2016年7月20日水曜日

ScanSnap iX100 on Ubuntu Linux 16.04 (wine)その2

前回の結果、とりあえずScanSnap Managerをwineで起動するところまでは出来た。
でも、ものすごく読み取りが遅くて実用に耐えない。しかも3枚までしか取れない。
何が問題で遅くなっているのか見てみようと思った。

遅い原因を探す(DEBUGフラグ)


https://wiki.winehq.org/Debug_Channels
を参考にデバッグフラグをつけて動かしてみた。
 +relay,+snoop

OKなとき、↓のInitializeのCALLで色々やったあと、RETで戻ってくる。
808373:0038:CALL PfuSsImgCtl.SsICSRGBInitialize(<unknown, check return>) ret=060bc073
808395:0038:RET  PfuSsImgCtl.SsICSRGBInitialize(060f023c "ScanSnap iX100") retval=00000000 ret=060bc073

NGのとき、戻ってこない。
これは、以下で戻ってこないのが原因っぽい(SsICSRGBInitializeの中で呼んでいる)
003b:Call mscms.OpenColorProfileA(001c3c58,00000001,00000001,00000003) ret=037211bb

OKの場合は、以下のような感じで、
ReadFileしたあと、FreeHeapして戻ってくるだけ





2025424 0038:Call KERNEL32.ReadFile(00000294,0c522540,00000c48,0cf0ee18,00000000) ret=7c56bb29
2025425 0038:Ret  KERNEL32.ReadFile() retval=00000001 ret=7c56bb29
2025426 0038:Call ntdll.RtlFreeHeap(00110000,00000000,0c4f51c8) ret=7c56c102
2025427 0038:Ret  ntdll.RtlFreeHeap() retval=00000001 ret=7c56c102
2025428 0038:Ret  mscms.OpenColorProfileA() retval=00000002 ret=037211bb


なのだが、NGの時は、スレッド0038はしばらく止まったあと以下のような感じでタイムアウトになる。
ロックしたまま開放されないのが原因であって、処理が遅いわけじゃないようだ。



2443843 0039:Call KERNEL32.Sleep(00000014) ret=00d7d00e
2443844 err:ntdll:RtlpWaitForCriticalSection section 0x7c575640 "handle.c: mscms_handle_cs" wait timed out in thread 003b, blocked by 0038, retrying (60 sec)
2443845 0039:Ret  KERNEL32.Sleep() retval=00000000 ret=00d7d00e

遅い原因を探す(printfデバッグ)


wineの最新をgit pullしてきて、dlls/mscms/handle.cで
mscms_handle_csの操作している前後に以下のような感じでprintfを入れて見てみる。

243     printf("%s:%d\n", __FILE__, __LINE__);
244     EnterCriticalSection( &mscms_handle_cs );
245     printf("%s:%d\n", __FILE__, __LINE__);

見てみようとしたら、動くようになってしまった。
printfの有無で動きが変わるので、タイミング的な問題のようだ。
根本的には何にも解決してないが、動くので良しとする。
(追記:やっぱり動かない。何が影響したのかわからない。)

カスタムwineをplayonlinuxで使う


wineのprefixをplayonlinuxのバイナリ置き場にする。
./configure --prefix=/home/****/.PlayOnLinux/wine/linux-x86/1-custom

あとはmake && make install


その他


これを調べてる最中にScanSnap Cloudってのがあることを知った。
これだと、PCなくてもiX100だけでキャプチャできるので、
linuxで動かすためにそこまで苦労する必要無かったかも。

でも、PCを介さず自動なのでレシートとか名刺がバラバラにJPGにされたりする。
ある程度制御したい場合はPCで使えたほうが便利。
なのでLinuxで動かすことに意味がなかったわけではない。(強がり)

あとは電波感度が良ければいいんだが。

追記


追記1:
やっぱり動かない。何が影響したのかわからない。
ログからすると、以下の2つの処理が遅いようだ。
P2ICRPPR.P2iGetDocPosMulti
P2IERASECLRBDR.P2iEraseClrBdr


2862806 1942566.330:003a:CALL P2ICRPPR.P2iGetDocPosMulti(<unknown, check return>
) ret=034b2c0f
3082841 1942605.508:003a:RET  P2ICRPPR.P2iGetDocPosMulti(0dd2cc6c,0dd2cca0,00000
000,00000000,0dd2d150) retval=00000000 ret=034b2c0f

3130018 1942619.899:003a:CALL P2IERASECLRBDR.P2iEraseClrBdr(<unknown, check retu
rn>) ret=034b37e6
3398921 1942702.424:003a:RET  P2IERASECLRBDR.P2iEraseClrBdr(0dd2cca0,0dd2cd9c,00
000000) retval=00000000 ret=034b37e6

追記2:
どうも使うwineをバージョン上げたりして変更したらしばらく使えるような感じがある。


0 件のコメント:

コメントを投稿