]> granicus.if.org Git - gc/commitdiff
2006-02-01 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Wed, 1 Feb 2006 14:26:05 +0000 (14:26 +0000)
committerguest <ivmai@mail.ru>
Fri, 29 Jul 2011 11:28:02 +0000 (15:28 +0400)
* pthread_support.c (GC_thread_deregister_foreign): New public API
function to deregister a foreign thread from the GC.
(GC_destroy_thread_local): Clean up the TLS key too.

svn path=/trunk/mono/; revision=56387

ChangeLog
include/private/pthread_support.h
pthread_support.c
solaris_threads.c

index ddc4befc3733f3a59b1dff6eaa884b48505ea635..8c47519f14dc191c4d23152b0b2a48b79c20e0db 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,9 @@
+2006-02-01  Zoltan Varga  <vargaz@gmail.com>
 
+       * pthread_support.c (GC_thread_deregister_foreign): New public API
+       function to deregister a foreign thread from the GC.
+       (GC_destroy_thread_local): Clean up the TLS key too.
+       
 Tue Jan 24 12:34:06 CET 2006 Paolo Molaro <lupus@ximian.com>
 
        * *: update from upstream changes.
index c2c48c22e01a2c889f0d2f3d8a092d07777f20fd..b4a762b542cbdb831c27e688278bff433ea591ca 100644 (file)
@@ -92,7 +92,7 @@ extern GC_bool GC_thr_initialized;
 
 GC_thread GC_lookup_thread(pthread_t id);
 
-void GC_thread_deregister_foreign (void *data);
+void GC_thread_deregister_foreign (void);
 
 void GC_stop_init();
 
index ac8df854c547e76908507a4632433c7b2498c4dc..5a7b37692089910f86ee5dcf0f0223fb966975ef 100644 (file)
@@ -223,7 +223,8 @@ static ptr_t size_zero_object = (ptr_t)(&size_zero_object);
 
 void GC_delete_thread(pthread_t id);
 
-void GC_thread_deregister_foreign (void *data)
+/* Called by pthreads when the TLS entry is destroyed */
+static void GC_thread_deregister_foreign_internal (void *data)
 {
     GC_thread me = (GC_thread)data;
  /*   GC_fprintf1( "\n\n\n\n --- Deregister %x ---\n\n\n\n\n", me->flags ); */
@@ -243,7 +244,7 @@ void GC_init_thread_local(GC_thread p)
     int i;
 
     if (!keys_initialized) {
-       if (0 != GC_key_create(&GC_thread_key, GC_thread_deregister_foreign)) {
+       if (0 != GC_key_create(&GC_thread_key, GC_thread_deregister_foreign_internal)) {
            ABORT("Failed to create key for local allocator");
         }
        keys_initialized = TRUE;
@@ -283,6 +284,7 @@ void GC_destroy_thread_local(GC_thread p)
 #   ifdef GC_GCJ_SUPPORT
        return_freelists(p -> gcj_freelists, GC_gcjobjfreelist);
 #   endif
+    GC_setspecific(GC_thread_key, NULL);
 }
 
 extern GC_PTR GC_generic_malloc_many();
@@ -630,7 +632,7 @@ void GC_delete_thread(pthread_t id)
     int hv = ((word)id) % THREAD_TABLE_SZ;
     register GC_thread p = GC_threads[hv];
     register GC_thread prev = 0;
-    
+
     while (!pthread_equal(p -> id, id)) {
         prev = p;
         p = p -> next;
@@ -1260,6 +1262,21 @@ int GC_thread_register_foreign (void *base_addr)
     return me != NULL;
 }
 
+void GC_thread_deregister_foreign (void)
+{
+       GC_thread me;
+
+       LOCK ();
+       me = GC_lookup_thread (pthread_self ());
+       if (me->flags & FOREIGN_THREAD) {
+               GC_delete_thread (me->id);
+#if defined(THREAD_LOCAL_ALLOC) && !defined(DBG_HDRS_ALL)
+               GC_destroy_thread_local (me);
+#endif
+       }
+       UNLOCK ();
+}
+
 void * GC_start_routine(void * arg)
 {
     int dummy;
index 5c49c1206b8176d85a09aa1fa7f33ca2ebf1e56a..a2f0a5d2aa1d0e0436b509c27ef9f093472264f0 100644 (file)
@@ -641,6 +641,10 @@ int GC_thread_register_foreign (void *base_addr)
        return 0;
 }
 
+void GC_thread_deregister_foreign (void)
+{
+}
+
 /* Solaris 2/Intel uses an initial stack size limit slightly bigger than the
    SPARC default of 8 MB.  Account for this to warn only if the user has
    raised the limit beyond the default.