diff options
author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-02-07 01:02:31 +0000 |
---|---|---|
committer | guest <ivmai@mail.ru> | 2011-07-29 10:54:27 +0400 |
commit | 2f26f4be56fa8e39921f7e2ca351919315951860 (patch) | |
tree | 2d2b7c4c1314fe0cf83e77c0640c5c34c6fbc50a /pthread_support.c | |
parent | 62123bbf952913f891bb026148ea0375674dd22b (diff) | |
download | bdwgc-2f26f4be56fa8e39921f7e2ca351919315951860.tar.gz |
2006-02-06 Jakub Jelinek <jakub@redhat.com>
Anthony Green <green@redhat.com>
Tom Tromey <tromey@redhat.com>
* include/gc_ext_config.h.in: Added GC_PTHREAD_SYM_VERSION.
* include/gc_config.h.in: Rebuilt.
* include/gc_pthread_redirects.h (pthread_create): Conditionally
define.
* pthread_support.c (pthread_create_): New global.
(constr): New function.
(pthread_create): Conditionally renamed.
* configure: Rebuilt.
* configure.ac (GC_PTHREAD_SYM_VERSION): Define.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@110682 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'pthread_support.c')
-rw-r--r-- | pthread_support.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/pthread_support.c b/pthread_support.c index 4271803c..7c7bb051 100644 --- a/pthread_support.c +++ b/pthread_support.c @@ -47,6 +47,9 @@ /*#define DEBUG_THREADS 1*/ /*#define GC_ASSERTIONS*/ +#define _GNU_SOURCE +#include <dlfcn.h> + # include "gc.h" # include "private/pthread_support.h" @@ -1193,8 +1196,37 @@ void * GC_start_routine(void * arg) return(result); } +#ifdef GC_PTHREAD_SYM_VERSION + +/* Force constr to execute prior to main(). */ +static void constr (void) __attribute__ ((constructor)); + +static int +(*pthread_create_)(pthread_t *new_thread, + const pthread_attr_t *attr_in, + void * (*thread_execp)(void *), void *arg); + +static void +constr (void) +{ + /* Get a pointer to the real pthread_create. */ + pthread_create_ = dlvsym (RTLD_NEXT, "pthread_create", + GC_PTHREAD_SYM_VERSION); +} + +#define GC_PTHREAD_CREATE_NAME pthread_create +#define GC_PTHREAD_REAL_NAME (*pthread_create_) + +#else + +#define GC_PTHREAD_CREATE_NAME WRAP_FUNC(pthread_create) +#define GC_PTHREAD_REAL_NAME REAL_FUNC(pthread_create) + +#endif + + int -WRAP_FUNC(pthread_create)(pthread_t *new_thread, +GC_PTHREAD_CREATE_NAME(pthread_t *new_thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg) { @@ -1255,7 +1287,7 @@ WRAP_FUNC(pthread_create)(pthread_t *new_thread, pthread_self()); # endif - result = REAL_FUNC(pthread_create)(new_thread, attr, GC_start_routine, si); + result = GC_PTHREAD_REAL_NAME(new_thread, attr, GC_start_routine, si); # ifdef DEBUG_THREADS GC_printf1("Started thread 0x%X\n", *new_thread); |