[PATCH] Pthreads cleanup push/pop changes
Gedare Bloom
gedare at rtems.org
Fri Jul 5 15:21:44 UTC 2013
On Fri, Jul 5, 2013 at 10:05 AM, Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
> Implementation according to POSIX:
>
> http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_cleanup_push.html
>
> This change is not conditional to RTEMS since I don't think the previous
> approach is useful at all. To provide binary compatibility systems can
> still provide the previous pthread_cleanup_push() and pthread_cleanup_pop()
> functions.
>
> newlib/ChangeLog
> 2013-07-05 Sebastian Huber <sebastian.huber at embedded-brains.de>
>
> * libc/include/pthread.h (pthread_cleanup_push): Delete prototype
> and add macro of the same name.
> (pthread_cleanup_pop): Likewise.
> (_pthread_cleanup_context): Define.
> (_pthread_cleanup_push): Likewise.
> (_pthread_cleanup_pop): Likewise.
> (pthread_cleanup_push_defer_np): Define if _GNU_SOURCE is defined.
> (pthread_cleanup_pop_restore_np): Likewise.
> (_pthread_cleanup_push_defer): Likewise.
> (_pthread_cleanup_pop_restore): Likewise.
> ---
> newlib/libc/include/pthread.h | 45 ++++++++++++++++++++++++++++++++++++++--
> 1 files changed, 42 insertions(+), 3 deletions(-)
>
> diff --git a/newlib/libc/include/pthread.h b/newlib/libc/include/pthread.h
> index ff7f354..3fb6e8b 100644
> --- a/newlib/libc/include/pthread.h
> +++ b/newlib/libc/include/pthread.h
> @@ -33,6 +33,13 @@ extern "C" {
> #include <time.h>
> #include <sys/sched.h>
>
> +struct _pthread_cleanup_context {
> + void (*_routine)(void *);
> + void *_arg;
> + int _canceltype;
> + struct _pthread_cleanup_context *_previous;
> +};
> +
> /* Register Fork Handlers */
> int _EXFUN(pthread_atfork,(void (*prepare)(void), void (*parent)(void),
> void (*child)(void)));
> @@ -280,9 +287,41 @@ void _EXFUN(pthread_testcancel, (void));
>
> /* Establishing Cancellation Handlers, P1003.1c/Draft 10, p. 184 */
>
> -void _EXFUN(pthread_cleanup_push,
> - (void (*__routine)( void * ), void *__arg));
> -void _EXFUN(pthread_cleanup_pop, (int __execute));
> +void _EXFUN(_pthread_cleanup_push,
> + (struct _pthread_cleanup_context *_context,
> + void (*_routine)(void *), void *_arg));
> +
> +void _EXFUN(_pthread_cleanup_pop,
> + (struct _pthread_cleanup_context *_context,
> + int _execute));
> +
> +#define pthread_cleanup_push(_routine, _arg) \
> + do { \
> + struct _pthread_cleanup_context _pthread_clup_ctx; \
> + _pthread_cleanup_push(&_pthread_clup_ctx, (_routine), (_arg))
> +
Does this macro work with the do-while split across two CPP defines,
or do you need " } while (0)" here?
> +#define pthread_cleanup_pop(_execute) \
Does this macro work, or do you need " do { \" here?
> + _pthread_cleanup_pop(&_pthread_clup_ctx, (_execute)); \
> + } while (0)
> +
> +#if defined(_GNU_SOURCE)
> +void _EXFUN(_pthread_cleanup_push_defer,
> + (struct _pthread_cleanup_context *_context,
> + void (*_routine)(void *), void *_arg);
> +
> +void _EXFUN(_pthread_cleanup_pop_restore,
> + (struct _pthread_cleanup_context *_context,
> + int _execute);
> +
> +#define pthread_cleanup_push_defer_np(_routine, _arg) \
> + do { \
> + struct _pthread_cleanup_context _pthread_clup_ctx; \
> + _pthread_cleanup_push_defer(&_pthread_clup_ctx, (_routine), (_arg))
> +
> +#define pthread_cleanup_pop_restore_np(_execute) \
> + _pthread_cleanup_pop_restore(&_pthread_clup_ctx, (_execute)); \
> + } while (0)
Same as above, the do-while is split.
> +#endif /* defined(_GNU_SOURCE) */
>
> #if defined(_POSIX_THREAD_CPUTIME)
>
> --
> 1.7.7
>
> _______________________________________________
> rtems-devel mailing list
> rtems-devel at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-devel
More information about the devel
mailing list