| 390 |
// スレッドの終了とファイルのクローズ |
// スレッドの終了とファイルのクローズ |
| 391 |
static void CloseFileSync(PFileVar ptr) |
static void CloseFileSync(PFileVar ptr) |
| 392 |
{ |
{ |
| 393 |
|
BOOL ret; |
| 394 |
|
DWORD code; |
| 395 |
|
|
| 396 |
if (!ptr->FileOpen) |
if (!ptr->FileOpen) |
| 397 |
return; |
return; |
| 398 |
|
|
| 399 |
if (ptr->LogThread != (HANDLE)-1) { |
if (ptr->LogThread != (HANDLE)-1) { |
| 400 |
// スレッドの終了待ち |
// スレッドの終了待ち |
| 401 |
PostThreadMessage(ptr->LogThreadId, WM_QUIT, 0, 0); |
ret = PostThreadMessage(ptr->LogThreadId, WM_QUIT, 0, 0); |
| 402 |
WaitForSingleObject(ptr->LogThread, INFINITE); |
if (ret != 0) { |
| 403 |
|
// スレッドキューにエンキューできた場合のみ待ち合わせを行う。 |
| 404 |
|
WaitForSingleObject(ptr->LogThread, INFINITE); |
| 405 |
|
} |
| 406 |
|
else { |
| 407 |
|
code = GetLastError(); |
| 408 |
|
} |
| 409 |
CloseHandle(ptr->LogThread); |
CloseHandle(ptr->LogThread); |
| 410 |
ptr->LogThread = (HANDLE)-1; |
ptr->LogThread = (HANDLE)-1; |
| 411 |
} |
} |
| 427 |
|
|
| 428 |
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); |
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); |
| 429 |
|
|
| 430 |
|
// スレッドキューの作成が終わったことをスレッド生成元へ通知する。 |
| 431 |
|
if (fv->LogThreadEvent != NULL) { |
| 432 |
|
SetEvent(fv->LogThreadEvent); |
| 433 |
|
} |
| 434 |
|
|
| 435 |
while (GetMessage(&msg, NULL, 0, 0) > 0) { |
while (GetMessage(&msg, NULL, 0, 0) > 0) { |
| 436 |
switch (msg.message) { |
switch (msg.message) { |
| 437 |
case WM_DPC_LOGTHREAD_SEND: |
case WM_DPC_LOGTHREAD_SEND: |
| 667 |
|
|
| 668 |
// 遅延書き込み用スレッドを起こす。 |
// 遅延書き込み用スレッドを起こす。 |
| 669 |
// (2013.4.19 yutaka) |
// (2013.4.19 yutaka) |
| 670 |
|
// DeferredLogWriteThread スレッドが起床して、スレッドキューが作成されるより前に、 |
| 671 |
|
// ログファイルのクローズ(CloseFileSync)が行われると、エンキューが失敗し、デッドロック |
| 672 |
|
// するという問題を修正した。 |
| 673 |
|
// スレッド間の同期を行うため、名前なしイベントオブジェクトを使って、スレッドキューの |
| 674 |
|
// 作成まで待ち合わせするようにした。名前付きイベントオブジェクトを使う場合は、 |
| 675 |
|
// システム(Windows OS)上でユニークな名前にする必要がある。 |
| 676 |
|
// (2016.9.23 yutaka) |
| 677 |
|
LogVar->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL); |
| 678 |
LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid); |
LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid); |
| 679 |
LogVar->LogThreadId = tid; |
LogVar->LogThreadId = tid; |
| 680 |
|
if (LogVar->LogThreadEvent != NULL) { |
| 681 |
|
WaitForSingleObject(LogVar->LogThreadEvent, INFINITE); |
| 682 |
|
CloseHandle(LogVar->LogThreadEvent); |
| 683 |
|
} |
| 684 |
|
|
| 685 |
// 現在バッファにあるデータをすべて書き出してから、 |
// 現在バッファにあるデータをすべて書き出してから、 |
| 686 |
// ログ採取を開始する。 |
// ログ採取を開始する。 |