| 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
|
| deleted file mode 100644
|
| index 80319551e2328972bcaf0f8698997be5cb2060b3..0000000000000000000000000000000000000000
|
| --- a/sync/internal_api/public/engine/model_safe_worker.cc
|
| +++ /dev/null
|
| @@ -1,200 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "sync/internal_api/public/engine/model_safe_worker.h"
|
| -
|
| -#include <memory>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/json/json_writer.h"
|
| -#include "base/threading/thread_task_runner_handle.h"
|
| -#include "base/values.h"
|
| -
|
| -namespace syncer {
|
| -
|
| -std::unique_ptr<base::DictionaryValue> ModelSafeRoutingInfoToValue(
|
| - const ModelSafeRoutingInfo& routing_info) {
|
| - std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
|
| - for (ModelSafeRoutingInfo::const_iterator it = routing_info.begin();
|
| - it != routing_info.end(); ++it) {
|
| - dict->SetString(ModelTypeToString(it->first),
|
| - ModelSafeGroupToString(it->second));
|
| - }
|
| - return dict;
|
| -}
|
| -
|
| -std::string ModelSafeRoutingInfoToString(
|
| - const ModelSafeRoutingInfo& routing_info) {
|
| - std::string json;
|
| - base::JSONWriter::Write(*ModelSafeRoutingInfoToValue(routing_info), &json);
|
| - return json;
|
| -}
|
| -
|
| -ModelTypeSet GetRoutingInfoTypes(const ModelSafeRoutingInfo& routing_info) {
|
| - ModelTypeSet types;
|
| - for (ModelSafeRoutingInfo::const_iterator it = routing_info.begin();
|
| - it != routing_info.end(); ++it) {
|
| - types.Put(it->first);
|
| - }
|
| - return types;
|
| -}
|
| -
|
| -ModelSafeGroup GetGroupForModelType(const ModelType type,
|
| - const ModelSafeRoutingInfo& routes) {
|
| - ModelSafeRoutingInfo::const_iterator it = routes.find(type);
|
| - if (it == routes.end()) {
|
| - if (type != UNSPECIFIED && type != TOP_LEVEL_FOLDER)
|
| - DVLOG(1) << "Entry does not belong to active ModelSafeGroup!";
|
| - return GROUP_PASSIVE;
|
| - }
|
| - return it->second;
|
| -}
|
| -
|
| -std::string ModelSafeGroupToString(ModelSafeGroup group) {
|
| - switch (group) {
|
| - case GROUP_UI:
|
| - return "GROUP_UI";
|
| - case GROUP_DB:
|
| - return "GROUP_DB";
|
| - case GROUP_FILE:
|
| - return "GROUP_FILE";
|
| - case GROUP_HISTORY:
|
| - return "GROUP_HISTORY";
|
| - case GROUP_PASSIVE:
|
| - return "GROUP_PASSIVE";
|
| - case GROUP_PASSWORD:
|
| - return "GROUP_PASSWORD";
|
| - case GROUP_NON_BLOCKING:
|
| - return "GROUP_NON_BLOCKING";
|
| - default:
|
| - NOTREACHED();
|
| - return "INVALID";
|
| - }
|
| -}
|
| -
|
| -ModelSafeWorker::ModelSafeWorker(WorkerLoopDestructionObserver* observer)
|
| - : stopped_(false),
|
| - work_done_or_stopped_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
|
| - base::WaitableEvent::InitialState::NOT_SIGNALED),
|
| - observer_(observer) {}
|
| -
|
| -ModelSafeWorker::~ModelSafeWorker() {}
|
| -
|
| -void ModelSafeWorker::RequestStop() {
|
| - base::AutoLock al(stopped_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. This prevents any *further* tasks from being posted
|
| - // to worker threads (see DoWorkAndWaitUntilDone below), but note that one
|
| - // may already be posted.
|
| - stopped_ = true;
|
| -}
|
| -
|
| -SyncerError ModelSafeWorker::DoWorkAndWaitUntilDone(const WorkCallback& work) {
|
| - {
|
| - base::AutoLock al(stopped_lock_);
|
| - if (stopped_)
|
| - return CANNOT_DO_WORK;
|
| -
|
| - CHECK(!work_done_or_stopped_.IsSignaled());
|
| - }
|
| -
|
| - return DoWorkAndWaitUntilDoneImpl(work);
|
| -}
|
| -
|
| -bool ModelSafeWorker::IsStopped() {
|
| - base::AutoLock al(stopped_lock_);
|
| - return stopped_;
|
| -}
|
| -
|
| -void ModelSafeWorker::WillDestroyCurrentMessageLoop() {
|
| - {
|
| - base::AutoLock al(stopped_lock_);
|
| - stopped_ = true;
|
| -
|
| - // Must signal to unblock syncer if it's waiting for a posted task to
|
| - // finish. At this point, all pending tasks posted to the loop have been
|
| - // destroyed (see MessageLoop::~MessageLoop). So syncer will be blocked
|
| - // indefinitely without signaling here.
|
| - work_done_or_stopped_.Signal();
|
| -
|
| - DVLOG(1) << ModelSafeGroupToString(GetModelSafeGroup())
|
| - << " worker stops on destruction of its working thread.";
|
| - }
|
| -
|
| - {
|
| - base::AutoLock l(working_task_runner_lock_);
|
| - working_task_runner_ = NULL;
|
| - }
|
| -
|
| - if (observer_)
|
| - observer_->OnWorkerLoopDestroyed(GetModelSafeGroup());
|
| -}
|
| -
|
| -void ModelSafeWorker::SetWorkingLoopToCurrent() {
|
| - base::Callback<void(ModelSafeGroup)> unregister_done_callback;
|
| -
|
| - {
|
| - base::AutoLock l(working_task_runner_lock_);
|
| - DCHECK(!working_task_runner_);
|
| -
|
| - if (unregister_done_callback_.is_null()) {
|
| - // Expected case - UnregisterForLoopDestruction hasn't been called yet.
|
| - base::MessageLoop::current()->AddDestructionObserver(this);
|
| - working_task_runner_ = base::ThreadTaskRunnerHandle::Get();
|
| - } else {
|
| - // Rare case which is possible when the model type thread remains
|
| - // blocked for the entire session and UnregisterForLoopDestruction ends
|
| - // up being called before this method. This method is posted unlike
|
| - // UnregisterForLoopDestruction - that's why they can end up being called
|
| - // out of order.
|
| - // In this case we skip the destruction observer registration
|
| - // and just invoke the callback stored at UnregisterForLoopDestruction.
|
| - DCHECK(stopped_);
|
| - unregister_done_callback = unregister_done_callback_;
|
| - unregister_done_callback_.Reset();
|
| - }
|
| - }
|
| -
|
| - if (!unregister_done_callback.is_null()) {
|
| - unregister_done_callback.Run(GetModelSafeGroup());
|
| - }
|
| -}
|
| -
|
| -void ModelSafeWorker::UnregisterForLoopDestruction(
|
| - base::Callback<void(ModelSafeGroup)> unregister_done_callback) {
|
| - base::AutoLock l(working_task_runner_lock_);
|
| - if (working_task_runner_) {
|
| - // Normal case - observer registration has been already done.
|
| - // Delegate to the sync thread to do the actual unregistration in
|
| - // UnregisterForLoopDestructionAsync.
|
| - DCHECK(!working_task_runner_->BelongsToCurrentThread());
|
| - working_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&ModelSafeWorker::UnregisterForLoopDestructionAsync, this,
|
| - unregister_done_callback));
|
| - } else {
|
| - // The working loop is still unknown, probably because the model type
|
| - // thread is blocked. Store the callback to be called from
|
| - // SetWorkingLoopToCurrent.
|
| - unregister_done_callback_ = unregister_done_callback;
|
| - }
|
| -}
|
| -
|
| -void ModelSafeWorker::UnregisterForLoopDestructionAsync(
|
| - base::Callback<void(ModelSafeGroup)> unregister_done_callback) {
|
| - {
|
| - base::AutoLock l(working_task_runner_lock_);
|
| - if (!working_task_runner_)
|
| - return;
|
| - DCHECK(working_task_runner_->BelongsToCurrentThread());
|
| - }
|
| -
|
| - DCHECK(stopped_);
|
| - base::MessageLoop::current()->RemoveDestructionObserver(this);
|
| - unregister_done_callback.Run(GetModelSafeGroup());
|
| -}
|
| -
|
| -} // namespace syncer
|
|
|