/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2019, Google Inc. * * cam - Event loop */ #pragma once #include #include #include #include #include #include #include #include struct event_base; class EventLoop { public: enum EventType { Read = 1, Write = 2, }; EventLoop(); ~EventLoop(); static EventLoop *instance(); int exec(); void exit(int code = 0); void callLater(std::function &&func); void addFdEvent(int fd, EventType type, std::function &&handler); using duration = std::chrono::steady_clock::duration; void addTimerEvent(const std::chrono::microseconds period, std::function &&handler); private: LIBCAMERA_DISABLE_COPY_AND_MOVE(EventLoop) struct Event { Event(std::function &&callback); LIBCAMERA_DISABLE_COPY_AND_MOVE(Event) ~Event(); static void dispatch(int fd, short events, void *arg); std::function callback_; struct event *event_; }; static EventLoop *instance_; struct event_base *base_; int exitCode_; std::deque> calls_; std::list> events_; std::mutex lock_; static void dispatchCallback(evutil_socket_t fd, short flags, void *param); void dispatchCall(); };