NaCl tips; glibc使用で.nmfから複数ファイルをロードする様な場合のプログレスイベントの発生について
先の記事の様にnewlib→glibcにして.nmfから複数ファイルをロードする様になったなら、プログレスイベントの発生がnewlibと単一ファイルだった頃では想定外の状況が発生した。
問題
newlib仕様で単一の.nexeをロードすれば良いだけの場合ならば次の様にロードの進捗をイベントで通知される:
on_loadstart
→on_progress × N回(N>=0) ※
→on_load
→on_loadend
glibc仕様でもこの点は同じなのだけど、※を付けた部分の挙動がそのままユーザーに提示したのではどこの不自由なOSのファイルコピーダイアログですか状態になってしまう。.nmfに記述された1つ1つのファイルそれぞれからプログレスイベントが発生するので、これを愚直に表示してしまったなら:
0 [%]
→ 64.78 [%]
→ 100.0 [%]
→ 32.74 [%]
→ 65.11 [%]
→ 92.45 [%]
→ 42.43 [%]
→ 85.09 [%]
とかこんな具合になる。これじゃユーザー大混乱。
解決方法について考えるが…
NaClモジュールがJavaScriptに発行するProgressEventオブジェクトにはurlというプロパティがあるので、これでどうにかする。
読み込まなければならない.so、.nexeは.nmfから得られる。並行して読み込まれないという保証は無いので、数だけチェックせずに、urlをキー、進捗を値としたプログレス管理オブジェクトを:
{ url1: 0.0, url2: 0.0, url3: 0.0, }
とかそんな感じで先に用意しておいて、プログレスイベントを受け取ったならurlを見て値を更新。トータルは総量(bytes)に対する読み込み済みの割合を表示すれば良いかな、と思ったのだけど…。.url毎に.loaded/.totalを記録してみると:
Labyrinthian_x86_64.nexe: 0 lib64/libc.so.32d9fc17: 0.9238467937759723 lib64/libgcc_s.so.1: 0 lib64/libm.so.32d9fc17: 0.3539516162787715 lib64/libppapi_cpp.so: 0.4090916184366719 lib64/libppapi_gles2.so: 0 lib64/libpthread.so.32d9fc17: 0.7327397612543278 lib64/libstdc++.so.6: 0.933980544208302 lib64/runnable-ld.so: 1
on_loadend発行時点でこんな状態になってしまった。embedより先に.nmfをパースしておく必要があるとかそういう事ではなくて、NaClモジュールのプログレスイベントが「0回以上てけとーに」呼ばれる仕様による。各ファイルについて個別に読み込み終えたかどうかは分からない。これはくまった。
仕方がないので、暫定的にプログレスはさておいてon_loadstart/on_loadendのみ見て、その間はなうろーでぃんぐっぽく1文字でぐるぐる表示(- \ | /)するだけにしておく事に。はてさて。