Emscripten proxying.h API は、ターゲットスレッドで実行される作業をディスパッチし、オプションでその作業が完了するまでブロックするメカニズムを提供します。これは、特定の JS API が特定の スレッドでのみ呼び出すことができる Web コンテキストで特に役立ちます。どのスレッドでも、API 呼び出しを正しいスレッドにプロキシすることで、これらの API にアクセスできます。プロキシは、非同期 JS タスクを同期インターフェースでラップするのにも役立ちます。呼び出し元スレッドは、非同期タスクを専用のワーカースレッドにプロキシし、ワーカースレッドが最終的にタスクを完了したとマークするまで、おそらく JS イベントループに複数回戻った後で、待機できます。
ターゲットスレッドでは、キューに入れられた作業は 2 つの方法で実行できます。まず、ユーザーは emscripten_proxy_execute_queue
を明示的に呼び出して、現在のスレッド用にキューに入れられたタスクを実行できます。または、ターゲットスレッドが JS イベントループに戻ると、たとえば emscripten_exit_with_live_runtime
を介して、キューに入れられた作業が自動的に実行されます。
プロキシ API の使用方法の例については、test_pthread_proxying.c と test_pthread_proxying_cpp.cpp を参照してください。
em_proxying_queue
¶他のスレッドから非同期または同期的にプロキシできる、スレッドローカルの作業キュー(スレッドごとに 1 つ)の不透明なハンドル。
プロキシされた作業は、ライブスレッドランタイムでのみ完了できます。そのため、ユーザーは、スレッドが終了する前にプロキシされたすべての作業が完了するか、スレッドがライブランタイムで終了するように、たとえば、emscripten_exit_with_live_runtime
を介して、ドロップされた作業を回避する必要があります。
em_proxying_ctx
¶現在実行中のプロキシされたタスクの不透明なハンドル。タスクの終了を通知するために使用されます。
em_proxying_queue_create
()¶新しいプロキシキューを割り当てます。
em_proxying_queue_destroy
(em_proxying_queue* q)¶プロキシキューを解放します。キューには、残りのキューに入れられた作業があってはなりません。
emscripten_proxy_get_system_queue
()¶低レベルのランタイム作業のプロキシに使用されるキューを取得します。このキューでの作業は、システム関数内でいつでも処理される可能性があるため、ネイティブシグナルハンドラーと同様に、いつでも実行できるように、ブロックしないで安全である必要があります。ユーザーコードは通常、この関数を使用すべきではありません。
emscripten_proxy_execute_queue
(em_proxying_queue* q)¶指定されたキューで、現在のスレッド用にキューに入れられたすべてのタスクを実行します。この実行と同時にキューに入れられた新しいタスクも実行されます。この関数は、空のキューが検出されると返ります。
emscripten_proxy_finish
(em_proxying_ctx* ctx)¶emscripten_proxy_sync_with_ctx
でプロキシされたタスクの終了を通知します。
emscripten_proxy_async
(em_proxying_queue* q, pthread_t target_thread, void (*func)(void*), void* arg)¶指定されたキューとスレッドで引数 arg
で呼び出される func
をキューに入れ、func
の実行を待たずにすぐに返ります。作業が正常にキューに入れられた場合は 1 を、それ以外の場合は 0 を返します。
emscripten_proxy_sync
(em_proxying_queue* q, pthread_t target_thread, void (*func)(void*), void* arg)¶指定されたキューとスレッドで引数 arg
で呼び出される func
をキューに入れ、func
が同期的に実行されるのを待ってから返ります。func
が正常に完了した場合は 1 を返し、それ以外の場合、ターゲットスレッドがキャンセルされた場合や、作業が完了する前に終了した場合など、0 を返します。
emscripten_proxy_sync_with_ctx
(em_proxying_queue* q, pthread_t target_thread, void (*func)(em_proxying_ctx*, void*), void* arg)¶emscripten_proxy_sync
と同じですが、プロキシされた関数の戻りを待つ代わりに、プロキシされたタスクが emscripten_proxy_finish
で明示的に完了したとマークされるのを待ちます。func
自体が emscripten_proxy_finish
を呼び出す必要はありません。代わりに、コンテキストポインターを格納し、任意の後で emscripten_proxy_finish
を呼び出すことができます。
emscripten_proxy_callback
(em_proxying_queue* q, pthread_t target_thread, void (*func)(void*), void (*callback)(void*), void (*cancel)(void*), void* arg)¶指定されたキューとスレッドで func
をキューに入れます。実行が完了すると(完了した場合)、同じキューで現在のスレッドに callback
が非同期的にプロキシされます。または、作業が完了する前にターゲットスレッドが終了した場合は、代わりに cancel
がプロキシバックされます。3 つの関数すべてが同じ引数 arg
を受け取ります。func
が正常にキューイングされ、ターゲットスレッドに通知された場合は 1 を、それ以外の場合は 0 を返します。
emscripten_proxy_callback_with_ctx
(em_proxying_queue* q, pthread_t target_thread, void (*func)(em_proxying_ctx*, void*), void (*callback)(void*), void (*cancel)(void*), void* arg)¶指定されたキューとスレッドで func
をキューに入れます。指定された em_proxying_ctx
で emscripten_proxy_finish
を呼び出すことによってタスクを完了すると(完了した場合)、同じキューで現在のスレッドに callback
が非同期的にプロキシされます。または、作業が完了する前にターゲットスレッドが終了した場合は、代わりに cancel
がプロキシバックされます。3 つの関数すべてが同じ引数 arg
を受け取ります。func
が正常にキューイングされ、ターゲットスレッドに通知された場合は 1 を、それ以外の場合は 0 を返します。
この C++ API は、C++11 以降でコンパイルするときに proxying.h によって提供されます。これは、名前空間 emscripten
内で定義されています。
ProxyingQueue
¶em_proxying_queue*
をラップする、薄い C++ ラッパー。
ProxyingCtx
¶em_proxying_ctx*
をラップする、薄い C++ ラッパー。
execute
()¶ラップされたem_proxying_queue*
に対してemscripten_proxy_execute_queue
を呼び出します。
proxyAsync
(pthread_t target, std::function<void()> &&func)¶func
を実行するためにemscripten_proxy_async
を呼び出し、関数が正常にエンキューされた場合はtrue
を、それ以外の場合はfalse
を返します。
proxySync
(const pthread_t target, const std::function<void()> &func)¶func
を実行するためにemscripten_proxy_sync
を呼び出し、関数が正常に完了した場合はtrue
を、それ以外の場合はfalse
を返します。
proxySyncWithCtx
(const pthread_t target, const std::function<void(ProxyingCtx)> &func)¶func
を実行するためにemscripten_proxy_sync_with_ctx
を呼び出し、関数がemscripten_proxy_finish
またはProxyingCtx::finish
で正常に完了したとマークされた場合はtrue
を、それ以外の場合はfalse
を返します。
proxyCallback
(pthread_t target, std::function<void()> &&funcstd::function<void()> &&callbackstd::function<void()> &&cancel)¶func
を実行し、callback
またはcancel
のいずれかをスケジュールするためにemscripten_proxy_callback
を呼び出し、関数が正常にエンキューされた場合はtrue
を、それ以外の場合はfalse
を返します。
proxyCallbackWithCtx
(pthread_t target, std::function<void(ProxyingCtx)> &&func, std::function<void()> &&callbackstd::function<void()> &&cancel)¶func
を実行し、callback
またはcancel
のいずれかをスケジュールするためにemscripten_proxy_callback_with_ctx
を呼び出し、関数が正常にエンキューされた場合はtrue
を、それ以外の場合はfalse
を返します。