// // Extension+RunBlocking.swift // SingBoxPacketTunnel // // Created by GFWFighter on 7/25/1402 AP. // import Foundation import Libcore import NetworkExtension func runBlocking(_ block: @escaping () async -> T) -> T { let semaphore = DispatchSemaphore(value: 0) let box = resultBox() Task.detached { let value = await block() box.result0 = value semaphore.signal() } semaphore.wait() return box.result0 } func runBlocking(_ tBlock: @escaping () async throws -> T) throws -> T { let semaphore = DispatchSemaphore(value: 0) let box = resultBox() Task.detached { do { let value = try await tBlock() box.result = .success(value) } catch { box.result = .failure(error) } semaphore.signal() } semaphore.wait() return try box.result.get() } private class resultBox { var result: Result! var result0: T! }