Skip to content

Commit 9884c8f

Browse files
committed
Lock-free design by creating fresh events; no need for unsafe impl S{end,ync}
1 parent 1e89804 commit 9884c8f

File tree

1 file changed

+12
-36
lines changed

1 file changed

+12
-36
lines changed

src/async_/spawn.rs

Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,14 @@ use std::sync::OnceLock;
77

88
use core::future::Future;
99

10+
use alloc::boxed::Box;
1011
pub use async_task::Task;
1112
use async_task::{Runnable, ScheduleInfo, WithInfo};
1213
use 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

1816
use crate::log::ngx_cycle_log;
1917
use crate::ngx_log_debug;
20-
use crate::sync::RwLock;
2118

2219
static 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

4748
fn notify() -> c_int {
@@ -57,22 +58,12 @@ fn notify() -> c_int {
5758
struct 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-
6763
impl 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-
12298
static SCHEDULER: OnceLock<Scheduler> = OnceLock::new();
12399

124100
fn scheduler() -> &'static Scheduler {

0 commit comments

Comments
 (0)