diff options
| -rw-r--r-- | include/pthread.h | 2 | ||||
| -rw-r--r-- | src/thread/pthread_create.c | 12 | ||||
| -rw-r--r-- | src/thread/pthread_setattr_default_np.c | 35 | 
3 files changed, 45 insertions, 4 deletions
| diff --git a/include/pthread.h b/include/pthread.h index 94ef919c..bba9587e 100644 --- a/include/pthread.h +++ b/include/pthread.h @@ -215,6 +215,8 @@ int pthread_getaffinity_np(pthread_t, size_t, struct cpu_set_t *);  int pthread_setaffinity_np(pthread_t, size_t, const struct cpu_set_t *);  int pthread_getattr_np(pthread_t, pthread_attr_t *);  int pthread_setname_np(pthread_t, const char *); +int pthread_getattr_default_np(pthread_attr_t *); +int pthread_setattr_default_np(const pthread_attr_t *);  int pthread_tryjoin_np(pthread_t, void **);  int pthread_timedjoin_np(pthread_t, void **, const struct timespec *);  #endif diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c index e8d4a635..49f2f729 100644 --- a/src/thread/pthread_create.c +++ b/src/thread/pthread_create.c @@ -163,6 +163,8 @@ static void *dummy_tsd[1] = { 0 };  weak_alias(dummy_tsd, __pthread_tsd_main);  volatile int __block_new_threads = 0; +size_t __default_stacksize = DEFAULT_STACK_SIZE; +size_t __default_guardsize = DEFAULT_GUARD_SIZE;  static FILE *volatile dummy_file = 0;  weak_alias(dummy_file, __stdin_used); @@ -186,10 +188,7 @@ int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict att  		| CLONE_THREAD | CLONE_SYSVSEM | CLONE_SETTLS  		| CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID | CLONE_DETACHED;  	int do_sched = 0; -	pthread_attr_t attr = { -		._a_stacksize = DEFAULT_STACK_SIZE, -		._a_guardsize = DEFAULT_GUARD_SIZE, -	}; +	pthread_attr_t attr = { 0 };  	if (!libc.can_do_threads) return ENOSYS;  	self = __pthread_self(); @@ -207,6 +206,11 @@ int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict att  	if (attrp && !c11) attr = *attrp;  	__acquire_ptc(); +	if (!attrp || c11) { +		attr._a_stacksize = __default_stacksize; +		attr._a_guardsize = __default_guardsize; +	} +  	if (__block_new_threads) __wait(&__block_new_threads, 0, 1, 1);  	if (attr._a_stackaddr) { diff --git a/src/thread/pthread_setattr_default_np.c b/src/thread/pthread_setattr_default_np.c new file mode 100644 index 00000000..ffd2712b --- /dev/null +++ b/src/thread/pthread_setattr_default_np.c @@ -0,0 +1,35 @@ +#include "pthread_impl.h" +#include <string.h> + +extern size_t __default_stacksize; +extern size_t __default_guardsize; + +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; + +	__inhibit_ptc(); +	if (attrp->_a_stacksize >= __default_stacksize) +		__default_stacksize = attrp->_a_stacksize; +	if (attrp->_a_guardsize >= __default_guardsize) +		__default_guardsize = attrp->_a_guardsize; +	__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; +} | 
