From 1b3575ba772124d2e7a8173a5d35dc9d2d271a8a Mon Sep 17 00:00:00 2001 From: jackpoz Date: Thu, 12 Sep 2013 22:54:05 +0200 Subject: Core/Logs: Fix race condition in Log Fix race condition in Log by using atomic operators. Helgrind log: Possible data race during read of size 8 at 0x7379D98 by thread #1 Locks held: none at 0x15AE9C7: AppenderFile::_write(LogMessage const&) (AppenderFile.cpp:59) by 0x15ADFF8: Appender::write(LogMessage&) (Appender.cpp:106) by 0x159F14E: Logger::write(LogMessage&) (Logger.cpp:83) by 0x15A215B: Log::write(LogMessage*) (Log.cpp:290) by 0x15A200F: Log::vlog(LogFilterType, LogLevel, char const*, __va_list_tag*) (Log.cpp:272) by 0x15A2682: Log::outInfo(LogFilterType, char const*, ...) (Log.cpp:364) by 0xF7DA28: Master::Run() (Master.cpp:296) by 0xF835E8: main (Main.cpp:142) This conflicts with a previous write of size 8 by thread #10 Locks held: none at 0x15AE9D7: AppenderFile::_write(LogMessage const&) (AppenderFile.cpp:59) by 0x15ADFF8: Appender::write(LogMessage&) (Appender.cpp:106) by 0x159F14E: Logger::write(LogMessage&) (Logger.cpp:83) by 0x15A215B: Log::write(LogMessage*) (Log.cpp:290) by 0x15A200F: Log::vlog(LogFilterType, LogLevel, char const*, __va_list_tag*) (Log.cpp:272) by 0x15A2682: Log::outInfo(LogFilterType, char const*, ...) (Log.cpp:364) by 0xF7EC1F: FreezeDetectorRunnable::run() (Master.cpp:98) by 0x15A5B3E: ACE_Based::Thread::ThreadTask(void*) (Threading.cpp:186) Address 0x7379D98 is 88 bytes inside a block of size 96 alloc'd at 0x4C2C857: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) by 0x15A0FE3: Log::CreateAppenderFromConfig(char const*) (Log.cpp:150) by 0x15A1AED: Log::ReadAppendersFromConfig() (Log.cpp:244) by 0x15A31B4: Log::LoadFromConfig() (Log.cpp:469) by 0x15A053B: Log::Log() (Log.cpp:35) by 0xF75CD1: ACE_Singleton::ACE_Singleton() (Singleton.inl:13) by 0xF754A4: ACE_Singleton::instance() (Singleton.cpp:91) by 0xF8351A: main (Main.cpp:135) --- src/server/shared/Logging/AppenderFile.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/server/shared/Logging/AppenderFile.cpp') diff --git a/src/server/shared/Logging/AppenderFile.cpp b/src/server/shared/Logging/AppenderFile.cpp index 93d53bcc30d..54458346bb9 100644 --- a/src/server/shared/Logging/AppenderFile.cpp +++ b/src/server/shared/Logging/AppenderFile.cpp @@ -40,7 +40,7 @@ AppenderFile::~AppenderFile() void AppenderFile::_write(LogMessage const& message) { - bool exceedMaxSize = maxFileSize > 0 && (fileSize + message.Size()) > maxFileSize; + bool exceedMaxSize = maxFileSize > 0 && (fileSize.value() + message.Size()) > maxFileSize; if (dynamicName) { @@ -56,7 +56,7 @@ void AppenderFile::_write(LogMessage const& message) fprintf(logfile, "%s%s", message.prefix.c_str(), message.text.c_str()); fflush(logfile); - fileSize += message.Size(); + fileSize += uint64(message.Size()); if (dynamicName) CloseFile(); -- cgit v1.2.3