]> granicus.if.org Git - gc/commitdiff
2006-02-06 Jakub Jelinek <jakub@redhat.com>
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 7 Feb 2006 01:02:31 +0000 (01:02 +0000)
committerguest <ivmai@mail.ru>
Fri, 29 Jul 2011 06:54:27 +0000 (10:54 +0400)
    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

ChangeLog
configure
configure.ac
include/gc_config.h.in
include/gc_ext_config.h.in
include/gc_pthread_redirects.h
pthread_support.c

index 61bc00e85214dc99bbde4fdfa39d4a50392725b1..425b015952a276edc129c20f3f140a04d9229663 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+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.
+
 2006-02-04  Alan Modra  <amodra@bigpond.net.au>
 
        * include/private/gc_locks.h (GC_test_and_set <POWERPC>): Don't
index a4aeaa8f43d500a8ecb704e156af87badd225fd7..e0223dd7ea3cba3ee3ad2dcc555ff7a6d27460a3 100755 (executable)
--- a/configure
+++ b/configure
@@ -6627,6 +6627,29 @@ _ACEOF
 
 fi
 
+symver=
+case "$target" in
+  *-*-linux* )
+    cat > conftest.c <<EOF
+#include <pthread.h>
+void *tf (void *arg) { (void) arg; return NULL; }
+int main (void) { pthread_t th; pthread_create (&th, NULL, tf, NULL); return 0; }
+EOF
+    if $CC $CFLAGS -pthread -o conftest conftest.c > /dev/null 2>&1; then
+      symver=`readelf -s conftest 2> /dev/null | sed -n '/UND pthread_create@/{s/^.*@//;s/ .*$//;p;q}'`
+    fi
+    rm -f conftest conftest.c
+    ;;
+esac
+if test -n "$symver"; then
+
+cat >>confdefs.h <<_ACEOF
+#define GC_PTHREAD_SYM_VERSION "$symver"
+_ACEOF
+
+fi
+
+
 if test -n "$with_cross_host" &&
    test x"$with_cross_host" != x"no"; then
   toolexecdir='$(exec_prefix)/$(target_noncanonical)'
index f33135f1dea9c53d38ddc62d671b48ce1f95144d..2b9663dec20c3bfa7ade0a21af6ca8b938b11934 100644 (file)
@@ -450,6 +450,25 @@ if test "${gc_use_mmap}" = "yes"; then
   AC_DEFINE(USE_MMAP, 1, [use MMAP instead of sbrk to get new memory])
 fi
 
+symver=
+case "$target" in
+  *-*-linux* )
+    cat > conftest.c <<EOF
+#include <pthread.h>
+void *tf (void *arg) { (void) arg; return NULL; }
+int main (void) { pthread_t th; pthread_create (&th, NULL, tf, NULL); return 0; }
+EOF
+    if $CC $CFLAGS -pthread -o conftest conftest.c > /dev/null 2>&1; then
+      symver=`readelf -s conftest 2> /dev/null | sed -n '/UND pthread_create@/{s/^.*@//;s/ .*$//;p;q}'`
+    fi
+    rm -f conftest conftest.c
+    ;;
+esac
+if test -n "$symver"; then
+  AC_DEFINE_UNQUOTED(GC_PTHREAD_SYM_VERSION, "$symver", [symbol version of pthread_create])
+fi
+
+
 if test -n "$with_cross_host" &&
    test x"$with_cross_host" != x"no"; then
   toolexecdir='$(exec_prefix)/$(target_noncanonical)'
index 92f1b2cf4607c30bb29d0da5914e5e55b220e52d..cfaae9dd464519b362a07b1b4ad353aa7b054b91 100644 (file)
@@ -45,6 +45,9 @@
 /* support for Tru64 pthreads */
 #undef GC_OSF1_THREADS
 
+/* symbol version of pthread_create */
+#undef GC_PTHREAD_SYM_VERSION
+
 /* support for Solaris pthreads */
 #undef GC_SOLARIS_PTHREADS
 
index 52a662dcf0bf8e7db148d975e87bdaa9cbb55d95..716143dc62f5d57215796e0279c0e8969971e923 100644 (file)
@@ -3,3 +3,5 @@ external clients that do not want to include the full gc.h.  Currently this
 is used by libjava/include/boehm-gc.h. */
 
 #undef THREAD_LOCAL_ALLOC
+
+#undef GC_PTHREAD_SYM_VERSION
index 842518cfcc48c2a0657b1cc6581994abf5cd8a44..f9d4939affcd09da304d50f39302d8d318c85f0d 100644 (file)
@@ -68,7 +68,9 @@
 # undef pthread_detach
 #endif
 
+#ifndef GC_PTHREAD_SYM_VERSION
 # define pthread_create GC_pthread_create
+#endif
 # define pthread_join GC_pthread_join
 # define pthread_detach GC_pthread_detach
 
index 4271803c7c2a2f8443b1663ab0953ed6e810d14f..7c7bb0519b27f612152b1f728e7990558c788372 100644 (file)
@@ -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);