(PECL ev >= 0.2.0)
Ev は静的クラスで、デフォルトのループへのアクセスや各種共通操作へのアクセスを提供します。
ループを作るときに渡すフラグ
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() メソッドを使います。