Ev クラス
Ev
&reftitle.intro;
Ev は静的クラスで、デフォルトのループへのアクセスや各種共通操作へのアクセスを提供します。
&reftitle.classsynopsis;
Ev
final
Ev
&Constants;
const
int
Ev::FLAG_AUTO
0
const
int
Ev::FLAG_NOENV
16777216
const
int
Ev::FLAG_FORKCHECK
33554432
const
int
Ev::FLAG_NOINOTIFY
1048576
const
int
Ev::FLAG_SIGNALFD
2097152
const
int
Ev::FLAG_NOSIGMASK
4194304
const
int
Ev::RUN_NOWAIT
1
const
int
Ev::RUN_ONCE
2
const
int
Ev::BREAK_CANCEL
0
const
int
Ev::BREAK_ONE
1
const
int
Ev::BREAK_ALL
2
const
int
Ev::MINPRI
-2
const
int
Ev::MAXPRI
2
const
int
Ev::READ
1
const
int
Ev::WRITE
2
const
int
Ev::TIMER
256
const
int
Ev::PERIODIC
512
const
int
Ev::SIGNAL
1024
const
int
Ev::CHILD
2048
const
int
Ev::STAT
4096
const
int
Ev::IDLE
8192
const
int
Ev::PREPARE
16384
const
int
Ev::CHECK
32768
const
int
Ev::EMBED
65536
const
int
Ev::CUSTOM
16777216
const
int
Ev::ERROR
2147483648
const
int
Ev::BACKEND_SELECT
1
const
int
Ev::BACKEND_POLL
2
const
int
Ev::BACKEND_EPOLL
4
const
int
Ev::BACKEND_KQUEUE
8
const
int
Ev::BACKEND_DEVPOLL
16
const
int
Ev::BACKEND_PORT
32
const
int
Ev::BACKEND_ALL
63
const
int
Ev::BACKEND_MASK
65535
&Methods;
&reftitle.constants;
ループを作るときに渡すフラグ
Ev::FLAG_AUTO
デフォルトのフラグの値。
Ev::FLAG_NOENV
このフラグを使う (あるいは setuid や setgid でプログラムを実行する) と、
libev は環境変数
LIBEV_FLAGS を見ません。
それ以外の場合 (デフォルト) は、
LIBEV_FLAGS が見つかった場合は
その内容でフラグを上書きします。パフォーマンステストやバグの調査のときに有用です。
Ev::FLAG_FORKCHECK
libev が繰り返しのたびにフォークをチェックするようにします。毎回手動で
EvLoop::fork を呼ぶことがなくなります。
これを実現するために、ループ内での繰り返しの旅に
getpid() を呼んでいます。
そのため、繰り返しの回数が増えるとイベントループがスローダウンするかもしれませんが、
通常は気になるほどではありません。このフラグの設定を上書きしたり、
環境変数 LIBEV_FLAGS で指定したりすることはできません。
Ev::FLAG_NOINOTIFY
このフラグを指定すると、
libev
は ev_stat
ウォッチャーに
inotify API を使わなくなります。
このフラグは inotify ファイルディスクリプタを節約するのに便利です。
これを使わなければ、ev_stat
ウォッチャーを使ったループのたびに
inotify
ハンドルをひとつずつ消費することになります。
Ev::FLAG_SIGNALFD
このフラグを指定すると、
libev
は
ev_signal
(および
ev_child
) ウォッチャーに
signalfd API を使おうとします。
この API はシグナルを同期的に配送し、高速に処理したり
キューに入ったシグナルデータを取得できるようにしたりします。
また、スレッドを使ったときのシグナル処理も、
スレッド内でシグナルが適切にブロックされている限りはシンプルになります。
デフォルトでは signalfd を使いません。
Ev::FLAG_NOSIGMASK
このフラグを指定すると、
libev はシグナルのマスクを変更しないようにします。
具体的には、シグナルが受信されるまではブロックしないようになるということです。
これは、自前のシグナル処理をするときに便利です。
また、特定のスレッドでだけシグナルを処理するという場合にも有用です。
Ev::run
あるいは
EvLoop::run
に渡すフラグ
Ev::RUN_NOWAIT
イベントループが新しいイベントを探し、
新しいイベントや未処理のイベントを処理するけれども、
もしイベントが見つからない場合は、最初のループですぐに呼び出し元に制御を戻します。
イベントを待つためにプロセスをブロックしたりはしません。
これは、時間のかかる計算をしているときのポーリングなどに便利です。
プログラムの動きを止めることなく新しいイベントを処理できます。
Ev::RUN_ONCE
イベントループが (必要なら待ち続けてでも) 新しいイベントを探し、
その新しいイベントや未処理のイベントを処理します。
少なくとも一つのイベントがやってくるまで
(libev 自身のイベント間隔になるでしょう。
そのため、ユーザー低位のコールバックが呼ばれる保証はありません) プロセスをブロックし
ループ処理の終了後に呼び出し元に制御を戻します。
Ev::stop
あるいは
EvLoop::stop
に渡すフラグ
Ev::BREAK_CANCEL
ブレーク操作をキャンセルします。
Ev::BREAK_ONE
一番内側の
Ev::run
(あるいは
EvLoop::run
) の呼び出しを返します。
Ev::BREAK_ALL
ネストしたすべての
Ev::run
(あるいは
EvLoop::run
) の呼び出しを返します。
ウォッチャーの優先度
Ev::MINPRI
最小の優先度。
Ev::MAXPRI
最大の優先度。
受信したイベントのビットマスク
Ev::READ
EvIo
ウォッチャーが読み込み可能になったときのファイルディスクリプタ。
Ev::WRITE
EvIo
ウォッチャーが書き込み可能になったときのファイルディスクリプタ。
Ev::TIMER
EvTimer
ウォッチャーがタイムアウトしました。
Ev::PERIODIC
EvPeriodic
ウォッチャーがタイムアウトしました。
Ev::SIGNAL
EvSignal::__construct
のコンストラクタで指定したシグナルを受信しました。
Ev::CHILD
EvChild::__construct
のコンストラクタで指定した
pid
が、状態の変更を受信しました。
Ev::STAT
EvStat
ウォッチャーで指定したパスが、その属性を変更しました。
Ev::IDLE
他のウォッチャーが何もすることがなくなったときに、
EvIdle
ウォッチャーが動作します。
Ev::PREPARE
すべての
EvPrepare
ウォッチャーが、
Ev::run
の開始前に起動しました。つまり、
イベントループがスリープしたり新しいイベントのポーリングをしたりする直前に
EvPrepare
ウォッチャーが起動するということになります。
Ev::CHECK
すべての
EvCheck
ウォッチャーが、
Ev::run
が新しいイベントをとりまとめた直後
(ただし受信したイベントのコールバックをキューに入れる前)
にキューに入ります。つまり、
イベントループ内で優先度が同じ (あるいはより低い) ウォッチャーより前に
EvCheck ウォッチャーが起動するということになります。
Ev::EMBED
EvEmbed
で指定した埋め込みイベントループのウォッチャーが注目する必要があります。
Ev::CUSTOM
まだ
libev
で送信したりそれ以外の使いかたをしたりはしていませんが、
libev
ユーザーが (EvWatcher::feed などで)
ウォッチャーに通知するために使えます。
Ev::ERROR
指定されていないエラーが発生し、ウォッチャーが停止しました。
これが発生する原因として考えられるのは、
libev がメモリ不足でウォッチャーをきちんと開始できなかった場合や
ファイルディスクリプタが閉じてしまった場合などがあります。
libev は、これらに関してはアプリケーションのバグとみなします。
詳細は
ANATOMY
OF A WATCHER
を参照ください。
バックエンドのフラグ
Ev::BACKEND_SELECT
select(2) バックエンド
Ev::BACKEND_POLL
poll(2) バックエンド
Ev::BACKEND_EPOLL
Linux 限定の
epoll(7)
バックエンド。2.6.9 以前のカーネルでもそれ以降のカーネルでも使えます。
Ev::BACKEND_KQUEUE
kqueue
バックエンド。大半の BSD システムで利用します。
EvEmbed ウォッチャーを使って、
kqueue バックエンドのループを別のループに埋め込むことができます。
たとえば、
kqueue バックエンドのループを作って、
それをソケットに対してだけ使うこともできます。
Ev::BACKEND_DEVPOLL
Solaris 8 バックエンド。現時点では未実装です。
Ev::BACKEND_PORT
Solaris 10 のイベントポート機構で、規模が大きくなっても対応できます。
Ev::BACKEND_ALL
壊れているものも含めて、すべてのバックエンドを試します。
これを明示的に使うことは推奨しません。ビット演算子を使って、
Ev::BACKEND_ALL
& ~
Ev::BACKEND_KQUEUE
のようにするか、
Ev::recommendedBackends
を使うか、あるいは何もバックエンドを指定しないようにしましょう。
Ev::BACKEND_MASK
これはバックエンドではなく、
flags の中のすべてのバックエンドビットをマスクするものです。
たとえば、環境変数
LIBEV_FLAGS
を変更するときに使います。
デフォルトのループの場合は、モジュールの初期化時に
Ev が
(もし使えれば) pthread_atfork を使って
ev_loop_fork
の呼び出しを登録します。
Ev クラスには、
デフォルトのイベントループ にアクセスするメソッドが用意されています
(Ev::iteration や Ev::depth など)。
カスタムループ
(EvLoop::__construct で作ったもの)
の場合、これらの値にアクセスするには
EvLoop クラスのプロパティやメソッドを使います。
デフォルトのイベントループ自体のインスタンスを取得するには
EvLoop::defaultLoop
メソッドを使います。
&reference.ev.entities.ev;