From b55398ed930b2a796177ca85964409460d25cbf7 Mon Sep 17 00:00:00 2001 From: Michael Chiu Date: Tue, 21 Jan 2025 14:04:16 -0800 Subject: [PATCH 1/4] fix freebsd build --- cmake/modules/SwiftSupport.cmake | 2 ++ private/private.h | 4 ++- src/event/event_kevent.c | 18 ++++++++--- src/event/workqueue.c | 45 ++++++++++++++++++++++++++ src/event/workqueue_internal.h | 2 +- src/init.c | 2 +- src/internal.h | 3 ++ src/io.c | 1 - src/queue.c | 32 ++++++++++++++++++ src/shims/lock.c | 29 ++++++++++++++++- src/shims/lock.h | 22 +++++++++++++ src/swift/Source.swift | 14 ++++++-- src/swift/Wrapper.swift | 8 +++-- src/swift/shims/DispatchOverlayShims.h | 5 +++ tests/bsdtestharness.c | 4 +-- tests/dispatch_apply.c | 2 +- tests/dispatch_io_pipe.c | 4 +++ tests/dispatch_select.c | 2 +- 18 files changed, 182 insertions(+), 17 deletions(-) diff --git a/cmake/modules/SwiftSupport.cmake b/cmake/modules/SwiftSupport.cmake index a42b61e40..a82842ef9 100644 --- a/cmake/modules/SwiftSupport.cmake +++ b/cmake/modules/SwiftSupport.cmake @@ -27,6 +27,8 @@ function(get_swift_host_arch result_var_name) set("${result_var_name}" "armv7" PARENT_SCOPE) elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7l") set("${result_var_name}" "armv7" PARENT_SCOPE) + elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "amd64") + set("${result_var_name}" "x86_64" PARENT_SCOPE) elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64") set("${result_var_name}" "x86_64" PARENT_SCOPE) elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "IA64") diff --git a/private/private.h b/private/private.h index b87f5dc2b..8f9922c31 100644 --- a/private/private.h +++ b/private/private.h @@ -189,8 +189,10 @@ void _dispatch_prohibit_transition_to_multithreaded(bool prohibit); #if TARGET_OS_MAC typedef mach_port_t dispatch_runloop_handle_t; -#elif defined(__linux__) || defined(__FreeBSD__) +#elif defined(__linux__) typedef int dispatch_runloop_handle_t; +#elif defined(__FreeBSD__) +typedef uint64_t dispatch_runloop_handle_t; #elif defined(_WIN32) typedef void *dispatch_runloop_handle_t; #else diff --git a/src/event/event_kevent.c b/src/event/event_kevent.c index 16b69b37d..16cc6cbf4 100644 --- a/src/event/event_kevent.c +++ b/src/event/event_kevent.c @@ -389,8 +389,13 @@ _dispatch_kevent_print_error(dispatch_kevent_t ke) case 0: return; case ERANGE: /* A broken QoS was passed to kevent_id() */ +#if defined(__APPLE__) DISPATCH_INTERNAL_CRASH(ke->qos, "Invalid kevent priority"); +#else + DISPATCH_INTERNAL_CRASH(0, "Invalid kevent priority"); +#endif default: +#if HAVE_MACH // log the unexpected error _dispatch_bug_kevent_client("kevent", _evfiltstr(ke->filter), !ke->udata ? NULL : @@ -398,6 +403,9 @@ _dispatch_kevent_print_error(dispatch_kevent_t ke) ke->flags & EV_ADD ? "add" : ke->flags & EV_ENABLE ? "enable" : "monitor", (int)ke->data, ke->ident, ke->udata, du); +#else + break; +#endif } } @@ -591,7 +599,6 @@ _dispatch_kq_create(intptr_t *fd_ptr) guardid_t guard = (uintptr_t)fd_ptr; kqfd = guarded_kqueue_np(&guard, GUARD_CLOSE | GUARD_DUP); #else - (void)guard_ptr; kqfd = kqueue(); #endif if (kqfd == -1) { @@ -743,7 +750,7 @@ _dispatch_kq_poll(dispatch_wlh_t wlh, dispatch_kevent_t ke, int n, switch (err) { case ENOMEM: _dispatch_temporary_resource_shortage(); - /* FALLTHROUGH */ + DISPATCH_FALLTHROUGH; case EINTR: goto retry; case EBADF: @@ -754,7 +761,7 @@ _dispatch_kq_poll(dispatch_wlh_t wlh, dispatch_kevent_t ke, int n, (flags & KEVENT_FLAG_DYNAMIC_KQ_MUST_EXIST)) { return 0; } - /* FALLTHROUGH */ + DISPATCH_FALLTHROUGH; #endif // DISPATCH_USE_KEVENT_WORKLOOP default: DISPATCH_CLIENT_CRASH(err, "Unexpected error from kevent"); @@ -860,7 +867,6 @@ _dispatch_kq_unote_set_kevent(dispatch_unote_t _du, dispatch_kevent_t dk, du->du_priority), #endif }; - (void)pp; // if DISPATCH_USE_KEVENT_QOS == 0 } DISPATCH_ALWAYS_INLINE @@ -985,6 +991,7 @@ _dispatch_sync_ipc_handoff_end(dispatch_wlh_t wlh, mach_port_t port) } #endif +#if DISPATCH_HAVE_DIRECT_KNOTES DISPATCH_NOINLINE static bool _dispatch_kq_unote_update(dispatch_wlh_t wlh, dispatch_unote_t _du, @@ -1055,6 +1062,7 @@ _dispatch_kq_unote_update(dispatch_wlh_t wlh, dispatch_unote_t _du, dispatch_assume_zero(r); return true; } +#endif // DISPATCH_HAVE_DIRECT_KNOTES #pragma mark dispatch_muxnote_t @@ -1300,6 +1308,7 @@ enum { DISPATCH_WORKLOOP_SYNC_END, }; +#if DISPATCH_USE_KEVENT_WORKLOOP static char const * const _dispatch_workloop_actions[] = { [DISPATCH_WORKLOOP_ASYNC] = "async", [DISPATCH_WORKLOOP_ASYNC_FROM_SYNC] = "async (from sync)", @@ -1316,6 +1325,7 @@ static char const * const _dispatch_workloop_actions[] = { [DISPATCH_WORKLOOP_SYNC_WAKE] = "sync-wake", [DISPATCH_WORKLOOP_SYNC_END] = "sync-end", }; +#endif // DISPATCH_USE_KEVENT_WORKLOOP void _dispatch_event_loop_atfork_child(void) diff --git a/src/event/workqueue.c b/src/event/workqueue.c index 749b0a452..7c85cfb02 100644 --- a/src/event/workqueue.c +++ b/src/event/workqueue.c @@ -247,6 +247,51 @@ _dispatch_workq_count_runnable_workers(dispatch_workq_monitor_t mon) _dispatch_unfair_lock_unlock(&mon->registered_tid_lock); } +#elif defined(__FreeBSD__) +#include +#include +#include + +static void +_dispatch_workq_count_runnable_workers(dispatch_workq_monitor_t mon) +{ + 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 = size > sizeof(kp) ? sizeof(kp) : size; + count = (int)(size / sizeof(struct kinfo_proc)); + + if (sysctl(mib, 4, kp, &size, NULL, 0) < 0) { + _dispatch_debug("workq: failed to get kinfo_proc[] from sysctl"); + return; + } + + _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; + } + } + } + + mon->num_runnable = runners; + + _dispatch_unfair_lock_unlock(&mon->registered_tid_lock); +} #else #error must define _dispatch_workq_count_runnable_workers #endif diff --git a/src/event/workqueue_internal.h b/src/event/workqueue_internal.h index 62028077a..4b3839dea 100644 --- a/src/event/workqueue_internal.h +++ b/src/event/workqueue_internal.h @@ -30,7 +30,7 @@ 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/src/init.c b/src/init.c index d54da4121..6e1ff6882 100644 --- a/src/init.c +++ b/src/init.c @@ -1051,7 +1051,7 @@ _dispatch_bug_kevent_vanished(dispatch_unote_t du) "{ %p[%s], ident: %" PRIdPTR " / 0x%" PRIxPTR ", handler: %p }", dux_type(du._du)->dst_kind, dou._dq, dou._dq->dq_label ? dou._dq->dq_label : "", - du._du->du_ident, du._du->du_ident, func); + (intptr_t)du._du->du_ident, (intptr_t)du._du->du_ident, func); } #endif // RDAR_49023449 diff --git a/src/internal.h b/src/internal.h index 4df1a2976..36f4b8864 100644 --- a/src/internal.h +++ b/src/internal.h @@ -277,6 +277,9 @@ upcast(dispatch_object_t dou) #include #include #endif +#if defined(__FreeBSD__) +#include +#endif // __FreeBSD__ #include #include #include diff --git a/src/io.c b/src/io.c index e31e28c82..7be7de728 100644 --- a/src/io.c +++ b/src/io.c @@ -22,7 +22,6 @@ #if defined(__FreeBSD__) #include -#define F_RDADVISE F_RDAHEAD #endif #ifndef DISPATCH_IO_DEBUG diff --git a/src/queue.c b/src/queue.c index 40f059c7a..b018094ad 100644 --- a/src/queue.c +++ b/src/queue.c @@ -6474,6 +6474,8 @@ _dispatch_runloop_handle_is_valid(dispatch_runloop_handle_t handle) return MACH_PORT_VALID(handle); #elif defined(__linux__) return handle >= 0; +#elif defined(__FreeBSD__) + return handle > 0; #elif defined(_WIN32) return handle != NULL; #else @@ -6490,6 +6492,8 @@ _dispatch_runloop_queue_get_handle(dispatch_lane_t dq) #elif defined(__linux__) // decode: 0 is a valid fd, so offset by 1 to distinguish from NULL return ((dispatch_runloop_handle_t)(uintptr_t)dq->do_ctxt) - 1; +#elif defined(__FreeBSD__) + return (dispatch_runloop_handle_t)(uintptr_t)dq->do_ctxt; #elif defined(_WIN32) return ((dispatch_runloop_handle_t)(uintptr_t)dq->do_ctxt); #else @@ -6507,6 +6511,8 @@ _dispatch_runloop_queue_set_handle(dispatch_lane_t dq, #elif defined(__linux__) // encode: 0 is a valid fd, so offset by 1 to distinguish from NULL dq->do_ctxt = (void *)(uintptr_t)(handle + 1); +#elif defined(__FreeBSD__) + dq->do_ctxt = (void *)(uintptr_t)handle; #elif defined(_WIN32) dq->do_ctxt = (void *)(uintptr_t)handle; #else @@ -6514,6 +6520,12 @@ _dispatch_runloop_queue_set_handle(dispatch_lane_t dq, #endif } +#if defined(__unix__) +#define DISPATCH_RUNLOOP_HANDLE_PACK(rfd, wfd) (((uint64_t)(rfd) << 32) | (wfd)) +#define DISPATCH_RUNLOOP_HANDLE_RFD(h) ((int)((h) >> 32)) +#define DISPATCH_RUNLOOP_HANDLE_WFD(h) ((int)((h) & 0xffffffff)) +#endif + static void _dispatch_runloop_queue_handle_init(void *ctxt) { @@ -6563,6 +6575,14 @@ _dispatch_runloop_queue_handle_init(void *ctxt) } } handle = fd; +#elif defined(__unix__) && !defined(__linux__) + int fds[2]; + int r = pipe2(fds, O_CLOEXEC | O_NONBLOCK); + if (r == -1) { + DISPATCH_CLIENT_CRASH(errno, "pipe2 failure"); + } + uint32_t rfd = (uint32_t)fds[0], wfd = (uint32_t)fds[1]; + handle = DISPATCH_RUNLOOP_HANDLE_PACK(rfd, wfd); #elif defined(_WIN32) HANDLE hEvent; hEvent = CreateEventW(NULL, /*bManualReset=*/FALSE, @@ -6597,6 +6617,11 @@ _dispatch_runloop_queue_handle_dispose(dispatch_lane_t dq) #elif defined(__linux__) int rc = close(handle); (void)dispatch_assume_zero(rc); +#elif defined(__unix__) && !defined(__linux__) + int rc = close(DISPATCH_RUNLOOP_HANDLE_WFD(handle)); + (void)dispatch_assume_zero(rc); + rc = close(DISPATCH_RUNLOOP_HANDLE_RFD(handle)); + (void)dispatch_assume_zero(rc); #elif defined(_WIN32) BOOL bSuccess; bSuccess = CloseHandle(handle); @@ -6633,6 +6658,13 @@ _dispatch_runloop_queue_class_poke(dispatch_lane_t dq) result = eventfd_write(handle, 1); } while (result == -1 && errno == EINTR); (void)dispatch_assume_zero(result); +#elif defined(__unix__) && !defined(__linux__) + int wfd = DISPATCH_RUNLOOP_HANDLE_WFD(handle); + ssize_t result; + do { + result = write(wfd, "x", 1); + } while (result == -1 && errno == EINTR); + (void)dispatch_assume_zero(result - 1); #elif defined(_WIN32) BOOL bSuccess; bSuccess = SetEvent(handle); diff --git a/src/shims/lock.c b/src/shims/lock.c index 88fb8f8b6..dd705078f 100644 --- a/src/shims/lock.c +++ b/src/shims/lock.c @@ -56,6 +56,21 @@ _dispatch_thread_switch(dispatch_lock value, dispatch_lock_options_t flags, #endif #endif +#if defined(__FreeBSD__) +#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; + sched_yield(); +} +#endif +#endif + #pragma mark - semaphores #if USE_MACH_SEM @@ -516,6 +531,16 @@ _dispatch_wait_on_address(uint32_t volatile *_address, uint32_t value, ? INFINITE : ((nsecs + 1000000) / 1000000); if (dwMilliseconds == 0) return ETIMEDOUT; return WaitOnAddress(address, &value, sizeof(value), dwMilliseconds) == TRUE; +#elif defined(__FreeBSD__) + (void)flags; + if (nsecs != DISPATCH_TIME_FOREVER) { + struct timespec ts = { + .tv_sec = (__typeof__(ts.tv_sec))(nsecs / NSEC_PER_SEC), + .tv_nsec = (__typeof__(ts.tv_nsec))(nsecs % NSEC_PER_SEC), + }; + return _umtx_op((void*)address, UMTX_OP_WAIT_UINT, value, (void*)(uintptr_t)sizeof(struct timespec), (void*)&ts); + } + return _umtx_op((void*)address, UMTX_OP_WAIT_UINT, value, 0, 0); #else #error _dispatch_wait_on_address unimplemented for this platform #endif @@ -530,6 +555,8 @@ _dispatch_wake_by_address(uint32_t volatile *address) _dispatch_futex_wake((uint32_t *)address, INT_MAX, FUTEX_PRIVATE_FLAG); #elif defined(_WIN32) WakeByAddressAll((uint32_t *)address); +#elif defined(__FreeBSD__) + _umtx_op((void*)address, UMTX_OP_WAKE, INT_MAX, 0, 0); #else (void)address; #endif @@ -689,7 +716,7 @@ _dispatch_once_wait(dispatch_once_gate_t dgo) _dispatch_futex_wait(lock, (dispatch_lock)new_v, NULL, FUTEX_PRIVATE_FLAG); #else - _dispatch_thread_switch(new_v, 0, timeout++); + _dispatch_thread_switch((dispatch_lock)new_v, 0, timeout++); #endif (void)timeout; } diff --git a/src/shims/lock.h b/src/shims/lock.h index 6bf825aa7..0e45eb345 100644 --- a/src/shims/lock.h +++ b/src/shims/lock.h @@ -79,6 +79,28 @@ _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 << 2)) + +DISPATCH_ALWAYS_INLINE +static inline dispatch_tid +_dispatch_lock_owner(dispatch_lock lock_value) +{ + return lock_value & DLOCK_OWNER_MASK; +} + #elif defined(_WIN32) #include diff --git a/src/swift/Source.swift b/src/swift/Source.swift index 57677c2c2..44c8b6011 100644 --- a/src/swift/Source.swift +++ b/src/swift/Source.swift @@ -124,8 +124,17 @@ extension DispatchSource { public static let exit = ProcessEvent(rawValue: 0x80000000) public static let fork = ProcessEvent(rawValue: 0x40000000) public static let exec = ProcessEvent(rawValue: 0x20000000) +#if os(FreeBSD) + public static let track = ProcessEvent(rawValue: 0x00000001) +#else public static let signal = ProcessEvent(rawValue: 0x08000000) +#endif + +#if os(FreeBSD) + public static let all: ProcessEvent = [.exit, .fork, .exec, .track] +#else public static let all: ProcessEvent = [.exit, .fork, .exec, .signal] +#endif } #endif @@ -224,7 +233,7 @@ extension DispatchSource { return DispatchSource(source: source) as DispatchSourceUserDataReplace } -#if !os(Linux) && !os(Android) && !os(Windows) +#if !os(Linux) && !os(Android) && !os(Windows) && !os(FreeBSD) public class func makeFileSystemObjectSource(fileDescriptor: Int32, eventMask: FileSystemEvent, queue: DispatchQueue? = nil) -> DispatchSourceFileSystemObject { let source = dispatch_source_create(_swift_dispatch_source_type_VNODE(), UInt(fileDescriptor), eventMask.rawValue, queue?.__wrapped) return DispatchSource(source: source) as DispatchSourceFileSystemObject @@ -293,7 +302,8 @@ extension DispatchSourceMemoryPressure { #if !os(Linux) && !os(Android) && !os(Windows) extension DispatchSourceProcess { public var handle: pid_t { - return pid_t(dispatch_source_get_handle(self as! DispatchSource)) + return pid_t((self as! DispatchSource).handle) +// return pid_t(dispatch_source_get_handle(self as! DispatchSource)) } public var data: DispatchSource.ProcessEvent { diff --git a/src/swift/Wrapper.swift b/src/swift/Wrapper.swift index 999c22d6c..c57a29b77 100644 --- a/src/swift/Wrapper.swift +++ b/src/swift/Wrapper.swift @@ -183,8 +183,12 @@ extension DispatchSource : DispatchSourceMachSend, #endif #if !os(Linux) && !os(Android) && !os(Windows) -extension DispatchSource : DispatchSourceProcess, - DispatchSourceFileSystemObject { +extension DispatchSource : DispatchSourceProcess { +} +#endif + +#if !os(Linux) && !os(Android) && !os(Windows) && !os(FreeBSD) +extension DispatchSource : DispatchSourceFileSystemObject { } #endif diff --git a/src/swift/shims/DispatchOverlayShims.h b/src/swift/shims/DispatchOverlayShims.h index 80e87a8db..222ac7456 100644 --- a/src/swift/shims/DispatchOverlayShims.h +++ b/src/swift/shims/DispatchOverlayShims.h @@ -88,6 +88,11 @@ SWIFT_DISPATCH_SOURCE_TYPE(PROC) SWIFT_DISPATCH_SOURCE_TYPE(VNODE) #endif +#if defined(__FreeBSD__) +SWIFT_DISPATCH_SOURCE_TYPE(PROC) +//SWIFT_DISPATCH_SOURCE_TYPE(VNODE) +#endif + extern void _swift_dispatch_source_create_abort(void); diff --git a/tests/bsdtestharness.c b/tests/bsdtestharness.c index 93ed8324b..d59d9356b 100644 --- a/tests/bsdtestharness.c +++ b/tests/bsdtestharness.c @@ -144,7 +144,7 @@ main(int argc, char *argv[]) //fprintf(stderr, "pid = %d\n", pid); assert(pid > 0); -#if defined(__linux__) +#if defined(__linux__) || defined(__FreeBSD__) int status; struct rusage usage; struct timeval tv_stop, tv_wall; @@ -211,7 +211,7 @@ main(int argc, char *argv[]) #else dispatch_queue_t main_q = dispatch_get_main_queue(); - dispatch_source_t tmp_ds = dispatch_source_create(DISPATCH_SOURCE_TYPE_PROC, pid, DISPATCH_PROC_EXIT, main_q); + dispatch_source_t tmp_ds = dispatch_source_create(DISPATCH_SOURCE_TYPE_PROC, (uintptr_t)pid, DISPATCH_PROC_EXIT, main_q); assert(tmp_ds); dispatch_source_set_event_handler(tmp_ds, ^{ int status; diff --git a/tests/dispatch_apply.c b/tests/dispatch_apply.c index 1f2dfb470..01b3dfb65 100644 --- a/tests/dispatch_apply.c +++ b/tests/dispatch_apply.c @@ -81,7 +81,7 @@ static void busythread(void *ignored) static void test_apply_contended(dispatch_queue_t dq) { uint32_t activecpu; -#if defined(__linux__) || defined(__OpenBSD__) +#if defined(__linux__) || defined(__OpenBSD__) || defined(__FreeBSD__) activecpu = (uint32_t)sysconf(_SC_NPROCESSORS_ONLN); #elif defined(_WIN32) SYSTEM_INFO si; diff --git a/tests/dispatch_io_pipe.c b/tests/dispatch_io_pipe.c index f94438483..90c212236 100644 --- a/tests/dispatch_io_pipe.c +++ b/tests/dispatch_io_pipe.c @@ -90,6 +90,10 @@ test_get_pipe_buffer_size(int kind) CloseHandle(write_handle); }); return size; +#elif defined(__FreeBSD__) + // buffer size of blocking and non-blocking pipes is different on FreeBSD + (void)kind; + return PIPE_BUF; #else (void)kind; static dispatch_once_t once; diff --git a/tests/dispatch_select.c b/tests/dispatch_select.c index 6202711cb..b0758707d 100644 --- a/tests/dispatch_select.c +++ b/tests/dispatch_select.c @@ -39,7 +39,7 @@ void finish(void* cxt); void stage1(int stage) { -#if defined(_WIN32) +#if defined(_WIN32) || defined(__FreeBSD__) char *path = dispatch_test_get_large_file(); dispatch_fd_t fd = dispatch_test_fd_open(path, O_RDONLY); if (fd == -1) From 4faf129da445322595490fa5867b79bec8f62f97 Mon Sep 17 00:00:00 2001 From: Michael Chiu Date: Wed, 22 Jan 2025 14:37:10 -0800 Subject: [PATCH 2/4] fix infinite loop --- src/swift/Source.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/swift/Source.swift b/src/swift/Source.swift index 44c8b6011..7b3f4b768 100644 --- a/src/swift/Source.swift +++ b/src/swift/Source.swift @@ -302,8 +302,7 @@ extension DispatchSourceMemoryPressure { #if !os(Linux) && !os(Android) && !os(Windows) extension DispatchSourceProcess { public var handle: pid_t { - return pid_t((self as! DispatchSource).handle) -// return pid_t(dispatch_source_get_handle(self as! DispatchSource)) + return pid_t(CDispatch.dispatch_source_get_handle((self as! DispatchSource).__wrapped)) } public var data: DispatchSource.ProcessEvent { From a1c8b4743d432b9148c3ee676122114a4b846ac3 Mon Sep 17 00:00:00 2001 From: Michael Chiu Date: Wed, 22 Jan 2025 14:58:36 -0800 Subject: [PATCH 3/4] formatting --- src/queue.c | 1 + src/shims/lock.c | 2 +- src/shims/lock.h | 2 +- src/swift/shims/DispatchOverlayShims.h | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/queue.c b/src/queue.c index b018094ad..2daaf8758 100644 --- a/src/queue.c +++ b/src/queue.c @@ -6576,6 +6576,7 @@ _dispatch_runloop_queue_handle_init(void *ctxt) } handle = fd; #elif defined(__unix__) && !defined(__linux__) + // swift-corelib-foundation PR #3004 implemented a pipe based queue handle int fds[2]; int r = pipe2(fds, O_CLOEXEC | O_NONBLOCK); if (r == -1) { diff --git a/src/shims/lock.c b/src/shims/lock.c index dd705078f..27987b58a 100644 --- a/src/shims/lock.c +++ b/src/shims/lock.c @@ -556,7 +556,7 @@ _dispatch_wake_by_address(uint32_t volatile *address) #elif defined(_WIN32) WakeByAddressAll((uint32_t *)address); #elif defined(__FreeBSD__) - _umtx_op((void*)address, UMTX_OP_WAKE, INT_MAX, 0, 0); + _umtx_op((void*)address, UMTX_OP_WAKE, INT_MAX, 0, 0); #else (void)address; #endif diff --git a/src/shims/lock.h b/src/shims/lock.h index 0e45eb345..bcbf812ce 100644 --- a/src/shims/lock.h +++ b/src/shims/lock.h @@ -92,7 +92,7 @@ typedef uint32_t dispatch_lock; #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 << 2)) +#define _dispatch_tid_self() ((dispatch_tid)(_dispatch_get_tsd_base()->tid << 2)) DISPATCH_ALWAYS_INLINE static inline dispatch_tid diff --git a/src/swift/shims/DispatchOverlayShims.h b/src/swift/shims/DispatchOverlayShims.h index 222ac7456..5ed8dd228 100644 --- a/src/swift/shims/DispatchOverlayShims.h +++ b/src/swift/shims/DispatchOverlayShims.h @@ -90,7 +90,7 @@ SWIFT_DISPATCH_SOURCE_TYPE(VNODE) #if defined(__FreeBSD__) SWIFT_DISPATCH_SOURCE_TYPE(PROC) -//SWIFT_DISPATCH_SOURCE_TYPE(VNODE) +SWIFT_DISPATCH_SOURCE_TYPE(VNODE) #endif extern void From d5cd841f2047971b06c8009524b7ad6fe644ede3 Mon Sep 17 00:00:00 2001 From: "(null)" Date: Mon, 17 Mar 2025 12:51:37 -0400 Subject: [PATCH 4/4] indentation fix --- src/event/workqueue.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/event/workqueue.c b/src/event/workqueue.c index 7c85cfb02..b06e03347 100644 --- a/src/event/workqueue.c +++ b/src/event/workqueue.c @@ -257,7 +257,7 @@ _dispatch_workq_count_runnable_workers(dispatch_workq_monitor_t mon) { struct kinfo_proc kp[WORKQ_MAX_TRACKED_TIDS]; size_t size; - int count, runners = 0; + int count, runners = 0; int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID | KERN_PROC_INC_THREAD, (int)getpid()}; // get size we need