diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index 9ec81cdfc93..fe9b5cfda7b 100644 --- a/components/constellation/constellation.rs +++ b/components/constellation/constellation.rs @@ -359,17 +359,17 @@ pub struct Constellation { bluetooth_ipc_sender: IpcSender, /// A map of origin to sender to a Service worker manager. - sw_managers: HashMap>, + sw_managers: HashMap>, /// An IPC channel for Service Worker Manager threads to send /// messages to the constellation. This is the SW Manager thread's /// view of `swmanager_receiver`. - swmanager_ipc_sender: IpcSender, + swmanager_ipc_sender: GenericSender, /// A channel for the constellation to receive messages from the /// Service Worker Manager thread. This is the constellation's view of /// `swmanager_sender`. - swmanager_receiver: Receiver>, + swmanager_receiver: RoutedReceiver, /// A channel for the constellation to send messages to the /// time profiler thread. @@ -607,7 +607,7 @@ where // service worker manager to communicate with constellation let (swmanager_ipc_sender, swmanager_ipc_receiver) = - ipc::channel().expect("ipc channel failure"); + generic_channel::channel().expect("ipc channel failure"); thread::Builder::new() .name("Constellation".to_owned()) @@ -653,10 +653,7 @@ where ) }; - let swmanager_receiver = - route_ipc_receiver_to_new_crossbeam_receiver_preserving_errors( - swmanager_ipc_receiver, - ); + let swmanager_receiver = swmanager_ipc_receiver.route_preserving_errors(); // Zero is reserved for the embedder. PipelineNamespace::install(PipelineNamespaceId(1)); @@ -2447,7 +2444,8 @@ where let sw_manager = match self.sw_managers.entry(origin.clone()) { Entry::Occupied(entry) => entry.into_mut(), Entry::Vacant(entry) => { - let (own_sender, receiver) = ipc::channel().expect("Failed to create IPC channel!"); + let (own_sender, receiver) = + generic_channel::channel().expect("Failed to create IPC channel!"); let sw_senders = SWManagerSenders { swmanager_sender: self.swmanager_ipc_sender.clone(), diff --git a/components/constellation/pipeline.rs b/components/constellation/pipeline.rs index 78924513bbe..d897a916bcd 100644 --- a/components/constellation/pipeline.rs +++ b/components/constellation/pipeline.rs @@ -155,7 +155,7 @@ pub struct InitialPipelineState { pub bluetooth_thread: IpcSender, /// A channel to the service worker manager thread - pub swmanager_thread: IpcSender, + pub swmanager_thread: GenericSender, /// A proxy to the system font service, responsible for managing the list of system fonts. pub system_font_service: Arc, @@ -481,7 +481,7 @@ pub struct UnprivilegedPipelineContent { devtools_ipc_sender: Option>, #[cfg(feature = "bluetooth")] bluetooth_thread: IpcSender, - swmanager_thread: IpcSender, + swmanager_thread: GenericSender, system_font_service: SystemFontServiceProxySender, resource_threads: ResourceThreads, time_profiler_chan: time::ProfilerChan, diff --git a/components/script/dom/serviceworkerglobalscope.rs b/components/script/dom/serviceworkerglobalscope.rs index 62720e52c1e..03444aef9c0 100644 --- a/components/script/dom/serviceworkerglobalscope.rs +++ b/components/script/dom/serviceworkerglobalscope.rs @@ -7,6 +7,7 @@ use std::sync::atomic::AtomicBool; use std::thread::{self, JoinHandle}; use std::time::{Duration, Instant}; +use base::generic_channel::GenericSender; use base::id::PipelineId; use constellation_traits::{ ScopeThings, ServiceWorkerMsg, WorkerGlobalScopeInit, WorkerScriptLoadOrigin, @@ -15,7 +16,7 @@ use crossbeam_channel::{Receiver, Sender, after, unbounded}; use devtools_traits::DevtoolScriptControlMsg; use dom_struct::dom_struct; use fonts::FontContext; -use ipc_channel::ipc::{IpcReceiver, IpcSender}; +use ipc_channel::ipc::IpcReceiver; use ipc_channel::router::ROUTER; use js::jsapi::{JS_AddInterruptCallback, JSContext}; use js::jsval::UndefinedValue; @@ -161,7 +162,7 @@ pub(crate) struct ServiceWorkerGlobalScope { #[ignore_malloc_size_of = "Defined in std"] #[no_trace] - swmanager_sender: IpcSender, + swmanager_sender: GenericSender, #[no_trace] scope_url: ServoUrl, @@ -224,7 +225,7 @@ impl ServiceWorkerGlobalScope { own_sender: Sender, receiver: Receiver, time_out_port: Receiver, - swmanager_sender: IpcSender, + swmanager_sender: GenericSender, scope_url: ServoUrl, control_receiver: Receiver, closing: Arc, @@ -263,7 +264,7 @@ impl ServiceWorkerGlobalScope { own_sender: Sender, receiver: Receiver, time_out_port: Receiver, - swmanager_sender: IpcSender, + swmanager_sender: GenericSender, scope_url: ServoUrl, control_receiver: Receiver, closing: Arc, @@ -293,7 +294,7 @@ impl ServiceWorkerGlobalScope { own_sender: Sender, receiver: Receiver, devtools_receiver: IpcReceiver, - swmanager_sender: IpcSender, + swmanager_sender: GenericSender, scope_url: ServoUrl, control_receiver: Receiver, context_sender: Sender, diff --git a/components/script/serviceworker_manager.rs b/components/script/serviceworker_manager.rs index 30a589641b1..9b37f658e5e 100644 --- a/components/script/serviceworker_manager.rs +++ b/components/script/serviceworker_manager.rs @@ -12,14 +12,15 @@ use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; use std::thread::{self, JoinHandle}; +use base::generic_channel::{self, GenericSender, ReceiveError, RoutedReceiver}; use base::id::{PipelineNamespace, ServiceWorkerId, ServiceWorkerRegistrationId}; use constellation_traits::{ DOMMessage, Job, JobError, JobResult, JobResultValue, JobType, SWManagerMsg, SWManagerSenders, ScopeThings, ServiceWorkerManagerFactory, ServiceWorkerMsg, }; -use crossbeam_channel::{Receiver, RecvError, Sender, select, unbounded}; +use crossbeam_channel::{Receiver, Sender, select, unbounded}; use fonts::FontContext; -use ipc_channel::ipc::{self, IpcSender}; +use ipc_channel::ipc; use ipc_channel::router::ROUTER; use net_traits::{CoreResourceMsg, CustomResponseMediator}; use servo_config::pref; @@ -217,11 +218,11 @@ pub struct ServiceWorkerManager { registrations: HashMap, // Will be useful to implement posting a message to a client. // See https://github.com/servo/servo/issues/24660 - _constellation_sender: IpcSender, + _constellation_sender: GenericSender, // own sender to send messages here - own_sender: IpcSender, + own_sender: GenericSender, // receiver to receive messages from constellation - own_port: Receiver, + own_port: RoutedReceiver, // to receive resource messages resource_receiver: Receiver, /// A shared [`FontContext`] to use for all service workers spawned by this [`ServiceWorkerManager`]. @@ -230,10 +231,10 @@ pub struct ServiceWorkerManager { impl ServiceWorkerManager { fn new( - own_sender: IpcSender, - from_constellation_receiver: Receiver, + own_sender: GenericSender, + from_constellation_receiver: RoutedReceiver, resource_port: Receiver, - constellation_sender: IpcSender, + constellation_sender: GenericSender, font_context: Arc, ) -> ServiceWorkerManager { // Install a pipeline-namespace in the current thread. @@ -289,10 +290,10 @@ impl ServiceWorkerManager { true } - fn receive_message(&mut self) -> Result { + fn receive_message(&mut self) -> generic_channel::ReceiveResult { select! { - recv(self.own_port) -> msg => msg.map(|m| Message::FromConstellation(Box::new(m))), - recv(self.resource_receiver) -> msg => msg.map(Message::FromResource), + recv(self.own_port) -> result_msg => generic_channel::to_receive_result::(result_msg).map(|msg| Message::FromConstellation(Box::new(msg))), + recv(self.resource_receiver) -> msg => msg.map(Message::FromResource).map_err(|_e| ReceiveError::Disconnected), } } @@ -452,7 +453,7 @@ impl ServiceWorkerManager { /// fn update_serviceworker( - own_sender: IpcSender, + own_sender: GenericSender, scope_url: ServoUrl, scope_things: ScopeThings, font_context: Arc, @@ -510,7 +511,7 @@ impl ServiceWorkerManagerFactory for ServiceWorkerManager { compositor_api, } = sw_senders; - let from_constellation = ROUTER.route_ipc_receiver_to_new_crossbeam_receiver(receiver); + let from_constellation = receiver.route_preserving_errors(); let resource_port = ROUTER.route_ipc_receiver_to_new_crossbeam_receiver(resource_port); let _ = resource_threads .core_thread diff --git a/components/shared/base/generic_channel.rs b/components/shared/base/generic_channel.rs index c9eebeded4f..8cebad84802 100644 --- a/components/shared/base/generic_channel.rs +++ b/components/shared/base/generic_channel.rs @@ -252,6 +252,16 @@ impl From for TryReceiveError { pub type RoutedReceiver = crossbeam_channel::Receiver>; pub type ReceiveResult = Result; pub type TryReceiveResult = Result; +pub type RoutedReceiverReceiveResult = + Result, crossbeam_channel::RecvError>; + +pub fn to_receive_result(receive_result: RoutedReceiverReceiveResult) -> ReceiveResult { + match receive_result { + Ok(Ok(msg)) => Ok(msg), + Err(_crossbeam_recv_err) => Err(ReceiveError::Disconnected), + Ok(Err(ipc_err)) => Err(ReceiveError::DeserializationFailed(ipc_err.to_string())), + } +} pub struct GenericReceiver(GenericReceiverVariants) where diff --git a/components/shared/constellation/from_script_message.rs b/components/shared/constellation/from_script_message.rs index 5349b8a4827..d62c70b2783 100644 --- a/components/shared/constellation/from_script_message.rs +++ b/components/shared/constellation/from_script_message.rs @@ -8,7 +8,7 @@ use std::collections::HashMap; use std::fmt; use base::Epoch; -use base::generic_channel::{GenericCallback, GenericSender, SendResult}; +use base::generic_channel::{GenericCallback, GenericReceiver, GenericSender, SendResult}; use base::id::{ BroadcastChannelRouterId, BrowsingContextId, HistoryStateId, MessagePortId, MessagePortRouterId, PipelineId, ServiceWorkerId, ServiceWorkerRegistrationId, WebViewId, @@ -24,7 +24,7 @@ use embedder_traits::{ use euclid::default::Size2D as UntypedSize2D; use fonts_traits::SystemFontServiceProxySender; use http::{HeaderMap, Method}; -use ipc_channel::ipc::{IpcReceiver, IpcSender}; +use ipc_channel::ipc::IpcSender; use malloc_size_of_derive::MallocSizeOf; use net_traits::policy_container::PolicyContainer; use net_traits::request::{Destination, InsecureRequestsPolicy, Referrer, RequestBody}; @@ -206,7 +206,7 @@ pub struct DOMMessage { #[derive(Deserialize, Serialize)] pub struct SWManagerSenders { /// Sender of messages to the constellation. - pub swmanager_sender: IpcSender, + pub swmanager_sender: GenericSender, /// [`ResourceThreads`] for initating fetches or using i/o. pub resource_threads: ResourceThreads, /// [`CrossProcessCompositorApi`] for communicating with the compositor. @@ -214,9 +214,9 @@ pub struct SWManagerSenders { /// The [`SystemFontServiceProxy`] used to communicate with the `SystemFontService`. pub system_font_service_sender: SystemFontServiceProxySender, /// Sender of messages to the manager. - pub own_sender: IpcSender, + pub own_sender: GenericSender, /// Receiver of messages from the constellation. - pub receiver: IpcReceiver, + pub receiver: GenericReceiver, } /// Messages sent to Service Worker Manager thread