in Sources/XCTest/Private/WaiterManager.swift [62:94]
func startManaging(_ waiter: WaiterType, timeout: TimeInterval) {
guard let thread = thread else { fatalError("\(self) no longer belongs to a thread") }
precondition(thread === Thread.current, "\(#function) called on wrong thread, must be called on \(thread)")
var alreadyFinishedOuterWaiter: WaiterType?
queue.sync {
// To start managing `waiter`, first see if any existing, outer waiters have already finished,
// because if one has, then `waiter` will be immediately interrupted before it begins waiting.
alreadyFinishedOuterWaiter = managedWaiterStack.first(where: { $0.waiter.isFinished })?.waiter
let watchdog: ManageableWaiterWatchdog?
if alreadyFinishedOuterWaiter == nil {
// If there is no already-finished outer waiter, install a watchdog for `waiter`, and store it
// alongside `waiter` so that it may be canceled if `waiter` finishes waiting within its allotted timeout.
watchdog = WaiterManager.installWatchdog(for: waiter, timeout: timeout)
} else {
// If there is an already-finished outer waiter, no watchdog is needed for `waiter` because it will
// be interrupted before it begins waiting.
watchdog = nil
}
// Add the waiter even if it's going to immediately be interrupted below to simplify the stack management
let details = ManagedWaiterDetails(waiter: waiter, watchdog: watchdog)
managedWaiterStack.append(details)
}
if let alreadyFinishedOuterWaiter = alreadyFinishedOuterWaiter {
XCTWaiter.subsystemQueue.async {
waiter.queue_interrupt(for: alreadyFinishedOuterWaiter)
}
}
}