Ev クラス
(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() メソッドを使います。
目次
- Ev::backend — libev が使うバックエンドを表す整数値を返す
- Ev::depth — 再帰の深さを返す
- Ev::embeddableBackends — 他のイベントループに埋め込めるバックエンド群を返す
- Ev::feedSignal — シグナルイベントを Ev に送る
- Ev::feedSignalEvent — シグナルイベントの情報をデフォルトループに送る
- Ev::iteration — デフォルトのイベントループが新しいイベントをポーリングした回数を返す
- Ev::now — デフォルトのイベントループで直近の処理が始まった時刻を返す
- Ev::nowUpdate — カーネルに問い合わせて現在時刻を確認し、処理中の Ev::now が返す時刻を更新する
- Ev::recommendedBackends — 現在のプラットフォーム上でおすすめのバックエンドのビットマスクを返す
- Ev::resume — 一時停止していたデフォルトのイベントループを再開させる
- Ev::run — イベントのチェックとデフォルトループのコールバックの呼び出しを開始する
- Ev::sleep — 指定した秒数だけプロセスをブロックする
- Ev::stop — デフォルトのイベントループを止める
- Ev::supportedBackends — 現在の libev の構成でサポートするバックエンド群を返す
- Ev::suspend — デフォルトのイベントループを一時停止する
- Ev::time — epoch から現在時刻までの秒数を返す
- Ev::verify — 内部の整合性をチェックする (デバッグ用)