| 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..e8245379fd677cf5d2e7ac6f1558fc5f9febae38 100644
|
| --- a/components/sync/driver/glue/browser_thread_model_worker.cc
|
| +++ b/components/sync/driver/glue/browser_thread_model_worker.cc
|
| @@ -27,15 +27,23 @@ SyncerError BrowserThreadModelWorker::DoWorkAndWaitUntilDoneImpl(
|
| return work.Run();
|
| }
|
|
|
| + // Signaled when the task is deleted, i.e. after it runs or when it is
|
| + // abandonned.
|
| + base::WaitableEvent work_done_or_abandonned(
|
| + 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))) {
|
| + work, base::Passed(syncer::SignalEventOnDelete(
|
| + &work_done_or_abandonned)),
|
| + &error))) {
|
| DLOG(WARNING) << "Failed to post task to runner " << runner_;
|
| error = CANNOT_DO_WORK;
|
| return error;
|
| }
|
| - work_done_or_stopped()->Wait();
|
| + work_done_or_abandonned.Wait();
|
| return error;
|
| }
|
|
|
| @@ -55,13 +63,14 @@ void BrowserThreadModelWorker::RegisterForLoopDestruction() {
|
| }
|
| }
|
|
|
| -void BrowserThreadModelWorker::CallDoWorkAndSignalTask(const WorkCallback& work,
|
| - WaitableEvent* done,
|
| - SyncerError* error) {
|
| +void BrowserThreadModelWorker::CallDoWorkAndSignalTask(
|
| + const WorkCallback& work,
|
| + syncer::SignalEventOnDelete signal_event_on_delete,
|
| + SyncerError* error) {
|
| DCHECK(runner_->BelongsToCurrentThread());
|
| if (!IsStopped())
|
| *error = work.Run();
|
| - done->Signal();
|
| + // The event in |signal_event_on_delete| is signaled at the end of this scope.
|
| }
|
|
|
| } // namespace syncer
|
|
|