]> git.saurik.com Git - apple/libdispatch.git/blobdiff - src/block.cpp
libdispatch-913.30.4.tar.gz
[apple/libdispatch.git] / src / block.cpp
index 83fff54edd6e028d13a7f49d91405f0702da6332..2a6f00799b5f6dee5f1b9743148b3c0554cb2dbd 100644 (file)
@@ -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;
 }