]> granicus.if.org Git - gc/commitdiff
Add debug logging to new_thread about GC_threads hash table collisions
authorIvan Maidanski <ivmai@mail.ru>
Thu, 24 Aug 2017 22:05:16 +0000 (01:05 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Thu, 24 Aug 2017 22:05:16 +0000 (01:05 +0300)
* pthread_support.c [DEBUG_THREADS] (GC_new_thread): Call GC_log_printf
(with the appropriate message) if a GC_threads[] entry already exists
at the given hv index (excluding the detached threads those id is
already reused).
* win32_threads.c [DEBUG_THREADS] (GC_new_thread): Call GC_log_printf
to report that a new thread is created; call GC_log_printf (with the
appropriate message) if a GC_threads[] entry already exists at the
given hv index; remove useless comment about the result of
GC_INTERNAL_MALLOC.

pthread_support.c
win32_threads.c

index 00032617377e2a41b8f1b2d5c7788aaff137abfc..7b02d95ce74e42b8b410fd876221860810f7f108 100644 (file)
@@ -543,6 +543,11 @@ STATIC GC_thread GC_new_thread(pthread_t id)
 
 #   ifdef DEBUG_THREADS
         GC_log_printf("Creating thread %p\n", (void *)id);
+        for (result = GC_threads[hv]; result != NULL; result = result->next)
+          if (!THREAD_EQUAL(result->id, id)) {
+            GC_log_printf("Hash collision at GC_threads[%d]\n", hv);
+            break;
+          }
 #   endif
     GC_ASSERT(I_HOLD_LOCK());
     if (!EXPECT(first_thread_used, TRUE)) {
index bce8af93f02342dd7ffa8d1ac4f6fae368d2478c..7befb9bb5ec0803630de0378ad7f006ad3fadee8 100644 (file)
@@ -338,6 +338,11 @@ STATIC GC_thread GC_new_thread(DWORD id)
   int hv = THREAD_TABLE_INDEX(id);
   GC_thread result;
 
+# ifdef DEBUG_THREADS
+    GC_log_printf("Creating thread 0x%lx\n", (long)id);
+    if (GC_threads[hv] != NULL)
+      GC_log_printf("Hash collision at GC_threads[%d]\n", hv);
+# endif
   GC_ASSERT(I_HOLD_LOCK());
   if (!EXPECT(first_thread_used, TRUE)) {
     result = &first_thread;
@@ -346,7 +351,6 @@ STATIC GC_thread GC_new_thread(DWORD id)
     GC_ASSERT(!GC_win32_dll_threads);
     result = (struct GC_Thread_Rep *)
                 GC_INTERNAL_MALLOC(sizeof(struct GC_Thread_Rep), NORMAL);
-    /* result can be NULL */
     if (result == 0) return(0);
   }
   /* result -> id = id; Done by caller.       */