diff options
author | haitaol@chromium.org <haitaol@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-31 01:31:55 +0000 |
---|---|---|
committer | haitaol@chromium.org <haitaol@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-31 01:31:55 +0000 |
commit | 93dcabfb6d0d60e2c4a2bed38cd4803303c9a377 (patch) | |
tree | 240e9b1419d01ed7cb3b4f0486d18e760c231381 /sync/internal_api/public/engine/model_safe_worker.cc | |
parent | 496552ef030bd2eec4c072c6b3d7ba84f38c80d4 (diff) | |
download | chromium_src-93dcabfb6d0d60e2c4a2bed38cd4803303c9a377.zip chromium_src-93dcabfb6d0d60e2c4a2bed38cd4803303c9a377.tar.gz chromium_src-93dcabfb6d0d60e2c4a2bed38cd4803303c9a377.tar.bz2 |
Lock-free shutdown of profile sync service. Changes include:
* Disconnect non-frontend processor/associator to stop accessing directory
so that sync backend can be shut down without waiting.
* Change non-frontend controller so that creation/destruction of
processor/associator doesn't depend on valid controller. So
scoped wait on stopping controller can be removed.
* Move sync thread to PSS. It's created when starting first backend and
destroyed on last browser thread.
BUG=19757
Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=210333
Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=210955
Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=213642
Review URL: https://chromiumcodereview.appspot.com/16770005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@214500 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'sync/internal_api/public/engine/model_safe_worker.cc')
-rw-r--r-- | sync/internal_api/public/engine/model_safe_worker.cc | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/sync/internal_api/public/engine/model_safe_worker.cc b/sync/internal_api/public/engine/model_safe_worker.cc index 44e0a24..7179ed5 100644 --- a/sync/internal_api/public/engine/model_safe_worker.cc +++ b/sync/internal_api/public/engine/model_safe_worker.cc @@ -4,6 +4,7 @@ #include "sync/internal_api/public/engine/model_safe_worker.h" +#include "base/bind.h" #include "base/json/json_writer.h" #include "base/memory/scoped_ptr.h" #include "base/values.h" @@ -84,7 +85,9 @@ std::string ModelSafeGroupToString(ModelSafeGroup group) { ModelSafeWorker::ModelSafeWorker(WorkerLoopDestructionObserver* observer) : stopped_(false), work_done_or_stopped_(false, false), - observer_(observer) {} + observer_(observer), + working_loop_(NULL), + working_loop_set_wait_(true, false) {} ModelSafeWorker::~ModelSafeWorker() {} @@ -135,4 +138,33 @@ void ModelSafeWorker::WillDestroyCurrentMessageLoop() { observer_->OnWorkerLoopDestroyed(GetModelSafeGroup()); } +void ModelSafeWorker::SetWorkingLoopToCurrent() { + DCHECK(!working_loop_); + working_loop_ = base::MessageLoop::current(); + working_loop_set_wait_.Signal(); +} + +void ModelSafeWorker::UnregisterForLoopDestruction( + base::Callback<void(ModelSafeGroup)> unregister_done_callback) { + // Ok to wait until |working_loop_| is set because this is called on sync + // loop. + working_loop_set_wait_.Wait(); + + // Should be called on sync loop. + DCHECK_NE(base::MessageLoop::current(), working_loop_); + DCHECK(working_loop_); + working_loop_->PostTask( + FROM_HERE, + base::Bind(&ModelSafeWorker::UnregisterForLoopDestructionAsync, + this, unregister_done_callback)); +} + +void ModelSafeWorker::UnregisterForLoopDestructionAsync( + base::Callback<void(ModelSafeGroup)> unregister_done_callback) { + DCHECK(stopped_); + DCHECK_EQ(base::MessageLoop::current(), working_loop_); + base::MessageLoop::current()->RemoveDestructionObserver(this); + unregister_done_callback.Run(GetModelSafeGroup()); +} + } // namespace syncer |