poll のメインループ
int pa_mainloop_iterate(pa_mainloop *m, int block, int *retval);
メインループを1回分実行する。
pa_mainloop_prepare()、pa_mainloop_poll()、pa_mainloop_dispatch() を実行するのと同じ。
pa_mainloop_prepare()、pa_mainloop_poll()、pa_mainloop_dispatch() を実行するのと同じ。
block
0 以外の場合、イベントが来るまでブロックする。
0 の場合は、prepare で timeout を 0 に、それ以外は -1 にする。
0 の場合は、prepare で timeout を 0 に、それ以外は -1 にする。
retval
NULL 以外で、quit で指定された戻り値が返る。
戻り値
成功時、ディスパッチされたソースの数。
エラー、または quit 要求が来た場合、負の値。
エラー、または quit 要求が来た場合、負の値。
int pa_mainloop_prepare(pa_mainloop *m, int timeout);
メインループの1回分を準備する。
timeout
この後に行う poll の最大タイムアウト (ms)。-1 で無限。
戻り値
エラーまたは quit 要求で、負の値
int pa_mainloop_dispatch(pa_mainloop *m);
以前に実行された poll で受け取ったイベントを、ディスパッチする。
クライアント側で、対応するコールバック関数を実行するなどの処理が行われる。
クライアント側で、対応するコールバック関数を実行するなどの処理が行われる。
戻り値
成功時、ディスパッチされたソースの数。エラー時は負の値。
int pa_mainloop_run(pa_mainloop *m, int *retval);
pa_mainloop_quit() が呼び出されるまで、メインループを永遠に繰り返す。
retval
NULL 以外の場合、quit 時の戻り値が返る
戻り値
エラー時は負の値
void pa_mainloop_set_poll_func(pa_mainloop *m, pa_poll_func poll_func, void *userdata); typedef int (*pa_poll_func)(struct pollfd *ufds, unsigned long nfds, int timeout, void *userdata);
内部の poll 関数を変更
スレッドのメインループ
int pa_threaded_mainloop_start(pa_threaded_mainloop *m);
イベントループのスレッドを開始する。
新しいスレッドが作成され、その中でイベントが処理される。
新しいスレッドが作成され、その中でイベントが処理される。
戻り値
成功すると 0、エラーで負の値
void pa_threaded_mainloop_stop(pa_threaded_mainloop *m);
イベントループスレッドを正常に終了させる。
※この関数を呼び出す前に、ロックを解除しておくこと。
※この関数を呼び出す前に、ロックを解除しておくこと。
int pa_threaded_mainloop_get_retval(const pa_threaded_mainloop *m);
メインループの pa_mainloop_quit() 時に指定された戻り値を返す。
int pa_threaded_mainloop_in_thread(pa_threaded_mainloop *m);
コールバック関数の実行中など、イベントループスレッド内から呼び出された場合は、0 以外を返す。
void pa_threaded_mainloop_lock(pa_threaded_mainloop *m); void pa_threaded_mainloop_unlock(pa_threaded_mainloop *m);
イベントループをロックして、スレッドがイベントを処理するのをブロックする。
このロックは再帰的である。
※この関数は、イベントループスレッド内から呼び出すことはできない。
イベントループスレッドから実行されたコールバック関数は、このロックを保持したまま実行される。
このロックは再帰的である。
※この関数は、イベントループスレッド内から呼び出すことはできない。
イベントループスレッドから実行されたコールバック関数は、このロックを保持したまま実行される。
void pa_threaded_mainloop_once_unlocked(pa_threaded_mainloop *m, void (*)(pa_threaded_mainloop *m, void *userdata)callback, void *userdata); //ver 13.0
ロック状態を維持せずに、メインループスレッド内で、指定されたコールバックを実行する。
PulseAudio のデータ構造体が、スレッドセーフな方法でのみアクセスされるようにすること。
(pa_context と pa_stream による関数は、スレッドセーフではないので、何らかの同期なしにアクセスするべきではない)
これは、メインループスレッドのコンテキストで、pa_threaded_mainloop_lock() および pa_threaded_mainloop_unlock() を使用できる唯一の状況。
PulseAudio のデータ構造体が、スレッドセーフな方法でのみアクセスされるようにすること。
(pa_context と pa_stream による関数は、スレッドセーフではないので、何らかの同期なしにアクセスするべきではない)
これは、メインループスレッドのコンテキストで、pa_threaded_mainloop_lock() および pa_threaded_mainloop_unlock() を使用できる唯一の状況。
void pa_threaded_mainloop_wait(pa_threaded_mainloop *m);
イベントループスレッド内で、pa_threaded_mainloop_signal() によってシグナルが送られるまで待つ。
この関数は、イベントループスレッド内で呼び出すことはできない。
この呼び出しの前に、pa_threaded_mainloop_lock() を使用して、ロックする必要がある。
待っている間はロックが解除され、戻る直前に再度ロックされる。
この関数は、pa_threaded_mainloop_signal() の呼び出し以外でも終了する可能性があるため、正しく戻ってきたかどうかを判定する必要がある。
この関数は、イベントループスレッド内で呼び出すことはできない。
この呼び出しの前に、pa_threaded_mainloop_lock() を使用して、ロックする必要がある。
待っている間はロックが解除され、戻る直前に再度ロックされる。
この関数は、pa_threaded_mainloop_signal() の呼び出し以外でも終了する可能性があるため、正しく戻ってきたかどうかを判定する必要がある。
void pa_threaded_mainloop_signal(pa_threaded_mainloop *m, int wait_for_accept);
pa_threaded_mainloop_wait() でイベントを待機しているすべてのスレッドに、シグナルを送る。
これにより、wait を抜けさせることができる。
これにより、wait を抜けさせることができる。
wait_for_accept
0 以外の場合、pa_threaded_mainloop_accept() と同時に使用する。
この関数の後、wait から戻ってから accept を実行するまでの間、オブジェクトはロック解除される。
この関数の後、wait から戻ってから accept を実行するまでの間、オブジェクトはロック解除される。
void pa_threaded_mainloop_accept(pa_threaded_mainloop *m);
この関数は、pa_threaded_mainloop_signal() で wait_for_accept を 0 以外にして呼び出した場合のみ使用する。
pa_threaded_mainloop_signal() によって wait から抜けた後に実行し、イベントスレッドからのシグナルを受け入れる。
コールバック関数に渡された引数などのデータを、wait から戻ったスレッド側で使いたい場合に使用する。
pa_threaded_mainloop_signal() によって wait から抜けた後に実行し、イベントスレッドからのシグナルを受け入れる。
コールバック関数に渡された引数などのデータを、wait から戻ったスレッド側で使いたい場合に使用する。
UNIX シグナル