Our dispatch_group_async interceptor actually extends the lifetime of the executed block. This means the destructor of the block (and captured variables) is called *after* dispatch_group_leave, which changes the semantics of dispatch_group_async.
Details
Diff Detail
- Repository
- rL LLVM
Event Timeline
lib/tsan/rtl/tsan_libdispatch_mac.cc | ||
---|---|---|
289 ↗ | (On Diff #62139) | What does keep the block alive currently? When is it destroyed without this change? |
test/tsan/Darwin/gcd-groups-destructor.mm | ||
43 ↗ | (On Diff #62139) | AFAIK, filecheck checks line-by-line, so this ensures that there are no WARNINGS _after_ "Done." is printed. I think you need to move CHECK_NOT before Done CHECK. |
lib/tsan/rtl/tsan_libdispatch_mac.cc | ||
---|---|---|
289 ↗ | (On Diff #62139) | 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). |
test/tsan/Darwin/gcd-groups-destructor.mm | ||
43 ↗ | (On Diff #62139) | Ok |
Is that pile of fixes happened because people started using tsan for their real programs?
lib/tsan/rtl/tsan_libdispatch_mac.cc | ||
---|---|---|
289 ↗ | (On Diff #62139) | 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. |
lib/tsan/rtl/tsan_libdispatch_mac.cc | ||
---|---|---|
289 ↗ | (On Diff #62139) | It’s the __block keyword. Objects with __block (blocks are objects) aren’t retained, they’re "captured directly" instead. |
Yes. A lot of both internal and external developers are using TSan now and they’re finding real races.