Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date: Mon, 7 Nov 2016 22:52:16 -0500
From: Rich Felker <dalias@...c.org>
To: musl@...ts.openwall.com
Subject: Re: [PATCH] add support for pthread_{get,set}attr_default_np
 GNU extension

On Mon, Oct 31, 2016 at 07:26:58PM +0200, Timo Teräs wrote:
> While generally this is a bad API, it is the only existing API to
> affect c++ (std::thread) and c11 (thrd_create) thread stack size.
> This patch allows applications only to increate stack and guard
> page sizes.
> ---
>  include/pthread.h                       |  2 ++
>  src/thread/pthread_create.c             |  7 +++++++
>  src/thread/pthread_setattr_default_np.c | 31 +++++++++++++++++++++++++++++++
>  3 files changed, 40 insertions(+)
>  create mode 100644 src/thread/pthread_setattr_default_np.c
> 
> diff --git a/include/pthread.h b/include/pthread.h
> index 94ef919..bba9587 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 9f6b98e..28cf6d4 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 = 0;
> +size_t __default_guardsize = 0;
>  
>  static FILE *volatile dummy_file = 0;
>  weak_alias(dummy_file, __stdin_used);
> @@ -204,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 0000000..21cd0f3
> --- /dev/null
> +++ b/src/thread/pthread_setattr_default_np.c
> @@ -0,0 +1,31 @@
> +#include "pthread_impl.h"
> +
> +extern size_t __default_stacksize;
> +extern size_t __default_guardsize;
> +
> +int pthread_setattr_default_np(const pthread_attr_t *attrp)
> +{
> +	if (attrp->_a_stackaddr || attrp->_a_detach ||
> +	    attrp->_a_sched || attrp->_a_policy || attrp->_a_prio)
> +		return EINVAL;
> +
> +	__inhibit_ptc();
> +	if (DEFAULT_STACK_SIZE+attrp->_a_stacksize >= DEFAULT_STACK_SIZE+__default_stacksize)
> +		__default_stacksize = attrp->_a_stacksize;
> +	if (DEFAULT_GUARD_SIZE+attrp->_a_guardsize >= DEFAULT_GUARD_SIZE+__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;
> +}

As discussed on #musl, I've changed the existing code not to use the
ugly default-relative sizes with addition/subtraction of the defaults
everywhere; see:

https://git.musl-libc.org/cgit/musl/commit/?id=33ce920857405d4f4b342c85b74588a15e2702e5

Your patch needs some minor changes to match that. Otherwise it
doesn't look too bad. What do you think about limiting how high the
defaults can be set? It's an idea I mentioned on irc before but I
don't remember if we followed up with it.

Rich

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.