1
1
use std:: {
2
- collections:: { HashMap , HashSet } ,
2
+ collections:: HashMap ,
3
3
io,
4
4
os:: {
5
5
raw:: c_void,
@@ -17,7 +17,7 @@ use std::{
17
17
18
18
use compio_log:: { instrument, trace} ;
19
19
use windows_sys:: Win32 :: {
20
- Foundation :: { ERROR_BUSY , ERROR_OPERATION_ABORTED , ERROR_TIMEOUT , WAIT_OBJECT_0 , WAIT_TIMEOUT } ,
20
+ Foundation :: { ERROR_BUSY , ERROR_TIMEOUT , WAIT_OBJECT_0 , WAIT_TIMEOUT } ,
21
21
Networking :: WinSock :: { WSACleanup , WSAStartup , WSADATA } ,
22
22
System :: {
23
23
Threading :: {
@@ -170,7 +170,6 @@ pub trait OpCode {
170
170
pub ( crate ) struct Driver {
171
171
port : cp:: Port ,
172
172
waits : HashMap < usize , WinThreadpollWait > ,
173
- cancelled : HashSet < usize > ,
174
173
pool : AsyncifyPool ,
175
174
notify_overlapped : Arc < Overlapped > ,
176
175
}
@@ -186,7 +185,6 @@ impl Driver {
186
185
Ok ( Self {
187
186
port,
188
187
waits : HashMap :: default ( ) ,
189
- cancelled : HashSet :: default ( ) ,
190
188
pool : builder. create_or_get_thread_pool ( ) ,
191
189
notify_overlapped : Arc :: new ( Overlapped :: new ( driver) ) ,
192
190
} )
@@ -203,8 +201,6 @@ impl Driver {
203
201
pub fn cancel < T : OpCode > ( & mut self , mut op : Key < T > ) {
204
202
instrument ! ( compio_log:: Level :: TRACE , "cancel" , ?op) ;
205
203
trace ! ( "cancel RawOp" ) ;
206
- let user_data = op. user_data ( ) ;
207
- self . cancelled . insert ( user_data) ;
208
204
let overlapped_ptr = op. as_mut_ptr ( ) ;
209
205
let op = op. as_op_pin ( ) ;
210
206
// It's OK to fail to cancel.
@@ -215,32 +211,25 @@ impl Driver {
215
211
pub fn push < T : OpCode + ' static > ( & mut self , op : & mut Key < T > ) -> Poll < io:: Result < usize > > {
216
212
instrument ! ( compio_log:: Level :: TRACE , "push" , ?op) ;
217
213
let user_data = op. user_data ( ) ;
218
- if self . cancelled . remove ( & user_data) {
219
- trace ! ( "pushed RawOp already cancelled" ) ;
220
- Poll :: Ready ( Err ( io:: Error :: from_raw_os_error (
221
- ERROR_OPERATION_ABORTED as _ ,
222
- ) ) )
223
- } else {
224
- trace ! ( "push RawOp" ) ;
225
- let optr = op. as_mut_ptr ( ) ;
226
- let op_pin = op. as_op_pin ( ) ;
227
- match op_pin. op_type ( ) {
228
- OpType :: Overlapped => unsafe { op_pin. operate ( optr. cast ( ) ) } ,
229
- OpType :: Blocking => {
230
- if self . push_blocking ( user_data) ? {
231
- Poll :: Pending
232
- } else {
233
- Poll :: Ready ( Err ( io:: Error :: from_raw_os_error ( ERROR_BUSY as _ ) ) )
234
- }
235
- }
236
- OpType :: Event ( e) => {
237
- self . waits . insert (
238
- user_data,
239
- WinThreadpollWait :: new ( self . port . handle ( ) , e, op) ?,
240
- ) ;
214
+ trace ! ( "push RawOp" ) ;
215
+ let optr = op. as_mut_ptr ( ) ;
216
+ let op_pin = op. as_op_pin ( ) ;
217
+ match op_pin. op_type ( ) {
218
+ OpType :: Overlapped => unsafe { op_pin. operate ( optr. cast ( ) ) } ,
219
+ OpType :: Blocking => {
220
+ if self . push_blocking ( user_data) ? {
241
221
Poll :: Pending
222
+ } else {
223
+ Poll :: Ready ( Err ( io:: Error :: from_raw_os_error ( ERROR_BUSY as _ ) ) )
242
224
}
243
225
}
226
+ OpType :: Event ( e) => {
227
+ self . waits . insert (
228
+ user_data,
229
+ WinThreadpollWait :: new ( self . port . handle ( ) , e, op) ?,
230
+ ) ;
231
+ Poll :: Pending
232
+ }
244
233
}
245
234
}
246
235
@@ -259,19 +248,13 @@ impl Driver {
259
248
260
249
fn create_entry (
261
250
notify_user_data : usize ,
262
- cancelled : & mut HashSet < usize > ,
263
251
waits : & mut HashMap < usize , WinThreadpollWait > ,
264
252
entry : Entry ,
265
253
) -> Option < Entry > {
266
254
let user_data = entry. user_data ( ) ;
267
255
if user_data != notify_user_data {
268
256
waits. remove ( & user_data) ;
269
- let result = if cancelled. remove ( & user_data) {
270
- Err ( io:: Error :: from_raw_os_error ( ERROR_OPERATION_ABORTED as _ ) )
271
- } else {
272
- entry. into_result ( )
273
- } ;
274
- Some ( Entry :: new ( user_data, result) )
257
+ Some ( Entry :: new ( user_data, entry. into_result ( ) ) )
275
258
} else {
276
259
None
277
260
}
@@ -286,9 +269,11 @@ impl Driver {
286
269
287
270
let notify_user_data = self . notify_overlapped . as_ref ( ) as * const Overlapped as usize ;
288
271
289
- entries. extend ( self . port . poll ( timeout) ?. filter_map ( |e| {
290
- Self :: create_entry ( notify_user_data, & mut self . cancelled , & mut self . waits , e)
291
- } ) ) ;
272
+ entries. extend (
273
+ self . port
274
+ . poll ( timeout) ?
275
+ . filter_map ( |e| Self :: create_entry ( notify_user_data, & mut self . waits , e) ) ,
276
+ ) ;
292
277
293
278
Ok ( ( ) )
294
279
}
0 commit comments