Skip to content
Merged
Show file tree
Hide file tree
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
3 changes: 2 additions & 1 deletion Sources/Kernel Completion/Kernel.Completion+IOUring.swift
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,8 @@
// Each closure is a one-line delegation to State.

let driver = Driver(
submit: { (submission: Submission, target: borrowing Kernel.Descriptor) throws(Error) in
submit: {
(submission: Submission, target: borrowing Kernel.Descriptor) throws(Error) in
try state.enqueue(submission, target: target)
},
flush: { () throws(Error) -> Submission.Count in
Expand Down
4 changes: 3 additions & 1 deletion Sources/Kernel Completion/Kernel.Completion.Driver.swift
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,9 @@ extension Kernel.Completion {
// MARK: - Init

public init(
submit: @escaping (Kernel.Completion.Submission, borrowing Kernel.Descriptor) throws(Kernel.Completion.Error) -> Void,
submit:
@escaping (Kernel.Completion.Submission, borrowing Kernel.Descriptor) throws(Kernel
.Completion.Error) -> Void,
flush: @escaping () throws(Kernel.Completion.Error) -> Submission.Count,
drain: @escaping ((Kernel.Completion.Event) -> Void) -> Event.Count,
close: @escaping () -> Void,
Expand Down
59 changes: 47 additions & 12 deletions Sources/Kernel Event/Kernel.Event.Driver.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@
/// Takes consuming ownership of the descriptor. On success, the
/// registration owns the descriptor (closed on deregister/drain).
/// On failure, the descriptor is dropped — deinit closes it.
package let _register: (consuming Kernel.Descriptor, Kernel.Event.Interest) throws(Error) -> Kernel.Event.ID
package let _register:
(consuming Kernel.Descriptor, Kernel.Event.Interest) throws(Error) ->
Kernel.Event.ID

/// Updates the registration's configured interest set.
///
Expand All @@ -70,7 +72,8 @@
/// `events` and returns the number written. Backend translation may
/// discard backend-local wakeup artifacts; driver filtering may
/// discard stale registrations.
package let _poll: (Clock.Continuous.Deadline?, inout [Kernel.Event]) throws(Error) -> Int
package let _poll:
(Clock.Continuous.Deadline?, inout [Kernel.Event]) throws(Error) -> Int

/// Drains the registry and cleans up backend resources.
package let _close: () -> Void
Expand Down Expand Up @@ -101,11 +104,30 @@
/// native timeout format (clock access is platform-specific).
/// - close: Clean up backend resources. Called after the registry is drained.
public init(
add: @escaping (_ fd: borrowing Kernel.Descriptor, _ id: Kernel.Event.ID, _ interest: Kernel.Event.Interest) throws(Error) -> Void,
modify: @escaping (_ fd: borrowing Kernel.Descriptor, _ id: Kernel.Event.ID, _ old: Kernel.Event.Interest, _ new: Kernel.Event.Interest) throws(Error) -> Void,
remove: @escaping (_ fd: borrowing Kernel.Descriptor, _ id: Kernel.Event.ID, _ interest: Kernel.Event.Interest) throws(Error) -> Void,
arm: @escaping (_ fd: borrowing Kernel.Descriptor, _ id: Kernel.Event.ID, _ interest: Kernel.Event.Interest) throws(Error) -> Void,
poll: @escaping (_ deadline: Clock.Continuous.Deadline?, _ output: inout [Kernel.Event]) throws(Error) -> Int,
add:
@escaping (
_ fd: borrowing Kernel.Descriptor, _ id: Kernel.Event.ID,
_ interest: Kernel.Event.Interest
) throws(Error) -> Void,
modify:
@escaping (
_ fd: borrowing Kernel.Descriptor, _ id: Kernel.Event.ID,
_ old: Kernel.Event.Interest, _ new: Kernel.Event.Interest
) throws(Error) -> Void,
remove:
@escaping (
_ fd: borrowing Kernel.Descriptor, _ id: Kernel.Event.ID,
_ interest: Kernel.Event.Interest
) throws(Error) -> Void,
arm:
@escaping (
_ fd: borrowing Kernel.Descriptor, _ id: Kernel.Event.ID,
_ interest: Kernel.Event.Interest
) throws(Error) -> Void,
poll:
@escaping (
_ deadline: Clock.Continuous.Deadline?, _ output: inout [Kernel.Event]
) throws(Error) -> Int,
close: @escaping () -> Void
) {
// Thread-confined mutable state captured by all witness closures.
Expand All @@ -114,15 +136,20 @@
/// The registration column — the move-only ADT-families Dictionary
/// over the default ordered hashed entry column, pinned through the
/// canonical `Dictionary<Key, Value>` front door ([DS-028]).
typealias Registry = Dictionary_Primitives.Dictionary<Kernel.Event.ID, Registration>
typealias Registry = Dictionary_Primitives.Dictionary<
Kernel.Event.ID, Registration
>
var nextID = Kernel.Event.ID.zero
var registry = Registry()
}

let shared = Shared()

self._register = {
(descriptor: consuming Kernel.Descriptor, interest: Kernel.Event.Interest) throws(Error) -> Kernel.Event.ID in
(
descriptor: consuming Kernel.Descriptor,
interest: Kernel.Event.Interest
) throws(Error) -> Kernel.Event.ID in

shared.nextID = shared.nextID.map { $0 &+ 1 }
let id = shared.nextID
Expand All @@ -131,7 +158,10 @@
try add(descriptor, id, interest)

var box: Kernel.Descriptor? = consume descriptor
shared.registry.insert(key: id, value: Registration(descriptor: box.take()!, interest: interest))
shared.registry.insert(
key: id,
value: Registration(descriptor: box.take()!, interest: interest)
)

return id
}
Expand Down Expand Up @@ -184,7 +214,10 @@
}

self._poll = {
(deadline: Clock.Continuous.Deadline?, buffer: inout [Kernel.Event]) throws(Error) -> Int in
(
deadline: Clock.Continuous.Deadline?,
buffer: inout [Kernel.Event]
) throws(Error) -> Int in

// Backend fills buffer with normalized events.
// The backend converts deadline → native timeout (clock access is platform-specific).
Expand Down Expand Up @@ -213,7 +246,9 @@
// full-duplex load.
for i in 0..<write {
let event = buffer[i]
guard var entry = shared.registry.removeValue(forKey: event.id) else { continue }
guard var entry = shared.registry.removeValue(forKey: event.id) else {
continue
}
let residual = entry.armedInterest.subtracting(event.interest)
entry.armedInterest = residual
if !residual.isEmpty {
Expand Down
41 changes: 34 additions & 7 deletions Sources/Kernel Event/Kernel.Event.Source+Epoll.swift
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,11 @@

let driver = Kernel.Event.Driver(
add: {
(fd: borrowing Kernel.Descriptor, id: Kernel.Event.ID, interest: Kernel.Event.Interest) throws(Kernel.Event.Driver.Error) in
(
fd: borrowing Kernel.Descriptor,
id: Kernel.Event.ID,
interest: Kernel.Event.Interest
) throws(Kernel.Event.Driver.Error) in

let event = Linux.Kernel.Event.Poll.Event(
events: events(oneShot: interest),
Expand All @@ -219,7 +223,12 @@
}
},
modify: {
(fd: borrowing Kernel.Descriptor, id: Kernel.Event.ID, _: Kernel.Event.Interest, new: Kernel.Event.Interest) throws(Kernel.Event.Driver.Error) in
(
fd: borrowing Kernel.Descriptor,
id: Kernel.Event.ID,
_: Kernel.Event.Interest,
new: Kernel.Event.Interest
) throws(Kernel.Event.Driver.Error) in

let event = Linux.Kernel.Event.Poll.Event(
events: events(oneShot: new),
Expand All @@ -232,7 +241,11 @@
}
},
remove: {
(fd: borrowing Kernel.Descriptor, _: Kernel.Event.ID, _: Kernel.Event.Interest) throws(Kernel.Event.Driver.Error) in
(
fd: borrowing Kernel.Descriptor,
_: Kernel.Event.ID,
_: Kernel.Event.Interest
) throws(Kernel.Event.Driver.Error) in

do throws(Linux.Kernel.Event.Poll.Error) {
try state.epoll.remove(fd: fd)
Expand All @@ -246,7 +259,11 @@
}
},
arm: {
(fd: borrowing Kernel.Descriptor, id: Kernel.Event.ID, interest: Kernel.Event.Interest) throws(Kernel.Event.Driver.Error) in
(
fd: borrowing Kernel.Descriptor,
id: Kernel.Event.ID,
interest: Kernel.Event.Interest
) throws(Kernel.Event.Driver.Error) in

let event = Linux.Kernel.Event.Poll.Event(
events: events(oneShot: interest),
Expand All @@ -259,7 +276,10 @@
}
},
poll: {
(deadline: Clock.Continuous.Deadline?, output: inout [Kernel.Event]) throws(Kernel.Event.Driver.Error) -> Int in
(
deadline: Clock.Continuous.Deadline?,
output: inout [Kernel.Event]
) throws(Kernel.Event.Driver.Error) -> Int in

let timeout = deadline.map { $0.remaining(at: Clock.Continuous.now) }

Expand All @@ -276,7 +296,10 @@
let count: Int
do throws(Linux.Kernel.Event.Poll.Error) {
if requestCount == state.rawEvents.count {
count = try state.epoll.poll(events: &state.rawEvents, timeout: timeout)
count = try state.epoll.poll(
events: &state.rawEvents,
timeout: timeout
)
} else {
var scratch = Array(state.rawEvents[0..<requestCount])
count = try state.epoll.poll(events: &scratch, timeout: timeout)
Expand All @@ -296,7 +319,11 @@
guard let id = Kernel.Event.ID(pollData: raw.data) else { continue }
let (interest, flags) = normalize(raw.events)
guard writeIdx < output.count else { break }
output[writeIdx] = Kernel.Event(id: id, interest: interest, flags: flags)
output[writeIdx] = Kernel.Event(
id: id,
interest: interest,
flags: flags
)
writeIdx += 1
}
return writeIdx
Expand Down
44 changes: 36 additions & 8 deletions Sources/Kernel Event/Kernel.Event.Source+Kqueue.swift
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,11 @@

let driver = Kernel.Event.Driver(
add: {
(fd: borrowing Kernel.Descriptor, id: Kernel.Event.ID, interest: Kernel.Event.Interest) throws(Kernel.Event.Driver.Error) in
(
fd: borrowing Kernel.Descriptor,
id: Kernel.Event.ID,
interest: Kernel.Event.Interest
) throws(Kernel.Event.Driver.Error) in

let events = kevents(fd: fd, id: id, interest: interest, flags: addFlags)
guard !events.isEmpty else { return }
Expand All @@ -152,12 +156,19 @@
}
},
modify: {
(fd: borrowing Kernel.Descriptor, id: Kernel.Event.ID, old: Kernel.Event.Interest, new: Kernel.Event.Interest) throws(Kernel.Event.Driver.Error) in
(
fd: borrowing Kernel.Descriptor,
id: Kernel.Event.ID,
old: Kernel.Event.Interest,
new: Kernel.Event.Interest
) throws(Kernel.Event.Driver.Error) in

let toRemove = old.subtracting(new)
let toAdd = new.subtracting(old)
var events = kevents(fd: fd, id: id, interest: toRemove, flags: .delete)
events.append(contentsOf: kevents(fd: fd, id: id, interest: toAdd, flags: addFlags))
events.append(
contentsOf: kevents(fd: fd, id: id, interest: toAdd, flags: addFlags)
)
guard !events.isEmpty else { return }
do throws(Kernel.Kqueue.Error) {
try state.kq.register(events: events)
Expand All @@ -166,7 +177,11 @@
}
},
remove: {
(fd: borrowing Kernel.Descriptor, id: Kernel.Event.ID, interest: Kernel.Event.Interest) throws(Kernel.Event.Driver.Error) in
(
fd: borrowing Kernel.Descriptor,
id: Kernel.Event.ID,
interest: Kernel.Event.Interest
) throws(Kernel.Event.Driver.Error) in

let events = kevents(fd: fd, id: id, interest: interest, flags: .delete)
guard !events.isEmpty else { return }
Expand All @@ -182,7 +197,11 @@
}
},
arm: {
(fd: borrowing Kernel.Descriptor, id: Kernel.Event.ID, interest: Kernel.Event.Interest) throws(Kernel.Event.Driver.Error) in
(
fd: borrowing Kernel.Descriptor,
id: Kernel.Event.ID,
interest: Kernel.Event.Interest
) throws(Kernel.Event.Driver.Error) in

let armFlags: Kernel.Kqueue.Flags = .add | .enable | .clear | .dispatch
let events = kevents(fd: fd, id: id, interest: interest, flags: armFlags)
Expand All @@ -194,7 +213,10 @@
}
},
poll: {
(deadline: Clock.Continuous.Deadline?, output: inout [Kernel.Event]) throws(Kernel.Event.Driver.Error) -> Int in
(
deadline: Clock.Continuous.Deadline?,
output: inout [Kernel.Event]
) throws(Kernel.Event.Driver.Error) -> Int in

let timeout = deadline.map { $0.remaining(at: Clock.Continuous.now) }

Expand Down Expand Up @@ -231,7 +253,9 @@
let raw = state.rawEvents[i]
if raw.filter == .user { continue }

let id = raw.data.map { UInt(truncatingIfNeeded: $0) }.retag(Kernel.Event.self)
let id = raw.data.map { UInt(truncatingIfNeeded: $0) }.retag(
Kernel.Event.self
)

var interest: Kernel.Event.Interest = []
if raw.filter == .read { interest.insert(.read) }
Expand All @@ -249,7 +273,11 @@
if raw.flags.contains(.error) { flags.insert(.error) }

guard writeIdx < output.count else { break }
output[writeIdx] = Kernel.Event(id: id, interest: interest, flags: flags)
output[writeIdx] = Kernel.Event(
id: id,
interest: interest,
flags: flags
)
writeIdx += 1
}
return writeIdx
Expand Down
12 changes: 9 additions & 3 deletions Sources/Kernel File/Kernel.File.Clone+CrossPlatform.swift
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,9 @@ extension Kernel.File.Clone {

#if os(Linux)
extension Kernel.File.Clone {
private static func openSource(_ path: borrowing Path.Borrowed) throws(Kernel.File.Clone.Error) -> Kernel.Descriptor {
private static func openSource(
_ path: borrowing Path.Borrowed
) throws(Kernel.File.Clone.Error) -> Kernel.Descriptor {
do throws(Kernel.File.Open.Error) {
return try Kernel.File.Open.open(
path: path,
Expand All @@ -293,7 +295,9 @@ extension Kernel.File.Clone {
}
}

private static func createDestination(_ path: borrowing Path.Borrowed) throws(Kernel.File.Clone.Error) -> Kernel.Descriptor {
private static func createDestination(
_ path: borrowing Path.Borrowed
) throws(Kernel.File.Clone.Error) -> Kernel.Descriptor {
do throws(Kernel.File.Open.Error) {
return try Kernel.File.Open.open(
path: path,
Expand All @@ -309,7 +313,9 @@ extension Kernel.File.Clone {
}
}

private static func getSize(_ path: borrowing Path.Borrowed) throws(Kernel.File.Clone.Error) -> Int {
private static func getSize(
_ path: borrowing Path.Borrowed
) throws(Kernel.File.Clone.Error) -> Int {
do throws(Linux.Kernel.File.Clone.Error.Syscall) {
return try Linux.Kernel.File.Clone.Metadata.size(at: path)
} catch {
Expand Down
8 changes: 0 additions & 8 deletions Sources/Kernel File/Kernel.File.Direct.Capability.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,6 @@ extension Kernel.File.Direct.Capability {
/// Direct I/O properties accessor.
public struct Direct: Sendable {
let capability: Kernel.File.Direct.Capability

init(capability: Kernel.File.Direct.Capability) {
self.capability = capability
}
}
}

Expand All @@ -76,10 +72,6 @@ extension Kernel.File.Direct.Capability {
/// Cache bypass properties accessor.
public struct Bypass: Sendable {
let capability: Kernel.File.Direct.Capability

init(capability: Kernel.File.Direct.Capability) {
self.capability = capability
}
}
}

Expand Down
8 changes: 6 additions & 2 deletions Sources/Kernel Thread/Kernel.Thread.trap.swift
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,9 @@ extension Kernel.Thread.Trap {
public func callAsFunction(
_ body: @escaping @Sendable () -> Void
) -> Kernel.Thread.Handle {
do throws(Kernel.Thread.Error) { return try Kernel.Thread.spawn(body) } catch { fatalError(error.description) }
do throws(Kernel.Thread.Error) { return try Kernel.Thread.spawn(body) } catch {
fatalError(error.description)
}
}

/// Spawns a dedicated OS thread with an explicit value, trapping on failure.
Expand All @@ -62,6 +64,8 @@ extension Kernel.Thread.Trap {
_ value: consuming sending T,
_ body: @escaping @Sendable (consuming T) -> Void
) -> Kernel.Thread.Handle {
do throws(Kernel.Thread.Error) { return try Kernel.Thread.spawn(value, body) } catch { fatalError(error.description) }
do throws(Kernel.Thread.Error) { return try Kernel.Thread.spawn(value, body) } catch {
fatalError(error.description)
}
}
}
Loading