more stable raw mem access in signal handlers

This commit is contained in:
Dominik Maier 2021-03-05 21:38:48 +01:00
parent 5392d534a9
commit edd239ce95

View File

@ -51,8 +51,12 @@ where
) -> Result<(), Error> { ) -> Result<(), Error> {
#[cfg(unix)] #[cfg(unix)]
unsafe { unsafe {
unix_signal_handler::GLOBAL_STATE.current_input_ptr = let data = &mut unix_signal_handler::GLOBAL_STATE;
_input as *const _ as *const c_void; data.current_input_ptr = _input as *const _ as *const c_void;
// Direct raw pointers access /aliasing is pretty undefined behavior.
// Since the state and event may have moved in memory, refresh them right before the signal may happen
data.state_ptr = _state as *mut _ as *mut c_void;
data.event_mgr_ptr = _event_mgr as *mut _ as *mut c_void;
} }
Ok(()) Ok(())
} }
@ -123,8 +127,6 @@ where
#[cfg(unix)] #[cfg(unix)]
unsafe { unsafe {
let mut data = &mut unix_signal_handler::GLOBAL_STATE; let mut data = &mut unix_signal_handler::GLOBAL_STATE;
data.state_ptr = _state as *mut _ as *mut c_void;
data.event_mgr_ptr = _event_mgr as *mut _ as *mut c_void;
data.observers_ptr = &observers as *const _ as *const c_void; data.observers_ptr = &observers as *const _ as *const c_void;
data.crash_handler = unix_signal_handler::inproc_crash_handler::<EM, I, OC, OFT, OT, S>; data.crash_handler = unix_signal_handler::inproc_crash_handler::<EM, I, OC, OFT, OT, S>;
data.timeout_handler = data.timeout_handler =