Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(90)

Unified Diff: sync/internal_api/public/engine/model_safe_worker.cc

Issue 14046031: Worker changes to prepare for lock-free shutdown. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sync/internal_api/public/engine/model_safe_worker.cc
diff --git a/sync/internal_api/public/engine/model_safe_worker.cc b/sync/internal_api/public/engine/model_safe_worker.cc
index d7bf906ef9f007feec43925789b22a3367a3e15c..49655ff0e3cb7ce8d3285223d7281b1a984abf2e 100644
--- a/sync/internal_api/public/engine/model_safe_worker.cc
+++ b/sync/internal_api/public/engine/model_safe_worker.cc
@@ -80,6 +80,57 @@ std::string ModelSafeGroupToString(ModelSafeGroup group) {
}
}
+ModelSafeWorker::ModelSafeWorker(WorkerLoopDestructionObserver* observer)
+ : stopped_(false),
+ work_done_or_stopped_(false, false),
+ observer_(observer) {}
+
ModelSafeWorker::~ModelSafeWorker() {}
+void ModelSafeWorker::RequestStop() {
+ base::AutoLock al(lock_);
+
+ // Set stop flag but don't signal work_done_or_stopped_ to unblock sync loop
+ // because the worker may be working and depending on sync command object
+ // living on sync thread.
+ stopped_ = true;
+}
+
+SyncerError ModelSafeWorker::DoWorkAndWaitUntilDone(const WorkCallback& work) {
+ {
+ base::AutoLock al(lock_);
+ if (stopped_)
+ return CANNOT_DO_WORK;
+
+ // Clear signal before starting work.
+ work_done_or_stopped_.Reset();
+ }
+
+ return DoWorkAndWaitUntilDoneImpl(work, &work_done_or_stopped_);
+}
+
+bool ModelSafeWorker::IsStopped() {
+ base::AutoLock al(lock_);
+ return stopped_;
+}
+
+void ModelSafeWorker::WillDestroyCurrentMessageLoop() {
+ {
+ base::AutoLock al(lock_);
+ stopped_ = true;
+
+ // Safe to signal because pending work (if any) will not be executed. So
+ // there should be no harm even the work holds a pointer to the
+ // ModelChangingSyncerCommand that will be destroyed on sync loop after
+ // the signal is set.
+ work_done_or_stopped_.Signal();
+
+ DLOG(INFO) << ModelSafeGroupToString(GetModelSafeGroup())
+ << " worker stops on destruction of its working thread.";
+ }
+
+ if (observer_)
+ observer_->OnWorkerLoopDestroyed(GetModelSafeGroup());
+}
+
} // namespace syncer

Powered by Google App Engine
This is Rietveld 408576698