Commit 691a924b by Ian Lance Taylor

Avoid race condition manipulating heap when goroutine exits.

From-SVN: r170758
parent 457186f6
...@@ -92,25 +92,32 @@ remove_current_thread (void) ...@@ -92,25 +92,32 @@ remove_current_thread (void)
if (list_entry->next != NULL) if (list_entry->next != NULL)
list_entry->next->prev = list_entry->prev; list_entry->next->prev = list_entry->prev;
/* This will look runtime_mheap as needed. */
runtime_MCache_ReleaseAll (mcache); runtime_MCache_ReleaseAll (mcache);
/* This should never deadlock--there shouldn't be any code that
holds the runtime_mheap lock when locking __go_thread_ids_lock.
We don't want to do this after releasing __go_thread_ids_lock
because it will mean that the garbage collector might run, and
the garbage collector does not try to lock runtime_mheap in all
cases since it knows it is running single-threaded. */
runtime_lock (&runtime_mheap);
mstats.heap_alloc += mcache->local_alloc;
mstats.heap_objects += mcache->local_objects;
__builtin_memset (mcache, 0, sizeof (struct MCache));
runtime_FixAlloc_Free (&runtime_mheap.cachealloc, mcache);
runtime_unlock (&runtime_mheap);
/* As soon as we release this look, a GC could run. Since this /* As soon as we release this look, a GC could run. Since this
thread is no longer on the list, the GC will not find our M thread is no longer on the list, the GC will not find our M
structure, so it could get freed at any time. That means that structure, so it could get freed at any time. That means that
any code from here to thread exit must not assume that the m is any code from here to thread exit must not assume that m is
valid. */ valid. */
m = NULL; m = NULL;
i = pthread_mutex_unlock (&__go_thread_ids_lock); i = pthread_mutex_unlock (&__go_thread_ids_lock);
__go_assert (i == 0); __go_assert (i == 0);
runtime_lock (&runtime_mheap);
mstats.heap_alloc += mcache->local_alloc;
mstats.heap_objects += mcache->local_objects;
__builtin_memset (mcache, 0, sizeof (struct MCache));
runtime_FixAlloc_Free (&runtime_mheap.cachealloc, mcache);
runtime_unlock (&runtime_mheap);
free (list_entry); free (list_entry);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment