svnno****@sourc*****
svnno****@sourc*****
2016年 9月 23日 (金) 22:12:44 JST
Revision: 6489 http://sourceforge.jp/projects/ttssh2/scm/svn/commits/6489 Author: yutakapon Date: 2016-09-23 22:12:44 +0900 (Fri, 23 Sep 2016) Log Message: ----------- チケット #36655 ログファイルオープンエラー DeferredLogWriteMode=on の場合において、ログファイルのオープン後、 すぐにクローズを行うと、まれに Tera Term がデッドロックしてストールするという 問題を修正した。 Ticket Links: ------------ http://sourceforge.jp/projects/ttssh2/tracker/detail/36655 Modified Paths: -------------- trunk/teraterm/common/ttftypes.h trunk/teraterm/teraterm/filesys.cpp -------------- next part -------------- Modified: trunk/teraterm/common/ttftypes.h =================================================================== --- trunk/teraterm/common/ttftypes.h 2016-09-13 12:37:43 UTC (rev 6488) +++ trunk/teraterm/common/ttftypes.h 2016-09-23 13:12:44 UTC (rev 6489) @@ -115,6 +115,7 @@ DWORD LogThreadId; DWORD FileMtime; + HANDLE LogThreadEvent; } TFileVar; typedef TFileVar far *PFileVar; Modified: trunk/teraterm/teraterm/filesys.cpp =================================================================== --- trunk/teraterm/teraterm/filesys.cpp 2016-09-13 12:37:43 UTC (rev 6488) +++ trunk/teraterm/teraterm/filesys.cpp 2016-09-23 13:12:44 UTC (rev 6489) @@ -390,13 +390,22 @@ // \x83X\x83\x8C\x83b\x83h\x82̏I\x97\xB9\x82ƃt\x83@\x83C\x83\x8B\x82̃N\x83\x8D\x81[\x83Y static void CloseFileSync(PFileVar ptr) { + BOOL ret; + DWORD code; + if (!ptr->FileOpen) return; if (ptr->LogThread != (HANDLE)-1) { // \x83X\x83\x8C\x83b\x83h\x82̏I\x97\xB9\x91҂\xBF - PostThreadMessage(ptr->LogThreadId, WM_QUIT, 0, 0); - WaitForSingleObject(ptr->LogThread, INFINITE); + ret = PostThreadMessage(ptr->LogThreadId, WM_QUIT, 0, 0); + if (ret != 0) { + // \x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82ɃG\x83\x93\x83L\x83\x85\x81[\x82ł\xAB\x82\xBD\x8Fꍇ\x82̂ݑ҂\xBF\x8D\x87\x82킹\x82\xF0\x8Ds\x82\xA4\x81B + WaitForSingleObject(ptr->LogThread, INFINITE); + } + else { + code = GetLastError(); + } CloseHandle(ptr->LogThread); ptr->LogThread = (HANDLE)-1; } @@ -418,6 +427,11 @@ PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); + // \x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82̍쐬\x82\xAA\x8FI\x82\xED\x82\xC1\x82\xBD\x82\xB1\x82Ƃ\xF0\x83X\x83\x8C\x83b\x83h\x90\xB6\x90\xAC\x8C\xB3\x82֒ʒm\x82\xB7\x82\xE9\x81B + if (fv->LogThreadEvent != NULL) { + SetEvent(fv->LogThreadEvent); + } + while (GetMessage(&msg, NULL, 0, 0) > 0) { switch (msg.message) { case WM_DPC_LOGTHREAD_SEND: @@ -653,8 +667,20 @@ // \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h\x82\xF0\x8BN\x82\xB1\x82\xB7\x81B // (2013.4.19 yutaka) + // DeferredLogWriteThread \x83X\x83\x8C\x83b\x83h\x82\xAA\x8BN\x8F\xB0\x82\xB5\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xAA\x8D쐬\x82\xB3\x82\xEA\x82\xE9\x82\xE6\x82\xE8\x91O\x82ɁA + // \x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82̃N\x83\x8D\x81[\x83Y(CloseFileSync)\x82\xAA\x8Ds\x82\xED\x82\xEA\x82\xE9\x82ƁA\x83G\x83\x93\x83L\x83\x85\x81[\x82\xAA\x8E\xB8\x94s\x82\xB5\x81A\x83f\x83b\x83h\x83\x8D\x83b\x83N + // \x82\xB7\x82\xE9\x82Ƃ\xA2\x82\xA4\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B + // \x83X\x83\x8C\x83b\x83h\x8AԂ̓\xAF\x8A\xFA\x82\xF0\x8Ds\x82\xA4\x82\xBD\x82߁A\x96\xBC\x91O\x82Ȃ\xB5\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xC1\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xCC + // \x8D쐬\x82܂ő҂\xBF\x8D\x87\x82킹\x82\xB7\x82\xE9\x82悤\x82ɂ\xB5\x82\xBD\x81B\x96\xBC\x91O\x95t\x82\xAB\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xA4\x8Fꍇ\x82́A + // \x83V\x83X\x83e\x83\x80(Windows OS)\x8F\xE3\x82Ń\x86\x83j\x81[\x83N\x82Ȗ\xBC\x91O\x82ɂ\xB7\x82\xE9\x95K\x97v\x82\xAA\x82\xA0\x82\xE9\x81B + // (2016.9.23 yutaka) + LogVar->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL); LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid); LogVar->LogThreadId = tid; + if (LogVar->LogThreadEvent != NULL) { + WaitForSingleObject(LogVar->LogThreadEvent, INFINITE); + CloseHandle(LogVar->LogThreadEvent); + } // \x8C\xBB\x8D݃o\x83b\x83t\x83@\x82ɂ\xA0\x82\xE9\x83f\x81[\x83^\x82\xF0\x82\xB7\x82ׂď\x91\x82\xAB\x8Fo\x82\xB5\x82Ă\xA9\x82\xE7\x81A // \x83\x8D\x83O\x8D̎\xE6\x82\xF0\x8AJ\x8En\x82\xB7\x82\xE9\x81B