#ifndef PLASMA_EVENTS #define PLASMA_EVENTS #include #include #include extern "C" { #include "ae/ae.h" } /// Constant specifying that the timer is done and it will be removed. constexpr int kEventLoopTimerDone = AE_NOMORE; /// Read event on the file descriptor. constexpr int kEventLoopRead = AE_READABLE; /// Write event on the file descriptor. constexpr int kEventLoopWrite = AE_WRITABLE; class EventLoop { public: // Signature of the handler that will be called when there is a new event // on the file descriptor that this handler has been registered for. // // The arguments are the event flags (read or write). typedef std::function FileCallback; // This handler will be called when a timer times out. The timer id is // passed as an argument. The return is the number of milliseconds the timer // shall be reset to or kEventLoopTimerDone if the timer shall not be // triggered again. typedef std::function TimerCallback; EventLoop(); /// Add a new file event handler to the event loop. /// /// @param fd The file descriptor we are listening to. /// @param events The flags for events we are listening to (read or write). /// @param callback The callback that will be called when the event happens. /// @return Returns true if the event handler was added successfully. bool add_file_event(int fd, int events, FileCallback callback); /// Remove a file event handler from the event loop. /// /// @param fd The file descriptor of the event handler. /// @return Void. void remove_file_event(int fd); /// Register a handler that will be called after a time slice of /// "timeout" milliseconds. /// /// @param timeout The timeout in milliseconds. /// @param callback The callback for the timeout. /// @return The ID of the newly created timer. int64_t add_timer(int64_t timeout, TimerCallback callback); /// Remove a timer handler from the event loop. /// /// @param timer_id The ID of the timer that is to be removed. /// @return The ae.c error code. TODO(pcm): needs to be standardized int remove_timer(int64_t timer_id); /// Run the event loop. /// /// @return Void. void run(); private: static void file_event_callback(aeEventLoop *loop, int fd, void *context, int events); static int timer_event_callback(aeEventLoop *loop, long long timer_id, void *context); aeEventLoop *loop_; std::unordered_map> file_callbacks_; std::unordered_map> timer_callbacks_; }; #endif // PLASMA_EVENTS