@@ -7,17 +7,14 @@ use std::sync::OnceLock;
77
88use core:: future:: Future ;
99
10+ use alloc:: boxed:: Box ;
1011pub use async_task:: Task ;
1112use async_task:: { Runnable , ScheduleInfo , WithInfo } ;
1213use crossbeam_channel:: { unbounded, Receiver , Sender } ;
13- use nginx_sys:: {
14- kill, ngx_del_timer, ngx_delete_posted_event, ngx_event_t, ngx_post_event,
15- ngx_posted_next_events, ngx_thread_tid, SIGIO ,
16- } ;
14+ use nginx_sys:: { kill, ngx_event_t, ngx_post_event, ngx_posted_next_events, ngx_thread_tid, SIGIO } ;
1715
1816use crate :: log:: ngx_cycle_log;
1917use crate :: ngx_log_debug;
20- use crate :: sync:: RwLock ;
2118
2219static MAIN_TID : AtomicI64 = AtomicI64 :: new ( -1 ) ;
2320
@@ -42,6 +39,10 @@ extern "C" fn async_handler(ev: *mut ngx_event_t) {
4239 unsafe { ( * ev) . log } ,
4340 "async: notify_handler processed {cnt} items"
4441 ) ;
42+
43+ unsafe {
44+ drop ( Box :: from_raw ( ev) ) ;
45+ }
4546}
4647
4748fn notify ( ) -> c_int {
@@ -57,22 +58,12 @@ fn notify() -> c_int {
5758struct Scheduler {
5859 rx : Receiver < Runnable > ,
5960 tx : Sender < Runnable > ,
60- event : RwLock < ngx_event_t > ,
6161}
6262
63- // Safety: mutable access to event is guarded via RwLock
64- unsafe impl Send for Scheduler { }
65- unsafe impl Sync for Scheduler { }
66-
6763impl Scheduler {
6864 fn new ( ) -> Self {
6965 let ( tx, rx) = unbounded ( ) ;
70- let mut event: ngx_event_t = unsafe { mem:: zeroed ( ) } ;
71- event. handler = Some ( async_handler) ;
72- event. log = ngx_cycle_log ( ) . as_ptr ( ) ;
73- let event = RwLock :: new ( event) ;
74-
75- Scheduler { tx, rx, event }
66+ Scheduler { tx, rx }
7667 }
7768
7869 fn schedule ( & self , runnable : Runnable , info : ScheduleInfo ) {
@@ -87,13 +78,11 @@ impl Scheduler {
8778 runnable. run ( ) ;
8879 } else {
8980 self . tx . send ( runnable) . expect ( "send" ) ;
90- {
91- let mut event = self . event . write ( ) ;
92- event. log = ngx_cycle_log ( ) . as_ptr ( ) ;
93-
94- unsafe {
95- ngx_post_event ( & mut * event, ptr:: addr_of_mut!( ngx_posted_next_events) ) ;
96- }
81+ unsafe {
82+ let event: * mut ngx_event_t = Box :: into_raw ( Box :: new ( mem:: zeroed ( ) ) ) ;
83+ ( * event) . handler = Some ( async_handler) ;
84+ ( * event) . log = ngx_cycle_log ( ) . as_ptr ( ) ;
85+ ngx_post_event ( event, ptr:: addr_of_mut!( ngx_posted_next_events) ) ;
9786 }
9887
9988 if !oet {
@@ -106,19 +95,6 @@ impl Scheduler {
10695 }
10796}
10897
109- impl Drop for Scheduler {
110- fn drop ( & mut self ) {
111- let mut event = self . event . write ( ) ;
112- if event. posted ( ) != 0 {
113- unsafe { ngx_delete_posted_event ( & mut * event) } ;
114- }
115-
116- if event. timer_set ( ) != 0 {
117- unsafe { ngx_del_timer ( & mut * event) } ;
118- }
119- }
120- }
121-
12298static SCHEDULER : OnceLock < Scheduler > = OnceLock :: new ( ) ;
12399
124100fn scheduler ( ) -> & ' static Scheduler {
0 commit comments