From 9c1f3dfa8fefb2505011d031bec68f3f7e6a2210 Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Sat, 2 Apr 2016 22:39:45 +0501 Subject: [PATCH] servo: Merge #10343 - Comment explaining constellation panic for recv (from asajeffrey:document-constellation-recv-panic); r=jdm A retry of #10294, which was closed due to homu issues. Source-Repo: https://github.com/servo/servo Source-Revision: 85f9f9626eaff12b66299eb6190955f2726b432c --- servo/components/compositing/constellation.rs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/servo/components/compositing/constellation.rs b/servo/components/compositing/constellation.rs index dbb22b84fc64..b41f75c7b6e6 100644 --- a/servo/components/compositing/constellation.rs +++ b/servo/components/compositing/constellation.rs @@ -536,6 +536,17 @@ impl Constellation Paint(FromPaintMsg) } + // Get one incoming request. + // This is one of the few places where the compositor is + // allowed to panic. If one of the receiver.recv() calls + // fails, it is because the matching sender has been + // reclaimed, but this can't happen in normal execution + // because the constellation keeps a pointer to the sender, + // so it should never be reclaimed. A possible scenario in + // which receiver.recv() fails is if some unsafe code + // produces undefined behaviour, resulting in the destructor + // being called. If this happens, there's not much we can do + // other than panic. let request = { let receiver_from_script = &self.script_receiver; let receiver_from_compositor = &self.compositor_receiver; @@ -543,16 +554,17 @@ impl Constellation let receiver_from_paint = &self.painter_receiver; select! { msg = receiver_from_script.recv() => - Request::Script(msg.unwrap()), + Request::Script(msg.expect("Unexpected script failure in constellation")), msg = receiver_from_compositor.recv() => - Request::Compositor(msg.unwrap()), + Request::Compositor(msg.expect("Unexpected compositor failure in constellation")), msg = receiver_from_layout.recv() => - Request::Layout(msg.unwrap()), + Request::Layout(msg.expect("Unexpected layout failure in constellation")), msg = receiver_from_paint.recv() => - Request::Paint(msg.unwrap()) + Request::Paint(msg.expect("Unexpected paint failure in constellation")) } }; + // Process the request. match request { // Messages from compositor