| Index: base/debug/trace_event_impl.cc
|
| diff --git a/base/debug/trace_event_impl.cc b/base/debug/trace_event_impl.cc
|
| index cce900c2e61b6d8e1482d421069576b981a33b7e..db321e2bfa42c893e34acce70c37d802459c0e6f 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);
|
|
|