From c214c03375e2d90898c502ceef1d50f83b99ccd4 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 29 Jun 2015 14:51:26 +0200 Subject: [PATCH 1/2] Pass shared_layout_context to run_queue_with_custom_work_data_type. --- components/layout/parallel.rs | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/components/layout/parallel.rs b/components/layout/parallel.rs index 3e186f06d95..99bed12911e 100644 --- a/components/layout/parallel.rs +++ b/components/layout/parallel.rs @@ -446,28 +446,29 @@ fn build_display_list(unsafe_flow: UnsafeFlow, fn run_queue_with_custom_work_data_type( queue: &mut WorkQueue, - callback: F) + callback: F, + shared_layout_context: &SharedLayoutContext) where To: 'static + Send, F: FnOnce(&mut WorkQueue) { - unsafe { - let queue: &mut WorkQueue = mem::transmute(queue); - callback(queue); - queue.run(); - } + queue.data = SharedLayoutContextWrapper(shared_layout_context as *const _); + + let queue: &mut WorkQueue = unsafe { + mem::transmute(queue) + }; + callback(queue); + queue.run(); + + queue.data = SharedLayoutContextWrapper(ptr::null()); } pub fn traverse_dom_preorder(root: LayoutNode, shared_layout_context: &SharedLayoutContext, queue: &mut WorkQueue) { - queue.data = SharedLayoutContextWrapper(shared_layout_context as *const _); - run_queue_with_custom_work_data_type(queue, |queue| { queue.push(WorkUnit { fun: recalc_style, data: (box vec![layout_node_to_unsafe_layout_node(&root)], 0), }); - }); - - queue.data = SharedLayoutContextWrapper(ptr::null()); + }, shared_layout_context); } pub fn traverse_flow_tree_preorder( @@ -482,8 +483,6 @@ pub fn traverse_flow_tree_preorder( root.traverse_postorder(&bubble_inline_sizes); } - queue.data = SharedLayoutContextWrapper(shared_layout_context as *const _); - run_queue_with_custom_work_data_type(queue, |queue| { profile(time::ProfilerCategory::LayoutParallelWarmup, profiler_metadata, time_profiler_chan, || { @@ -492,9 +491,7 @@ pub fn traverse_flow_tree_preorder( data: (box vec![mut_owned_flow_to_unsafe_flow(root)], 0), }) }); - }); - - queue.data = SharedLayoutContextWrapper(ptr::null()) + }, shared_layout_context); } pub fn build_display_list_for_subtree( @@ -503,8 +500,6 @@ pub fn build_display_list_for_subtree( time_profiler_chan: time::ProfilerChan, shared_layout_context: &SharedLayoutContext, queue: &mut WorkQueue) { - queue.data = SharedLayoutContextWrapper(shared_layout_context as *const _); - run_queue_with_custom_work_data_type(queue, |queue| { profile(time::ProfilerCategory::LayoutParallelWarmup, profiler_metadata, time_profiler_chan, || { @@ -513,7 +508,5 @@ pub fn build_display_list_for_subtree( data: (box vec![mut_owned_flow_to_unsafe_flow(root)], 0), }) }); - }); - - queue.data = SharedLayoutContextWrapper(ptr::null()) + }, shared_layout_context); } From 41da4fceee653366bb709539c1ce3a873a08b695 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sun, 28 Jun 2015 22:17:55 +0200 Subject: [PATCH 2/2] Remove the data field from WorkQueue. It is only used in the run method. --- components/layout/layout_task.rs | 3 +-- components/layout/parallel.rs | 7 +------ components/util/workqueue.rs | 10 +++------- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/components/layout/layout_task.rs b/components/layout/layout_task.rs index e3349ef19de..172fcf2ed3f 100644 --- a/components/layout/layout_task.rs +++ b/components/layout/layout_task.rs @@ -300,8 +300,7 @@ impl LayoutTask { opts::get().initial_window_size.as_f32() * ScaleFactor::new(1.0)); let parallel_traversal = if opts::get().layout_threads != 1 { Some(WorkQueue::new("LayoutWorker", task_state::LAYOUT, - opts::get().layout_threads, - SharedLayoutContextWrapper(ptr::null()))) + opts::get().layout_threads)) } else { None }; diff --git a/components/layout/parallel.rs b/components/layout/parallel.rs index 99bed12911e..65bf7fb0eae 100644 --- a/components/layout/parallel.rs +++ b/components/layout/parallel.rs @@ -21,7 +21,6 @@ use wrapper::{PreorderDomTraversal, PostorderDomTraversal}; use profile_traits::time::{self, ProfilerMetadata, profile}; use std::mem; -use std::ptr; use std::sync::atomic::{AtomicIsize, Ordering}; use util::opts; use util::workqueue::{WorkQueue, WorkUnit, WorkerProxy}; @@ -449,15 +448,11 @@ fn run_queue_with_custom_work_data_type( callback: F, shared_layout_context: &SharedLayoutContext) where To: 'static + Send, F: FnOnce(&mut WorkQueue) { - queue.data = SharedLayoutContextWrapper(shared_layout_context as *const _); - let queue: &mut WorkQueue = unsafe { mem::transmute(queue) }; callback(queue); - queue.run(); - - queue.data = SharedLayoutContextWrapper(ptr::null()); + queue.run(SharedLayoutContextWrapper(shared_layout_context as *const _)); } pub fn traverse_dom_preorder(root: LayoutNode, diff --git a/components/util/workqueue.rs b/components/util/workqueue.rs index 2f0523a09ef..e8d9e408f00 100644 --- a/components/util/workqueue.rs +++ b/components/util/workqueue.rs @@ -244,8 +244,6 @@ pub struct WorkQueue { port: Receiver>, /// The amount of work that has been enqueued. work_count: usize, - /// Arbitrary user data. - pub data: QueueData, } impl WorkQueue { @@ -253,8 +251,7 @@ impl WorkQueue { /// it. pub fn new(task_name: &'static str, state: task_state::TaskState, - thread_count: usize, - user_data: QueueData) -> WorkQueue { + thread_count: usize) -> WorkQueue { // Set up data structures. let (supervisor_chan, supervisor_port) = channel(); let (mut infos, mut threads) = (vec!(), vec!()); @@ -302,7 +299,6 @@ impl WorkQueue { workers: infos, port: supervisor_port, work_count: 0, - data: user_data, } } @@ -320,13 +316,13 @@ impl WorkQueue { } /// Synchronously runs all the enqueued tasks and waits for them to complete. - pub fn run(&mut self) { + pub fn run(&mut self, data: QueueData) { // Tell the workers to start. let mut work_count = AtomicUsize::new(self.work_count); for worker in self.workers.iter_mut() { worker.chan.send(WorkerMsg::Start(worker.deque.take().unwrap(), &mut work_count, - &self.data)).unwrap() + &data)).unwrap() } // Wait for the work to finish.