| Index: components/sync/driver/glue/browser_thread_model_worker.cc
|
| diff --git a/components/sync/driver/glue/browser_thread_model_worker.cc b/components/sync/driver/glue/browser_thread_model_worker.cc
|
| index 2b77c03a4e4c45a6fb0c754179d414c4b4ffe775..4f247fd02a2f47f472a4448fb232809b41cd411d 100644
|
| --- a/components/sync/driver/glue/browser_thread_model_worker.cc
|
| +++ b/components/sync/driver/glue/browser_thread_model_worker.cc
|
| @@ -9,7 +9,6 @@
|
| #include "base/synchronization/waitable_event.h"
|
|
|
| using base::SingleThreadTaskRunner;
|
| -using base::WaitableEvent;
|
|
|
| namespace syncer {
|
|
|
| @@ -27,15 +26,23 @@ SyncerError BrowserThreadModelWorker::DoWorkAndWaitUntilDoneImpl(
|
| return work.Run();
|
| }
|
|
|
| + // Signaled when the task is deleted, i.e. after it runs or when it is
|
| + // abandoned.
|
| + base::WaitableEvent work_done_or_abandoned(
|
| + base::WaitableEvent::ResetPolicy::AUTOMATIC,
|
| + base::WaitableEvent::InitialState::NOT_SIGNALED);
|
| +
|
| if (!runner_->PostTask(
|
| FROM_HERE,
|
| - base::Bind(&BrowserThreadModelWorker::CallDoWorkAndSignalTask, this,
|
| - work, work_done_or_stopped(), &error))) {
|
| + base::Bind(
|
| + &BrowserThreadModelWorker::CallDoWorkAndSignalTask, this, work,
|
| + base::Passed(syncer::ScopedEventSignal(&work_done_or_abandoned)),
|
| + &error))) {
|
| DLOG(WARNING) << "Failed to post task to runner " << runner_;
|
| error = CANNOT_DO_WORK;
|
| return error;
|
| }
|
| - work_done_or_stopped()->Wait();
|
| + work_done_or_abandoned.Wait();
|
| return error;
|
| }
|
|
|
| @@ -55,13 +62,14 @@ void BrowserThreadModelWorker::RegisterForLoopDestruction() {
|
| }
|
| }
|
|
|
| -void BrowserThreadModelWorker::CallDoWorkAndSignalTask(const WorkCallback& work,
|
| - WaitableEvent* done,
|
| - SyncerError* error) {
|
| +void BrowserThreadModelWorker::CallDoWorkAndSignalTask(
|
| + const WorkCallback& work,
|
| + syncer::ScopedEventSignal scoped_event_signal,
|
| + SyncerError* error) {
|
| DCHECK(runner_->BelongsToCurrentThread());
|
| if (!IsStopped())
|
| *error = work.Run();
|
| - done->Signal();
|
| + // The event in |scoped_event_signal| is signaled at the end of this scope.
|
| }
|
|
|
| } // namespace syncer
|
|
|