auto merge of #5245 : nnethercote/servo/only-one-quit-event, r=glennw

This fixes #5234, in that the huge memory spike disappears. It still takes ~15 seconds for the window to actually disappear after that first `Quit` event is received by the IOCompositor. Maybe that's a pre-existing problem.

There may be better ways to do this, like handling it on the sending side (i.e. within glutin) instead of the receiving side. I just did it this way because it seemed like the easiest thing.
This commit is contained in:
bors-servo 2015-03-16 22:21:49 -06:00
commit 2281bca892

View file

@ -128,6 +128,9 @@ pub struct IOCompositor<Window: WindowMethods> {
/// Pending scroll events. /// Pending scroll events.
pending_scroll_events: Vec<ScrollEvent>, pending_scroll_events: Vec<ScrollEvent>,
/// Has a Quit event been seen?
has_seen_quit_event: bool,
} }
pub struct ScrollEvent { pub struct ScrollEvent {
@ -217,6 +220,7 @@ impl<Window: WindowMethods> IOCompositor<Window> {
fragment_point: None, fragment_point: None,
outstanding_paint_msgs: 0, outstanding_paint_msgs: 0,
last_composite_time: 0, last_composite_time: 0,
has_seen_quit_event: false,
} }
} }
@ -787,10 +791,13 @@ impl<Window: WindowMethods> IOCompositor<Window> {
} }
WindowEvent::Quit => { WindowEvent::Quit => {
debug!("shutting down the constellation for WindowEvent::Quit"); if !self.has_seen_quit_event {
let ConstellationChan(ref chan) = self.constellation_chan; self.has_seen_quit_event = true;
chan.send(ConstellationMsg::Exit).unwrap(); debug!("shutting down the constellation for WindowEvent::Quit");
self.shutdown_state = ShutdownState::ShuttingDown; let ConstellationChan(ref chan) = self.constellation_chan;
chan.send(ConstellationMsg::Exit).unwrap();
self.shutdown_state = ShutdownState::ShuttingDown;
}
} }
} }
} }