Develop and Download Open Source Software

Browse Subversion Repository

Diff of /trunk/teraterm/teraterm/filesys_log.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 5189 by maya, Thu Apr 4 04:01:46 2013 UTC revision 5206 by yutakapon, Fri Apr 19 15:31:54 2013 UTC
# Line 23  Line 23 
23  #include "ftlib.h"  #include "ftlib.h"
24    
25  #include <io.h>  #include <io.h>
26    #include <process.h>
27    
28  #define FS_BRACKET_NONE  0  #define FS_BRACKET_NONE  0
29  #define FS_BRACKET_START 1  #define FS_BRACKET_START 1
# Line 88  enum enumLineEnd { Line 89  enum enumLineEnd {
89    
90  enum enumLineEnd eLineEnd = Line_LineHead;  enum enumLineEnd eLineEnd = Line_LineHead;
91    
92    
93    // 遅延書き込み用スレッドのメッセージ
94    #define WM_DPC_LOGTHREAD_SEND (WM_APP + 1)
95    
96    static void CloseFileSync(PFileVar ptr);
97    
98    
99  BOOL LoadTTFILE()  BOOL LoadTTFILE()
100  {  {
101          BOOL Err;          BOOL Err;
# Line 290  void FreeFileVar(PFileVar *fv) Line 298  void FreeFileVar(PFileVar *fv)
298  {  {
299          if ((*fv)!=NULL)          if ((*fv)!=NULL)
300          {          {
301                  if ((*fv)->FileOpen) _lclose((*fv)->FileHandle);                  CloseFileSync(*fv);
302                    //if ((*fv)->FileOpen) _lclose((*fv)->FileHandle);
303                  if ((*fv)->FnStrMemHandle>0)                  if ((*fv)->FnStrMemHandle>0)
304                  {                  {
305                          GlobalUnlock((*fv)->FnStrMemHandle);                          GlobalUnlock((*fv)->FnStrMemHandle);
# Line 362  void FixLogOption() Line 371  void FixLogOption()
371          }          }
372  }  }
373    
374    
375    // スレッドの終了とファイルのクローズ
376    static void CloseFileSync(PFileVar ptr)
377    {
378            if (!ptr->FileOpen)
379                    return;
380    
381            if (ptr->LogThread != (HANDLE)-1) {
382                    // スレッドの終了待ち
383                    PostThreadMessage(ptr->LogThreadId, WM_QUIT, 0, 0);
384                    WaitForSingleObject(ptr->LogThread, INFINITE);
385                    CloseHandle(ptr->LogThread);
386                    ptr->LogThread = (HANDLE)-1;
387            }
388            _lclose(ptr->FileHandle);
389    }
390    
391    // 遅延書き込み用スレッド
392    static unsigned _stdcall DeferredLogWriteThread(void *arg)
393    {
394            MSG msg;
395            PFileVar fv = (PFileVar)arg;
396            PCHAR buf;
397            DWORD buflen;
398    
399            PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
400    
401            while (GetMessage(&msg, NULL, 0, 0) > 0) {
402                    switch (msg.message) {
403                            case WM_DPC_LOGTHREAD_SEND:
404                                    buf = (PCHAR)msg.wParam;
405                                    buflen = (DWORD)msg.lParam;
406                                    _lwrite(fv->FileHandle, buf, buflen );
407                                    free(buf);   // ここでメモリ解放
408                                    break;
409    
410                            case WM_QUIT:
411                                    goto end;
412                                    break;
413                    }
414            }
415    
416    end:
417            _endthreadex(0);
418            return (0);
419    }
420    
421    
422  extern "C" {  extern "C" {
423  BOOL LogStart()  BOOL LogStart()
424  {  {
425          LONG Option;          LONG Option;
426          char *logdir;          char *logdir;
427            unsigned tid;
428    
429          if ((FileLog) || (BinLog)) return FALSE;          if ((FileLog) || (BinLog)) return FALSE;
430    
# Line 542  BOOL LogStart() Line 600  BOOL LogStart()
600                  return FALSE;                  return FALSE;
601          }          }
602    
603            // 遅延書き込み用スレッドを起こす。
604            // (2013.4.19 yutaka)
605            LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid);
606            LogVar->LogThreadId = tid;
607    
608          return TRUE;          return TRUE;
609  }  }
610  }  }
# Line 663  static void LogRotate(void) Line 726  static void LogRotate(void)
726          char newfile[1024], oldfile[1024];          char newfile[1024], oldfile[1024];
727          int i, k;          int i, k;
728          int dwShareMode = FILE_SHARE_READ;          int dwShareMode = FILE_SHARE_READ;
729            unsigned tid;
730    
731          if (! LogVar->FileOpen) return;          if (! LogVar->FileOpen) return;
732    
# Line 682  static void LogRotate(void) Line 746  static void LogRotate(void)
746          LogVar->ByteCount = 0;          LogVar->ByteCount = 0;
747    
748          // いったん今のファイルをクローズして、別名のファイルをオープンする。          // いったん今のファイルをクローズして、別名のファイルをオープンする。
749          _lclose(LogVar->FileHandle);          CloseFileSync(LogVar);
750            //_lclose(LogVar->FileHandle);
751    
752          // 世代ローテーションのステップ数の指定があるか          // 世代ローテーションのステップ数の指定があるか
753          if (LogVar->RotateStep > 0)          if (LogVar->RotateStep > 0)
# Line 718  static void LogRotate(void) Line 783  static void LogRotate(void)
783          LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,          LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
784                                               CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);                                               CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
785    
786            // 遅延書き込み用スレッドを起こす。
787            // (2013.4.19 yutaka)
788            LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid);
789            LogVar->LogThreadId = tid;
790    
791          logfile_unlock();          logfile_unlock();
792    
793  }  }
# Line 727  void LogToFile() Line 797  void LogToFile()
797          PCHAR Buf;          PCHAR Buf;
798          int Start, Count;          int Start, Count;
799          BYTE b;          BYTE b;
800            PCHAR WriteBuf;
801            DWORD WriteBufMax, WriteBufLen;
802            CHAR tmp[128];
803    
804          if (! LogVar->FileOpen) return;          if (! LogVar->FileOpen) return;
805          if (FileLog)          if (FileLog)
# Line 750  void LogToFile() Line 823  void LogToFile()
823          // ロックを取る(2004.8.6 yutaka)          // ロックを取る(2004.8.6 yutaka)
824          logfile_lock();          logfile_lock();
825    
826          while (Get1(Buf,&Start,&Count,&b))          if (ts.DeferredLogWriteMode) {
827          {                  WriteBufMax = 8192;
828                  if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))                  WriteBufLen = 0;
829                  {                  WriteBuf = (PCHAR)malloc(WriteBufMax);
830                          // 時刻を書き出す(2006.7.23 maya)                  while (Get1(Buf,&Start,&Count,&b)) {
831                          // 日付フォーマットを日本ではなく世界標準に変更した (2006.7.23 yutaka)                          if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))
832                          /* 2007.05.24 Gentaro */                          {
833                          // ミリ秒も表示するように変更 (2009.5.23 maya)                                  tmp[0] = 0;
834                          if ( ts.LogTimestamp && eLineEnd ) {                                  if ( ts.LogTimestamp && eLineEnd ) {
835  #if 1                                          char *strtime = mctimelocal();
836  #if 0                                          /* 2007.05.24 Gentaro */
837                                  SYSTEMTIME      LocalTime;                                          if( eLineEnd == Line_FileHead ){
838                                  GetLocalTime(&LocalTime);                                                  strncat_s(tmp, sizeof(tmp), "\r\n", _TRUNCATE);
839                                  char strtime[27];                                          }
840                                            strncat_s(tmp, sizeof(tmp), "[", _TRUNCATE);
841                                  // format time                                          strncat_s(tmp, sizeof(tmp), strtime, _TRUNCATE);
842                                  sprintf(strtime, "[%04d/%02d/%02d %02d:%02d:%02d.%03d] ",                                          strncat_s(tmp, sizeof(tmp), "] ", _TRUNCATE);
843                                                  LocalTime.wYear, LocalTime.wMonth,LocalTime.wDay,                                  }
844                                                  LocalTime.wHour, LocalTime.wMinute, LocalTime.wSecond,                                  
                                                 LocalTime.wMilliseconds);  
 #else  
                                 char *strtime = mctimelocal();  
 #endif  
 #else  
                                         time_t tick = time(NULL);  
                                         char *strtime = ctime(&tick);  
 #endif  
845                                  /* 2007.05.24 Gentaro */                                  /* 2007.05.24 Gentaro */
846                                  if( eLineEnd == Line_FileHead ){                                  if( b == 0x0a ){
847                                          _lwrite(LogVar->FileHandle,"\r\n",2);                                          eLineEnd = Line_LineHead; /* set endmark*/
848                                  }                                  }
849                                  _lwrite(LogVar->FileHandle,"[",1);                                  else {
850                                  _lwrite(LogVar->FileHandle, strtime, strlen(strtime));                                          eLineEnd = Line_Other; /* clear endmark*/
851                                  _lwrite(LogVar->FileHandle,"] ",2);                                  }
852                          }  
853                                                            if (WriteBufLen >= (WriteBufMax*4/5)) {
854                          /* 2007.05.24 Gentaro */                                          WriteBufMax *= 2;
855                          if( b == 0x0a ){                                          WriteBuf = (PCHAR)realloc(WriteBuf, WriteBufMax);
856                                  eLineEnd = Line_LineHead; /* set endmark*/                                  }
857                          }                                  memcpy(&WriteBuf[WriteBufLen], tmp, strlen(tmp));
858                          else {                                  WriteBufLen += strlen(tmp);
859                                  eLineEnd = Line_Other; /* clear endmark*/                                  WriteBuf[WriteBufLen++] = b;
860    
861                                    (LogVar->ByteCount)++;
862                          }                          }
863                    }
864    
865                    PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)WriteBuf, WriteBufLen);
866    
867            } else {
868    
869                          _lwrite(LogVar->FileHandle,(PCHAR)&b,1);                  while (Get1(Buf,&Start,&Count,&b))
870                          (LogVar->ByteCount)++;                  {
871                            if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))
872                            {
873                                    // 時刻を書き出す(2006.7.23 maya)
874                                    // 日付フォーマットを日本ではなく世界標準に変更した (2006.7.23 yutaka)
875                                    /* 2007.05.24 Gentaro */
876                                    // ミリ秒も表示するように変更 (2009.5.23 maya)
877                                    if ( ts.LogTimestamp && eLineEnd ) {
878            #if 1
879            #if 0
880                                            SYSTEMTIME      LocalTime;
881                                            GetLocalTime(&LocalTime);
882                                            char strtime[27];
883    
884                                            // format time
885                                            sprintf(strtime, "[%04d/%02d/%02d %02d:%02d:%02d.%03d] ",
886                                                            LocalTime.wYear, LocalTime.wMonth,LocalTime.wDay,
887                                                            LocalTime.wHour, LocalTime.wMinute, LocalTime.wSecond,
888                                                            LocalTime.wMilliseconds);
889            #else
890                                            char *strtime = mctimelocal();
891            #endif
892            #else
893                                                    time_t tick = time(NULL);
894                                                    char *strtime = ctime(&tick);
895            #endif
896                                            /* 2007.05.24 Gentaro */
897                                            if( eLineEnd == Line_FileHead ){
898                                                    _lwrite(LogVar->FileHandle,"\r\n",2);
899                                            }
900                                            _lwrite(LogVar->FileHandle,"[",1);
901                                            _lwrite(LogVar->FileHandle, strtime, strlen(strtime));
902                                            _lwrite(LogVar->FileHandle,"] ",2);
903                                    }
904                                    
905                                    /* 2007.05.24 Gentaro */
906                                    if( b == 0x0a ){
907                                            eLineEnd = Line_LineHead; /* set endmark*/
908                                    }
909                                    else {
910                                            eLineEnd = Line_Other; /* clear endmark*/
911                                    }
912    
913                                    _lwrite(LogVar->FileHandle,(PCHAR)&b,1);
914                                    (LogVar->ByteCount)++;
915                            }
916                  }                  }
917    
918          }          }
919    
920          logfile_unlock();          logfile_unlock();

Legend:
Removed from v.5189  
changed lines
  Added in v.5206

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26