svnno****@sourc*****
svnno****@sourc*****
2013年 4月 20日 (土) 00:31:58 JST
Revision: 5206 http://sourceforge.jp/projects/ttssh2/scm/svn/commits/5206 Author: yutakapon Date: 2013-04-20 00:31:54 +0900 (Sat, 20 Apr 2013) Log Message: ----------- ログファイルの遅延書き込みをサポートした。 ネットワーク経由でのログ採取時、Tera Term自身がスローダウンする問題への改善。 チケット #25434 Ticket Links: ------------ http://sourceforge.jp/projects/ttssh2/tracker/detail/25434 Modified Paths: -------------- trunk/installer/release/TERATERM.INI trunk/teraterm/common/ttftypes.h trunk/teraterm/common/tttypes.h trunk/teraterm/teraterm/filesys.cpp trunk/teraterm/ttpset/ttset.c -------------- next part -------------- Modified: trunk/installer/release/TERATERM.INI =================================================================== --- trunk/installer/release/TERATERM.INI 2013-04-18 13:03:30 UTC (rev 5205) +++ trunk/installer/release/TERATERM.INI 2013-04-19 15:31:54 UTC (rev 5206) @@ -354,7 +354,10 @@ ; Step: 0(none), >=1(count times) LogRotateStep=0 +; Deferred Log Write Mode (on/off) +DeferredLogWriteMode=on + ; XMODEM option (checksum/crc/1k) XmodemOpt=checksum ; Binary flag for XMODEM Receive and ZMODEM Send (on/off) Modified: trunk/teraterm/common/ttftypes.h =================================================================== --- trunk/teraterm/common/ttftypes.h 2013-04-18 13:03:30 UTC (rev 5205) +++ trunk/teraterm/common/ttftypes.h 2013-04-19 15:31:54 UTC (rev 5206) @@ -111,6 +111,9 @@ LONG RotateSize; int RotateStep; + HANDLE LogThread; + DWORD LogThreadId; + } TFileVar; typedef TFileVar far *PFileVar; Modified: trunk/teraterm/common/tttypes.h =================================================================== --- trunk/teraterm/common/tttypes.h 2013-04-18 13:03:30 UTC (rev 5205) +++ trunk/teraterm/common/tttypes.h 2013-04-19 15:31:54 UTC (rev 5206) @@ -561,6 +561,7 @@ DWORD LogRotateSize; WORD LogRotateSizeType; WORD LogRotateStep; + WORD DeferredLogWriteMode; }; typedef struct tttset TTTSet, *PTTSet; @@ -1021,6 +1022,7 @@ * added tttset.LogRotateSize * added tttset.LogRotateSizeType * added tttset.LogRotateStep + * added tttset.DeferredLogWriteMode * * - At version 4.74, ttset_memfilemap was replaced with ttset_memfilemap_19. * added tttset.FontQuality Modified: trunk/teraterm/teraterm/filesys.cpp =================================================================== --- trunk/teraterm/teraterm/filesys.cpp 2013-04-18 13:03:30 UTC (rev 5205) +++ trunk/teraterm/teraterm/filesys.cpp 2013-04-19 15:31:54 UTC (rev 5206) @@ -23,6 +23,7 @@ #include "ftlib.h" #include <io.h> +#include <process.h> #define FS_BRACKET_NONE 0 #define FS_BRACKET_START 1 @@ -88,6 +89,13 @@ enum enumLineEnd eLineEnd = Line_LineHead; + +// \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h\x82̃\x81\x83b\x83Z\x81[\x83W +#define WM_DPC_LOGTHREAD_SEND (WM_APP + 1) + +static void CloseFileSync(PFileVar ptr); + + BOOL LoadTTFILE() { BOOL Err; @@ -290,7 +298,8 @@ { if ((*fv)!=NULL) { - if ((*fv)->FileOpen) _lclose((*fv)->FileHandle); + CloseFileSync(*fv); + //if ((*fv)->FileOpen) _lclose((*fv)->FileHandle); if ((*fv)->FnStrMemHandle>0) { GlobalUnlock((*fv)->FnStrMemHandle); @@ -362,11 +371,60 @@ } } + +// \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) +{ + 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); + CloseHandle(ptr->LogThread); + ptr->LogThread = (HANDLE)-1; + } + _lclose(ptr->FileHandle); +} + +// \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h +static unsigned _stdcall DeferredLogWriteThread(void *arg) +{ + MSG msg; + PFileVar fv = (PFileVar)arg; + PCHAR buf; + DWORD buflen; + + PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); + + while (GetMessage(&msg, NULL, 0, 0) > 0) { + switch (msg.message) { + case WM_DPC_LOGTHREAD_SEND: + buf = (PCHAR)msg.wParam; + buflen = (DWORD)msg.lParam; + _lwrite(fv->FileHandle, buf, buflen ); + free(buf); // \x82\xB1\x82\xB1\x82Ń\x81\x83\x82\x83\x8A\x89\xF0\x95\xFA + break; + + case WM_QUIT: + goto end; + break; + } + } + +end: + _endthreadex(0); + return (0); +} + + extern "C" { BOOL LogStart() { LONG Option; char *logdir; + unsigned tid; if ((FileLog) || (BinLog)) return FALSE; @@ -542,6 +600,11 @@ return FALSE; } + // \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) + LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid); + LogVar->LogThreadId = tid; + return TRUE; } } @@ -663,6 +726,7 @@ char newfile[1024], oldfile[1024]; int i, k; int dwShareMode = FILE_SHARE_READ; + unsigned tid; if (! LogVar->FileOpen) return; @@ -682,7 +746,8 @@ LogVar->ByteCount = 0; // \x82\xA2\x82\xC1\x82\xBD\x82̃t\x83@\x83C\x83\x8B\x82\xF0\x83N\x83\x8D\x81[\x83Y\x82\xB5\x82āA\x95ʖ\xBC\x82̃t\x83@\x83C\x83\x8B\x82\xF0\x83I\x81[\x83v\x83\x93\x82\xB7\x82\xE9\x81B - _lclose(LogVar->FileHandle); + CloseFileSync(LogVar); + //_lclose(LogVar->FileHandle); // \x90\xA2\x91ネ\x81[\x83e\x81[\x83V\x83\x87\x83\x93\x82̃X\x83e\x83b\x83v\x90\x94\x82̎w\x92肪\x82\xA0\x82邩 if (LogVar->RotateStep > 0) @@ -718,6 +783,11 @@ LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + // \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) + LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid); + LogVar->LogThreadId = tid; + logfile_unlock(); } @@ -727,6 +797,9 @@ PCHAR Buf; int Start, Count; BYTE b; + PCHAR WriteBuf; + DWORD WriteBufMax, WriteBufLen; + CHAR tmp[128]; if (! LogVar->FileOpen) return; if (FileLog) @@ -750,53 +823,98 @@ // \x83\x8D\x83b\x83N\x82\xF0\x8E\xE6\x82\xE9(2004.8.6 yutaka) logfile_lock(); - while (Get1(Buf,&Start,&Count,&b)) - { - if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag)) + if (ts.DeferredLogWriteMode) { + WriteBufMax = 8192; + WriteBufLen = 0; + WriteBuf = (PCHAR)malloc(WriteBufMax); + while (Get1(Buf,&Start,&Count,&b)) { + if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag)) + { + tmp[0] = 0; + if ( ts.LogTimestamp && eLineEnd ) { + char *strtime = mctimelocal(); + /* 2007.05.24 Gentaro */ + if( eLineEnd == Line_FileHead ){ + strncat_s(tmp, sizeof(tmp), "\r\n", _TRUNCATE); + } + strncat_s(tmp, sizeof(tmp), "[", _TRUNCATE); + strncat_s(tmp, sizeof(tmp), strtime, _TRUNCATE); + strncat_s(tmp, sizeof(tmp), "] ", _TRUNCATE); + } + + /* 2007.05.24 Gentaro */ + if( b == 0x0a ){ + eLineEnd = Line_LineHead; /* set endmark*/ + } + else { + eLineEnd = Line_Other; /* clear endmark*/ + } + + if (WriteBufLen >= (WriteBufMax*4/5)) { + WriteBufMax *= 2; + WriteBuf = (PCHAR)realloc(WriteBuf, WriteBufMax); + } + memcpy(&WriteBuf[WriteBufLen], tmp, strlen(tmp)); + WriteBufLen += strlen(tmp); + WriteBuf[WriteBufLen++] = b; + + (LogVar->ByteCount)++; + } + } + + PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)WriteBuf, WriteBufLen); + + } else { + + while (Get1(Buf,&Start,&Count,&b)) { - // \x8E\x9E\x8D\x8F\x82\xF0\x8F\x91\x82\xAB\x8Fo\x82\xB7(2006.7.23 maya) - // \x93\xFA\x95t\x83t\x83H\x81[\x83}\x83b\x83g\x82\xF0\x93\xFA\x96{\x82ł͂Ȃ\xAD\x90\xA2\x8AE\x95W\x8F\x80\x82ɕύX\x82\xB5\x82\xBD (2006.7.23 yutaka) - /* 2007.05.24 Gentaro */ - // \x83~\x83\x8A\x95b\x82\xE0\x95\\x8E\xA6\x82\xB7\x82\xE9\x82悤\x82ɕύX (2009.5.23 maya) - if ( ts.LogTimestamp && eLineEnd ) { -#if 1 -#if 0 - SYSTEMTIME LocalTime; - GetLocalTime(&LocalTime); - char strtime[27]; + if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag)) + { + // \x8E\x9E\x8D\x8F\x82\xF0\x8F\x91\x82\xAB\x8Fo\x82\xB7(2006.7.23 maya) + // \x93\xFA\x95t\x83t\x83H\x81[\x83}\x83b\x83g\x82\xF0\x93\xFA\x96{\x82ł͂Ȃ\xAD\x90\xA2\x8AE\x95W\x8F\x80\x82ɕύX\x82\xB5\x82\xBD (2006.7.23 yutaka) + /* 2007.05.24 Gentaro */ + // \x83~\x83\x8A\x95b\x82\xE0\x95\\x8E\xA6\x82\xB7\x82\xE9\x82悤\x82ɕύX (2009.5.23 maya) + if ( ts.LogTimestamp && eLineEnd ) { + #if 1 + #if 0 + SYSTEMTIME LocalTime; + GetLocalTime(&LocalTime); + char strtime[27]; - // format time - sprintf(strtime, "[%04d/%02d/%02d %02d:%02d:%02d.%03d] ", - LocalTime.wYear, LocalTime.wMonth,LocalTime.wDay, - LocalTime.wHour, LocalTime.wMinute, LocalTime.wSecond, - LocalTime.wMilliseconds); -#else - char *strtime = mctimelocal(); -#endif -#else - time_t tick = time(NULL); - char *strtime = ctime(&tick); -#endif + // format time + sprintf(strtime, "[%04d/%02d/%02d %02d:%02d:%02d.%03d] ", + LocalTime.wYear, LocalTime.wMonth,LocalTime.wDay, + LocalTime.wHour, LocalTime.wMinute, LocalTime.wSecond, + LocalTime.wMilliseconds); + #else + char *strtime = mctimelocal(); + #endif + #else + time_t tick = time(NULL); + char *strtime = ctime(&tick); + #endif + /* 2007.05.24 Gentaro */ + if( eLineEnd == Line_FileHead ){ + _lwrite(LogVar->FileHandle,"\r\n",2); + } + _lwrite(LogVar->FileHandle,"[",1); + _lwrite(LogVar->FileHandle, strtime, strlen(strtime)); + _lwrite(LogVar->FileHandle,"] ",2); + } + /* 2007.05.24 Gentaro */ - if( eLineEnd == Line_FileHead ){ - _lwrite(LogVar->FileHandle,"\r\n",2); + if( b == 0x0a ){ + eLineEnd = Line_LineHead; /* set endmark*/ } - _lwrite(LogVar->FileHandle,"[",1); - _lwrite(LogVar->FileHandle, strtime, strlen(strtime)); - _lwrite(LogVar->FileHandle,"] ",2); + else { + eLineEnd = Line_Other; /* clear endmark*/ + } + + _lwrite(LogVar->FileHandle,(PCHAR)&b,1); + (LogVar->ByteCount)++; } - - /* 2007.05.24 Gentaro */ - if( b == 0x0a ){ - eLineEnd = Line_LineHead; /* set endmark*/ - } - else { - eLineEnd = Line_Other; /* clear endmark*/ - } + } - _lwrite(LogVar->FileHandle,(PCHAR)&b,1); - (LogVar->ByteCount)++; - } } logfile_unlock(); Modified: trunk/teraterm/ttpset/ttset.c =================================================================== --- trunk/teraterm/ttpset/ttset.c 2013-04-18 13:03:30 UTC (rev 5205) +++ trunk/teraterm/ttpset/ttset.c 2013-04-19 15:31:54 UTC (rev 5206) @@ -781,7 +781,10 @@ ts->LogRotateSizeType = GetPrivateProfileInt(Section, "LogRotateSizeType", 0, FName); ts->LogRotateStep = GetPrivateProfileInt(Section, "LogRotateStep", 0, FName); + /* Deferred Log Write Mode (2013.4.20 yutaka) */ + ts->DeferredLogWriteMode = GetOnOff(Section, "DeferredLogWriteMode", FName, TRUE); + /* XMODEM option */ GetPrivateProfileString(Section, "XmodemOpt", "", Temp, sizeof(Temp), FName); @@ -2119,6 +2122,9 @@ WriteInt(Section, "LogRotateSizeType", FName, ts->LogRotateSizeType); WriteInt(Section, "LogRotateStep", FName, ts->LogRotateStep); + /* Deferred Log Write Mode (2013.4.20 yutaka) */ + WriteOnOff(Section, "DeferredLogWriteMode", FName, ts->DeferredLogWriteMode); + /* XMODEM option */ switch (ts->XmodemOpt) { case XoptCRC: