[Ttssh2-commit] [6489] チケット #36655 ログファイルオープンエラー

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



Ttssh2-commit メーリングリストの案内