diff options
author | Joel Sherrill <joel.sherrill@oarcorp.com> | 2013-11-29 23:35:34 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@oarcorp.com> | 2013-11-29 23:35:34 +0000 |
commit | a534dfd26e765047621acd0eda656ded886e7108 (patch) | |
tree | 3f4d9db657af8cf61f3db8a0b66dc421ef0239d2 | |
parent | 62c28b76acd5190377c9311e5ef5009f9df175c5 (diff) | |
download | cygnal-a534dfd26e765047621acd0eda656ded886e7108.tar.gz cygnal-a534dfd26e765047621acd0eda656ded886e7108.tar.bz2 cygnal-a534dfd26e765047621acd0eda656ded886e7108.zip |
2013-11-29 Sebastian Huber <sebastian.huber@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.
-rw-r--r-- | newlib/ChangeLog | 13 | ||||
-rw-r--r-- | 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 <sebastian.huber@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. + 2013-11-29 Jennifer Averett <jennifer.averett@oarcorp.com> * 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 <sys/sched.h> #include <sys/cdefs.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))); @@ -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) |