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-08 Sebastian Huber <[email protected]> * 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 | 47 ++++++++++++++++++++++++++++++++++++++-- 1 files changed, 44 insertions(+), 3 deletions(-) diff --git a/newlib/libc/include/pthread.h b/newlib/libc/include/pthread.h index ff7f354..9641114 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,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) -- 1.7.7 _______________________________________________ rtems-devel mailing list [email protected] http://www.rtems.org/mailman/listinfo/rtems-devel
