blob: 23af4f440326f29fc33aa65909e463a32200db34 [file] [log] [blame]
#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_