X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=libgc%2Fpthread_support.c;h=11d2cd6ad71514caa514d0312522247a9eca5b16;hb=123970fb9ff1ee121350f3273b2fcb576f38dbb7;hp=0346a8022a6dcff525eb9b899c9ed933ff1c42b2;hpb=5bbfa8860b090e465a3aa45edeb9c94481ef1a22;p=mono.git diff --git a/libgc/pthread_support.c b/libgc/pthread_support.c index 0346a8022a6..11d2cd6ad71 100644 --- a/libgc/pthread_support.c +++ b/libgc/pthread_support.c @@ -67,8 +67,8 @@ # endif # if (defined(GC_DGUX386_THREADS) || defined(GC_OSF1_THREADS) || \ - defined(GC_DARWIN_THREADS) || defined(GC_AIX_THREADS)) \ - && !defined(USE_PTHREAD_SPECIFIC) + defined(GC_DARWIN_THREADS) || defined(GC_AIX_THREADS)) || \ + defined(GC_NETBSD_THREADS) && !defined(USE_PTHREAD_SPECIFIC) # define USE_PTHREAD_SPECIFIC # endif @@ -97,8 +97,11 @@ typedef pthread_key_t GC_key_t; # endif # if defined(USE_COMPILER_TLS) +/* Note sles9 gcc on powerpc gets confused by the define to set GC_thread_tls and pthread_setspecific + * so we actually use a static inline function decalred below that is equivalent to: + * define GC_setspecific(key, v) (GC_thread_tls = (v), pthread_setspecific ((key), (v))) + */ # define GC_getspecific(x) (GC_thread_tls) -# define GC_setspecific(key, v) (GC_thread_tls = (v), pthread_setspecific ((key), (v))) # define GC_key_create pthread_key_create typedef pthread_key_t GC_key_t; # endif @@ -126,6 +129,11 @@ # include #endif /* GC_DARWIN_THREADS */ +#if defined(GC_NETBSD_THREADS) +# include +# include +#endif + #if defined(GC_DGUX386_THREADS) @@ -186,7 +194,19 @@ static GC_key_t GC_thread_key; #ifdef USE_COMPILER_TLS -static __thread MONO_TLS_FAST void* GC_thread_tls; +__thread MONO_TLS_FAST void* GC_thread_tls; + +/* + * gcc errors out with /tmp/ccdPMFuq.s:2994: Error: symbol `.LTLS4' is already defined + * if the inline is added on powerpc + */ +#if !defined(__ppc__) && !defined(__powerpc__) +inline +#endif +static int GC_setspecific (GC_key_t key, void *value) { + GC_thread_tls = value; + return pthread_setspecific (key, value); +} #endif static GC_bool keys_initialized; @@ -1013,7 +1033,7 @@ void GC_thr_init() GC_nprocs = sysconf(_SC_NPROC_ONLN); if (GC_nprocs <= 0) GC_nprocs = 1; # endif -# if defined(GC_DARWIN_THREADS) || defined(GC_FREEBSD_THREADS) +# if defined(GC_DARWIN_THREADS) || defined(GC_FREEBSD_THREADS) || defined(GC_NETBSD_THREADS) int ncpus = 1; size_t len = sizeof(ncpus); sysctl((int[2]) {CTL_HW, HW_NCPU}, 2, &ncpus, &len, NULL, 0); @@ -1180,6 +1200,11 @@ void GC_thread_exit_proc(void *arg) me = GC_lookup_thread(pthread_self()); GC_destroy_thread_local(me); if (me -> flags & DETACHED) { +# ifdef THREAD_LOCAL_ALLOC + /* NULL out the tls key to prevent the dtor function from being called */ + if (0 != GC_setspecific(GC_thread_key, NULL)) + ABORT("Failed to set thread specific allocation pointers"); +#endif GC_delete_thread(pthread_self()); } else { me -> flags |= FINISHED;