Create Usage.Monitor.swift

This commit is contained in:
shogo4405 2019-08-13 01:12:29 +09:00
parent 95629a4e61
commit cb1ad74b3b
1 changed files with 56 additions and 0 deletions

View File

@ -0,0 +1,56 @@
import Foundation
extension Usage {
public class Monitor {
let fileHandler: FileHandle
public private(set) var running: Bool = false
private let queue: DispatchQueue = .init(label: "Usage.Monitor.queue")
private var timeBase: mach_timebase_info = mach_timebase_info()
public init(_ forWritingTo: URL) throws {
mach_timebase_info(&timeBase)
fileHandler = try .init(forWritingTo: forWritingTo)
}
public func startRunning(_ hz: Double) {
queue.async {
guard !self.running else {
return
}
self.running = true
self.run(hz)
}
}
public func stopRunning() {
queue.async {
guard self.running else {
return
}
self.running = false
self.fileHandler.closeFile()
}
}
func run(_ hz: Double) {
while running {
let startTime = mach_absolute_time()
exectute()
let diff = (mach_absolute_time() - startTime)
Thread.sleep(forTimeInterval: (1 / hz) * 1000000)
}
}
func exectute() {
guard let cpu = Usage.cpu(), let memory = Usage.memory() else {
return
}
let timestamp = Date().timeIntervalSince1970
let line = "\(timestamp),\(cpu.user),\(cpu.system),\(cpu.nice),\(cpu.idle),\(memory)\n"
if let line = line.data(using: .utf8) {
fileHandler.write(line)
}
}
}
}