Skip to content

Instantly share code, notes, and snippets.

@T1T4N
Created August 12, 2024 10:19
Show Gist options
  • Save T1T4N/fe858be95896b3810cfbec42e797f718 to your computer and use it in GitHub Desktop.
Save T1T4N/fe858be95896b3810cfbec42e797f718 to your computer and use it in GitHub Desktop.
Swift 6 concurrency-friendly way of monitoring memory pressure
@discardableResult
func logMemoryPressure() -> DispatchSourceProtocol {
// Wrapper class to make DispatchSourceMemoryPressure sendable
final class SendableDispatchMemoryPressureSource: @unchecked Sendable {
let source: any DispatchSourceMemoryPressure
init(_ source: any DispatchSourceMemoryPressure) {
self.source = source
}
func activate() {
source.activate()
}
}
let source = DispatchSource.makeMemoryPressureSource(eventMask: .all, queue: nil)
let queue = DispatchQueue(label: "com.example.memoryPressure")
func handleMemoryPressureEvent() {
guard !source.isCancelled else { return }
let event = source.data
switch event {
case .normal:
os_log("Memory pressure: %{public}s", log: .default, type: .debug, "normal")
case .warning:
os_log("Memory pressure: %{public}s", log: .default, type: .info, "warning")
case .critical:
os_log("Memory pressure: %{public}s", log: .default, type: .error, "critical")
default:
break
}
}
source.setEventHandler(handler: handleMemoryPressureEvent)
let sendableSource = SendableDispatchMemoryPressureSource(source)
queue.async {
os_log("Memory pressure logging start", log: .default, type: .debug)
sendableSource.activate()
}
return source
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment