@@ -12,6 +12,7 @@ cfg_net! {
1212
1313use miow:: iocp:: { CompletionPort , CompletionStatus } ;
1414use std:: collections:: VecDeque ;
15+ use std:: io;
1516use std:: marker:: PhantomPinned ;
1617use std:: os:: windows:: io:: RawSocket ;
1718use std:: pin:: Pin ;
@@ -20,7 +21,6 @@ use std::sync::atomic::AtomicUsize;
2021use std:: sync:: atomic:: { AtomicBool , Ordering } ;
2122use std:: sync:: { Arc , Mutex } ;
2223use std:: time:: Duration ;
23- use std:: io;
2424use winapi:: shared:: ntdef:: NT_SUCCESS ;
2525use winapi:: shared:: ntdef:: { HANDLE , PVOID } ;
2626use winapi:: shared:: ntstatus:: STATUS_CANCELLED ;
@@ -327,8 +327,9 @@ static NEXT_ID: AtomicUsize = AtomicUsize::new(0);
327327pub struct Selector {
328328 #[ cfg( debug_assertions) ]
329329 id : usize ,
330-
331330 pub ( super ) inner : Arc < SelectorInner > ,
331+ #[ cfg( debug_assertions) ]
332+ has_waker : AtomicBool ,
332333}
333334
334335impl Selector {
@@ -340,6 +341,8 @@ impl Selector {
340341 #[ cfg( debug_assertions) ]
341342 id,
342343 inner : Arc :: new ( inner) ,
344+ #[ cfg( debug_assertions) ]
345+ has_waker : AtomicBool :: new ( false ) ,
343346 }
344347 } )
345348 }
@@ -349,6 +352,8 @@ impl Selector {
349352 #[ cfg( debug_assertions) ]
350353 id : self . id ,
351354 inner : Arc :: clone ( & self . inner ) ,
355+ #[ cfg( debug_assertions) ]
356+ has_waker : AtomicBool :: new ( self . has_waker . load ( Ordering :: Acquire ) ) ,
352357 } )
353358 }
354359
@@ -360,6 +365,11 @@ impl Selector {
360365 self . inner . select ( events, timeout)
361366 }
362367
368+ #[ cfg( debug_assertions) ]
369+ pub fn register_waker ( & self ) -> bool {
370+ self . has_waker . swap ( true , Ordering :: AcqRel )
371+ }
372+
363373 pub ( super ) fn clone_port ( & self ) -> Arc < CompletionPort > {
364374 self . inner . cp . clone ( )
365375 }
@@ -499,7 +509,7 @@ impl SelectorInner {
499509 } else if iocp_event. token ( ) % 2 == 1 {
500510 // Handle is a named pipe. This could be extended to be any non-AFD event.
501511 let callback = ( * ( iocp_event. overlapped ( ) as * mut super :: Overlapped ) ) . callback ;
502-
512+
503513 let len = events. len ( ) ;
504514 callback ( iocp_event. entry ( ) , Some ( events) ) ;
505515 n += events. len ( ) - len;
@@ -701,7 +711,7 @@ impl Drop for SelectorInner {
701711 let callback = unsafe {
702712 ( * ( iocp_event. overlapped ( ) as * mut super :: Overlapped ) ) . callback
703713 } ;
704-
714+
705715 callback ( iocp_event. entry ( ) , None ) ;
706716 } else {
707717 // drain sock state to release memory of Arc reference
0 commit comments