#ifndef ANDROID_PDX_UDS_SERVICE_DISPATCHER_H_ #define ANDROID_PDX_UDS_SERVICE_DISPATCHER_H_ #include <list> #include <memory> #include <mutex> #include <unordered_map> #include <pdx/file_handle.h> #include <pdx/service_dispatcher.h> namespace android { namespace pdx { namespace uds { class ServiceDispatcher : public pdx::ServiceDispatcher { public: // Get a new instance of ServiceDispatcher, or return nullptr if init failed. static std::unique_ptr<pdx::ServiceDispatcher> Create(); ~ServiceDispatcher() override; int AddService(const std::shared_ptr<Service>& service) override; int RemoveService(const std::shared_ptr<Service>& service) override; int ReceiveAndDispatch() override; int ReceiveAndDispatch(int timeout) override; int EnterDispatchLoop() override; void SetCanceled(bool cancel) override; bool IsCanceled() const override; private: ServiceDispatcher(); // Internal thread accounting. int ThreadEnter(); void ThreadExit(); std::mutex mutex_; std::condition_variable condition_; std::atomic<bool> canceled_{false}; std::list<std::shared_ptr<Service>> services_; int thread_count_ = 0; LocalHandle event_fd_; LocalHandle epoll_fd_; ServiceDispatcher(const ServiceDispatcher&) = delete; void operator=(const ServiceDispatcher&) = delete; }; } // namespace uds } // namespace pdx } // namespace android #endif // ANDROID_PDX_UDS_SERVICE_DISPATCHER_H_