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