#pragma once #include #include #include "interconnect_stream.h" #include #include #include namespace NInterconnect { using NActors::TFDDelegate; using NActors::TSharedDescriptor; class TPollerUnit { public: typedef std::unique_ptr TPtr; static TPtr Make(bool useSelect); void Start(); void Stop(); virtual void StartReadOperation( const TIntrusivePtr& stream, TFDDelegate&& operation); virtual void StartWriteOperation( const TIntrusivePtr& stream, TFDDelegate&& operation); virtual ~TPollerUnit(); private: virtual void ProcessRead() = 0; virtual void ProcessWrite() = 0; template static void* IdleThread(void* param); template void RunLoop(); volatile bool StopFlag; TThread ReadLoop, WriteLoop; protected: TPollerUnit(); struct TSide { using TOperations = std::unordered_map, TFDDelegate>>; TOperations Operations; using TItem = TOperations::mapped_type; TFunnelQueue InputQueue; void ProcessInput(); } Read, Write; template TSide& GetSide(); }; }