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 6488 by doda, Mon Jul 11 08:53:02 2016 UTC revision 6489 by yutakapon, Fri Sep 23 13:12:44 2016 UTC
# Line 390  void FixLogOption() Line 390  void FixLogOption()
390  // スレッドの終了とファイルのクローズ  // スレッドの終了とファイルのクローズ
391  static void CloseFileSync(PFileVar ptr)  static void CloseFileSync(PFileVar ptr)
392  {  {
393            BOOL ret;
394            DWORD code;
395    
396          if (!ptr->FileOpen)          if (!ptr->FileOpen)
397                  return;                  return;
398    
399          if (ptr->LogThread != (HANDLE)-1) {          if (ptr->LogThread != (HANDLE)-1) {
400                  // スレッドの終了待ち                  // スレッドの終了待ち
401                  PostThreadMessage(ptr->LogThreadId, WM_QUIT, 0, 0);                  ret = PostThreadMessage(ptr->LogThreadId, WM_QUIT, 0, 0);
402                  WaitForSingleObject(ptr->LogThread, INFINITE);                  if (ret != 0) {
403                            // スレッドキューにエンキューできた場合のみ待ち合わせを行う。
404                            WaitForSingleObject(ptr->LogThread, INFINITE);
405                    }
406                    else {
407                            code = GetLastError();
408                    }
409                  CloseHandle(ptr->LogThread);                  CloseHandle(ptr->LogThread);
410                  ptr->LogThread = (HANDLE)-1;                  ptr->LogThread = (HANDLE)-1;
411          }          }
# Line 418  static unsigned _stdcall DeferredLogWrit Line 427  static unsigned _stdcall DeferredLogWrit
427    
428          PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);          PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
429    
430            // スレッドキューの作成が終わったことをスレッド生成元へ通知する。
431            if (fv->LogThreadEvent != NULL) {
432                    SetEvent(fv->LogThreadEvent);
433            }
434    
435          while (GetMessage(&msg, NULL, 0, 0) > 0) {          while (GetMessage(&msg, NULL, 0, 0) > 0) {
436                  switch (msg.message) {                  switch (msg.message) {
437                          case WM_DPC_LOGTHREAD_SEND:                          case WM_DPC_LOGTHREAD_SEND:
# Line 653  BOOL LogStart() Line 667  BOOL LogStart()
667    
668          // 遅延書き込み用スレッドを起こす。          // 遅延書き込み用スレッドを起こす。
669          // (2013.4.19 yutaka)          // (2013.4.19 yutaka)
670            // DeferredLogWriteThread スレッドが起床して、スレッドキューが作成されるより前に、
671            // ログファイルのクローズ(CloseFileSync)が行われると、エンキューが失敗し、デッドロック
672            // するという問題を修正した。
673            // スレッド間の同期を行うため、名前なしイベントオブジェクトを使って、スレッドキューの
674            // 作成まで待ち合わせするようにした。名前付きイベントオブジェクトを使う場合は、
675            // システム(Windows OS)上でユニークな名前にする必要がある。
676            // (2016.9.23 yutaka)
677            LogVar->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
678          LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid);          LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid);
679          LogVar->LogThreadId = tid;          LogVar->LogThreadId = tid;
680            if (LogVar->LogThreadEvent != NULL) {
681                    WaitForSingleObject(LogVar->LogThreadEvent, INFINITE);
682                    CloseHandle(LogVar->LogThreadEvent);
683            }
684    
685          // 現在バッファにあるデータをすべて書き出してから、          // 現在バッファにあるデータをすべて書き出してから、
686          // ログ採取を開始する。          // ログ採取を開始する。

Legend:
Removed from v.6488  
changed lines
  Added in v.6489

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