diff --git a/devel/libdispatch/Makefile b/devel/libdispatch/Makefile index 16c3769343d2..f3ae0f1b572c 100644 --- a/devel/libdispatch/Makefile +++ b/devel/libdispatch/Makefile @@ -1,26 +1,26 @@ PORTNAME= libdispatch -DISTVERSION= 6.1 +DISTVERSION= 6.1.1 PORTEPOCH= 1 CATEGORIES= devel MAINTAINER= fluffy@FreeBSD.org COMMENT= Grand Central Dispatch API support library LICENSE= APACHE20 USES= cmake:testing compiler:c++17-lang USE_LDCONFIG= yes USE_CXXSTD= c++17 USE_GITHUB= yes GH_ACCOUNT= swiftlang GH_PROJECT= swift-corelibs-libdispatch GH_TAGNAME= swift-${DISTVERSION}-RELEASE .include .if ${OPSYS} == FreeBSD && (${ARCH} == armv7 || ${ARCH} == i386 || ${ARCH} == powerpc) CFLAGS+= -Wno-incompatible-function-pointer-types .endif .include diff --git a/devel/libdispatch/distinfo b/devel/libdispatch/distinfo index 25429492d7fa..e7ce29e7403c 100644 --- a/devel/libdispatch/distinfo +++ b/devel/libdispatch/distinfo @@ -1,3 +1,3 @@ -TIMESTAMP = 1743943822 -SHA256 (swiftlang-swift-corelibs-libdispatch-6.1-swift-6.1-RELEASE_GH0.tar.gz) = 5bba8d7442890f7dbd37a9245340c5bb0c4c924dee6180ba30385b24e3fdf121 -SIZE (swiftlang-swift-corelibs-libdispatch-6.1-swift-6.1-RELEASE_GH0.tar.gz) = 595700 +TIMESTAMP = 1757674615 +SHA256 (swiftlang-swift-corelibs-libdispatch-6.1.1-swift-6.1.1-RELEASE_GH0.tar.gz) = 6fc6f8b1767a1348e1d960647b2bfbc52fd7074b7aeab97bd0f4b21af58baa47 +SIZE (swiftlang-swift-corelibs-libdispatch-6.1.1-swift-6.1.1-RELEASE_GH0.tar.gz) = 595723 diff --git a/devel/libdispatch/files/patch-CMakeLists.txt b/devel/libdispatch/files/patch-CMakeLists.txt index 0460f0e62c51..e96f7e93416f 100644 --- a/devel/libdispatch/files/patch-CMakeLists.txt +++ b/devel/libdispatch/files/patch-CMakeLists.txt @@ -1,13 +1,21 @@ ---- CMakeLists.txt.orig 2024-06-13 00:13:26 UTC +--- CMakeLists.txt.orig 2025-03-07 00:50:44 UTC +++ CMakeLists.txt -@@ -187,6 +187,10 @@ endif() - find_package(LibRT) - endif() +@@ -132,6 +132,7 @@ include(SwiftSupport) + include(DispatchCompilerWarnings) + include(DTrace) + include(SwiftSupport) ++include(PkgConfigGeneration) -+if(CMAKE_SYSTEM_NAME STREQUAL FreeBSD) -+ find_package(BlocksRuntime) + # NOTE(abdulras) this is the CMake supported way to control whether we generate + # shared or static libraries. This impacts the behaviour of `add_library` in +@@ -191,6 +192,10 @@ if(NOT CMAKE_SYSTEM_NAME STREQUAL Android) + + if(NOT CMAKE_SYSTEM_NAME STREQUAL Android) + find_package(LibRT) +endif() + ++if(CMAKE_SYSTEM_NAME STREQUAL FreeBSD) ++ find_package(BlocksRuntime) + endif() + check_function_exists(_pthread_workqueue_init HAVE__PTHREAD_WORKQUEUE_INIT) - check_function_exists(getprogname HAVE_GETPROGNAME) - check_function_exists(mach_absolute_time HAVE_MACH_ABSOLUTE_TIME) diff --git a/devel/libdispatch/files/patch-cmake_libdispatch.pc.in b/devel/libdispatch/files/patch-cmake_libdispatch.pc.in new file mode 100644 index 000000000000..b86d582dc54f --- /dev/null +++ b/devel/libdispatch/files/patch-cmake_libdispatch.pc.in @@ -0,0 +1,13 @@ +--- cmake/libdispatch.pc.in.orig 2025-09-12 11:07:41 UTC ++++ cmake/libdispatch.pc.in +@@ -0,0 +1,10 @@ ++prefix=@CMAKE_INSTALL_PREFIX@ ++exec_prefix=${prefix} ++libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@ ++includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ ++ ++Name: libdispatch ++Description: libdispatch (a.k.a. Grand Central Dispatch) ++Version: @PROJECT_VERSION@ ++Libs: -L${libdir} -ldispatch ++Cflags: -I${includedir} diff --git a/devel/libdispatch/files/patch-cmake_modules_PkgConfigGeneration.cmake b/devel/libdispatch/files/patch-cmake_modules_PkgConfigGeneration.cmake new file mode 100644 index 000000000000..7d468a3c2ea9 --- /dev/null +++ b/devel/libdispatch/files/patch-cmake_modules_PkgConfigGeneration.cmake @@ -0,0 +1,21 @@ +--- cmake/modules/PkgConfigGeneration.cmake.orig 2025-09-12 11:07:41 UTC ++++ cmake/modules/PkgConfigGeneration.cmake +@@ -0,0 +1,18 @@ ++#.rst: ++# PkgConfigGeneration ++# ------------------- ++# ++# Generate the pkg-config file for libdispatch. ++# ++# The script generates a pkg-config file on non-Apple UNIX-like systems. ++# ++ ++# Check if the system is UNIX-based and not Apple ++if(UNIX AND NOT APPLE) ++ # Configure the pkg-config file from the template ++ configure_file("${PROJECT_SOURCE_DIR}/cmake/libdispatch.pc.in" ++ "${PROJECT_BINARY_DIR}/libdispatch.pc" @ONLY) ++ ++ # Install the generated pkg-config file to the appropriate directory ++ install(FILES "${PROJECT_BINARY_DIR}/libdispatch.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") ++endif() diff --git a/devel/libdispatch/files/patch-src_CMakeLists.txt b/devel/libdispatch/files/patch-src_CMakeLists.txt index 5774cceae846..2ee9aa26a227 100644 --- a/devel/libdispatch/files/patch-src_CMakeLists.txt +++ b/devel/libdispatch/files/patch-src_CMakeLists.txt @@ -1,30 +1,29 @@ ---- src/CMakeLists.txt.orig 2024-06-13 00:13:26 UTC +--- src/CMakeLists.txt.orig 2025-03-07 00:50:44 UTC +++ src/CMakeLists.txt -@@ -1,6 +1,6 @@ if(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin) +@@ -1,5 +1,5 @@ - if(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin) -- add_subdirectory(BlocksRuntime) -+# add_subdirectory(BlocksRuntime) +-if(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin) ++if(NOT BlocksRuntime_FOUND) + add_subdirectory(BlocksRuntime) endif() - add_library(dispatch @@ -145,7 +145,7 @@ target_compile_options(dispatch PRIVATE -fblocks) # FIXME(compnerd) add check for -fblocks? target_compile_options(dispatch PRIVATE -fblocks) -check_c_compiler_flag("-momit-leaf-frame-pointer -Werror -Wall -O3" C_SUPPORTS_OMIT_LEAF_FRAME_POINTER) +check_c_compiler_flag("-momit-leaf-frame-pointer -Wall" C_SUPPORTS_OMIT_LEAF_FRAME_POINTER) if (C_SUPPORTS_OMIT_LEAF_FRAME_POINTER) target_compile_options(dispatch PRIVATE -momit-leaf-frame-pointer) endif() @@ -176,6 +176,10 @@ if(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin|Windows") if(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin|Windows") set_target_properties(dispatch PROPERTIES INSTALL_RPATH "$ORIGIN") + set_target_properties(dispatch PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + EXPORT_NAME dispatch ) endif() - if(ENABLE_SWIFT) + if(LINKER_SUPPORTS_BUILD_ID) diff --git a/devel/libdispatch/files/patch-src_event_workqueue.c b/devel/libdispatch/files/patch-src_event_workqueue.c index 151e807f356e..edffa17c2efc 100644 --- a/devel/libdispatch/files/patch-src_event_workqueue.c +++ b/devel/libdispatch/files/patch-src_event_workqueue.c @@ -1,55 +1,56 @@ ---- src/event/workqueue.c.orig 2021-09-17 04:54:52 UTC +--- src/event/workqueue.c.orig 2025-03-07 00:50:44 UTC +++ src/event/workqueue.c -@@ -180,6 +180,52 @@ _dispatch_workq_count_runnable_workers(dispatch_workq_ +@@ -247,6 +247,53 @@ _dispatch_workq_count_runnable_workers(dispatch_workq_ _dispatch_unfair_lock_unlock(&mon->registered_tid_lock); } +#elif defined(__FreeBSD__) +#include +#include +#include ++#include + +static void +_dispatch_workq_count_runnable_workers(dispatch_workq_monitor_t mon) +{ -+ struct kinfo_proc kp[WORKQ_MAX_TRACKED_TIDS] = {0}; -+ size_t size, len; -+ int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, (int)getpid(), (int)sizeof(struct kinfo_proc), 0}; -+ if (sysctl(mib, 6, NULL, &size, NULL, 0) < 0) { -+ _dispatch_debug("workq: Failed to sysctl1"); -+ return; ++ struct kinfo_proc kp[WORKQ_MAX_TRACKED_TIDS]; ++ size_t size; ++ int count, runners = 0; ++ int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID | KERN_PROC_INC_THREAD, (int)getpid()}; ++ ++ // get size we need ++ if (sysctl(mib, 4, NULL, &size, NULL, 0) < 0) { ++ _dispatch_debug("workq: failed to get size for kinfo_proc[] from sysctll"); ++ return; ++ } ++ ++ // only care about up to WORKQ_MAX_TRACKED_TIDS threads ++ size = MIN(sizeof(kp), size); ++ ++ if (sysctl(mib, 4, kp, &size, NULL, 0) < 0) { ++ _dispatch_debug("workq: failed to get kinfo_proc[] from sysctl"); ++ return; ++ } ++ ++ count = (int)(size / sizeof(struct kinfo_proc)); ++ ++ _dispatch_unfair_lock_lock(&mon->registered_tid_lock); ++ ++ for (int i = 0; i < mon->num_registered_tids; ++i) { ++ dispatch_tid tid = mon->registered_tids[i]; ++ for (int j = 0; i < count; ++i) { ++ if ((dispatch_tid)kp[j].ki_tid != tid) { continue; } ++ if (kp[j].ki_stat == SRUN || kp[j].ki_stat == SIDL) { ++ ++runners; ++ break; ++ } + } ++ } + -+ size = size > sizeof(kp)? sizeof(kp): size; -+ len = size / sizeof(struct kinfo_proc); -+ mib[5] = (int)len; -+ if (sysctl(mib, 6, kp, &size, NULL, 0) < 0) { -+ _dispatch_debug("workq: Failed to sysctl2"); -+ return; -+ } -+ -+ int running_count = 0; -+ -+ _dispatch_unfair_lock_lock(&mon->registered_tid_lock); -+ -+ for (int i = 0; i < mon->num_registered_tids; i++) { -+ dispatch_tid tid = mon->registered_tids[i]; -+ for (size_t j = 0; j < len; j++) { -+ if ((dispatch_tid)kp[j].p_tid != tid) { -+ continue; -+ } -+ -+ if (kp[j].p_stat == SRUN || kp[j].p_stat == SIDL || kp[j].p_stat == SONPROC) { -+ running_count++; -+ break; -+ } -+ } -+ } -+ -+ mon->num_runnable = running_count; ++ mon->num_runnable = runners; + -+ _dispatch_unfair_lock_unlock(&mon->registered_tid_lock); ++ _dispatch_unfair_lock_unlock(&mon->registered_tid_lock); +} #else #error must define _dispatch_workq_count_runnable_workers #endif diff --git a/devel/libdispatch/files/patch-src_event_workqueue__internal.h b/devel/libdispatch/files/patch-src_event_workqueue__internal.h new file mode 100644 index 000000000000..e393356ad346 --- /dev/null +++ b/devel/libdispatch/files/patch-src_event_workqueue__internal.h @@ -0,0 +1,11 @@ +--- src/event/workqueue_internal.h.orig 2025-03-07 00:50:44 UTC ++++ src/event/workqueue_internal.h +@@ -30,7 +30,7 @@ void _dispatch_workq_worker_unregister(dispatch_queue_ + void _dispatch_workq_worker_register(dispatch_queue_global_t root_q); + void _dispatch_workq_worker_unregister(dispatch_queue_global_t root_q); + +-#if defined(__linux__) || defined(_WIN32) ++#if defined(__linux__) || defined(_WIN32) || defined(__FreeBSD__) + #define HAVE_DISPATCH_WORKQ_MONITORING 1 + #else + #define HAVE_DISPATCH_WORKQ_MONITORING 0 diff --git a/devel/libdispatch/files/patch-src_internal.h b/devel/libdispatch/files/patch-src_internal.h index f36de567dc00..d2ca8a141670 100644 --- a/devel/libdispatch/files/patch-src_internal.h +++ b/devel/libdispatch/files/patch-src_internal.h @@ -1,15 +1,25 @@ ---- src/internal.h.orig 2021-09-17 04:54:52 UTC +--- src/internal.h.orig 2025-03-07 00:50:44 UTC +++ src/internal.h -@@ -475,12 +475,10 @@ struct dispatch_unote_class_s; +@@ -277,6 +277,9 @@ upcast(dispatch_object_t dou) + #include + #include + #endif ++#if defined(__FreeBSD__) ++#include ++#endif // __FreeBSD__ + #include + #include + #include +@@ -475,12 +478,10 @@ struct dispatch_unote_class_s; struct dispatch_unote_class_s; -#if HAVE_MACH DISPATCH_NOINLINE DISPATCH_COLD void _dispatch_bug_kevent_client(const char *msg, const char *filter, const char *operation, int err, uint64_t ident, uint64_t udata, struct dispatch_unote_class_s *du); -#endif // HAVE_MACH DISPATCH_NOINLINE DISPATCH_COLD void _dispatch_bug_kevent_vanished(struct dispatch_unote_class_s *du); diff --git a/devel/libdispatch/files/patch-src_shims_lock.c b/devel/libdispatch/files/patch-src_shims_lock.c index 3fafcc2344e7..f54778de96ac 100644 --- a/devel/libdispatch/files/patch-src_shims_lock.c +++ b/devel/libdispatch/files/patch-src_shims_lock.c @@ -1,119 +1,121 @@ ---- src/shims/lock.c.orig 2023-06-15 00:55:45 UTC +--- src/shims/lock.c.orig 2025-03-07 00:50:44 UTC +++ src/shims/lock.c -@@ -56,6 +56,18 @@ _dispatch_thread_switch(dispatch_lock value, dispatch_ +@@ -56,6 +56,20 @@ _dispatch_thread_switch(dispatch_lock value, dispatch_ #endif #endif +#if defined(__unix__) ++#if !HAVE_UL_UNFAIR_LOCK +DISPATCH_ALWAYS_INLINE +static inline void +_dispatch_thread_switch(dispatch_lock value, dispatch_lock_options_t flags, + uint32_t timeout) +{ + (void)value; + (void)flags; + (void)timeout; +} ++#endif // HAVE_UL_UNFAIR_LOCK +#endif + #pragma mark - semaphores #if USE_MACH_SEM -@@ -395,8 +407,10 @@ _dispatch_unfair_lock_wake(uint32_t *uaddr, uint32_t f +@@ -395,8 +409,10 @@ _dispatch_unfair_lock_wake(uint32_t *uaddr, uint32_t f #include #ifdef __ANDROID__ #include -#else +#elif __linux__ #include +#else +#include #endif /* __ANDROID__ */ DISPATCH_ALWAYS_INLINE -@@ -405,7 +419,12 @@ _dispatch_futex(uint32_t *uaddr, int op, uint32_t val, +@@ -405,7 +421,12 @@ _dispatch_futex(uint32_t *uaddr, int op, uint32_t val, const struct timespec *timeout, uint32_t *uaddr2, uint32_t val3, int opflags) { +#if __linux__ return (int)syscall(SYS_futex, uaddr, op | opflags, val, timeout, uaddr2, val3); +#else + (void)val3; + return futex(uaddr, op | opflags, (int)val, timeout, uaddr2); +#endif } // returns 0, ETIMEDOUT, EFAULT, EINTR, EWOULDBLOCK -@@ -415,11 +434,15 @@ _futex_blocking_op(uint32_t *uaddr, int futex_op, uint +@@ -415,11 +436,15 @@ _futex_blocking_op(uint32_t *uaddr, int futex_op, uint const struct timespec *timeout, int flags) { for (;;) { - int rc = _dispatch_futex(uaddr, futex_op, val, timeout, NULL, 0, flags); - if (!rc) { + int err = _dispatch_futex(uaddr, futex_op, val, timeout, NULL, 0, flags); + if (!err) { return 0; } - switch (errno) { +#if __linux__ + // syscall sets errno to communicate error code. + err = errno +#endif + switch (err) { case EINTR: /* * if we have a timeout, we need to return for the caller to -@@ -455,6 +478,7 @@ _dispatch_futex_wake(uint32_t *uaddr, int wake, int op +@@ -455,6 +480,7 @@ _dispatch_futex_wake(uint32_t *uaddr, int wake, int op DISPATCH_INTERNAL_CRASH(errno, "_dlock_wake() failed"); } +#if HAVE_FUTEX_PI static void _dispatch_futex_lock_pi(uint32_t *uaddr, struct timespec *timeout, int detect, int opflags) -@@ -472,6 +496,7 @@ _dispatch_futex_unlock_pi(uint32_t *uaddr, int opflags +@@ -472,6 +498,7 @@ _dispatch_futex_unlock_pi(uint32_t *uaddr, int opflags if (rc == 0) return; DISPATCH_CLIENT_CRASH(errno, "futex_unlock_pi() failed"); } +#endif #endif #pragma mark - wait for address -@@ -516,6 +541,19 @@ _dispatch_wait_on_address(uint32_t volatile *_address, +@@ -516,6 +543,19 @@ _dispatch_wait_on_address(uint32_t volatile *_address, ? INFINITE : ((nsecs + 1000000) / 1000000); if (dwMilliseconds == 0) return ETIMEDOUT; return WaitOnAddress(address, &value, sizeof(value), dwMilliseconds) == TRUE; +#elif defined(__FreeBSD__) + uint64_t usecs = 0; + int rc; + if (nsecs == DISPATCH_TIME_FOREVER) { + return _dispatch_ulock_wait(address, value, 0, flags); + } + do { + usecs = howmany(nsecs, NSEC_PER_USEC); + if (usecs > UINT32_MAX) usecs = UINT32_MAX; + rc = _dispatch_ulock_wait(address, value, (uint32_t)usecs, flags); + } while (usecs == UINT32_MAX && rc == ETIMEDOUT && + (nsecs = _dispatch_timeout(timeout)) != 0); + return rc; #else #error _dispatch_wait_on_address unimplemented for this platform #endif -@@ -606,7 +644,7 @@ _dispatch_unfair_lock_lock_slow(dispatch_unfair_lock_t +@@ -606,7 +646,7 @@ _dispatch_unfair_lock_lock_slow(dispatch_unfair_lock_t } } } -#elif HAVE_FUTEX +#elif HAVE_FUTEX_PI void _dispatch_unfair_lock_lock_slow(dispatch_unfair_lock_t dul, dispatch_lock_options_t flags) -@@ -643,7 +681,7 @@ _dispatch_unfair_lock_unlock_slow(dispatch_unfair_lock +@@ -643,7 +683,7 @@ _dispatch_unfair_lock_unlock_slow(dispatch_unfair_lock if (_dispatch_lock_has_waiters(cur)) { _dispatch_unfair_lock_wake(&dul->dul_lock, 0); } -#elif HAVE_FUTEX +#elif HAVE_FUTEX_PI // futex_unlock_pi() handles both OWNER_DIED which we abuse & WAITERS _dispatch_futex_unlock_pi(&dul->dul_lock, FUTEX_PRIVATE_FLAG); #else diff --git a/devel/libdispatch/files/patch-src_shims_lock.h b/devel/libdispatch/files/patch-src_shims_lock.h index 75d1230dcf5e..6e61fd9faafa 100644 --- a/devel/libdispatch/files/patch-src_shims_lock.h +++ b/devel/libdispatch/files/patch-src_shims_lock.h @@ -1,45 +1,49 @@ ---- src/shims/lock.h.orig 2021-09-17 04:54:52 UTC +--- src/shims/lock.h.orig 2025-03-07 00:50:44 UTC +++ src/shims/lock.h -@@ -100,6 +100,25 @@ _dispatch_lock_owner(dispatch_lock lock_value) +@@ -100,6 +100,29 @@ _dispatch_lock_owner(dispatch_lock lock_value) return lock_value & DLOCK_OWNER_MASK; } +#elif defined(__FreeBSD__) + ++#include ++#include ++#include ++ +typedef uint32_t dispatch_tid; +typedef uint32_t dispatch_lock; + +#define DLOCK_OWNER_NULL ((dispatch_tid)0) +#define DLOCK_OWNER_MASK ((dispatch_lock)0xfffffffc) +#define DLOCK_WAITERS_BIT ((dispatch_lock)0x00000001) +#define DLOCK_FAILED_TRYLOCK_BIT ((dispatch_lock)0x00000002) + +#define _dispatch_tid_self() ((dispatch_tid)(_dispatch_get_tsd_base()->tid)) + +DISPATCH_ALWAYS_INLINE +static inline dispatch_tid +_dispatch_lock_owner(dispatch_lock lock_value) +{ + return lock_value & DLOCK_OWNER_MASK; +} + #else # error define _dispatch_lock encoding scheme for your platform here #endif -@@ -167,10 +186,15 @@ _dispatch_lock_has_failed_trylock(dispatch_lock lock_v +@@ -167,10 +190,15 @@ _dispatch_lock_has_failed_trylock(dispatch_lock lock_v #endif #ifndef HAVE_FUTEX -#ifdef __linux__ +#if defined(__linux__) #define HAVE_FUTEX 1 +#define HAVE_FUTEX_PI 1 +#elif defined(__FreeBSD__) +#define HAVE_FUTEX 0 +#define HAVE_FUTEX_PI 0 #else #define HAVE_FUTEX 0 +#define HAVE_FUTEX_PI 0 #endif #endif // HAVE_FUTEX diff --git a/devel/libdispatch/pkg-plist b/devel/libdispatch/pkg-plist index 5443b321d338..6458afaf907b 100644 --- a/devel/libdispatch/pkg-plist +++ b/devel/libdispatch/pkg-plist @@ -1,38 +1,39 @@ @comment include/Block.h include/dispatch/base.h include/dispatch/block.h include/dispatch/data.h include/dispatch/dispatch.h include/dispatch/group.h include/dispatch/introspection.h include/dispatch/io.h include/dispatch/object.h include/dispatch/once.h include/dispatch/queue.h include/dispatch/semaphore.h include/dispatch/source.h include/dispatch/time.h include/os/generic_base.h include/os/generic_unix_base.h include/os/generic_win_base.h include/os/object.h @comment lib/libBlocksRuntime.so lib/libdispatch.so lib/libdispatch.so.1 lib/libdispatch.so.1.3 +libdata/pkgconfig/libdispatch.pc share/man/man3/dispatch.3.gz share/man/man3/dispatch_after.3.gz share/man/man3/dispatch_api.3.gz share/man/man3/dispatch_apply.3.gz share/man/man3/dispatch_async.3.gz share/man/man3/dispatch_data_create.3.gz share/man/man3/dispatch_group_create.3.gz share/man/man3/dispatch_io_create.3.gz share/man/man3/dispatch_io_read.3.gz share/man/man3/dispatch_object.3.gz share/man/man3/dispatch_once.3.gz share/man/man3/dispatch_queue_create.3.gz share/man/man3/dispatch_read.3.gz share/man/man3/dispatch_semaphore_create.3.gz share/man/man3/dispatch_source_create.3.gz share/man/man3/dispatch_time.3.gz