From 42c10268d2ca5394501961af5c6d5c78a4922c07 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 6 Mar 2014 09:49:39 +0100 Subject: [PATCH] Fixed thread-safety Fixed huge mistake in Clock code (Allocating a mutex everytime instead of locking it) HashDigest and StringStream class are no longer thread-safe (That was stupid anyway) Former-commit-id: d07a6859df27eac2c5171e75720b3963b6a5fbbb --- include/Nazara/Core/Config.hpp | 2 -- include/Nazara/Core/Directory.hpp | 4 +-- include/Nazara/Core/DynLib.hpp | 4 +-- include/Nazara/Core/File.hpp | 4 +-- include/Nazara/Core/Log.hpp | 8 +++--- include/Nazara/Core/Resource.hpp | 4 +-- include/Nazara/Core/StringStream.hpp | 8 ------ src/Nazara/Core/Clock.cpp | 16 ++++++++---- src/Nazara/Core/Directory.cpp | 6 +++++ src/Nazara/Core/DynLib.cpp | 6 +++++ src/Nazara/Core/File.cpp | 6 +++++ src/Nazara/Core/Log.cpp | 10 ++++++-- src/Nazara/Core/Resource.cpp | 7 +++++ src/Nazara/Core/StringStream.cpp | 38 ---------------------------- 14 files changed, 56 insertions(+), 67 deletions(-) diff --git a/include/Nazara/Core/Config.hpp b/include/Nazara/Core/Config.hpp index ed419c7db..0f6c41984 100644 --- a/include/Nazara/Core/Config.hpp +++ b/include/Nazara/Core/Config.hpp @@ -61,10 +61,8 @@ #define NAZARA_THREADSAFETY_DIRECTORY 1 // NzDirectory #define NAZARA_THREADSAFETY_DYNLIB 1 // NzDynLib #define NAZARA_THREADSAFETY_FILE 1 // NzFile -#define NAZARA_THREADSAFETY_HASHDIGEST 0 // NzHashDigest #define NAZARA_THREADSAFETY_LOG 1 // NzLog #define NAZARA_THREADSAFETY_RESOURCE 1 // NzResource -#define NAZARA_THREADSAFETY_STRINGSTREAM 0 // NzStringStream // Le nombre de spinlocks à utiliser avec les critical sections de Windows (0 pour désactiver) #define NAZARA_CORE_WINDOWS_CS_SPINLOCKS 4096 diff --git a/include/Nazara/Core/Directory.hpp b/include/Nazara/Core/Directory.hpp index 0be483de7..21dd54dbe 100644 --- a/include/Nazara/Core/Directory.hpp +++ b/include/Nazara/Core/Directory.hpp @@ -20,9 +20,9 @@ #endif #if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_DIRECTORY -#include + #include #else -#include + #include #endif class NzDirectoryImpl; diff --git a/include/Nazara/Core/DynLib.hpp b/include/Nazara/Core/DynLib.hpp index 4d5415e28..12b89249f 100644 --- a/include/Nazara/Core/DynLib.hpp +++ b/include/Nazara/Core/DynLib.hpp @@ -22,9 +22,9 @@ #endif #if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_DYNLIB -#include + #include #else -#include + #include #endif using NzDynLibFunc = int (*)(); // Type "générique" de pointeur sur fonction diff --git a/include/Nazara/Core/File.hpp b/include/Nazara/Core/File.hpp index 60d2c873c..65c442b45 100644 --- a/include/Nazara/Core/File.hpp +++ b/include/Nazara/Core/File.hpp @@ -18,9 +18,9 @@ #include #if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_FILE -#include + #include #else -#include + #include #endif class NzFileImpl; diff --git a/include/Nazara/Core/Log.hpp b/include/Nazara/Core/Log.hpp index 5b30ba8df..0348d2c10 100644 --- a/include/Nazara/Core/Log.hpp +++ b/include/Nazara/Core/Log.hpp @@ -13,15 +13,15 @@ #include #if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_LOG -#include + #include #else -#include + #include #endif #ifdef NAZARA_DEBUG -#define NazaraDebug(txt) NazaraNotice(txt) + #define NazaraDebug(txt) NazaraNotice(txt) #else -#define NazaraDebug(txt) + #define NazaraDebug(txt) #endif #define NazaraLog NzLog::Instance() diff --git a/include/Nazara/Core/Resource.hpp b/include/Nazara/Core/Resource.hpp index 951f19fdd..5a96c3324 100644 --- a/include/Nazara/Core/Resource.hpp +++ b/include/Nazara/Core/Resource.hpp @@ -12,9 +12,9 @@ #include #if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_RESOURCE -#include + #include #else -#include + #include #endif class NzResourceListener; diff --git a/include/Nazara/Core/StringStream.hpp b/include/Nazara/Core/StringStream.hpp index 768bc0331..7807c9806 100644 --- a/include/Nazara/Core/StringStream.hpp +++ b/include/Nazara/Core/StringStream.hpp @@ -12,12 +12,6 @@ #include #include -#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_STRINGSTREAM -#include -#else -#include -#endif - class NAZARA_API NzStringStream { public: @@ -48,8 +42,6 @@ class NAZARA_API NzStringStream operator NzString() const; private: - NazaraMutexAttrib(m_mutex, mutable) - std::vector m_strings; unsigned int m_bufferSize; }; diff --git a/src/Nazara/Core/Clock.cpp b/src/Nazara/Core/Clock.cpp index 7c8d4bda3..2c2fa2db5 100644 --- a/src/Nazara/Core/Clock.cpp +++ b/src/Nazara/Core/Clock.cpp @@ -13,6 +13,12 @@ #error OS not handled #endif +#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_CLOCK + #include +#else + #include +#endif + #include namespace @@ -47,7 +53,7 @@ float NzClock::GetSeconds() const nzUInt64 NzClock::GetMicroseconds() const { - NazaraMutex(m_mutex); + NazaraLock(m_mutex); return m_elapsedTime + (NzGetMicroseconds()-m_refTime); } @@ -59,14 +65,14 @@ nzUInt64 NzClock::GetMilliseconds() const bool NzClock::IsPaused() const { - NazaraMutex(m_mutex); + NazaraLock(m_mutex); return m_paused; } void NzClock::Pause() { - NazaraMutex(m_mutex); + NazaraLock(m_mutex); if (!m_paused) { @@ -79,7 +85,7 @@ void NzClock::Pause() void NzClock::Restart() { - NazaraMutex(m_mutex); + NazaraLock(m_mutex); m_elapsedTime = 0; m_refTime = NzGetMicroseconds(); @@ -88,7 +94,7 @@ void NzClock::Restart() void NzClock::Unpause() { - NazaraMutex(m_mutex); + NazaraLock(m_mutex); if (m_paused) { diff --git a/src/Nazara/Core/Directory.cpp b/src/Nazara/Core/Directory.cpp index 21c862a11..2969e578c 100644 --- a/src/Nazara/Core/Directory.cpp +++ b/src/Nazara/Core/Directory.cpp @@ -16,6 +16,12 @@ #error OS not handled #endif +#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_DIRECTORY + #include +#else + #include +#endif + #include namespace diff --git a/src/Nazara/Core/DynLib.cpp b/src/Nazara/Core/DynLib.cpp index f8dc60c86..b819f1ef7 100644 --- a/src/Nazara/Core/DynLib.cpp +++ b/src/Nazara/Core/DynLib.cpp @@ -15,6 +15,12 @@ #error No implementation for this platform #endif +#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_DYNLIB + #include +#else + #include +#endif + #include NzDynLib::NzDynLib() : diff --git a/src/Nazara/Core/File.cpp b/src/Nazara/Core/File.cpp index 822fc310c..980e69377 100644 --- a/src/Nazara/Core/File.cpp +++ b/src/Nazara/Core/File.cpp @@ -19,6 +19,12 @@ #error OS not handled #endif +#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_FILE + #include +#else + #include +#endif + #include NzFile::NzFile() : diff --git a/src/Nazara/Core/Log.cpp b/src/Nazara/Core/Log.cpp index ccf0830f7..946548479 100644 --- a/src/Nazara/Core/Log.cpp +++ b/src/Nazara/Core/Log.cpp @@ -11,7 +11,13 @@ #include #if NAZARA_CORE_DUPLICATE_LOG_TO_COUT -#include + #include +#endif + +#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_LOG + #include +#else + #include #endif #include @@ -116,7 +122,7 @@ void NzLog::Write(const NzString& string) if (m_writeTime) { line.Reserve(23 + string.GetSize() + 1); - line.Resize(23); + line.Set(23, '\0'); // Buffer non-initialisé time_t currentTime = std::time(nullptr); std::strftime(&line[0], 24, "%d/%m/%Y - %H:%M:%S: ", std::localtime(¤tTime)); diff --git a/src/Nazara/Core/Resource.cpp b/src/Nazara/Core/Resource.cpp index 4b74bb81a..312a93de2 100644 --- a/src/Nazara/Core/Resource.cpp +++ b/src/Nazara/Core/Resource.cpp @@ -9,6 +9,13 @@ #include #include #include + +#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_RESOURCE + #include +#else + #include +#endif + #include NzResource::NzResource(bool persistent) : diff --git a/src/Nazara/Core/StringStream.cpp b/src/Nazara/Core/StringStream.cpp index d24666b69..a15196cac 100644 --- a/src/Nazara/Core/StringStream.cpp +++ b/src/Nazara/Core/StringStream.cpp @@ -18,8 +18,6 @@ m_bufferSize(str.GetSize()) NzString NzStringStream::ToString() const { - NazaraLock(m_mutex) - NzString string; string.Reserve(m_bufferSize); @@ -31,8 +29,6 @@ NzString NzStringStream::ToString() const NzStringStream& NzStringStream::operator<<(bool boolean) { - NazaraLock(m_mutex) - m_strings.push_back(NzString::Boolean(boolean)); m_bufferSize += m_strings.back().GetSize(); @@ -41,8 +37,6 @@ NzStringStream& NzStringStream::operator<<(bool boolean) NzStringStream& NzStringStream::operator<<(short number) { - NazaraLock(m_mutex) - m_strings.push_back(NzString::Number(number)); m_bufferSize += m_strings.back().GetSize(); @@ -51,8 +45,6 @@ NzStringStream& NzStringStream::operator<<(short number) NzStringStream& NzStringStream::operator<<(unsigned short number) { - NazaraLock(m_mutex) - m_strings.push_back(NzString::Number(number)); m_bufferSize += m_strings.back().GetSize(); @@ -61,8 +53,6 @@ NzStringStream& NzStringStream::operator<<(unsigned short number) NzStringStream& NzStringStream::operator<<(int number) { - NazaraLock(m_mutex) - m_strings.push_back(NzString::Number(number)); m_bufferSize += m_strings.back().GetSize(); @@ -71,8 +61,6 @@ NzStringStream& NzStringStream::operator<<(int number) NzStringStream& NzStringStream::operator<<(unsigned int number) { - NazaraLock(m_mutex) - m_strings.push_back(NzString::Number(number)); m_bufferSize += m_strings.back().GetSize(); @@ -81,8 +69,6 @@ NzStringStream& NzStringStream::operator<<(unsigned int number) NzStringStream& NzStringStream::operator<<(long number) { - NazaraLock(m_mutex) - m_strings.push_back(NzString::Number(number)); m_bufferSize += m_strings.back().GetSize(); @@ -91,8 +77,6 @@ NzStringStream& NzStringStream::operator<<(long number) NzStringStream& NzStringStream::operator<<(unsigned long number) { - NazaraLock(m_mutex) - m_strings.push_back(NzString::Number(number)); m_bufferSize += m_strings.back().GetSize(); @@ -101,8 +85,6 @@ NzStringStream& NzStringStream::operator<<(unsigned long number) NzStringStream& NzStringStream::operator<<(long long number) { - NazaraLock(m_mutex) - m_strings.push_back(NzString::Number(number)); m_bufferSize += m_strings.back().GetSize(); @@ -111,8 +93,6 @@ NzStringStream& NzStringStream::operator<<(long long number) NzStringStream& NzStringStream::operator<<(unsigned long long number) { - NazaraLock(m_mutex) - m_strings.push_back(NzString::Number(number)); m_bufferSize += m_strings.back().GetSize(); @@ -121,8 +101,6 @@ NzStringStream& NzStringStream::operator<<(unsigned long long number) NzStringStream& NzStringStream::operator<<(float number) { - NazaraLock(m_mutex) - m_strings.push_back(NzString::Number(number)); m_bufferSize += m_strings.back().GetSize(); @@ -131,8 +109,6 @@ NzStringStream& NzStringStream::operator<<(float number) NzStringStream& NzStringStream::operator<<(double number) { - NazaraLock(m_mutex) - m_strings.push_back(NzString::Number(number)); m_bufferSize += m_strings.back().GetSize(); @@ -141,8 +117,6 @@ NzStringStream& NzStringStream::operator<<(double number) NzStringStream& NzStringStream::operator<<(long double number) { - NazaraLock(m_mutex) - m_strings.push_back(NzString::Number(number)); m_bufferSize += m_strings.back().GetSize(); @@ -151,8 +125,6 @@ NzStringStream& NzStringStream::operator<<(long double number) NzStringStream& NzStringStream::operator<<(char character) { - NazaraLock(m_mutex) - m_strings.push_back(NzString(character)); m_bufferSize++; @@ -161,8 +133,6 @@ NzStringStream& NzStringStream::operator<<(char character) NzStringStream& NzStringStream::operator<<(unsigned char character) { - NazaraLock(m_mutex) - m_strings.push_back(NzString(static_cast(character))); m_bufferSize++; @@ -171,8 +141,6 @@ NzStringStream& NzStringStream::operator<<(unsigned char character) NzStringStream& NzStringStream::operator<<(const char* string) { - NazaraLock(m_mutex) - m_strings.push_back(string); m_bufferSize += m_strings.back().GetSize(); @@ -181,8 +149,6 @@ NzStringStream& NzStringStream::operator<<(const char* string) NzStringStream& NzStringStream::operator<<(const std::string& string) { - NazaraLock(m_mutex) - m_strings.push_back(string); m_bufferSize += string.size(); @@ -191,8 +157,6 @@ NzStringStream& NzStringStream::operator<<(const std::string& string) NzStringStream& NzStringStream::operator<<(const NzString& string) { - NazaraLock(m_mutex) - m_strings.push_back(string); m_bufferSize += string.GetSize(); @@ -201,8 +165,6 @@ NzStringStream& NzStringStream::operator<<(const NzString& string) NzStringStream& NzStringStream::operator<<(const void* ptr) { - NazaraLock(m_mutex) - m_strings.push_back(NzString::Pointer(ptr)); m_bufferSize += sizeof(void*)*2;