On Thu, 2003-09-18 at 23:36, Philip Blundell wrote: > I'll try adding these functions to __libc_pthread_functions and see if > that helps.
Well, it seems to do the trick with that testcase. p.
? linuxthreads/sysdeps/pthread/bits/libc-lock.diff Index: linuxthreads/forward.c =================================================================== RCS file: /cvs/glibc/libc/linuxthreads/forward.c,v retrieving revision 1.5 diff -u -r1.5 forward.c --- linuxthreads/forward.c 2 Sep 2003 00:37:04 -0000 1.5 +++ linuxthreads/forward.c 18 Sep 2003 23:36:32 -0000 @@ -173,3 +173,7 @@ 0) FORWARD (pthread_setcanceltype, (int type, int *oldtype), (type, oldtype), 0) + +FORWARD2 (_pthread_cleanup_push, void, (struct _pthread_cleanup_buffer * buffer, void (*routine)(void *), void * arg), (buffer, routine, arg), return) + +FORWARD2 (_pthread_cleanup_pop, void, (struct _pthread_cleanup_buffer * buffer, int execute), (buffer, execute), return) Index: linuxthreads/pthread.c =================================================================== RCS file: /cvs/glibc/libc/linuxthreads/pthread.c,v retrieving revision 1.130 diff -u -r1.130 pthread.c --- linuxthreads/pthread.c 17 Sep 2003 09:39:16 -0000 1.130 +++ linuxthreads/pthread.c 18 Sep 2003 23:36:32 -0000 @@ -279,7 +279,9 @@ .ptr_pthread_cleanup_upto = __pthread_cleanup_upto, .ptr_pthread_sigaction = __pthread_sigaction, .ptr_pthread_sigwait = __pthread_sigwait, - .ptr_pthread_raise = __pthread_raise + .ptr_pthread_raise = __pthread_raise, + .ptr__pthread_cleanup_push = _pthread_cleanup_push, + .ptr__pthread_cleanup_pop = _pthread_cleanup_pop }; #ifdef SHARED # define ptr_pthread_functions &__pthread_functions Index: linuxthreads/sysdeps/pthread/pthread-functions.h =================================================================== RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/pthread/pthread-functions.h,v retrieving revision 1.3 diff -u -r1.3 pthread-functions.h --- linuxthreads/sysdeps/pthread/pthread-functions.h 10 Sep 2003 22:27:19 -0000 1.3 +++ linuxthreads/sysdeps/pthread/pthread-functions.h 18 Sep 2003 23:36:33 -0000 @@ -83,6 +83,11 @@ int (*ptr_pthread_raise) (int sig); int (*ptr___pthread_cond_timedwait) (pthread_cond_t *, pthread_mutex_t *, const struct timespec *); + void (*ptr__pthread_cleanup_push) (struct _pthread_cleanup_buffer * buffer, + void (*routine)(void *), void * arg); + + void (*ptr__pthread_cleanup_pop) (struct _pthread_cleanup_buffer * buffer, + int execute); }; /* Variable in libc.so. */ Index: linuxthreads/sysdeps/pthread/bits/libc-lock.h =================================================================== RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/pthread/bits/libc-lock.h,v retrieving revision 1.31 diff -u -r1.31 libc-lock.h --- linuxthreads/sysdeps/pthread/bits/libc-lock.h 8 Aug 2003 07:40:17 -0000 1.31 +++ linuxthreads/sysdeps/pthread/bits/libc-lock.h 18 Sep 2003 23:36:33 -0000 @@ -265,18 +265,12 @@ } #define __libc_cleanup_push(fct, arg) \ - { struct _pthread_cleanup_buffer _buffer; \ - int _avail = _pthread_cleanup_push != NULL; \ - if (_avail) { \ - _pthread_cleanup_push (&_buffer, (fct), (arg)); \ - } + { struct _pthread_cleanup_buffer _buffer; \ + __libc_maybe_call (_pthread_cleanup_push, (&_buffer, (fct), (arg)), 0) #define __libc_cleanup_pop(execute) \ - if (_avail) { \ - _pthread_cleanup_pop (&_buffer, execute); \ - } \ - } - + __libc_maybe_call (_pthread_cleanup_pop, (&_buffer, execute), 0); \ + } /* Create thread-specific key. */ #define __libc_key_create(KEY, DESTRUCTOR) \