mirror of
https://github.com/servo/servo.git
synced 2025-08-11 00:15:32 +01:00
add a control chan to workers, use to signal shutdown
This commit is contained in:
parent
ed688fe2c1
commit
947fa8bbb7
6 changed files with 165 additions and 31 deletions
|
@ -82,12 +82,15 @@ impl ScriptPort for Receiver<DedicatedWorkerScriptMsg> {
|
|||
|
||||
pub trait WorkerEventLoopMethods {
|
||||
type WorkerMsg: QueuedTaskConversion + Send;
|
||||
type ControlMsg;
|
||||
type Event;
|
||||
fn task_queue(&self) -> &TaskQueue<Self::WorkerMsg>;
|
||||
fn handle_event(&self, event: Self::Event);
|
||||
fn handle_event(&self, event: Self::Event) -> bool;
|
||||
fn handle_worker_post_event(&self, worker: &TrustedWorkerAddress) -> Option<AutoWorkerReset>;
|
||||
fn from_control_msg(&self, msg: Self::ControlMsg) -> Self::Event;
|
||||
fn from_worker_msg(&self, msg: Self::WorkerMsg) -> Self::Event;
|
||||
fn from_devtools_msg(&self, msg: DevtoolScriptControlMsg) -> Self::Event;
|
||||
fn control_receiver(&self) -> &Receiver<Self::ControlMsg>;
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#worker-event-loop
|
||||
|
@ -108,6 +111,7 @@ pub fn run_worker_event_loop<T, WorkerMsg, Event>(
|
|||
};
|
||||
let task_queue = worker_scope.task_queue();
|
||||
let event = select! {
|
||||
recv(worker_scope.control_receiver()) -> msg => worker_scope.from_control_msg(msg.unwrap()),
|
||||
recv(task_queue.select()) -> msg => {
|
||||
task_queue.take_tasks(msg.unwrap());
|
||||
worker_scope.from_worker_msg(task_queue.recv().unwrap())
|
||||
|
@ -136,7 +140,10 @@ pub fn run_worker_event_loop<T, WorkerMsg, Event>(
|
|||
}
|
||||
// Step 3
|
||||
for event in sequential {
|
||||
worker_scope.handle_event(event);
|
||||
if !worker_scope.handle_event(event) {
|
||||
// Shutdown
|
||||
return;
|
||||
}
|
||||
// Step 6
|
||||
let _ar = match worker {
|
||||
Some(worker) => worker_scope.handle_worker_post_event(worker),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue