Chromium Code Reviews| Index: components/history/core/browser/history_model_worker.cc |
| diff --git a/components/history/core/browser/history_model_worker.cc b/components/history/core/browser/history_model_worker.cc |
| index da959bf57e94d1b1bf74cece94406a293d10d5cc..e300bd9dd9de79d607ca2572765070654e5a63f0 100644 |
| --- a/components/history/core/browser/history_model_worker.cc |
| +++ b/components/history/core/browser/history_model_worker.cc |
| @@ -9,23 +9,27 @@ |
| #include "base/memory/ref_counted.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/synchronization/waitable_event.h" |
| - |
| -using base::WaitableEvent; |
| +#include "components/sync/engine/signal_event_on_delete.h" |
| namespace browser_sync { |
| class WorkerTask : public history::HistoryDBTask { |
| public: |
| - WorkerTask( |
| - const syncer::WorkCallback& work, |
| - WaitableEvent* done, |
| - syncer::SyncerError* error) |
| - : work_(work), done_(done), error_(error) {} |
| + WorkerTask(const syncer::WorkCallback& work, |
| + syncer::SignalEventOnDelete signal_event_on_delete, |
| + syncer::SyncerError* error) |
| + : work_(work), |
| + signal_event_on_delete_(std::move(signal_event_on_delete)), |
| + error_(error) {} |
| bool RunOnDBThread(history::HistoryBackend* backend, |
| history::HistoryDatabase* db) override { |
| + // Signal the completion event at the end of this scope. |
| + auto signal_event_on_delete = std::move(signal_event_on_delete_); |
| + |
| + // Run the task. |
| *error_ = work_.Run(); |
| - done_->Signal(); |
| + |
| return true; |
| } |
| @@ -34,10 +38,13 @@ class WorkerTask : public history::HistoryDBTask { |
| void DoneRunOnMainThread() override {} |
| protected: |
| - ~WorkerTask() override {} |
| + ~WorkerTask() override { |
| + // The event in |signal_event_on_delete_| is signaled at the end of this |
| + // scope if this is destroyed before RunOnDBThread runs. |
| + } |
| syncer::WorkCallback work_; |
| - WaitableEvent* done_; |
| + syncer::SignalEventOnDelete signal_event_on_delete_; |
| syncer::SyncerError* error_; |
| }; |
| @@ -67,16 +74,17 @@ namespace { |
| void PostWorkerTask( |
| const base::WeakPtr<history::HistoryService>& history_service, |
| const syncer::WorkCallback& work, |
| + syncer::SignalEventOnDelete signal_event_on_delete, |
| base::CancelableTaskTracker* cancelable_tracker, |
| - WaitableEvent* done, |
| syncer::SyncerError* error) { |
| if (history_service.get()) { |
| std::unique_ptr<history::HistoryDBTask> task( |
| - new WorkerTask(work, done, error)); |
| + new WorkerTask(work, std::move(signal_event_on_delete), error)); |
| history_service->ScheduleDBTask(std::move(task), cancelable_tracker); |
| } else { |
| *error = syncer::CANNOT_DO_WORK; |
| - done->Signal(); |
| + // The event in |signal_event_on_delete| is signaled at the end of this |
| + // scope. |
| } |
| } |
| @@ -109,11 +117,18 @@ void HistoryModelWorker::RegisterOnDBThread() { |
| syncer::SyncerError HistoryModelWorker::DoWorkAndWaitUntilDoneImpl( |
| const syncer::WorkCallback& work) { |
| syncer::SyncerError error = syncer::UNSET; |
| + |
| + // Signaled after the task runs or when it is abandonned. |
| + base::WaitableEvent work_done_or_abandonned( |
|
Nicolas Zea
2016/11/01 22:39:23
spelling nit: s/abandonned/abandoned (here and in
fdoray
2016/11/02 15:52:05
Done.
|
| + base::WaitableEvent::ResetPolicy::AUTOMATIC, |
| + base::WaitableEvent::InitialState::NOT_SIGNALED); |
| + |
| if (ui_thread_->PostTask(FROM_HERE, |
| base::Bind(&PostWorkerTask, history_service_, work, |
| - cancelable_tracker_.get(), |
| - work_done_or_stopped(), &error))) { |
| - work_done_or_stopped()->Wait(); |
| + base::Passed(syncer::SignalEventOnDelete( |
| + &work_done_or_abandonned)), |
| + cancelable_tracker_.get(), &error))) { |
| + work_done_or_abandonned.Wait(); |
| } else { |
| error = syncer::CANNOT_DO_WORK; |
| } |