problem with syslog, libpthread and dlopen
Philip Blundell
Philip.Blundell@pobox.com
Mon Sep 22 17:53:00 GMT 2003
On Fri, 2003-09-19 at 01:08, Philip Blundell wrote:
> What's the right way to fix this? Should _pthread_cleanup_push/pop be
> called through __libc_pthread_functions as well?
Here's the patch I'm currently using for this. Any comments?
Thanks
p.
-------------- next part --------------
2003-09-22 Philip Blundell <philb@gnu.org>
* forward.c: Add _pthread_cleanup_push, _pthread_cleanup_pop.
* sysdeps/pthread/pthread-functions.h (struct pthread_functions):
Likewise.
* pthread.c (__pthread_elements): Initialise these new elements.
* sysdeps/pthread/bits/libc-lock.h (__libc_cleanup_push): Use
__libc_maybe_call.
(__libc_cleanup_pop): Likewise.
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) \
More information about the Libc-hacker
mailing list