Re: [PATCH] D21816: [tsan] Stop extending the block’s lifetime in dispatch_group_async

Dmitry Vyukov via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 29 02:45:35 PDT 2016


dvyukov accepted this revision.
dvyukov added a comment.
This revision is now accepted and ready to land.

Is that pile of fixes happened because people started using tsan for their real programs?


================
Comment at: lib/tsan/rtl/tsan_libdispatch_mac.cc:289
@@ -288,1 +288,3 @@
+    block_copy();
+    _Block_release(block_copy);
     WRAP(dispatch_group_leave)(group);
----------------
kubabrecka wrote:
> dvyukov wrote:
> > What does keep the block alive currently? When is it destroyed without this change?
> Without this change, the block named "block" is captured by this anonymous block that's submitted via dispatch_async, and it's also released only when this anonymous block is released (after dispatch completely executes it).  That means the release only happens after the two lines below (call to dispatch_group_leave and dispatch_release).
> 
> With this change, we're avoiding the capture (with __block) by explicitly copying the block.  It will be released/destroyed at the call to _Block_release (as long as there are no other references to the block).
For my education: how does compiler/runtime know that it needs to capture the block with the current code, but does not need to capture with the new code? I mean in both cases a dispatch_block_t variable is referenced from ^(void){} block. So I would expect the capture happen in both cases.


http://reviews.llvm.org/D21816





More information about the llvm-commits mailing list