mirror of
https://github.com/servo/servo.git
synced 2025-09-30 00:29:14 +01:00
script: Reduce ScriptThread TLS usage (#38875)
We store a pointer to the ScriptThread singleton for a thread in thread-local storage. While we don't have yet have profiles pointing to this TLS access as a hot spot, we can remove a potential performance footgun without a lot of effort by passing around small pieces of data that we otherwise need to fetch from the ScriptThread. Testing: Existing WPT is sufficient Fixes: part of #37969 --------- Signed-off-by: Josh Matthews <josh@joshmatthews.net>
This commit is contained in:
parent
d1da1a995c
commit
c97ec1b2fb
17 changed files with 129 additions and 68 deletions
|
@ -15,7 +15,6 @@ use strum::VariantArray;
|
|||
use crate::dom::bindings::cell::DomRefCell;
|
||||
use crate::dom::worker::TrustedWorkerAddress;
|
||||
use crate::script_runtime::ScriptThreadEventCategory;
|
||||
use crate::script_thread::ScriptThread;
|
||||
use crate::task::TaskBox;
|
||||
use crate::task_source::TaskSourceName;
|
||||
|
||||
|
@ -197,19 +196,18 @@ impl<T: QueuedTaskConversion> TaskQueue<T> {
|
|||
}
|
||||
|
||||
/// Take all tasks again and then run `recv()`.
|
||||
pub(crate) fn take_tasks_and_recv(&self) -> Result<T, ()> {
|
||||
self.take_tasks(T::wake_up_msg());
|
||||
pub(crate) fn take_tasks_and_recv(&self, fully_active: &HashSet<PipelineId>) -> Result<T, ()> {
|
||||
self.take_tasks(T::wake_up_msg(), fully_active);
|
||||
self.recv()
|
||||
}
|
||||
|
||||
/// Drain the queue for the current iteration of the event-loop.
|
||||
/// Holding-back throttles above a given high-water mark.
|
||||
pub(crate) fn take_tasks(&self, first_msg: T) {
|
||||
pub(crate) fn take_tasks(&self, first_msg: T, fully_active: &HashSet<PipelineId>) {
|
||||
// High-watermark: once reached, throttled tasks will be held-back.
|
||||
const PER_ITERATION_MAX: u64 = 5;
|
||||
let fully_active = ScriptThread::get_fully_active_document_ids();
|
||||
// Always first check for new tasks, but don't reset 'taken_task_counter'.
|
||||
self.process_incoming_tasks(first_msg, &fully_active);
|
||||
self.process_incoming_tasks(first_msg, fully_active);
|
||||
let mut throttled = self.throttled.borrow_mut();
|
||||
let mut throttled_length: usize = throttled.values().map(|queue| queue.len()).sum();
|
||||
let mut task_source_cycler = TaskSourceName::VARIANTS.iter().cycle();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue