Envoyソース分析(三)------event
3307 ワード
#Envoyソース分析(三)------event Envoyのネットワーク部分はlibeventであるため、そのイベント部分もlibeventインタフェースのパッケージである.##libeventはまずlibeventでlibeventのいくつかの基礎コンポーネントを包装し、自動分析のスマートポインタタイプにパッケージした.
ここにGlobalクラスがあり、libeventスレッドのセキュリティを初期化し、SIGPIPE信号を遮断する静的initialize方法を提供します.
####event_impl_ベースすべてのイベントクラスのベースクラス
####timer_implはlibeventタイマイベントをカプセル化し、伝達する必要があるように構成されています.
関数オブジェクト、ここでは初期化時にlibeventのeventに匿名関数を渡し、TimerCbのパラメータ伝達過程を回避します.コンストラクション関数でevtimer_を介してassignマクロはlibeventに値を割り当て、enableTimerを呼び出すとタイマが起動します.
####signal_implのlibevent信号イベントのカプセル化、timer_implは同じですが、メンバー関数はありません.コンストラクション関数ではeventがlibeventに登録されます.
####file_event_implはioのイベントをカプセル化し,コールバックをトリガするとトリガイベントパラメータがコールバック関数に伝達されることを区別する.
####dispatcher_implイベントスケジューリングループ、runメソッドでlibeventのevent_を呼び出すbase_loopインタフェースはイベントがトリガーされるのを待つ.これは、イベントトリガ比較の下位レベルのクラスです.
ここで疑問なのは、2つのタイマが挿入操作が発生したときに、1つの項目がある場合に0秒トリガを設定し、他の場所の呼び出しが見つからないようだということです.メンバー変数からdispatcher_を簡単に見ることができます.implの主な仕事はlibevent baseのパッケージであり、また一連の作成関数も提供されています.
これらのオブジェクトは、作成中に独自の時間イベント、信号イベント、IOイベントをコンストラクション関数に登録します.implのbase_で、createListenerインタフェースの作成時に呼び出されるlibeventインタフェースが異なるのは唯一ですが、対応するコールバックインタフェースもbaseに登録されます.
####dispatched_thread
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