11import 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+
3675extension 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