Envoyソース分析(三)------event

3307 ワード

#Envoyソース分析(三)------event Envoyのネットワーク部分はlibeventであるため、そのイベント部分もlibeventインタフェースのパッケージである.##libeventはまずlibeventでlibeventのいくつかの基礎コンポーネントを包装し、自動分析のスマートポインタタイプにパッケージした.
typedef CSmartPtr BasePtr;
typedef CSmartPtr BufferPtr;
typedef CSmartPtr BufferEventPtr;
typedef CSmartPtr ListenerPtr;

ここにGlobalクラスがあり、libeventスレッドのセキュリティを初期化し、SIGPIPE信号を遮断する静的initialize方法を提供します.
####event_impl_ベースすべてのイベントクラスのベースクラス
####timer_implはlibeventタイマイベントをカプセル化し、伝達する必要があるように構成されています.
typedef std::function TimerCb;

関数オブジェクト、ここでは初期化時にlibeventのeventに匿名関数を渡し、TimerCbのパラメータ伝達過程を回避します.コンストラクション関数でevtimer_を介してassignマクロはlibeventに値を割り当て、enableTimerを呼び出すとタイマが起動します.
####signal_implのlibevent信号イベントのカプセル化、timer_implは同じですが、メンバー関数はありません.コンストラクション関数ではeventがlibeventに登録されます.
####file_event_implはioのイベントをカプセル化し,コールバックをトリガするとトリガイベントパラメータがコールバック関数に伝達されることを区別する.
[](evutil_socket_t, short what, void* arg) -> void {
                 FileEventImpl* event = static_cast(arg);
                 uint32_t events = 0;
                 if (what & EV_READ) {
                   events |= FileReadyType::Read;
                 }

                 if (what & EV_WRITE) {
                   events |= FileReadyType::Write;
                 }

                 if (what & EV_CLOSED) {
                   events |= FileReadyType::Closed;
                 }

                 ASSERT(event);
                 event->cb_(events);
               },
               this);

####dispatcher_implイベントスケジューリングループ、runメソッドでlibeventのevent_を呼び出すbase_loopインタフェースはイベントがトリガーされるのを待つ.これは、イベントトリガ比較の下位レベルのクラスです.
 //  run      id
 Thread::ThreadId run_tid_{};
 //           buffer  
 Buffer::WatermarkFactoryPtr buffer_factory_;
 //libevent  base
 Libevent::BasePtr base_;
 //       
 TimerPtr deferred_delete_timer_;
 //post        
 TimerPtr post_timer_;
 //             current_to_delete_     to_delete*
 std::vector to_delete_1_;
 std::vector to_delete_2_;
 std::vector* current_to_delete_;
 //  post_callbacks_   
 Thread::MutexBasicLockable post_lock_;
 //post       
 std::list<:function>> post_callbacks_ GUARDED_BY(post_lock_);
 //        
 bool deferred_deleting_{};

ここで疑問なのは、2つのタイマが挿入操作が発生したときに、1つの項目がある場合に0秒トリガを設定し、他の場所の呼び出しが見つからないようだということです.メンバー変数からdispatcher_を簡単に見ることができます.implの主な仕事はlibevent baseのパッケージであり、また一連の作成関数も提供されています.
 Network::ConnectionPtr createServerConnection
 Network::ClientConnectionPtr  createClientConnection
 Network::DnsResolverSharedPtr createDnsResolve
 FileEventPtr createFileEvent
 Filesystem::WatcherPtr createFilesystemWatcher
 Network::ListenerPtr createListener
 TimerPtr createTimer

これらのオブジェクトは、作成中に独自の時間イベント、信号イベント、IOイベントをコンストラクション関数に登録します.implのbase_で、createListenerインタフェースの作成時に呼び出されるlibeventインタフェースが異なるのは唯一ですが、対応するコールバックインタフェースもbaseに登録されます.
####dispatched_thread