aboutsummaryrefslogtreecommitdiff
path: root/mingling_core/src/program/once_exec.rs
diff options
context:
space:
mode:
authorWeicao-CatilGrass <1992414357@qq.com>2026-06-09 06:20:21 +0800
committerWeicao-CatilGrass <1992414357@qq.com>2026-06-09 06:21:29 +0800
commit78f282007980fe9c9ef143a6bc6fb76282957ab6 (patch)
treec13a9a7a79796e5e0bd0805a16a4a7fab97cd063 /mingling_core/src/program/once_exec.rs
parentafe4245084563fa0efe85ae6de74b3652829a08a (diff)
Replace `OnceLock<Option<Box<dyn Any>>>` with custom `ProgramCell` type
Reduces indirection and allows taking ownership of the program instance for proper cleanup before `process::exit()`
Diffstat (limited to 'mingling_core/src/program/once_exec.rs')
-rw-r--r--mingling_core/src/program/once_exec.rs30
1 files changed, 17 insertions, 13 deletions
diff --git a/mingling_core/src/program/once_exec.rs b/mingling_core/src/program/once_exec.rs
index f6eb0c0..fe90784 100644
--- a/mingling_core/src/program/once_exec.rs
+++ b/mingling_core/src/program/once_exec.rs
@@ -13,11 +13,9 @@ where
F: FnOnce(&'static Program<C>) -> Fut + Send + Sync,
Fut: Future + Send,
{
- THIS_PROGRAM.get_or_init(|| Some(Box::new(self)));
+ THIS_PROGRAM.set(Box::new(self));
let program = THIS_PROGRAM
- .get()
- .unwrap()
- .as_ref()
+ .get_raw()
.unwrap()
.downcast_ref::<Program<C>>()
.unwrap();
@@ -100,7 +98,12 @@ where
where
C: 'static + Send + Sync,
{
- std::process::exit(self.exec().await)
+ let exit_code = self.exec().await;
+ // SAFETY: exec() is synchronous — it returns only after all
+ // chain handlers and renderers have finished. No code still
+ // holds references from get_raw() at this point.
+ drop(unsafe { THIS_PROGRAM.take() });
+ std::process::exit(exit_code)
}
}
@@ -115,11 +118,9 @@ where
C: 'static + Send + Sync,
F: FnOnce(&'static Program<C>) -> R + Send + Sync,
{
- THIS_PROGRAM.get_or_init(|| Some(Box::new(self)));
+ THIS_PROGRAM.set(Box::new(self));
let program = THIS_PROGRAM
- .get()
- .unwrap()
- .as_ref()
+ .get_raw()
.unwrap()
.downcast_ref::<Program<C>>()
.unwrap();
@@ -165,9 +166,7 @@ where
};
let program = THIS_PROGRAM
- .get()
- .unwrap()
- .as_ref()
+ .get_raw()
.unwrap()
.downcast_ref::<Program<C>>()
.unwrap();
@@ -232,6 +231,11 @@ where
where
C: 'static + Send + Sync,
{
- std::process::exit(self.exec())
+ let exit_code = self.exec();
+ // SAFETY: exec() is synchronous — it returns only after all
+ // chain handlers and renderers have finished. No code still
+ // holds references from get_raw() at this point.
+ drop(unsafe { THIS_PROGRAM.take() });
+ std::process::exit(exit_code)
}
}