[PATCH] Pthreads cleanup push/pop changes
Sebastian Huber
sebastian.huber at embedded-brains.de
Fri Jul 5 14:05:23 UTC 2013
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))
+
+#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);
+
+#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
More information about the devel
mailing list