From 4a5241032eb53bd526207831d16ab0af62e7d63a Mon Sep 17 00:00:00 2001 From: martin Date: Sat, 28 Apr 2018 09:54:03 +0000 Subject: [PATCH] LazLogger: Thread safety git-svn-id: trunk@57736 - --- components/lazutils/lazlogger.pas | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/components/lazutils/lazlogger.pas b/components/lazutils/lazlogger.pas index e37611f929..79faf177dc 100644 --- a/components/lazutils/lazlogger.pas +++ b/components/lazutils/lazlogger.pas @@ -43,6 +43,7 @@ type FLogText: Text; FLogTextInUse, FLogTextFailed: Boolean; FUseStdOut: Boolean; + FWriteToFileLock: TRTLCriticalSection; procedure DoOpenFile; procedure DoCloseFile; function GetWriteTarget: TLazLoggerWriteTarget; @@ -268,6 +269,7 @@ end; constructor TLazLoggerFileHandle.Create; begin + InitCriticalSection(FWriteToFileLock); FLogTextInUse := False; FLogTextFailed := False; {$ifdef WinCE} @@ -285,6 +287,7 @@ destructor TLazLoggerFileHandle.Destroy; begin inherited Destroy; DoCloseFile; + DoneCriticalsection(FWriteToFileLock); end; procedure TLazLoggerFileHandle.OpenFile; @@ -301,6 +304,8 @@ end; procedure TLazLoggerFileHandle.WriteToFile(const s: string); begin + EnterCriticalsection(FWriteToFileLock); + try DoOpenFile; if FActiveLogText = nil then exit; @@ -308,10 +313,15 @@ begin if FCloseLogFileBetweenWrites then DoCloseFile; + finally + LeaveCriticalsection(FWriteToFileLock); + end; end; procedure TLazLoggerFileHandle.WriteLnToFile(const s: string); begin + EnterCriticalsection(FWriteToFileLock); + try DoOpenFile; if FActiveLogText = nil then exit; @@ -319,6 +329,9 @@ begin if FCloseLogFileBetweenWrites then DoCloseFile; + finally + LeaveCriticalsection(FWriteToFileLock); + end; end; { TLazLoggerFile } @@ -817,6 +830,6 @@ end; initialization LazDebugLoggerCreator := @CreateDebugLogger; - RecreateDebugLogger + RecreateDebugLogger; end.