Skip to content

Commit 8299eb2

Browse files
committed
Fix crash when running in release mode
1 parent bb6ab1b commit 8299eb2

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
@@ -205,15 +205,19 @@ impl<T> EventLoop<T> {
205205
None => break
206206
}
207207
}
208-
*runner_ref = Some(&mut runner);
208+
*runner_ref = Some(runner);
209+
}
210+
211+
macro_rules! runner {
212+
() => {{ self.runner_shared.runner.borrow_mut().as_mut().unwrap() }};
209213
}
210214

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

215219
'main: loop {
216-
runner.new_events();
220+
runner!().new_events();
217221
loop {
218222
if !msg_unprocessed {
219223
if 0 == winuser::PeekMessageW(&mut msg, ptr::null_mut(), 0, 0, 1) {
@@ -224,9 +228,9 @@ impl<T> EventLoop<T> {
224228
winuser::DispatchMessageW(&mut msg);
225229
msg_unprocessed = false;
226230
}
227-
runner.events_cleared();
231+
runner!().events_cleared();
228232

229-
match runner.control_flow {
233+
match runner!().control_flow {
230234
ControlFlow::Exit => break 'main,
231235
ControlFlow::Wait => {
232236
if 0 == winuser::GetMessageW(&mut msg, ptr::null_mut(), 0, 0) {
@@ -242,7 +246,7 @@ impl<T> EventLoop<T> {
242246
}
243247
}
244248

245-
unsafe{ runner.call_event_handler(Event::LoopDestroyed) }
249+
unsafe{ runner!().call_event_handler(Event::LoopDestroyed) }
246250
*self.runner_shared.runner.borrow_mut() = None;
247251
}
248252

@@ -264,7 +268,7 @@ impl<T> EventLoop<T> {
264268

265269
pub(crate) type EventLoopRunnerShared<T> = Rc<ELRShared<T>>;
266270
pub(crate) struct ELRShared<T> {
267-
runner: RefCell<Option<*mut EventLoopRunner<T>>>,
271+
runner: RefCell<Option<EventLoopRunner<T>>>,
268272
buffer: RefCell<VecDeque<Event<T>>>
269273
}
270274
pub(crate) struct EventLoopRunner<T> {
@@ -278,9 +282,9 @@ pub(crate) struct EventLoopRunner<T> {
278282

279283
impl<T> ELRShared<T> {
280284
unsafe fn send_event(&self, event: Event<T>) {
281-
if let Ok(runner_ref) = self.runner.try_borrow_mut() {
282-
if let Some(runner) = *runner_ref {
283-
(*runner).process_event(event);
285+
if let Ok(mut runner_ref) = self.runner.try_borrow_mut() {
286+
if let Some(ref mut runner) = *runner_ref {
287+
runner.process_event(event);
284288
return;
285289
}
286290
}
@@ -378,12 +382,14 @@ impl<T> EventLoopRunner<T> {
378382
// deferred.
379383
if let RunnerState::DeferredNewEvents(wait_start) = self.runner_state {
380384
match self.control_flow {
381-
ControlFlow::Wait => self.call_event_handler(
382-
Event::NewEvents(StartCause::WaitCancelled {
383-
start: wait_start,
384-
requested_resume: None
385-
})
386-
),
385+
ControlFlow::Wait => {
386+
self.call_event_handler(
387+
Event::NewEvents(StartCause::WaitCancelled {
388+
start: wait_start,
389+
requested_resume: None
390+
})
391+
)
392+
},
387393
ControlFlow::WaitUntil(resume_time) => {
388394
let start_cause = match Instant::now() >= resume_time {
389395
// If the current time is later than the requested resume time, the resume time
@@ -402,7 +408,9 @@ impl<T> EventLoopRunner<T> {
402408
},
403409
// This can be reached if the control flow is changed to poll during a `RedrawRequested`
404410
// that was sent after `EventsCleared`.
405-
ControlFlow::Poll => self.call_event_handler(Event::NewEvents(StartCause::Poll)),
411+
ControlFlow::Poll => {
412+
self.call_event_handler(Event::NewEvents(StartCause::Poll))
413+
},
406414
ControlFlow::Exit => unreachable!()
407415
}
408416
}
@@ -455,23 +463,19 @@ impl<T> EventLoopRunner<T> {
455463
}
456464

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

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

468-
if self.control_flow != ControlFlow::Exit {
469-
(*self.event_handler)(event, event_loop_ref, &mut self.control_flow);
470-
} else {
471-
(*self.event_handler)(event, event_loop_ref, &mut ControlFlow::Exit);
472-
}
475+
if self.control_flow != ControlFlow::Exit {
476+
(*self.event_handler)(event, event_loop_ref, &mut self.control_flow);
473477
} else {
474-
panic!("Tried to call event handler with null handler");
478+
(*self.event_handler)(event, event_loop_ref, &mut ControlFlow::Exit);
475479
}
476480
}
477481
}
@@ -762,16 +766,16 @@ unsafe extern "system" fn public_window_callback<T>(
762766

763767
match msg {
764768
winuser::WM_ENTERSIZEMOVE => {
765-
let runner = subclass_input.event_loop_runner.runner.borrow_mut();
766-
if let Some(runner) = *runner {
767-
(*runner).in_modal_loop = true;
769+
let mut runner = subclass_input.event_loop_runner.runner.borrow_mut();
770+
if let Some(ref mut runner) = *runner {
771+
runner.in_modal_loop = true;
768772
}
769773
0
770774
},
771775
winuser::WM_EXITSIZEMOVE => {
772-
let runner = subclass_input.event_loop_runner.runner.borrow_mut();
773-
if let Some(runner) = *runner {
774-
(*runner).in_modal_loop = false;
776+
let mut runner = subclass_input.event_loop_runner.runner.borrow_mut();
777+
if let Some(ref mut runner) = *runner {
778+
runner.in_modal_loop = false;
775779
}
776780
0
777781
},
@@ -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 => {
@@ -1516,8 +1519,8 @@ unsafe extern "system" fn thread_event_target_callback<T>(
15161519
};
15171520
let in_modal_loop = {
15181521
let runner = subclass_input.event_loop_runner.runner.borrow_mut();
1519-
if let Some(runner) = *runner {
1520-
(*runner).in_modal_loop
1522+
if let Some(ref runner) = *runner {
1523+
runner.in_modal_loop
15211524
} else {
15221525
false
15231526
}
@@ -1550,9 +1553,8 @@ unsafe extern "system" fn thread_event_target_callback<T>(
15501553
}
15511554
}
15521555

1553-
let runner = subclass_input.event_loop_runner.runner.borrow_mut();
1554-
if let Some(runner) = *runner {
1555-
let runner = &mut *runner;
1556+
let mut runner = subclass_input.event_loop_runner.runner.borrow_mut();
1557+
if let Some(ref mut runner) = *runner {
15561558
runner.events_cleared();
15571559
match runner.control_flow {
15581560
// Waiting is handled by the modal loop.

0 commit comments

Comments
 (0)