]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
DRD: handle fork() in processes with detached threads correctly (see also #255355).
authorBart Van Assche <bvanassche@acm.org>
Wed, 9 Feb 2011 11:55:12 +0000 (11:55 +0000)
committerBart Van Assche <bvanassche@acm.org>
Wed, 9 Feb 2011 11:55:12 +0000 (11:55 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11532

drd/drd_thread.c
drd/drd_thread.h

index f85a5b0923e525b41769e71c132c14fb1d21eb8b..a31531ed9de63ef27c81f5f12c6f2809c29d7e68 100644 (file)
@@ -367,7 +367,7 @@ void DRD_(thread_post_join)(DrdThreadId drd_joiner, DrdThreadId drd_joinee)
                                DRD_(thread_get_stack_max)(drd_joinee));
    }
    DRD_(clientobj_delete_thread)(drd_joinee);
-   DRD_(thread_delete)(drd_joinee);
+   DRD_(thread_delete)(drd_joinee, False);
 }
 
 /**
@@ -450,7 +450,7 @@ Int DRD_(thread_get_threads_on_alt_stack)(void)
  * Clean up thread-specific data structures. Call this just after
  * pthread_join().
  */
-void DRD_(thread_delete)(const DrdThreadId tid)
+void DRD_(thread_delete)(const DrdThreadId tid, const Bool detached)
 {
    Segment* sg;
    Segment* sg_prev;
@@ -467,7 +467,10 @@ void DRD_(thread_delete)(const DrdThreadId tid)
    }
    DRD_(g_threadinfo)[tid].vg_thread_exists = False;
    DRD_(g_threadinfo)[tid].posix_thread_exists = False;
-   tl_assert(DRD_(g_threadinfo)[tid].detached_posix_thread == False);
+   if (detached)
+      DRD_(g_threadinfo)[tid].detached_posix_thread = False;
+   else
+      tl_assert(!DRD_(g_threadinfo)[tid].detached_posix_thread);
    DRD_(g_threadinfo)[tid].first = 0;
    DRD_(g_threadinfo)[tid].last = 0;
 
@@ -514,7 +517,7 @@ void DRD_(drd_thread_atfork_child)(const DrdThreadId tid)
       if (i == tid)
         continue;
       if (DRD_(IsValidDrdThreadId(i)))
-        DRD_(thread_delete)(i);
+        DRD_(thread_delete)(i, True);
       tl_assert(!DRD_(IsValidDrdThreadId(i)));
    }   
 }
index 920df4a28cfa1bb3e6070a9939f58d072e42a9f6..8d63467acf6cef469dab3b892398732a7e2ee820 100644 (file)
@@ -134,7 +134,7 @@ DrdThreadId DRD_(thread_pre_create)(const DrdThreadId creator,
                                     const ThreadId vg_created);
 DrdThreadId DRD_(thread_post_create)(const ThreadId vg_created);
 void DRD_(thread_post_join)(DrdThreadId drd_joiner, DrdThreadId drd_joinee);
-void DRD_(thread_delete)(const DrdThreadId tid);
+void DRD_(thread_delete)(const DrdThreadId tid, Bool detached);
 void DRD_(thread_finished)(const DrdThreadId tid);
 void DRD_(drd_thread_atfork_child)(const DrdThreadId tid);
 void DRD_(thread_pre_cancel)(const DrdThreadId tid);