@@ -80,7 +80,7 @@ Iouring::Iouring(Reactor *_reactor) {
80
80
}
81
81
82
82
if (SwooleG.iouring_workers > 0 ) {
83
- unsigned int workers[2 ] = {SwooleG.iouring_workers , SwooleG.iouring_workers };
83
+ uint32_t workers[2 ] = {SwooleG.iouring_workers , SwooleG.iouring_workers };
84
84
ret = io_uring_register_iowq_max_workers (&ring, workers);
85
85
86
86
if (ret < 0 ) {
@@ -93,6 +93,7 @@ Iouring::Iouring(Reactor *_reactor) {
93
93
}
94
94
95
95
ring_socket = make_socket (ring.ring_fd , SW_FD_IOURING);
96
+ ring_socket->object = this ;
96
97
97
98
reactor->set_exit_condition (Reactor::EXIT_CONDITION_IOURING, [](Reactor *reactor, size_t &event_num) -> bool {
98
99
if (SwooleTG.iouring && SwooleTG.iouring ->get_task_num () == 0 && SwooleTG.iouring ->is_empty_waiting_tasks ()) {
@@ -113,14 +114,16 @@ Iouring::Iouring(Reactor *_reactor) {
113
114
}
114
115
115
116
Iouring::~Iouring () {
116
- if (ring_socket) {
117
- if (!ring_socket->removed ) {
118
- reactor->del (ring_socket);
119
- }
120
- ring_socket->move_fd ();
121
- ring_socket->free ();
122
- ring_socket = nullptr ;
117
+ if (!ring_socket) {
118
+ return ;
119
+ }
120
+
121
+ if (!ring_socket->removed ) {
122
+ reactor->del (ring_socket);
123
123
}
124
+ ring_socket->move_fd ();
125
+ ring_socket->free ();
126
+ ring_socket = nullptr ;
124
127
125
128
io_uring_queue_exit (&ring);
126
129
}
@@ -130,24 +133,18 @@ bool Iouring::ready() {
130
133
}
131
134
132
135
bool Iouring::wakeup () {
133
- unsigned count = 0 ;
134
- unsigned num = 8192 ;
135
- void *data = nullptr ;
136
- IouringEvent *event = nullptr ;
137
136
IouringEvent *waiting_task = nullptr ;
138
- struct io_uring_cqe *cqe = nullptr ;
139
- struct io_uring_cqe *cqes[num];
137
+ struct io_uring_cqe *cqes[SW_IOURING_CQES_SIZE];
140
138
141
139
while (true ) {
142
- count = io_uring_peek_batch_cqe (&ring, cqes, num );
140
+ auto count = io_uring_peek_batch_cqe (&ring, cqes, SW_IOURING_CQES_SIZE );
143
141
if (count == 0 ) {
144
142
return true ;
145
143
}
146
144
147
- for (unsigned i = 0 ; i < count; i++) {
148
- cqe = cqes[i];
149
- data = io_uring_cqe_get_data (cqe);
150
- event = static_cast <IouringEvent *>(data);
145
+ for (decltype (count) i = 0 ; i < count; i++) {
146
+ struct io_uring_cqe *cqe = cqes[i];
147
+ IouringEvent *task = static_cast <IouringEvent *>(io_uring_cqe_get_data (cqe));
151
148
task_num--;
152
149
if (cqe->res < 0 ) {
153
150
errno = -(cqe->res );
@@ -158,15 +155,15 @@ bool Iouring::wakeup() {
158
155
*/
159
156
if (cqe->res == -EAGAIN) {
160
157
io_uring_cq_advance (&ring, 1 );
161
- waiting_tasks.push (event );
158
+ waiting_tasks.push (task );
162
159
continue ;
163
160
}
164
161
}
165
162
166
- event ->result = (cqe->res >= 0 ? cqe->res : -1 );
163
+ task ->result = (cqe->res >= 0 ? cqe->res : -1 );
167
164
io_uring_cq_advance (&ring, 1 );
168
165
169
- event ->coroutine ->resume ();
166
+ task ->coroutine ->resume ();
170
167
171
168
if (!is_empty_waiting_tasks ()) {
172
169
waiting_task = waiting_tasks.front ();
@@ -181,7 +178,42 @@ bool Iouring::wakeup() {
181
178
return true ;
182
179
}
183
180
181
+ static const char *get_opcode_name (IouringOpcode opcode) {
182
+ switch (opcode) {
183
+ case SW_IORING_OP_OPENAT:
184
+ return " OPENAT" ;
185
+ case SW_IORING_OP_CLOSE:
186
+ return " CLOSE" ;
187
+ case SW_IORING_OP_STATX:
188
+ return " STATX" ;
189
+ case SW_IORING_OP_READ:
190
+ return " READ" ;
191
+ case SW_IORING_OP_WRITE:
192
+ return " WRITE" ;
193
+ case SW_IORING_OP_RENAMEAT:
194
+ return " RENAMEAT" ;
195
+ case SW_IORING_OP_MKDIRAT:
196
+ return " MKDIRAT" ;
197
+ case SW_IORING_OP_FSTAT:
198
+ return " FSTAT" ;
199
+ case SW_IORING_OP_LSTAT:
200
+ return " LSTAT" ;
201
+ case SW_IORING_OP_UNLINK_FILE:
202
+ return " UNLINK_FILE" ;
203
+ case SW_IORING_OP_UNLINK_DIR:
204
+ return " UNLINK_DIR" ;
205
+ case SW_IORING_OP_FSYNC:
206
+ return " FSYNC" ;
207
+ case SW_IORING_OP_FDATASYNC:
208
+ return " FDATASYNC" ;
209
+ default :
210
+ return " unknown" ;
211
+ }
212
+ }
213
+
184
214
bool Iouring::submit (IouringEvent *event) {
215
+ swoole_trace (" opcode=%s, fd=%d, path=%s" , get_opcode_name (event->opcode ), event->fd , event->pathname );
216
+
185
217
int ret = io_uring_submit (&ring);
186
218
187
219
if (ret < 0 ) {
@@ -434,8 +466,8 @@ int Iouring::stat(const char *path, struct stat *statbuf) {
434
466
}
435
467
436
468
int Iouring::callback (Reactor *reactor, Event *event) {
437
- Iouring *iouring = SwooleTG. iouring ;
438
- return iouring->wakeup () ? 1 : 0 ;
469
+ Iouring *iouring = static_cast <Iouring *>(event-> socket -> object ) ;
470
+ return iouring->wakeup () ? SW_OK : SW_ERR ;
439
471
}
440
472
} // namespace swoole
441
473
#endif
0 commit comments