C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

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文字でぐるぐる表示(- \ | /)するだけにしておく事に。はてさて。