| #ifndef AOS_EVENT_H_ |
| #define AOS_EVENT_H_ |
| |
| #include "aos/time/time.h" |
| |
| #include "aos/ipc_lib/aos_sync.h" |
| |
| namespace aos { |
| |
| // An abstraction of an event which is easy to implement for Linux and in other |
| // environments. |
| // On Linux at least, this is definitely safe for passing through C code with |
| // memcpy etc. |
| // |
| // An event is either "set" or "unset". Any thread can transition it between |
| // these two states and other threads can wait for an unset->set transition. |
| // This is not a particularly powerful synchronization primitive, but it can be |
| // much easier to use than more complicated ones in some situations. The name is |
| // taken from Python's implementation of the same thing. |
| // |
| // An event is equivalent to a semaphore which is either set to 0 or infinity. |
| // It is also equivalent to a condition variable with the monitored condition |
| // being "is it set or not". |
| // |
| // IMPORTANT: You can NOT use this to successfully replace a standard condition |
| // variable in most cases. When the condition being monitored changes separately |
| // from the actual state of the condition variable/event, there WILL be race |
| // conditions if you try to use this class. |
| // |
| // It is undefined behavior to destroy an Event while there are current |
| // Wait()ers. |
| class Event { |
| public: |
| // Creates an unset event. |
| Event(); |
| // There must be no waiters when an Event is destroyed. |
| ~Event() = default; |
| |
| // Waits for the event to be set. Returns immediately if it is already set. |
| void Wait(); |
| |
| // Waits for the event to be set or until timeout has elapsed. Returns |
| // immediately if it is already set. |
| // Returns true if the event was Set or false if the timeout expired. |
| bool WaitTimeout(monotonic_clock::duration timeout); |
| |
| // Wakes up all Wait()ers and sets the event (atomically). |
| void Set(); |
| // Unsets the event so future Wait() callers will block instead of returning |
| // immediately. |
| // Returns true if the event was previously set. |
| bool Clear(); |
| |
| private: |
| aos_futex impl_; |
| }; |
| |
| } // namespace aos |
| |
| #endif // AOS_EVENT_H_ |