aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/serviceworker_manager.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2018-09-12 13:33:45 -0400
committerGitHub <noreply@github.com>2018-09-12 13:33:45 -0400
commit910cc23a6e85cced43905f7615065b23bdb54b42 (patch)
tree3ceae959c0ebdf3f224c5c07f5b8c2cbd31dddf1 /components/script/serviceworker_manager.rs
parent9a83ab6297ddb62937fc54521b7fd4d19017e6b1 (diff)
parent2a996fbc8fef722b264389680cc55c25c46807d1 (diff)
downloadservo-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.rs18
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),
}
}
}