1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
// Copyright (c) 2015 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 "components/password_manager/sync/browser/password_model_worker.h"
#include "base/bind.h"
#include "base/callback.h"
#include "base/synchronization/waitable_event.h"
#include "components/password_manager/core/browser/password_store.h"
#include "components/sync/base/scoped_event_signal.h"
namespace browser_sync {
namespace {
void CallDoWorkAndSignalEvent(const syncer::WorkCallback& work,
syncer::ScopedEventSignal scoped_event_signal,
syncer::SyncerError* error_info) {
*error_info = work.Run();
// The event in |scoped_event_signal| is signaled at the end of this scope.
}
} // namespace
PasswordModelWorker::PasswordModelWorker(
const scoped_refptr<password_manager::PasswordStore>& password_store)
: password_store_(password_store) {
DCHECK(password_store.get());
}
syncer::SyncerError PasswordModelWorker::DoWorkAndWaitUntilDoneImpl(
const syncer::WorkCallback& work) {
syncer::SyncerError error = syncer::UNSET;
// Signaled when the task is deleted, i.e. after it runs or when it is
// abandoned.
base::WaitableEvent work_done_or_abandoned(
base::WaitableEvent::ResetPolicy::AUTOMATIC,
base::WaitableEvent::InitialState::NOT_SIGNALED);
bool scheduled = false;
{
base::AutoLock lock(password_store_lock_);
if (!password_store_.get())
return syncer::CANNOT_DO_WORK;
scheduled = password_store_->ScheduleTask(base::Bind(
&CallDoWorkAndSignalEvent, work,
base::Passed(syncer::ScopedEventSignal(&work_done_or_abandoned)),
&error));
}
if (scheduled)
work_done_or_abandoned.Wait();
else
error = syncer::CANNOT_DO_WORK;
return error;
}
syncer::ModelSafeGroup PasswordModelWorker::GetModelSafeGroup() {
return syncer::GROUP_PASSWORD;
}
bool PasswordModelWorker::IsOnModelThread() {
// Ideally PasswordStore would expose a way to check whether this is the
// thread it does work on. Since it doesn't, just return true to bypass a
// CHECK in the sync code.
return true;
}
PasswordModelWorker::~PasswordModelWorker() {}
void PasswordModelWorker::RequestStop() {
ModelSafeWorker::RequestStop();
base::AutoLock lock(password_store_lock_);
password_store_ = NULL;
}
} // namespace browser_sync
|