Chromium Code Reviews| Index: sync/internal_api/public/base/cancellation_signal.h |
| diff --git a/sync/internal_api/public/base/cancellation_signal.h b/sync/internal_api/public/base/cancellation_signal.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d9a9c5d0249673e5183dc4518b70f9ac1bf8c7c2 |
| --- /dev/null |
| +++ b/sync/internal_api/public/base/cancellation_signal.h |
| @@ -0,0 +1,71 @@ |
| +// Copyright (c) 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. |
| + |
| +#ifndef SYNC_INTERNAL_API_PUBLIC_BASE_ABORT_SIGNALLER_H_ |
| +#define SYNC_INTERNAL_API_PUBLIC_BASE_ABORT_SIGNALLER_H_ |
| + |
| +#include "base/synchronization/lock.h" |
| +#include "sync/base/sync_export.h" |
| + |
| +namespace syncer { |
| + |
| +class CancellationObserver; |
| + |
| +// This class is used to allow one thread to request that another abort and |
| +// return early. |
| +// |
| +// The signalling thread owns this class and my call RequestStop() at any time. |
| +// After that call, this class' IsStopRequested() will always return true. The |
| +// intended use case is that the task intending to support early exit will |
| +// periodically check the value of IsStopRequested() to see if it should return |
| +// early. |
| +// |
| +// The receiving task may also choose to register an CancellationObserver whose |
| +// OnStopRequested() method will be executed on the signaller's thread when |
| +// RequestStop() is called. This may be used for sending an early Signal() to a |
| +// WaitableEvent. The registration of the handler is necessarily racy. If |
| +// RequestStop() is executes before TryRegisterHandler(), TryRegisterHandler() |
| +// will not perform any registration and return false. That function's caller |
| +// must handle this case. |
| +// |
| +// This class supports only one handler, though it could easily support multiple |
| +// observers if we found a use case for such a feature. |
| +class SYNC_EXPORT_PRIVATE CancellationSignal { |
| + public: |
| + CancellationSignal(); |
| + ~CancellationSignal(); |
| + |
| + // Tries to register a handler to be invoked when RequestStop() is called. |
| + // |
| + // If RequestStop() has already been called, returns false without registering |
| + // the handler. Returns true when the registration is successful. |
| + // |
| + // If the registration was successful, the handler must be unregistered with |
| + // UnregisterHandler before this CancellationSignal is destroyed. |
| + bool TryRegisterHandler(CancellationObserver* handler); |
| + |
| + // Unregisters the abort handler. |
| + void UnregisterHandler(CancellationObserver* handler); |
| + |
| + // Returns true if RequestStop() has been called. |
| + bool IsStopRequested(); |
| + |
| + // Sets the stop_requested_ flag and calls the OnStopRequested() method of the |
| + // registered handler, if one exists. |
|
akalin
2013/09/05 16:06:35
might want to mention that OnStopRequested() is ca
rlarocque
2013/09/05 22:37:06
Done.
|
| + void RequestStop(); |
| + |
| + private: |
| + // Protects all members of this class. |
| + base::Lock stop_requested_lock_; |
| + |
| + // True if RequestStop() has been invoked. |
| + bool stop_requested_; |
| + |
| + // The registered abort handler. May be NULL. |
| + CancellationObserver* handler_; |
| +}; |
| + |
| +} // namespace syncer |
| + |
| +#endif // SYNC_INTERNAL_API_PUBLIC_BASE_ABORT_SIGNALLER_H_ |