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

Kuba Brecka via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 29 03:10:50 PDT 2016


kubabrecka added inline comments.

================
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);
----------------
dvyukov wrote:
> 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.
It’s the `__block` keyword.  Objects with `__block` (blocks are objects) aren’t retained, they’re "captured directly" instead.


http://reviews.llvm.org/D21816





More information about the llvm-commits mailing list