Shunt to mainactor and don't have dedicated methods

This commit is contained in:
Max Goedjen 2025-11-25 20:51:37 -08:00
parent df26e0047c
commit 2fa185a153
No known key found for this signature in database

View File

@ -36,13 +36,13 @@ public struct SocketController {
logger.debug("Socket controller path is clear") logger.debug("Socket controller path is clear")
port = SocketPort(path: path) port = SocketPort(path: path)
fileHandle = FileHandle(fileDescriptor: port.socket, closeOnDealloc: true) fileHandle = FileHandle(fileDescriptor: port.socket, closeOnDealloc: true)
Task { [fileHandle, sessionsContinuation, logger] in Task { @MainActor [fileHandle, sessionsContinuation, logger] in
for await notification in NotificationCenter.default.notifications(named: .NSFileHandleConnectionAccepted) { for await notification in NotificationCenter.default.notifications(named: .NSFileHandleConnectionAccepted) {
logger.debug("Socket controller accepted connection") logger.debug("Socket controller accepted connection")
guard let new = notification.userInfo?[NSFileHandleNotificationFileHandleItem] as? FileHandle else { continue } guard let new = notification.userInfo?[NSFileHandleNotificationFileHandleItem] as? FileHandle else { continue }
let session = Session(fileHandle: new) let session = Session(fileHandle: new)
sessionsContinuation.yield(session) sessionsContinuation.yield(session)
await fileHandle.acceptConnectionInBackgroundAndNotifyOnMainActor() fileHandle.acceptConnectionInBackgroundAndNotify()
} }
} }
fileHandle.acceptConnectionInBackgroundAndNotify() fileHandle.acceptConnectionInBackgroundAndNotify()
@ -90,16 +90,16 @@ extension SocketController {
logger.debug("Socket controller yielded data.") logger.debug("Socket controller yielded data.")
} }
} }
Task { fileHandle.waitForDataInBackgroundAndNotify()
await fileHandle.waitForDataInBackgroundAndNotifyOnMainActor()
}
} }
/// Writes new data to the socket. /// Writes new data to the socket.
/// - Parameter data: The data to write. /// - Parameter data: The data to write.
public func write(_ data: Data) async throws { public func write(_ data: Data) async throws {
try fileHandle.write(contentsOf: data) try fileHandle.write(contentsOf: data)
await fileHandle.waitForDataInBackgroundAndNotifyOnMainActor() await MainActor.run {
fileHandle.waitForDataInBackgroundAndNotify()
}
} }
/// Closes the socket and cleans up resources. /// Closes the socket and cleans up resources.
@ -113,26 +113,6 @@ extension SocketController {
} }
private extension FileHandle {
/// Ensures waitForDataInBackgroundAndNotify will be called on the main actor.
func waitForDataInBackgroundAndNotifyOnMainActor() async {
await MainActor.run {
waitForDataInBackgroundAndNotify()
}
}
/// Ensures acceptConnectionInBackgroundAndNotify will be called on the main actor.
/// - Parameter modes: the runloop modes to use.
func acceptConnectionInBackgroundAndNotifyOnMainActor(forModes modes: [RunLoop.Mode]? = [RunLoop.Mode.default]) async {
await MainActor.run {
acceptConnectionInBackgroundAndNotify(forModes: modes)
}
}
}
private extension SocketPort { private extension SocketPort {
convenience init(path: String) { convenience init(path: String) {