Skip to content

Commit 9c15f03

Browse files
committed
Fix crash when running in release mode
1 parent 874fcf5 commit 9c15f03

File tree

1 file changed

+50
-48
lines changed

1 file changed

+50
-48
lines changed

src/platform_impl/windows/event_loop.rs

+50-48
Original file line numberDiff line numberDiff line change
@@ -206,15 +206,19 @@ impl<T> EventLoop<T> {
206206
None => break
207207
}
208208
}
209-
*runner_ref = Some(&mut runner);
209+
*runner_ref = Some(runner);
210+
}
211+
212+
macro_rules! runner {
213+
() => {{ self.runner_shared.runner.borrow_mut().as_mut().unwrap() }};
210214
}
211215

212216
unsafe {
213217
let mut msg = mem::uninitialized();
214218
let mut msg_unprocessed = false;
215219

216220
'main: loop {
217-
runner.new_events();
221+
runner!().new_events();
218222
loop {
219223
if !msg_unprocessed {
220224
if 0 == winuser::PeekMessageW(&mut msg, ptr::null_mut(), 0, 0, 1) {
@@ -225,9 +229,9 @@ impl<T> EventLoop<T> {
225229
winuser::DispatchMessageW(&mut msg);
226230
msg_unprocessed = false;
227231
}
228-
runner.events_cleared();
232+
runner!().events_cleared();
229233

230-
match runner.control_flow {
234+
match runner!().control_flow {
231235
ControlFlow::Exit => break 'main,
232236
ControlFlow::Wait => {
233237
if 0 == winuser::GetMessageW(&mut msg, ptr::null_mut(), 0, 0) {
@@ -243,7 +247,7 @@ impl<T> EventLoop<T> {
243247
}
244248
}
245249

246-
unsafe{ runner.call_event_handler(Event::LoopDestroyed) }
250+
unsafe{ runner!().call_event_handler(Event::LoopDestroyed) }
247251
*self.runner_shared.runner.borrow_mut() = None;
248252
}
249253

@@ -265,7 +269,7 @@ impl<T> EventLoop<T> {
265269

266270
pub(crate) type EventLoopRunnerShared<T> = Rc<ELRShared<T>>;
267271
pub(crate) struct ELRShared<T> {
268-
runner: RefCell<Option<*mut EventLoopRunner<T>>>,
272+
runner: RefCell<Option<EventLoopRunner<T>>>,
269273
buffer: RefCell<VecDeque<Event<T>>>
270274
}
271275
pub(crate) struct EventLoopRunner<T> {
@@ -279,9 +283,9 @@ pub(crate) struct EventLoopRunner<T> {
279283

280284
impl<T> ELRShared<T> {
281285
unsafe fn send_event(&self, event: Event<T>) {
282-
if let Ok(runner_ref) = self.runner.try_borrow_mut() {
283-
if let Some(runner) = *runner_ref {
284-
(*runner).process_event(event);
286+
if let Ok(mut runner_ref) = self.runner.try_borrow_mut() {
287+
if let Some(ref mut runner) = *runner_ref {
288+
runner.process_event(event);
285289
return;
286290
}
287291
}
@@ -379,12 +383,14 @@ impl<T> EventLoopRunner<T> {
379383
// deferred.
380384
if let RunnerState::DeferredNewEvents(wait_start) = self.runner_state {
381385
match self.control_flow {
382-
ControlFlow::Wait => self.call_event_handler(
383-
Event::NewEvents(StartCause::WaitCancelled {
384-
start: wait_start,
385-
requested_resume: None
386-
})
387-
),
386+
ControlFlow::Wait => {
387+
self.call_event_handler(
388+
Event::NewEvents(StartCause::WaitCancelled {
389+
start: wait_start,
390+
requested_resume: None
391+
})
392+
)
393+
},
388394
ControlFlow::WaitUntil(resume_time) => {
389395
let start_cause = match Instant::now() >= resume_time {
390396
// If the current time is later than the requested resume time, the resume time
@@ -403,7 +409,9 @@ impl<T> EventLoopRunner<T> {
403409
},
404410
// This can be reached if the control flow is changed to poll during a `RedrawRequested`
405411
// that was sent after `EventsCleared`.
406-
ControlFlow::Poll => self.call_event_handler(Event::NewEvents(StartCause::Poll)),
412+
ControlFlow::Poll => {
413+
self.call_event_handler(Event::NewEvents(StartCause::Poll))
414+
},
407415
ControlFlow::Exit => unreachable!()
408416
}
409417
}
@@ -456,23 +464,19 @@ impl<T> EventLoopRunner<T> {
456464
}
457465

458466
unsafe fn call_event_handler(&mut self, event: Event<T>) {
459-
if self.event_handler != mem::zeroed() {
460-
match event {
461-
Event::NewEvents(_) => (*self.event_loop).trigger_newevents_on_redraw.store(true, Ordering::Relaxed),
462-
Event::EventsCleared => (*self.event_loop).trigger_newevents_on_redraw.store(false, Ordering::Relaxed),
463-
_ => ()
464-
}
467+
match event {
468+
Event::NewEvents(_) => (*self.event_loop).trigger_newevents_on_redraw.store(true, Ordering::Relaxed),
469+
Event::EventsCleared => (*self.event_loop).trigger_newevents_on_redraw.store(false, Ordering::Relaxed),
470+
_ => ()
471+
}
465472

466-
assert_eq!(mem::size_of::<RootEventLoop<T>>(), mem::size_of::<EventLoop<T>>());
467-
let event_loop_ref = &*(self.event_loop as *const RootEventLoop<T>);
473+
assert_eq!(mem::size_of::<RootEventLoop<T>>(), mem::size_of::<EventLoop<T>>());
474+
let event_loop_ref = &*(self.event_loop as *const RootEventLoop<T>);
468475

469-
if self.control_flow != ControlFlow::Exit {
470-
(*self.event_handler)(event, event_loop_ref, &mut self.control_flow);
471-
} else {
472-
(*self.event_handler)(event, event_loop_ref, &mut ControlFlow::Exit);
473-
}
476+
if self.control_flow != ControlFlow::Exit {
477+
(*self.event_handler)(event, event_loop_ref, &mut self.control_flow);
474478
} else {
475-
panic!("Tried to call event handler with null handler");
479+
(*self.event_handler)(event, event_loop_ref, &mut ControlFlow::Exit);
476480
}
477481
}
478482
}
@@ -763,16 +767,16 @@ unsafe extern "system" fn public_window_callback<T>(
763767

764768
match msg {
765769
winuser::WM_ENTERSIZEMOVE => {
766-
let runner = subclass_input.event_loop_runner.runner.borrow_mut();
767-
if let Some(runner) = *runner {
768-
(*runner).in_modal_loop = true;
770+
let mut runner = subclass_input.event_loop_runner.runner.borrow_mut();
771+
if let Some(ref mut runner) = *runner {
772+
runner.in_modal_loop = true;
769773
}
770774
0
771775
},
772776
winuser::WM_EXITSIZEMOVE => {
773-
let runner = subclass_input.event_loop_runner.runner.borrow_mut();
774-
if let Some(runner) = *runner {
775-
(*runner).in_modal_loop = false;
777+
let mut runner = subclass_input.event_loop_runner.runner.borrow_mut();
778+
if let Some(ref mut runner) = *runner {
779+
runner.in_modal_loop = false;
776780
}
777781
0
778782
},
@@ -804,9 +808,8 @@ unsafe extern "system" fn public_window_callback<T>(
804808

805809
_ if msg == *REQUEST_REDRAW_NO_NEWEVENTS_MSG_ID => {
806810
use event::WindowEvent::RedrawRequested;
807-
let runner = subclass_input.event_loop_runner.runner.borrow_mut();
808-
if let Some(runner) = *runner {
809-
let runner = &mut *runner;
811+
let mut runner = subclass_input.event_loop_runner.runner.borrow_mut();
812+
if let Some(ref mut runner) = *runner {
810813
match runner.runner_state {
811814
RunnerState::Idle(..) |
812815
RunnerState::DeferredNewEvents(..) => runner.call_event_handler(Event::WindowEvent {
@@ -827,9 +830,8 @@ unsafe extern "system" fn public_window_callback<T>(
827830

828831
let mut send_event = false;
829832
{
830-
let runner = subclass_input.event_loop_runner.runner.borrow_mut();
831-
if let Some(runner) = *runner {
832-
let runner = &mut *runner;
833+
let mut runner = subclass_input.event_loop_runner.runner.borrow_mut();
834+
if let Some(ref mut runner) = *runner {
833835
match runner.runner_state {
834836
RunnerState::Idle(..) |
835837
RunnerState::DeferredNewEvents(..) => runner.call_event_handler(event()),
@@ -1154,7 +1156,8 @@ unsafe extern "system" fn public_window_callback<T>(
11541156
event,
11551157
});
11561158

1157-
commctrl::DefSubclassProc(window, msg, wparam, lparam)
1159+
0
1160+
// commctrl::DefSubclassProc(window, msg, wparam, lparam)
11581161
},
11591162

11601163
winuser::WM_INPUT => {
@@ -1533,8 +1536,8 @@ unsafe extern "system" fn thread_event_target_callback<T>(
15331536
};
15341537
let in_modal_loop = {
15351538
let runner = subclass_input.event_loop_runner.runner.borrow_mut();
1536-
if let Some(runner) = *runner {
1537-
(*runner).in_modal_loop
1539+
if let Some(ref runner) = *runner {
1540+
runner.in_modal_loop
15381541
} else {
15391542
false
15401543
}
@@ -1567,9 +1570,8 @@ unsafe extern "system" fn thread_event_target_callback<T>(
15671570
}
15681571
}
15691572

1570-
let runner = subclass_input.event_loop_runner.runner.borrow_mut();
1571-
if let Some(runner) = *runner {
1572-
let runner = &mut *runner;
1573+
let mut runner = subclass_input.event_loop_runner.runner.borrow_mut();
1574+
if let Some(ref mut runner) = *runner {
15731575
runner.events_cleared();
15741576
match runner.control_flow {
15751577
// Waiting is handled by the modal loop.

0 commit comments

Comments
 (0)