Skip to content

Commit 10c070a

Browse files
committed
WIP, more ~Copyable adoption
1 parent 6029936 commit 10c070a

File tree

5 files changed

+295
-282
lines changed

5 files changed

+295
-282
lines changed

Sources/System/IORequest.swift

Lines changed: 90 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import struct CSystem.io_uring_sqe
22

3-
public enum IORequest {
3+
public enum IORequest: ~Copyable {
44
case nop // nothing here
55
case openat(
6-
atDirectory: FileDescriptor,
6+
atDirectory: FileDescriptor,
77
path: UnsafePointer<CChar>,
88
FileDescriptor.AccessMode,
99
options: FileDescriptor.OpenOptions = FileDescriptor.OpenOptions(),
@@ -22,71 +22,106 @@ public enum IORequest {
2222
)
2323
case close(File)
2424

25-
public enum Buffer {
25+
public enum Buffer: ~Copyable {
2626
case registered(IORingBuffer)
2727
case unregistered(UnsafeMutableRawBufferPointer)
2828
}
2929

30-
public enum File {
30+
public enum File: ~Copyable {
3131
case registered(IORingFileSlot)
3232
case unregistered(FileDescriptor)
3333
}
3434
}
3535

36+
@inlinable @inline(__always)
37+
internal func makeRawRequest_readWrite_registered(
38+
file: consuming IORequest.File,
39+
buffer: consuming IORingBuffer,
40+
offset: UInt64,
41+
request: consuming RawIORequest
42+
) -> RawIORequest {
43+
switch file {
44+
case .registered(let regFile):
45+
request.rawValue.fd = Int32(exactly: regFile.index)!
46+
request.flags = .fixedFile
47+
case .unregistered(let fd):
48+
request.fileDescriptor = fd
49+
}
50+
request.buffer = buffer.unsafeBuffer
51+
request.rawValue.buf_index = UInt16(exactly: buffer.index)!
52+
request.offset = offset
53+
return request
54+
}
55+
56+
@inlinable @inline(__always)
57+
internal func makeRawRequest_readWrite_unregistered(
58+
file: consuming IORequest.File,
59+
buffer: UnsafeMutableRawBufferPointer,
60+
offset: UInt64,
61+
request: consuming RawIORequest
62+
) -> RawIORequest {
63+
switch file {
64+
case .registered(let regFile):
65+
request.rawValue.fd = Int32(exactly: regFile.index)!
66+
request.flags = .fixedFile
67+
case .unregistered(let fd):
68+
request.fileDescriptor = fd
69+
}
70+
request.buffer = buffer
71+
request.offset = offset
72+
return request
73+
}
74+
3675
extension IORequest {
3776
@inlinable @inline(__always)
38-
public func makeRawRequest() -> RawIORequest {
77+
public consuming func makeRawRequest() -> RawIORequest {
3978
var request = RawIORequest()
40-
switch self {
41-
case .nop:
42-
request.operation = .nop
43-
case .openat(let atDirectory, let path, let mode, let options, let permissions, let slot):
44-
// TODO: use rawValue less
45-
request.operation = .openAt
46-
request.fileDescriptor = atDirectory
47-
request.rawValue.addr = unsafeBitCast(path, to: UInt64.self)
48-
request.rawValue.open_flags = UInt32(bitPattern: options.rawValue | mode.rawValue)
49-
request.rawValue.len = permissions?.rawValue ?? 0
50-
if let fileSlot = slot {
51-
request.rawValue.file_index = UInt32(fileSlot.index + 1)
52-
}
53-
case .read(let file, let buffer, let offset), .write(let file, let buffer, let offset):
54-
if case .read = self {
55-
if case .registered = buffer {
56-
request.operation = .readFixed
57-
} else {
58-
request.operation = .read
59-
}
60-
} else {
61-
if case .registered = buffer {
62-
request.operation = .writeFixed
63-
} else {
64-
request.operation = .write
65-
}
66-
}
67-
switch file {
68-
case .registered(let regFile):
69-
request.rawValue.fd = Int32(exactly: regFile.index)!
70-
request.flags = .fixedFile
71-
case .unregistered(let fd):
72-
request.fileDescriptor = fd
73-
}
74-
switch buffer {
75-
case .registered(let regBuf):
76-
request.buffer = regBuf.unsafeBuffer
77-
request.rawValue.buf_index = UInt16(exactly: regBuf.index)!
78-
case .unregistered(let buf):
79-
request.buffer = buf
80-
}
81-
request.offset = offset
82-
case .close(let file):
83-
request.operation = .close
84-
switch file {
85-
case .registered(let regFile):
86-
request.rawValue.file_index = UInt32(regFile.index + 1)
87-
case .unregistered(let normalFile):
88-
request.fileDescriptor = normalFile
89-
}
79+
switch consume self {
80+
case .nop:
81+
request.operation = .nop
82+
case .openat(let atDirectory, let path, let mode, let options, let permissions, let slot):
83+
// TODO: use rawValue less
84+
request.operation = .openAt
85+
request.fileDescriptor = atDirectory
86+
request.rawValue.addr = unsafeBitCast(path, to: UInt64.self)
87+
request.rawValue.open_flags = UInt32(bitPattern: options.rawValue | mode.rawValue)
88+
request.rawValue.len = permissions?.rawValue ?? 0
89+
if let fileSlot = slot {
90+
request.rawValue.file_index = UInt32(fileSlot.index + 1)
91+
}
92+
case .write(let file, let buffer, let offset):
93+
switch consume buffer {
94+
case .registered(let buffer):
95+
request.operation = .writeFixed
96+
return makeRawRequest_readWrite_registered(
97+
file: file, buffer: buffer, offset: offset, request: request)
98+
99+
case .unregistered(let buffer):
100+
request.operation = .write
101+
return makeRawRequest_readWrite_unregistered(
102+
file: file, buffer: buffer, offset: offset, request: request)
103+
}
104+
case .read(let file, let buffer, let offset):
105+
106+
switch consume buffer {
107+
case .registered(let buffer):
108+
request.operation = .readFixed
109+
return makeRawRequest_readWrite_registered(
110+
file: file, buffer: buffer, offset: offset, request: request)
111+
112+
case .unregistered(let buffer):
113+
request.operation = .read
114+
return makeRawRequest_readWrite_unregistered(
115+
file: file, buffer: buffer, offset: offset, request: request)
116+
}
117+
case .close(let file):
118+
request.operation = .close
119+
switch file {
120+
case .registered(let regFile):
121+
request.rawValue.file_index = UInt32(regFile.index + 1)
122+
case .unregistered(let normalFile):
123+
request.fileDescriptor = normalFile
124+
}
90125
}
91126
return request
92127
}

0 commit comments

Comments
 (0)