From b2d4c6188d4df09a34c0dbd33507c31111c262f0 Mon Sep 17 00:00:00 2001 From: Ein Anderssono Date: Thu, 11 Jun 2026 21:24:03 +0200 Subject: [PATCH] fix: make Ctrl+C cancel ObjC semaphore waits within ~1s semaphore_wait_with_timeout now polls photos_cancelled every second instead of blocking for the full timeout duration --- bridge/photokit_bridge.m | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/bridge/photokit_bridge.m b/bridge/photokit_bridge.m index d2a1efb..7a66ce2 100644 --- a/bridge/photokit_bridge.m +++ b/bridge/photokit_bridge.m @@ -10,8 +10,15 @@ static NSDictionary *make_error_dict(NSString *message) { } static BOOL semaphore_wait_with_timeout(dispatch_semaphore_t sem, int64_t seconds) { - dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, seconds * NSEC_PER_SEC); - return dispatch_semaphore_wait(sem, timeout) == 0; + int64_t deadline = (int64_t)[NSDate timeIntervalSinceReferenceDate] + seconds; + while (1) { + if (photos_cancelled) return NO; + int64_t remaining = deadline - (int64_t)[NSDate timeIntervalSinceReferenceDate]; + if (remaining <= 0) return NO; + int64_t waitSecs = remaining < 1 ? remaining : 1; + dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, waitSecs * NSEC_PER_SEC); + if (dispatch_semaphore_wait(sem, timeout) == 0) return YES; + } } static NSDictionary *collection_to_dict(PHCollection *collection) {