]> granicus.if.org Git - gc/commitdiff
Fix GC_setspecific to prevent garbage collection inside
authorIvan Maidanski <ivmai@mail.ru>
Sat, 21 Apr 2012 10:31:26 +0000 (14:31 +0400)
committerIvan Maidanski <ivmai@mail.ru>
Sat, 21 Apr 2012 10:31:26 +0000 (14:31 +0400)
* specific.c (GC_setspecific): Call MALLOC_CLEAR with GC temporarily
disabled; add comment about lock.

specific.c

index 5f4765dfb08a09bb48ad75a198c06ebb44e1a370..a7114cb24fc0fe630de878960408f1ca7b11c7eb 100644 (file)
@@ -47,14 +47,19 @@ GC_INNER int GC_key_create_inner(tsd ** key_ptr)
     return 0;
 }
 
+/* Called with the lock held.   */
 GC_INNER int GC_setspecific(tsd * key, void * value)
 {
     pthread_t self = pthread_self();
     int hash_val = HASH(self);
-    volatile tse * entry = (volatile tse *)MALLOC_CLEAR(sizeof (tse));
+    volatile tse * entry;
 
     GC_ASSERT(self != INVALID_THREADID);
+    GC_dont_gc++; /* disable GC */
+    entry = (volatile tse *)MALLOC_CLEAR(sizeof(tse));
+    GC_dont_gc--;
     if (0 == entry) return ENOMEM;
+
     pthread_mutex_lock(&(key -> lock));
     /* Could easily check for an existing entry here.   */
     entry -> next = key->hash[hash_val].p;