From a534dfd26e765047621acd0eda656ded886e7108 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 29 Nov 2013 23:35:34 +0000 Subject: [PATCH] 2013-11-29 Sebastian Huber * 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/ChangeLog | 13 ++++++++++ newlib/libc/include/pthread.h | 47 ++++++++++++++++++++++++++++++++--- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 850b93acc..60392b8f6 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,16 @@ +2013-11-29 Sebastian Huber + + * 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. + 2013-11-29 Jennifer Averett * libc/include/pthread.h (pthread_attr_setaffinity_np): diff --git a/newlib/libc/include/pthread.h b/newlib/libc/include/pthread.h index 935de4119..db1f9c1ca 100644 --- a/newlib/libc/include/pthread.h +++ b/newlib/libc/include/pthread.h @@ -34,6 +34,13 @@ extern "C" { #include #include +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))); @@ -304,9 +311,43 @@ 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)); + +/* It is intentional to open and close the scope in two different macros */ +#define pthread_cleanup_push(_routine, _arg) \ + do { \ + struct _pthread_cleanup_context _pthread_clup_ctx; \ + _pthread_cleanup_push(&_pthread_clup_ctx, (_routine), (_arg)) + +#define pthread_cleanup_pop(_execute) \ + _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)); + +/* It is intentional to open and close the scope in two different macros */ +#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) +#endif /* defined(_GNU_SOURCE) */ #if defined(_POSIX_THREAD_CPUTIME)