X-Git-Url: https://git.saurik.com/apple/libdispatch.git/blobdiff_plain/45201a42773e3f9687334f0f931d12bc311c2ceb..refs/heads/master:/src/block.cpp?ds=sidebyside diff --git a/src/block.cpp b/src/block.cpp index 83fff54..2a6f007 100644 --- a/src/block.cpp +++ b/src/block.cpp @@ -32,6 +32,8 @@ extern "C" { #include "internal.h" } +// NOTE: this file must not contain any atomic operations + #if DISPATCH_DEBUG && DISPATCH_BLOCK_PRIVATE_DATA_DEBUG #define _dispatch_block_private_data_debug(msg, ...) \ _dispatch_debug("block_private[%p]: " msg, (this), ##__VA_ARGS__) @@ -82,6 +84,10 @@ struct dispatch_block_private_data_s { if (!dbpd_performed) dispatch_group_leave(dbpd_group); ((void (*)(dispatch_group_t))dispatch_release)(dbpd_group); } + if (dbpd_queue) { + ((void (*)(os_mpsc_queue_t, uint16_t)) + _os_object_release_internal_n)(dbpd_queue, 2); + } if (dbpd_block) Block_release(dbpd_block); if (dbpd_voucher) voucher_release(dbpd_voucher); } @@ -95,7 +101,7 @@ _dispatch_block_create(dispatch_block_flags_t flags, voucher_t voucher, return _dispatch_Block_copy(^{ // Capture stack object: invokes copy constructor (17094902) (void)dbpds; - _dispatch_block_invoke(&dbpds); + _dispatch_block_invoke_direct(&dbpds); }); } @@ -103,7 +109,11 @@ extern "C" { // The compiler hides the name of the function it generates, and changes it if // we try to reference it directly, but the linker still sees it. extern void DISPATCH_BLOCK_SPECIAL_INVOKE(void *) +#ifdef __linux__ + asm("___dispatch_block_create_block_invoke"); +#else asm("____dispatch_block_create_block_invoke"); +#endif void (*_dispatch_block_special_invoke)(void*) = DISPATCH_BLOCK_SPECIAL_INVOKE; }