| // Copyright 2017 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 MOJO_PUBLIC_CPP_SYSTEM_HANDLE_SIGNAL_TRACKER_H_ |
| #define MOJO_PUBLIC_CPP_SYSTEM_HANDLE_SIGNAL_TRACKER_H_ |
| |
| #include "base/callback.h" |
| #include "base/macros.h" |
| #include "mojo/public/c/system/types.h" |
| #include "mojo/public/cpp/system/handle.h" |
| #include "mojo/public/cpp/system/simple_watcher.h" |
| #include "mojo/public/cpp/system/system_export.h" |
| |
| namespace mojo { |
| |
| // This class helps track the state of specific signal on a handle so that |
| // the user doesn't have to manually query the signal state every time they |
| // want to know the handle's state. |
| // |
| // Usage of this class is specifically targeting cases where the signal state |
| // changes infrequently but must be queried frequently. If either condition does |
| // not hold, consider using Handle::QuerySignalsState (or |
| // MojoQueryHandleSignalsState) directly instead. |
| class MOJO_CPP_SYSTEM_EXPORT HandleSignalTracker { |
| public: |
| using NotificationCallback = |
| base::Callback<void(const HandleSignalsState& signals_state)>; |
| |
| // Constructs a tracker which tracks |signals| on |handle|. |signals| may |
| // be any single signal flag or any combination of signal flags. |
| HandleSignalTracker(Handle handle, MojoHandleSignals signals); |
| ~HandleSignalTracker(); |
| |
| const HandleSignalsState& last_known_state() const { |
| return last_known_state_; |
| } |
| |
| // Sets an optional callback to be invoked any time the tracker is notified of |
| // a relevant state change. |
| void set_notification_callback(const NotificationCallback& callback) { |
| notification_callback_ = callback; |
| } |
| |
| private: |
| class State; |
| |
| void Arm(); |
| void OnNotify(MojoResult result, const HandleSignalsState& state); |
| |
| NotificationCallback notification_callback_; |
| |
| // The last known signaliing state of the handle. |
| HandleSignalsState last_known_state_ = {0, 0}; |
| |
| // Watches for the signal(s) to be signaled. May only be armed when |
| // |low_watcher_| is not. |
| SimpleWatcher high_watcher_; |
| |
| // Watches for the signal(s) to be cleared. May only be armed when |
| // |high_watcher_| is not. |
| SimpleWatcher low_watcher_; |
| |
| DISALLOW_COPY_AND_ASSIGN(HandleSignalTracker); |
| }; |
| |
| } // namespace mojo |
| |
| #endif // MOJO_PUBLIC_CPP_SYSTEM_HANDLE_SIGNAL_TRACKER_H_ |