diff options
Diffstat (limited to 'base/debug/trace_event_impl.cc')
-rw-r--r-- | base/debug/trace_event_impl.cc | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/base/debug/trace_event_impl.cc b/base/debug/trace_event_impl.cc index cce900c..db321e2 100644 --- a/base/debug/trace_event_impl.cc +++ b/base/debug/trace_event_impl.cc @@ -1697,6 +1697,9 @@ void TraceLog::Flush(const TraceLog::OutputCallback& cb) { } int generation = this->generation(); + // Copy of thread_message_loops_ to be used without locking. + std::vector<scoped_refptr<SingleThreadTaskRunner> > + thread_message_loop_task_runners; { AutoLock lock(lock_); DCHECK(!flush_message_loop_proxy_.get()); @@ -1713,16 +1716,22 @@ void TraceLog::Flush(const TraceLog::OutputCallback& cb) { for (hash_set<MessageLoop*>::const_iterator it = thread_message_loops_.begin(); it != thread_message_loops_.end(); ++it) { - (*it)->PostTask( - FROM_HERE, - Bind(&TraceLog::FlushCurrentThread, Unretained(this), generation)); + thread_message_loop_task_runners.push_back((*it)->task_runner()); } - flush_message_loop_proxy_->PostDelayedTask( + } + } + + if (thread_message_loop_task_runners.size()) { + for (size_t i = 0; i < thread_message_loop_task_runners.size(); ++i) { + thread_message_loop_task_runners[i]->PostTask( FROM_HERE, - Bind(&TraceLog::OnFlushTimeout, Unretained(this), generation), - TimeDelta::FromMilliseconds(kThreadFlushTimeoutMs)); - return; + Bind(&TraceLog::FlushCurrentThread, Unretained(this), generation)); } + flush_message_loop_proxy_->PostDelayedTask( + FROM_HERE, + Bind(&TraceLog::OnFlushTimeout, Unretained(this), generation), + TimeDelta::FromMilliseconds(kThreadFlushTimeoutMs)); + return; } FinishFlush(generation); |