| 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 |
| 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; |
| 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); |
| 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 |
|
|
| 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 |
} |
} |
| 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 |
|
|
| 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) |
| 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 |
} |
} |
| 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) |
| 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(); |