Fix crash when running in release mode

This commit is contained in:
Osspial
2018-09-13 22:39:40 -04:00
parent bb6ab1bb6e
commit 8299eb2f03

View File

@@ -205,7 +205,11 @@ impl<T> EventLoop<T> {
None => break None => break
} }
} }
*runner_ref = Some(&mut runner); *runner_ref = Some(runner);
}
macro_rules! runner {
() => {{ self.runner_shared.runner.borrow_mut().as_mut().unwrap() }};
} }
unsafe { unsafe {
@@ -213,7 +217,7 @@ impl<T> EventLoop<T> {
let mut msg_unprocessed = false; let mut msg_unprocessed = false;
'main: loop { 'main: loop {
runner.new_events(); runner!().new_events();
loop { loop {
if !msg_unprocessed { if !msg_unprocessed {
if 0 == winuser::PeekMessageW(&mut msg, ptr::null_mut(), 0, 0, 1) { if 0 == winuser::PeekMessageW(&mut msg, ptr::null_mut(), 0, 0, 1) {
@@ -224,9 +228,9 @@ impl<T> EventLoop<T> {
winuser::DispatchMessageW(&mut msg); winuser::DispatchMessageW(&mut msg);
msg_unprocessed = false; msg_unprocessed = false;
} }
runner.events_cleared(); runner!().events_cleared();
match runner.control_flow { match runner!().control_flow {
ControlFlow::Exit => break 'main, ControlFlow::Exit => break 'main,
ControlFlow::Wait => { ControlFlow::Wait => {
if 0 == winuser::GetMessageW(&mut msg, ptr::null_mut(), 0, 0) { if 0 == winuser::GetMessageW(&mut msg, ptr::null_mut(), 0, 0) {
@@ -242,7 +246,7 @@ impl<T> EventLoop<T> {
} }
} }
unsafe{ runner.call_event_handler(Event::LoopDestroyed) } unsafe{ runner!().call_event_handler(Event::LoopDestroyed) }
*self.runner_shared.runner.borrow_mut() = None; *self.runner_shared.runner.borrow_mut() = None;
} }
@@ -264,7 +268,7 @@ impl<T> EventLoop<T> {
pub(crate) type EventLoopRunnerShared<T> = Rc<ELRShared<T>>; pub(crate) type EventLoopRunnerShared<T> = Rc<ELRShared<T>>;
pub(crate) struct ELRShared<T> { pub(crate) struct ELRShared<T> {
runner: RefCell<Option<*mut EventLoopRunner<T>>>, runner: RefCell<Option<EventLoopRunner<T>>>,
buffer: RefCell<VecDeque<Event<T>>> buffer: RefCell<VecDeque<Event<T>>>
} }
pub(crate) struct EventLoopRunner<T> { pub(crate) struct EventLoopRunner<T> {
@@ -278,9 +282,9 @@ pub(crate) struct EventLoopRunner<T> {
impl<T> ELRShared<T> { impl<T> ELRShared<T> {
unsafe fn send_event(&self, event: Event<T>) { unsafe fn send_event(&self, event: Event<T>) {
if let Ok(runner_ref) = self.runner.try_borrow_mut() { if let Ok(mut runner_ref) = self.runner.try_borrow_mut() {
if let Some(runner) = *runner_ref { if let Some(ref mut runner) = *runner_ref {
(*runner).process_event(event); runner.process_event(event);
return; return;
} }
} }
@@ -378,12 +382,14 @@ impl<T> EventLoopRunner<T> {
// deferred. // deferred.
if let RunnerState::DeferredNewEvents(wait_start) = self.runner_state { if let RunnerState::DeferredNewEvents(wait_start) = self.runner_state {
match self.control_flow { match self.control_flow {
ControlFlow::Wait => self.call_event_handler( ControlFlow::Wait => {
Event::NewEvents(StartCause::WaitCancelled { self.call_event_handler(
start: wait_start, Event::NewEvents(StartCause::WaitCancelled {
requested_resume: None start: wait_start,
}) requested_resume: None
), })
)
},
ControlFlow::WaitUntil(resume_time) => { ControlFlow::WaitUntil(resume_time) => {
let start_cause = match Instant::now() >= resume_time { let start_cause = match Instant::now() >= resume_time {
// If the current time is later than the requested resume time, the resume time // If the current time is later than the requested resume time, the resume time
@@ -402,7 +408,9 @@ impl<T> EventLoopRunner<T> {
}, },
// This can be reached if the control flow is changed to poll during a `RedrawRequested` // This can be reached if the control flow is changed to poll during a `RedrawRequested`
// that was sent after `EventsCleared`. // that was sent after `EventsCleared`.
ControlFlow::Poll => self.call_event_handler(Event::NewEvents(StartCause::Poll)), ControlFlow::Poll => {
self.call_event_handler(Event::NewEvents(StartCause::Poll))
},
ControlFlow::Exit => unreachable!() ControlFlow::Exit => unreachable!()
} }
} }
@@ -455,23 +463,19 @@ impl<T> EventLoopRunner<T> {
} }
unsafe fn call_event_handler(&mut self, event: Event<T>) { unsafe fn call_event_handler(&mut self, event: Event<T>) {
if self.event_handler != mem::zeroed() { match event {
match event { Event::NewEvents(_) => (*self.event_loop).trigger_newevents_on_redraw.store(true, Ordering::Relaxed),
Event::NewEvents(_) => (*self.event_loop).trigger_newevents_on_redraw.store(true, Ordering::Relaxed), Event::EventsCleared => (*self.event_loop).trigger_newevents_on_redraw.store(false, Ordering::Relaxed),
Event::EventsCleared => (*self.event_loop).trigger_newevents_on_redraw.store(false, Ordering::Relaxed), _ => ()
_ => () }
}
assert_eq!(mem::size_of::<RootEventLoop<T>>(), mem::size_of::<EventLoop<T>>()); assert_eq!(mem::size_of::<RootEventLoop<T>>(), mem::size_of::<EventLoop<T>>());
let event_loop_ref = &*(self.event_loop as *const RootEventLoop<T>); let event_loop_ref = &*(self.event_loop as *const RootEventLoop<T>);
if self.control_flow != ControlFlow::Exit { if self.control_flow != ControlFlow::Exit {
(*self.event_handler)(event, event_loop_ref, &mut self.control_flow); (*self.event_handler)(event, event_loop_ref, &mut self.control_flow);
} else {
(*self.event_handler)(event, event_loop_ref, &mut ControlFlow::Exit);
}
} else { } else {
panic!("Tried to call event handler with null handler"); (*self.event_handler)(event, event_loop_ref, &mut ControlFlow::Exit);
} }
} }
} }
@@ -762,16 +766,16 @@ unsafe extern "system" fn public_window_callback<T>(
match msg { match msg {
winuser::WM_ENTERSIZEMOVE => { winuser::WM_ENTERSIZEMOVE => {
let runner = subclass_input.event_loop_runner.runner.borrow_mut(); let mut runner = subclass_input.event_loop_runner.runner.borrow_mut();
if let Some(runner) = *runner { if let Some(ref mut runner) = *runner {
(*runner).in_modal_loop = true; runner.in_modal_loop = true;
} }
0 0
}, },
winuser::WM_EXITSIZEMOVE => { winuser::WM_EXITSIZEMOVE => {
let runner = subclass_input.event_loop_runner.runner.borrow_mut(); let mut runner = subclass_input.event_loop_runner.runner.borrow_mut();
if let Some(runner) = *runner { if let Some(ref mut runner) = *runner {
(*runner).in_modal_loop = false; runner.in_modal_loop = false;
} }
0 0
}, },
@@ -804,9 +808,8 @@ unsafe extern "system" fn public_window_callback<T>(
_ if msg == *REQUEST_REDRAW_NO_NEWEVENTS_MSG_ID => { _ if msg == *REQUEST_REDRAW_NO_NEWEVENTS_MSG_ID => {
use event::WindowEvent::RedrawRequested; use event::WindowEvent::RedrawRequested;
let runner = subclass_input.event_loop_runner.runner.borrow_mut(); let mut runner = subclass_input.event_loop_runner.runner.borrow_mut();
if let Some(runner) = *runner { if let Some(ref mut runner) = *runner {
let runner = &mut *runner;
match runner.runner_state { match runner.runner_state {
RunnerState::Idle(..) | RunnerState::Idle(..) |
RunnerState::DeferredNewEvents(..) => runner.call_event_handler(Event::WindowEvent { RunnerState::DeferredNewEvents(..) => runner.call_event_handler(Event::WindowEvent {
@@ -827,9 +830,8 @@ unsafe extern "system" fn public_window_callback<T>(
let mut send_event = false; let mut send_event = false;
{ {
let runner = subclass_input.event_loop_runner.runner.borrow_mut(); let mut runner = subclass_input.event_loop_runner.runner.borrow_mut();
if let Some(runner) = *runner { if let Some(ref mut runner) = *runner {
let runner = &mut *runner;
match runner.runner_state { match runner.runner_state {
RunnerState::Idle(..) | RunnerState::Idle(..) |
RunnerState::DeferredNewEvents(..) => runner.call_event_handler(event()), RunnerState::DeferredNewEvents(..) => runner.call_event_handler(event()),
@@ -1154,7 +1156,8 @@ unsafe extern "system" fn public_window_callback<T>(
event, event,
}); });
commctrl::DefSubclassProc(window, msg, wparam, lparam) 0
// commctrl::DefSubclassProc(window, msg, wparam, lparam)
}, },
winuser::WM_INPUT => { winuser::WM_INPUT => {
@@ -1516,8 +1519,8 @@ unsafe extern "system" fn thread_event_target_callback<T>(
}; };
let in_modal_loop = { let in_modal_loop = {
let runner = subclass_input.event_loop_runner.runner.borrow_mut(); let runner = subclass_input.event_loop_runner.runner.borrow_mut();
if let Some(runner) = *runner { if let Some(ref runner) = *runner {
(*runner).in_modal_loop runner.in_modal_loop
} else { } else {
false false
} }
@@ -1550,9 +1553,8 @@ unsafe extern "system" fn thread_event_target_callback<T>(
} }
} }
let runner = subclass_input.event_loop_runner.runner.borrow_mut(); let mut runner = subclass_input.event_loop_runner.runner.borrow_mut();
if let Some(runner) = *runner { if let Some(ref mut runner) = *runner {
let runner = &mut *runner;
runner.events_cleared(); runner.events_cleared();
match runner.control_flow { match runner.control_flow {
// Waiting is handled by the modal loop. // Waiting is handled by the modal loop.