diff options
author | bors-servo <metajack+bors@gmail.com> | 2015-06-12 18:42:32 -0600 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2015-06-12 18:42:32 -0600 |
commit | f03f584895f80deb08c77c817f6655609c4ee97c (patch) | |
tree | b7f8d827d34589ea015ebb5129e467709a3dc617 /components/util/workqueue.rs | |
parent | 836ac8a0b6daeecb865bcf35d2b39602398870ef (diff) | |
parent | 48a0725c01e792f32ec745c6b6daf1b5a39962a0 (diff) | |
download | servo-f03f584895f80deb08c77c817f6655609c4ee97c.tar.gz servo-f03f584895f80deb08c77c817f6655609c4ee97c.zip |
Auto merge of #6334 - nnethercote:report-local-contexts, r=pcwalton
Passing a function that measures TLS to WorkQueue is a bit weird, but I can't see how else to measure that data.
<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/6334)
<!-- Reviewable:end -->
Diffstat (limited to 'components/util/workqueue.rs')
-rw-r--r-- | components/util/workqueue.rs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/components/util/workqueue.rs b/components/util/workqueue.rs index 2a76adb51eb..2f0523a09ef 100644 --- a/components/util/workqueue.rs +++ b/components/util/workqueue.rs @@ -36,6 +36,8 @@ enum WorkerMsg<QueueData: 'static, WorkData: 'static> { Start(Worker<WorkUnit<QueueData, WorkData>>, *mut AtomicUsize, *const QueueData), /// Tells the worker to stop. It can be restarted again with a `WorkerMsg::Start`. Stop, + /// Tells the worker to measure the heap size of its TLS using the supplied function. + HeapSizeOfTLS(fn() -> usize), /// Tells the worker thread to terminate. Exit, } @@ -45,6 +47,7 @@ unsafe impl<QueueData: 'static, WorkData: 'static> Send for WorkerMsg<QueueData, /// Messages to the supervisor. enum SupervisorMsg<QueueData: 'static, WorkData: 'static> { Finished, + HeapSizeOfTLS(usize), ReturnDeque(usize, Worker<WorkUnit<QueueData, WorkData>>), } @@ -102,6 +105,10 @@ impl<QueueData: Send, WorkData: Send> WorkerThread<QueueData, WorkData> { WorkerMsg::Start(deque, ref_count, queue_data) => (deque, ref_count, queue_data), WorkerMsg::Stop => panic!("unexpected stop message"), WorkerMsg::Exit => return, + WorkerMsg::HeapSizeOfTLS(f) => { + self.chan.send(SupervisorMsg::HeapSizeOfTLS(f())).unwrap(); + continue; + } }; let mut back_off_sleep = 0 as u32; @@ -335,11 +342,32 @@ impl<QueueData: Send, WorkData: Send> WorkQueue<QueueData, WorkData> { for _ in 0..self.workers.len() { match self.port.recv().unwrap() { SupervisorMsg::ReturnDeque(index, deque) => self.workers[index].deque = Some(deque), + SupervisorMsg::HeapSizeOfTLS(_) => panic!("unexpected HeapSizeOfTLS message"), SupervisorMsg::Finished => panic!("unexpected finished message!"), } } } + /// Synchronously measure memory usage of any thread-local storage. + pub fn heap_size_of_tls(&self, f: fn() -> usize) -> Vec<usize> { + // Tell the workers to measure themselves. + for worker in self.workers.iter() { + worker.chan.send(WorkerMsg::HeapSizeOfTLS(f)).unwrap() + } + + // Wait for the workers to finish measuring themselves. + let mut sizes = vec![]; + for _ in 0..self.workers.len() { + match self.port.recv().unwrap() { + SupervisorMsg::HeapSizeOfTLS(size) => { + sizes.push(size); + } + _ => panic!("unexpected message!"), + } + } + sizes + } + pub fn shutdown(&mut self) { for worker in self.workers.iter() { worker.chan.send(WorkerMsg::Exit).unwrap() |