Home | History | Annotate | Download | only in uds
      1 #ifndef ANDROID_PDX_UDS_SERVICE_DISPATCHER_H_
      2 #define ANDROID_PDX_UDS_SERVICE_DISPATCHER_H_
      3 
      4 #include <list>
      5 #include <memory>
      6 #include <mutex>
      7 #include <unordered_map>
      8 
      9 #include <pdx/file_handle.h>
     10 #include <pdx/service_dispatcher.h>
     11 
     12 namespace android {
     13 namespace pdx {
     14 namespace uds {
     15 
     16 class ServiceDispatcher : public pdx::ServiceDispatcher {
     17  public:
     18   // Get a new instance of ServiceDispatcher, or return nullptr if init failed.
     19   static std::unique_ptr<pdx::ServiceDispatcher> Create();
     20 
     21   ~ServiceDispatcher() override;
     22   int AddService(const std::shared_ptr<Service>& service) override;
     23   int RemoveService(const std::shared_ptr<Service>& service) override;
     24   int ReceiveAndDispatch() override;
     25   int ReceiveAndDispatch(int timeout) override;
     26   int EnterDispatchLoop() override;
     27   void SetCanceled(bool cancel) override;
     28   bool IsCanceled() const override;
     29 
     30  private:
     31   ServiceDispatcher();
     32 
     33   // Internal thread accounting.
     34   int ThreadEnter();
     35   void ThreadExit();
     36 
     37   std::mutex mutex_;
     38   std::condition_variable condition_;
     39   std::atomic<bool> canceled_{false};
     40 
     41   std::list<std::shared_ptr<Service>> services_;
     42 
     43   int thread_count_ = 0;
     44   LocalHandle event_fd_;
     45   LocalHandle epoll_fd_;
     46 
     47   ServiceDispatcher(const ServiceDispatcher&) = delete;
     48   void operator=(const ServiceDispatcher&) = delete;
     49 };
     50 
     51 }  // namespace uds
     52 }  // namespace pdx
     53 }  // namespace android
     54 
     55 #endif  // ANDROID_PDX_UDS_SERVICE_DISPATCHER_H_
     56