diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2018-09-12 13:33:45 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-12 13:33:45 -0400 |
commit | 910cc23a6e85cced43905f7615065b23bdb54b42 (patch) | |
tree | 3ceae959c0ebdf3f224c5c07f5b8c2cbd31dddf1 /components/script/serviceworker_manager.rs | |
parent | 9a83ab6297ddb62937fc54521b7fd4d19017e6b1 (diff) | |
parent | 2a996fbc8fef722b264389680cc55c25c46807d1 (diff) | |
download | servo-910cc23a6e85cced43905f7615065b23bdb54b42.tar.gz servo-910cc23a6e85cced43905f7615065b23bdb54b42.zip |
Auto merge of #21325 - gterzian:crossbeam_integration, r=SimonSapin,jdm
Replace mpsc with crossbeam-channel
Follow up on https://github.com/servo/servo/pull/19515
---
Selecting over multiple channels in `std::sync::mpsc` is not stable and likely never will be:
https://github.com/rust-lang/rust/issues/27800#issuecomment-260136777
> It seems the only thing keeping `mpsc_select` around is Servo.
crossbeam-channel is designed specifically to replace `std::sync::mpsc` and fix many of its shortcomings:
https://github.com/stjepang/rfcs-crossbeam/blob/channel/text/2017-11-09-channel.md
This is to be landed together with https://github.com/servo/ipc-channel/pull/183.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/21325)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/serviceworker_manager.rs')
-rw-r--r-- | components/script/serviceworker_manager.rs | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/components/script/serviceworker_manager.rs b/components/script/serviceworker_manager.rs index 2bf19aa25a5..4573a5666c3 100644 --- a/components/script/serviceworker_manager.rs +++ b/components/script/serviceworker_manager.rs @@ -13,13 +13,12 @@ use dom::bindings::structuredclone::StructuredCloneData; use dom::serviceworkerglobalscope::{ServiceWorkerGlobalScope, ServiceWorkerScriptMsg}; use dom::serviceworkerregistration::longest_prefix_match; use ipc_channel::ipc::{self, IpcSender}; -use ipc_channel::router::ROUTER; use net_traits::{CustomResponseMediator, CoreResourceMsg}; use script_traits::{ServiceWorkerMsg, ScopeThings, SWManagerMsg, SWManagerSenders, DOMMessage}; +use servo_channel::{channel, route_ipc_receiver_to_new_servo_receiver, Sender, Receiver}; use servo_config::prefs::PREFS; use servo_url::ServoUrl; use std::collections::HashMap; -use std::sync::mpsc::{channel, Sender, Receiver, RecvError}; use std::thread; enum Message { @@ -56,8 +55,8 @@ impl ServiceWorkerManager { pub fn spawn_manager(sw_senders: SWManagerSenders) { let (own_sender, from_constellation_receiver) = ipc::channel().unwrap(); let (resource_chan, resource_port) = ipc::channel().unwrap(); - let from_constellation = ROUTER.route_ipc_receiver_to_new_mpsc_receiver(from_constellation_receiver); - let resource_port = ROUTER.route_ipc_receiver_to_new_mpsc_receiver(resource_port); + let from_constellation = route_ipc_receiver_to_new_servo_receiver(from_constellation_receiver); + let resource_port = route_ipc_receiver_to_new_servo_receiver(resource_port); let _ = sw_senders.resource_sender.send(CoreResourceMsg::NetworkMediator(resource_chan)); let _ = sw_senders.swmanager_sender.send(SWManagerMsg::OwnSender(own_sender.clone())); thread::Builder::new().name("ServiceWorkerManager".to_owned()).spawn(move || { @@ -108,7 +107,7 @@ impl ServiceWorkerManager { } fn handle_message(&mut self) { - while let Ok(message) = self.receive_message() { + while let Some(message) = self.receive_message() { let should_continue = match message { Message::FromConstellation(msg) => { self.handle_message_from_constellation(msg) @@ -184,13 +183,10 @@ impl ServiceWorkerManager { true } - #[allow(unsafe_code)] - fn receive_message(&mut self) -> Result<Message, RecvError> { - let msg_from_constellation = &self.own_port; - let msg_from_resource = &self.resource_receiver; + fn receive_message(&mut self) -> Option<Message> { select! { - msg = msg_from_constellation.recv() => msg.map(Message::FromConstellation), - msg = msg_from_resource.recv() => msg.map(Message::FromResource) + recv(self.own_port.select(), msg) => msg.map(Message::FromConstellation), + recv(self.resource_receiver.select(), msg) => msg.map(Message::FromResource), } } } |