diff options
Diffstat (limited to 'sync/internal_api/public/base/cancelation_signal.cc')
-rw-r--r-- | sync/internal_api/public/base/cancelation_signal.cc | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/sync/internal_api/public/base/cancelation_signal.cc b/sync/internal_api/public/base/cancelation_signal.cc new file mode 100644 index 0000000..1ce920e --- /dev/null +++ b/sync/internal_api/public/base/cancelation_signal.cc @@ -0,0 +1,52 @@ +// Copyright 2013 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/base/cancelation_signal.h" + +#include "base/logging.h" +#include "sync/internal_api/public/base/cancelation_observer.h" + +namespace syncer { + +CancelationSignal::CancelationSignal() + : stop_requested_(false), + handler_(NULL) { } + +CancelationSignal::~CancelationSignal() { + DCHECK(!handler_); +} + +bool CancelationSignal::TryRegisterHandler(CancelationObserver* handler) { + base::AutoLock lock(stop_requested_lock_); + DCHECK(!handler_); + + if (stop_requested_) + return false; + + handler_ = handler; + return true; +} + +void CancelationSignal::UnregisterHandler(CancelationObserver* handler) { + base::AutoLock lock(stop_requested_lock_); + DCHECK_EQ(handler_, handler); + handler_ = NULL; +} + +bool CancelationSignal::IsStopRequested() { + base::AutoLock lock(stop_requested_lock_); + return stop_requested_; +} + +void CancelationSignal::RequestStop() { + base::AutoLock lock(stop_requested_lock_); + DCHECK(!stop_requested_); + + stop_requested_ = true; + if (handler_) { + handler_->OnStopRequested(); + } +} + +} // namespace syncer |