#211 gives removeSiriShortcut a native deadline, because its only answer came from a framework completion that sometimes never arrives. Several other actions served by Zig have the same shape: no person is involved, the only answer is a completion or delegate call from a system daemon, and nothing else settles the call if it never comes.
| action | where it waits | notes |
|---|---|---|
getPendingNotifications | bridge_mobile_notifications.zig, answered only in pendingCompletionFired | |
scheduleNotification | the stage after authorization (addNotificationRequest:) | start the deadline after the prompt, never at dispatch |
getHealthData | bridge_mobile_health.zig, HKStatisticsQuery | |
saveHealthWorkout | three chained healthd completions | |
openSettings | bridge_mobile_permissions.zig, the openURL: completion | the app is backgrounded while Settings is open, and a main-queue deadline does not run while it is suspended, so a deadline could report TIMEOUT for a successful open |
openURL | bridge_mobile_system.zig, the openURL: completion | borderline: tel: and facetime: show a confirmation |
Why this is not just "call ios_async.scheduleDeadline"
Each of these keeps a side table read by reply-slot index alone: takeCall, takeSettingsCall, takePendingCall, takeScheduleCall. A deadline that releases slot k lets the next call lease slot k, and the first call's late completion then answers the second one with its own result.
#211 solved this for Siri by separating completion blocks from reply slots. A block answered by the deadline is kept owed, and never handed to another call, until its completion arrives. The same design, or a completion that carries the whole ticket, is needed here before any deadline is safe.
Also found in the same files: failures after the lease
openSettingslooks up its selector after publishing the call (bridge_mobile_permissions.zig).getHealthDataresolves classes and selectors afterpublishCall.- The HealthKit stage chain has
sel_registerName(...) orelse return;after taking the call. That releases neither the parked reply nor the slot.
#211 moved every fallible step above acquire in Siri for the same reason.
The slice fixture
page.m's __craftBridgeError handles a location TIMEOUT only for i=112. A deadline answering i=110 or i=111 would be dropped, and the harness would stall on the ids after it. SFSpeechRecognizer requestAuthorization: and AVAudioSession requestRecordPermission: also gate awaited ids with no deadline, although a real app puts a person in front of those.