@@ -10,11 +10,10 @@ use std::{
10
10
11
11
use super :: {
12
12
op:: { CompletionMeta , Op , OpAble } ,
13
+ poll:: Poll as LegacyPoll ,
13
14
ready:: { self , Ready } ,
14
- scheduled_io:: ScheduledIo ,
15
15
Driver , Inner , CURRENT ,
16
16
} ;
17
- use crate :: utils:: slab:: Slab ;
18
17
19
18
#[ allow( missing_docs, unreachable_pub, dead_code, unused_imports) ]
20
19
#[ cfg( windows) ]
@@ -26,15 +25,7 @@ mod waker;
26
25
pub ( crate ) use waker:: UnparkHandle ;
27
26
28
27
pub ( crate ) struct LegacyInner {
29
- pub ( crate ) io_dispatch : Slab < ScheduledIo > ,
30
- #[ cfg( unix) ]
31
- events : mio:: Events ,
32
- #[ cfg( unix) ]
33
- poll : mio:: Poll ,
34
- #[ cfg( windows) ]
35
- events : iocp:: Events ,
36
- #[ cfg( windows) ]
37
- poll : iocp:: Poller ,
28
+ pub ( crate ) poller : LegacyPoll ,
38
29
39
30
#[ cfg( feature = "sync" ) ]
40
31
shared_waker : std:: sync:: Arc < waker:: EventWaker > ,
@@ -66,14 +57,10 @@ impl LegacyDriver {
66
57
}
67
58
68
59
pub ( crate ) fn new_with_entries ( entries : u32 ) -> io:: Result < Self > {
69
- #[ cfg( unix) ]
70
- let poll = mio:: Poll :: new ( ) ?;
71
- #[ cfg( windows) ]
72
- let poll = iocp:: Poller :: new ( ) ?;
73
-
60
+ let poller = LegacyPoll :: with_capacity ( entries as usize ) ?;
74
61
#[ cfg( all( unix, feature = "sync" ) ) ]
75
62
let shared_waker = std:: sync:: Arc :: new ( waker:: EventWaker :: new ( mio:: Waker :: new (
76
- poll. registry ( ) ,
63
+ poller . poll . registry ( ) ,
77
64
TOKEN_WAKEUP ,
78
65
) ?) ) ;
79
66
#[ cfg( all( windows, feature = "sync" ) ) ]
@@ -87,15 +74,7 @@ impl LegacyDriver {
87
74
let thread_id = crate :: builder:: BUILD_THREAD_ID . with ( |id| * id) ;
88
75
89
76
let inner = LegacyInner {
90
- io_dispatch : Slab :: new ( ) ,
91
- #[ cfg( unix) ]
92
- events : mio:: Events :: with_capacity ( entries as usize ) ,
93
- #[ cfg( unix) ]
94
- poll,
95
- #[ cfg( windows) ]
96
- events : iocp:: Events :: with_capacity ( entries as usize ) ,
97
- #[ cfg( windows) ]
98
- poll,
77
+ poller,
99
78
#[ cfg( feature = "sync" ) ]
100
79
shared_waker,
101
80
#[ cfg( feature = "sync" ) ]
@@ -150,13 +129,12 @@ impl LegacyDriver {
150
129
timeout = Some ( Duration :: ZERO ) ;
151
130
}
152
131
153
- // here we borrow 2 mut self, but its safe.
154
- let events = unsafe { & mut ( * self . inner . get ( ) ) . events } ;
155
- match inner. poll . poll ( events, timeout) {
132
+ match inner. poller . poll_inside ( timeout) {
156
133
Ok ( _) => { }
157
134
Err ( ref e) if e. kind ( ) == io:: ErrorKind :: Interrupted => { }
158
135
Err ( e) => return Err ( e) ,
159
136
}
137
+ let events = & inner. poller . events ;
160
138
#[ cfg( unix) ]
161
139
let iter = events. iter ( ) ;
162
140
#[ cfg( windows) ]
@@ -166,103 +144,69 @@ impl LegacyDriver {
166
144
167
145
#[ cfg( feature = "sync" ) ]
168
146
if token != TOKEN_WAKEUP {
169
- inner. dispatch ( token, Ready :: from_mio ( event) ) ;
147
+ LegacyPoll :: dispatch (
148
+ & mut inner. poller . io_dispatch ,
149
+ token. 0 ,
150
+ Ready :: from_mio ( event) ,
151
+ ) ;
170
152
}
171
153
172
154
#[ cfg( not( feature = "sync" ) ) ]
173
- inner. dispatch ( token, Ready :: from_mio ( event) ) ;
155
+ LegacyPoll :: dispatch (
156
+ & mut inner. poller . io_dispatch ,
157
+ token. 0 ,
158
+ Ready :: from_mio ( event) ,
159
+ ) ;
174
160
}
175
161
Ok ( ( ) )
176
162
}
177
163
178
164
#[ cfg( windows) ]
165
+ #[ inline]
179
166
pub ( crate ) fn register (
180
167
this : & Rc < UnsafeCell < LegacyInner > > ,
181
168
state : & mut iocp:: SocketState ,
182
169
interest : mio:: Interest ,
183
170
) -> io:: Result < usize > {
184
171
let inner = unsafe { & mut * this. get ( ) } ;
185
- let io = ScheduledIo :: default ( ) ;
186
- let token = inner. io_dispatch . insert ( io) ;
187
-
188
- match inner. poll . register ( state, mio:: Token ( token) , interest) {
189
- Ok ( _) => Ok ( token) ,
190
- Err ( e) => {
191
- inner. io_dispatch . remove ( token) ;
192
- Err ( e)
193
- }
194
- }
172
+ inner. poller . register ( state, interest)
195
173
}
196
174
197
175
#[ cfg( windows) ]
176
+ #[ inline]
198
177
pub ( crate ) fn deregister (
199
178
this : & Rc < UnsafeCell < LegacyInner > > ,
200
179
token : usize ,
201
180
state : & mut iocp:: SocketState ,
202
181
) -> io:: Result < ( ) > {
203
182
let inner = unsafe { & mut * this. get ( ) } ;
204
-
205
- // try to deregister fd first, on success we will remove it from slab.
206
- match inner. poll . deregister ( state) {
207
- Ok ( _) => {
208
- inner. io_dispatch . remove ( token) ;
209
- Ok ( ( ) )
210
- }
211
- Err ( e) => Err ( e) ,
212
- }
183
+ inner. poller . deregister ( token, state)
213
184
}
214
185
215
186
#[ cfg( unix) ]
187
+ #[ inline]
216
188
pub ( crate ) fn register (
217
189
this : & Rc < UnsafeCell < LegacyInner > > ,
218
190
source : & mut impl mio:: event:: Source ,
219
191
interest : mio:: Interest ,
220
192
) -> io:: Result < usize > {
221
193
let inner = unsafe { & mut * this. get ( ) } ;
222
- let token = inner. io_dispatch . insert ( ScheduledIo :: new ( ) ) ;
223
-
224
- let registry = inner. poll . registry ( ) ;
225
- match registry. register ( source, mio:: Token ( token) , interest) {
226
- Ok ( _) => Ok ( token) ,
227
- Err ( e) => {
228
- inner. io_dispatch . remove ( token) ;
229
- Err ( e)
230
- }
231
- }
194
+ inner. poller . register ( source, interest)
232
195
}
233
196
234
197
#[ cfg( unix) ]
198
+ #[ inline]
235
199
pub ( crate ) fn deregister (
236
200
this : & Rc < UnsafeCell < LegacyInner > > ,
237
201
token : usize ,
238
202
source : & mut impl mio:: event:: Source ,
239
203
) -> io:: Result < ( ) > {
240
204
let inner = unsafe { & mut * this. get ( ) } ;
241
-
242
- // try to deregister fd first, on success we will remove it from slab.
243
- match inner. poll . registry ( ) . deregister ( source) {
244
- Ok ( _) => {
245
- inner. io_dispatch . remove ( token) ;
246
- Ok ( ( ) )
247
- }
248
- Err ( e) => Err ( e) ,
249
- }
205
+ inner. poller . deregister ( source, token)
250
206
}
251
207
}
252
208
253
209
impl LegacyInner {
254
- fn dispatch ( & mut self , token : mio:: Token , ready : Ready ) {
255
- let mut sio = match self . io_dispatch . get ( token. 0 ) {
256
- Some ( io) => io,
257
- None => {
258
- return ;
259
- }
260
- } ;
261
- let ref_mut = sio. as_mut ( ) ;
262
- ref_mut. set_readiness ( |curr| curr | ready) ;
263
- ref_mut. wake ( ready) ;
264
- }
265
-
266
210
pub ( crate ) fn poll_op < T : OpAble > (
267
211
this : & Rc < UnsafeCell < Self > > ,
268
212
data : & mut T ,
@@ -282,7 +226,11 @@ impl LegacyInner {
282
226
} ;
283
227
284
228
// wait io ready and do syscall
285
- let mut scheduled_io = inner. io_dispatch . get ( index) . expect ( "scheduled_io lost" ) ;
229
+ let mut scheduled_io = inner
230
+ . poller
231
+ . io_dispatch
232
+ . get ( index)
233
+ . expect ( "scheduled_io lost" ) ;
286
234
let ref_mut = scheduled_io. as_mut ( ) ;
287
235
288
236
let readiness = ready ! ( ref_mut. poll_readiness( cx, direction) ) ;
@@ -316,15 +264,16 @@ impl LegacyInner {
316
264
317
265
pub ( crate ) fn cancel_op (
318
266
this : & Rc < UnsafeCell < LegacyInner > > ,
319
- index : usize ,
267
+ token : usize ,
320
268
direction : ready:: Direction ,
321
269
) {
322
270
let inner = unsafe { & mut * this. get ( ) } ;
323
271
let ready = match direction {
324
272
ready:: Direction :: Read => Ready :: READ_CANCELED ,
325
273
ready:: Direction :: Write => Ready :: WRITE_CANCELED ,
274
+ ready:: Direction :: ReadOrWrite => Ready :: CANCELED ,
326
275
} ;
327
- inner . dispatch ( mio :: Token ( index ) , ready) ;
276
+ LegacyPoll :: dispatch ( & mut inner . poller . io_dispatch , token , ready) ;
328
277
}
329
278
330
279
pub ( crate ) fn submit_with_data < T > (
0 commit comments