Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 20 additions & 10 deletions Sources/CmuxEventLogWriter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -137,18 +137,14 @@ final class CmuxEventLogWriter: @unchecked Sendable {
private func append(_ lines: [String]) {
guard !lines.isEmpty else { return }
do {
try FileManager.default.createDirectory(
at: eventLogURL.deletingLastPathComponent(),
withIntermediateDirectories: true
)
let fileManager = FileManager.default
if !fileManager.fileExists(atPath: eventLogURL.path) {
_ = fileManager.createFile(atPath: eventLogURL.path, contents: nil)
}
var handle = try FileHandle(forWritingTo: eventLogURL)
// Every agent hook event flushes here, so the steady state is one
// open + seek + write. Directory and file creation run only when the
// open fails, and the end-of-file offset doubles as the current size
// instead of a separate attributesOfItem stat per flush.
var handle = try openForAppending(fileManager: fileManager)
defer { try? handle.close() }
try handle.seekToEnd()
var currentSize = Self.fileSize(at: eventLogURL, fileManager: fileManager)
var currentSize = try handle.seekToEnd()
// One file segment at a time bounds the extra buffer to the rotation limit,
// except for an indivisible oversized record (the existing write-whole policy).
var batchData = Data()
Expand Down Expand Up @@ -178,6 +174,20 @@ final class CmuxEventLogWriter: @unchecked Sendable {
}
}

private func openForAppending(fileManager: FileManager) throws -> FileHandle {
if let handle = try? FileHandle(forWritingTo: eventLogURL) {
return handle
}
try fileManager.createDirectory(
at: eventLogURL.deletingLastPathComponent(),
withIntermediateDirectories: true
)
if !fileManager.fileExists(atPath: eventLogURL.path) {
_ = fileManager.createFile(atPath: eventLogURL.path, contents: nil)
}
return try FileHandle(forWritingTo: eventLogURL)
}

private func rotate(fileManager: FileManager) throws {
let currentSize = Self.fileSize(at: eventLogURL, fileManager: fileManager)
let rotatedURL = eventLogURL.appendingPathExtension("1")
Expand Down
Loading