summaryrefslogtreecommitdiff
path: root/pthread_support.c
diff options
context:
space:
mode:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2006-02-07 01:02:31 +0000
committerguest <ivmai@mail.ru>2011-07-29 10:54:27 +0400
commit2f26f4be56fa8e39921f7e2ca351919315951860 (patch)
tree2d2b7c4c1314fe0cf83e77c0640c5c34c6fbc50a /pthread_support.c
parent62123bbf952913f891bb026148ea0375674dd22b (diff)
downloadbdwgc-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.c36
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);