diff options
Diffstat (limited to 'src/thread/pthread_setattr_default_np.c')
-rw-r--r-- | src/thread/pthread_setattr_default_np.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/thread/pthread_setattr_default_np.c b/src/thread/pthread_setattr_default_np.c new file mode 100644 index 0000000..5848622 --- /dev/null +++ b/src/thread/pthread_setattr_default_np.c @@ -0,0 +1,37 @@ +#define _GNU_SOURCE +#include "pthread_impl.h" +#include <string.h> + +#define MIN(a,b) ((a)<(b) ? (a) : (b)) +#define MAX(a,b) ((a)>(b) ? (a) : (b)) + +int pthread_setattr_default_np(const pthread_attr_t *attrp) +{ + /* Reject anything in the attr object other than stack/guard size. */ + pthread_attr_t tmp = *attrp, zero = { 0 }; + tmp._a_stacksize = 0; + tmp._a_guardsize = 0; + if (memcmp(&tmp, &zero, sizeof tmp)) + return EINVAL; + + unsigned stack = MIN(attrp->_a_stacksize, DEFAULT_STACK_MAX); + unsigned guard = MIN(attrp->_a_guardsize, DEFAULT_GUARD_MAX); + + __inhibit_ptc(); + __default_stacksize = MAX(__default_stacksize, stack); + __default_guardsize = MAX(__default_guardsize, guard); + __release_ptc(); + + return 0; +} + +int pthread_getattr_default_np(pthread_attr_t *attrp) +{ + __acquire_ptc(); + *attrp = (pthread_attr_t) { + ._a_stacksize = __default_stacksize, + ._a_guardsize = __default_guardsize, + }; + __release_ptc(); + return 0; +} |