Release cache while holding thread lock.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 14 Dec 2010 05:16:18 +0000 (05:16 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 14 Dec 2010 05:16:18 +0000 (05:16 +0000)
Don't bother to hold thread lock while allocating cache.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@167784 138bc75d-0d04-0410-961f-82ee72b054a4

libgo/runtime/go-go.c

index a97b7af..55aa3e3 100644 (file)
@@ -107,11 +107,11 @@ remove_current_thread (void)
   if (list_entry->next != NULL)
     list_entry->next->prev = list_entry->prev;
 
+  runtime_MCache_ReleaseAll (mcache);
+
   i = pthread_mutex_unlock (&__go_thread_ids_lock);
   __go_assert (i == 0);
 
-  runtime_MCache_ReleaseAll (mcache);
-
   runtime_lock (&runtime_mheap);
   mstats.heap_alloc += mcache->local_alloc;
   mstats.heap_objects += mcache->local_objects;
@@ -225,14 +225,13 @@ __go_go (void (*pfn) (void*), void *arg)
 
   newm->list_entry = list_entry;
 
+  newm->mcache = runtime_allocmcache ();
+
   /* Add the thread to the list of all threads, marked as tentative
      since it is not yet ready to go.  */
   i = pthread_mutex_lock (&__go_thread_ids_lock);
   __go_assert (i == 0);
 
-  /* We use __go_thread_ids_lock as a lock for mheap.cachealloc.  */
-  newm->mcache = runtime_allocmcache ();
-
   if (__go_all_thread_ids != NULL)
     __go_all_thread_ids->prev = list_entry;
   list_entry->next = __go_all_thread_ids;