]> granicus.if.org Git - gc/commitdiff
Add double-lock assertion to GC_acquire_mark_lock
authorIvan Maidanski <ivmai@mail.ru>
Mon, 15 Jul 2013 12:02:36 +0000 (16:02 +0400)
committerIvan Maidanski <ivmai@mail.ru>
Mon, 15 Jul 2013 12:02:36 +0000 (16:02 +0400)
* pthread_support.c (GC_acquire_mark_lock): Add assertion that
GC_mark_lock_holder is not set to the current thread on the function
entry (i.e., assertion against double lock).
* win32_threads.c (GC_acquire_mark_lock): Likewise.

pthread_support.c
win32_threads.c

index 975c0816d8ed6e12d2db6014965d5aef0f73e5d9..334be501a592c3a0fedba5c4f6687baa6f787eec 100644 (file)
@@ -1963,6 +1963,7 @@ static pthread_cond_t builder_cv = PTHREAD_COND_INITIALIZER;
 
 GC_INNER void GC_acquire_mark_lock(void)
 {
+    GC_ASSERT(GC_mark_lock_holder != NUMERIC_THREAD_ID(pthread_self()));
     GC_generic_lock(&mark_mutex);
 #   ifdef GC_ASSERTIONS
         GC_mark_lock_holder = NUMERIC_THREAD_ID(pthread_self());
index 32e42ce3396905af639f2fa89dccc364ccc2678e..2462c2a31c7d8213ae77c316eb783ebe2c4ca97f 100644 (file)
@@ -1786,6 +1786,7 @@ GC_INNER void GC_get_next_stack(char *start, char *limit,
 
     GC_INNER void GC_acquire_mark_lock(void)
     {
+      GC_ASSERT(GC_mark_lock_holder != NUMERIC_THREAD_ID(pthread_self()));
       if (pthread_mutex_lock(&mark_mutex) != 0) {
         ABORT("pthread_mutex_lock failed");
       }
@@ -1971,6 +1972,7 @@ GC_INNER void GC_get_next_stack(char *start, char *limit,
 
     GC_INNER void GC_acquire_mark_lock(void)
     {
+      GC_ASSERT(GC_mark_lock_holder != (unsigned long)GetCurrentThreadId());
 #     ifdef DONT_USE_SIGNALANDWAIT
         if (InterlockedExchange(&GC_mark_mutex_state, 1 /* locked */) != 0)
 #     else