mirror of
https://github.com/servo/servo.git
synced 2025-10-17 00:39:15 +01:00
This introduces a process manager that holds for each process a "lifeline": this is the receiving end of a ipc channel that is not used to send anything, but only to monitor the process presence. We turn that ipc receiver into a crossbeam one to integrate the monitoring into the constellation run loop. The sender side is made part of the initial "UnprivilegedContent" data structure sent to the new process, both for content and for service worker processes. When a process dies we currently wait() on it to let the OS do a clean shutdown. Signed-off-by: webbeef <me@webbeef.org>
63 lines
1.9 KiB
Rust
63 lines
1.9 KiB
Rust
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
|
|
use ipc_channel::Error;
|
|
use ipc_channel::ipc::IpcSender;
|
|
use script_traits::{SWManagerSenders, ServiceWorkerManagerFactory};
|
|
use serde::{Deserialize, Serialize};
|
|
use servo_config::opts::{self, Opts};
|
|
use servo_config::prefs;
|
|
use servo_config::prefs::Preferences;
|
|
use servo_url::ImmutableOrigin;
|
|
|
|
use crate::process_manager::Process;
|
|
use crate::sandboxing::{UnprivilegedContent, spawn_multiprocess};
|
|
|
|
/// Conceptually, this is glue to start an agent-cluster for a service worker agent.
|
|
/// <https://html.spec.whatwg.org/multipage/#obtain-a-service-worker-agent>
|
|
#[derive(Deserialize, Serialize)]
|
|
pub struct ServiceWorkerUnprivilegedContent {
|
|
opts: Opts,
|
|
prefs: Box<Preferences>,
|
|
senders: SWManagerSenders,
|
|
origin: ImmutableOrigin,
|
|
lifeline_sender: Option<IpcSender<()>>,
|
|
}
|
|
|
|
impl ServiceWorkerUnprivilegedContent {
|
|
pub fn new(
|
|
senders: SWManagerSenders,
|
|
origin: ImmutableOrigin,
|
|
lifeline_sender: Option<IpcSender<()>>,
|
|
) -> ServiceWorkerUnprivilegedContent {
|
|
ServiceWorkerUnprivilegedContent {
|
|
opts: (*opts::get()).clone(),
|
|
prefs: Box::new(prefs::get().clone()),
|
|
senders,
|
|
origin,
|
|
lifeline_sender,
|
|
}
|
|
}
|
|
|
|
/// Start the agent-cluster.
|
|
pub fn start<SWF>(self)
|
|
where
|
|
SWF: ServiceWorkerManagerFactory,
|
|
{
|
|
SWF::create(self.senders, self.origin);
|
|
}
|
|
|
|
/// Start the agent-cluster in it's own process.
|
|
pub fn spawn_multiprocess(self) -> Result<Process, Error> {
|
|
spawn_multiprocess(UnprivilegedContent::ServiceWorker(self))
|
|
}
|
|
|
|
pub fn opts(&self) -> Opts {
|
|
self.opts.clone()
|
|
}
|
|
|
|
pub fn prefs(&self) -> &Preferences {
|
|
&self.prefs
|
|
}
|
|
}
|