お世話になっております。
レアケースではあるのですが、
フォントの読み込み(非同期)中に破棄(同期)が行われた際にハングするようです。
確認した所、
static int SubHandleBase( HANDLEMANAGE *HandleManage, HANDLEINFO *HandleInfo )
の
#ifndef DX_NON_ASYNCLOAD
#endif
で囲まれた部分(DxHandle.cpp 292周辺)なのですが、
// クリティカルセクションの解放
CriticalSection_Unlock( &HandleManage->CriticalSection ) ;
でカウンタをデクリメントしていると思うのですが、
呼び出し元の
extern int SubHandle( int Handle, int ASyncLoadFlag, int ASyncThread )
でもロックが行われている為、実際にはロックされたままになっているようです。
その結果、他スレッドのフォント生成処理が止まったままになる事でwhileのループから抜けられない、という状況のようです。
一先ず手元で呼び出し元の
> {
> // 非同期実行希望や別スレッドからの呼び出しではない場合は即座に削除
> if( SubHandleBase( HandleManage, HandleInfo ) < 0 )
> {
> // クリティカルセクションの解放
> CriticalSection_Unlock( &HandleManage->CriticalSection ) ;
>
> return -1 ;
> }
> }
を、
> {
> // クリティカルセクションの解放 ←※追加
> CriticalSection_Unlock( &HandleManage->CriticalSection ) ;
> // 非同期実行希望や別スレッドからの呼び出しではない場合は即座に削除
> if( SubHandleBase( HandleManage, HandleInfo ) < 0 )
> {
>// // クリティカルセクションの解放 ←※コメントアウト
>// CriticalSection_Unlock( &HandleManage->CriticalSection ) ;
>
> return -1 ;
> }
> // クリティカルセクションの取得 ←※追加
> CRITICALSECTION_LOCK( &HandleManage->CriticalSection ) ;
> }
とする事で解消されることを確認しております。
(基本的にASyncLoadCountが0かのチェック、もしくはUnlockしてから呼ぶようにされているので恐らくここの修正だけで大丈夫だとは思うのですが・・・・。)
ご確認よろしくお願いいたしますm(_ _)m