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
This commit is contained in:
Lynix 2014-03-06 09:49:39 +01:00
parent ef9592a0fd
commit 42c10268d2
14 changed files with 56 additions and 67 deletions

View File

@ -61,10 +61,8 @@
#define NAZARA_THREADSAFETY_DIRECTORY 1 // NzDirectory #define NAZARA_THREADSAFETY_DIRECTORY 1 // NzDirectory
#define NAZARA_THREADSAFETY_DYNLIB 1 // NzDynLib #define NAZARA_THREADSAFETY_DYNLIB 1 // NzDynLib
#define NAZARA_THREADSAFETY_FILE 1 // NzFile #define NAZARA_THREADSAFETY_FILE 1 // NzFile
#define NAZARA_THREADSAFETY_HASHDIGEST 0 // NzHashDigest
#define NAZARA_THREADSAFETY_LOG 1 // NzLog #define NAZARA_THREADSAFETY_LOG 1 // NzLog
#define NAZARA_THREADSAFETY_RESOURCE 1 // NzResource #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) // Le nombre de spinlocks à utiliser avec les critical sections de Windows (0 pour désactiver)
#define NAZARA_CORE_WINDOWS_CS_SPINLOCKS 4096 #define NAZARA_CORE_WINDOWS_CS_SPINLOCKS 4096

View File

@ -20,9 +20,9 @@
#endif #endif
#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_DIRECTORY #if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_DIRECTORY
#include <Nazara/Core/ThreadSafety.hpp> #include <Nazara/Core/ThreadSafety.hpp>
#else #else
#include <Nazara/Core/ThreadSafetyOff.hpp> #include <Nazara/Core/ThreadSafetyOff.hpp>
#endif #endif
class NzDirectoryImpl; class NzDirectoryImpl;

View File

@ -22,9 +22,9 @@
#endif #endif
#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_DYNLIB #if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_DYNLIB
#include <Nazara/Core/ThreadSafety.hpp> #include <Nazara/Core/ThreadSafety.hpp>
#else #else
#include <Nazara/Core/ThreadSafetyOff.hpp> #include <Nazara/Core/ThreadSafetyOff.hpp>
#endif #endif
using NzDynLibFunc = int (*)(); // Type "générique" de pointeur sur fonction using NzDynLibFunc = int (*)(); // Type "générique" de pointeur sur fonction

View File

@ -18,9 +18,9 @@
#include <Nazara/Core/String.hpp> #include <Nazara/Core/String.hpp>
#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_FILE #if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_FILE
#include <Nazara/Core/ThreadSafety.hpp> #include <Nazara/Core/ThreadSafety.hpp>
#else #else
#include <Nazara/Core/ThreadSafetyOff.hpp> #include <Nazara/Core/ThreadSafetyOff.hpp>
#endif #endif
class NzFileImpl; class NzFileImpl;

View File

@ -13,15 +13,15 @@
#include <Nazara/Core/String.hpp> #include <Nazara/Core/String.hpp>
#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_LOG #if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_LOG
#include <Nazara/Core/ThreadSafety.hpp> #include <Nazara/Core/ThreadSafety.hpp>
#else #else
#include <Nazara/Core/ThreadSafetyOff.hpp> #include <Nazara/Core/ThreadSafetyOff.hpp>
#endif #endif
#ifdef NAZARA_DEBUG #ifdef NAZARA_DEBUG
#define NazaraDebug(txt) NazaraNotice(txt) #define NazaraDebug(txt) NazaraNotice(txt)
#else #else
#define NazaraDebug(txt) #define NazaraDebug(txt)
#endif #endif
#define NazaraLog NzLog::Instance() #define NazaraLog NzLog::Instance()

View File

@ -12,9 +12,9 @@
#include <unordered_map> #include <unordered_map>
#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_RESOURCE #if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_RESOURCE
#include <Nazara/Core/ThreadSafety.hpp> #include <Nazara/Core/ThreadSafety.hpp>
#else #else
#include <Nazara/Core/ThreadSafetyOff.hpp> #include <Nazara/Core/ThreadSafetyOff.hpp>
#endif #endif
class NzResourceListener; class NzResourceListener;

View File

@ -12,12 +12,6 @@
#include <string> #include <string>
#include <vector> #include <vector>
#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_STRINGSTREAM
#include <Nazara/Core/ThreadSafety.hpp>
#else
#include <Nazara/Core/ThreadSafetyOff.hpp>
#endif
class NAZARA_API NzStringStream class NAZARA_API NzStringStream
{ {
public: public:
@ -48,8 +42,6 @@ class NAZARA_API NzStringStream
operator NzString() const; operator NzString() const;
private: private:
NazaraMutexAttrib(m_mutex, mutable)
std::vector<NzString> m_strings; std::vector<NzString> m_strings;
unsigned int m_bufferSize; unsigned int m_bufferSize;
}; };

View File

@ -13,6 +13,12 @@
#error OS not handled #error OS not handled
#endif #endif
#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_CLOCK
#include <Nazara/Core/ThreadSafety.hpp>
#else
#include <Nazara/Core/ThreadSafetyOff.hpp>
#endif
#include <Nazara/Core/Debug.hpp> #include <Nazara/Core/Debug.hpp>
namespace namespace
@ -47,7 +53,7 @@ float NzClock::GetSeconds() const
nzUInt64 NzClock::GetMicroseconds() const nzUInt64 NzClock::GetMicroseconds() const
{ {
NazaraMutex(m_mutex); NazaraLock(m_mutex);
return m_elapsedTime + (NzGetMicroseconds()-m_refTime); return m_elapsedTime + (NzGetMicroseconds()-m_refTime);
} }
@ -59,14 +65,14 @@ nzUInt64 NzClock::GetMilliseconds() const
bool NzClock::IsPaused() const bool NzClock::IsPaused() const
{ {
NazaraMutex(m_mutex); NazaraLock(m_mutex);
return m_paused; return m_paused;
} }
void NzClock::Pause() void NzClock::Pause()
{ {
NazaraMutex(m_mutex); NazaraLock(m_mutex);
if (!m_paused) if (!m_paused)
{ {
@ -79,7 +85,7 @@ void NzClock::Pause()
void NzClock::Restart() void NzClock::Restart()
{ {
NazaraMutex(m_mutex); NazaraLock(m_mutex);
m_elapsedTime = 0; m_elapsedTime = 0;
m_refTime = NzGetMicroseconds(); m_refTime = NzGetMicroseconds();
@ -88,7 +94,7 @@ void NzClock::Restart()
void NzClock::Unpause() void NzClock::Unpause()
{ {
NazaraMutex(m_mutex); NazaraLock(m_mutex);
if (m_paused) if (m_paused)
{ {

View File

@ -16,6 +16,12 @@
#error OS not handled #error OS not handled
#endif #endif
#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_DIRECTORY
#include <Nazara/Core/ThreadSafety.hpp>
#else
#include <Nazara/Core/ThreadSafetyOff.hpp>
#endif
#include <Nazara/Core/Debug.hpp> #include <Nazara/Core/Debug.hpp>
namespace namespace

View File

@ -15,6 +15,12 @@
#error No implementation for this platform #error No implementation for this platform
#endif #endif
#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_DYNLIB
#include <Nazara/Core/ThreadSafety.hpp>
#else
#include <Nazara/Core/ThreadSafetyOff.hpp>
#endif
#include <Nazara/Core/Debug.hpp> #include <Nazara/Core/Debug.hpp>
NzDynLib::NzDynLib() : NzDynLib::NzDynLib() :

View File

@ -19,6 +19,12 @@
#error OS not handled #error OS not handled
#endif #endif
#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_FILE
#include <Nazara/Core/ThreadSafety.hpp>
#else
#include <Nazara/Core/ThreadSafetyOff.hpp>
#endif
#include <Nazara/Core/Debug.hpp> #include <Nazara/Core/Debug.hpp>
NzFile::NzFile() : NzFile::NzFile() :

View File

@ -11,7 +11,13 @@
#include <cstring> #include <cstring>
#if NAZARA_CORE_DUPLICATE_LOG_TO_COUT #if NAZARA_CORE_DUPLICATE_LOG_TO_COUT
#include <cstdio> #include <cstdio>
#endif
#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_LOG
#include <Nazara/Core/ThreadSafety.hpp>
#else
#include <Nazara/Core/ThreadSafetyOff.hpp>
#endif #endif
#include <Nazara/Core/Debug.hpp> #include <Nazara/Core/Debug.hpp>
@ -116,7 +122,7 @@ void NzLog::Write(const NzString& string)
if (m_writeTime) if (m_writeTime)
{ {
line.Reserve(23 + string.GetSize() + 1); line.Reserve(23 + string.GetSize() + 1);
line.Resize(23); line.Set(23, '\0'); // Buffer non-initialisé
time_t currentTime = std::time(nullptr); time_t currentTime = std::time(nullptr);
std::strftime(&line[0], 24, "%d/%m/%Y - %H:%M:%S: ", std::localtime(&currentTime)); std::strftime(&line[0], 24, "%d/%m/%Y - %H:%M:%S: ", std::localtime(&currentTime));

View File

@ -9,6 +9,13 @@
#include <Nazara/Utility/StaticMesh.hpp> #include <Nazara/Utility/StaticMesh.hpp>
#include <Nazara/Utility/VertexDeclaration.hpp> #include <Nazara/Utility/VertexDeclaration.hpp>
#include <typeinfo> #include <typeinfo>
#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_RESOURCE
#include <Nazara/Core/ThreadSafety.hpp>
#else
#include <Nazara/Core/ThreadSafetyOff.hpp>
#endif
#include <Nazara/Core/Debug.hpp> #include <Nazara/Core/Debug.hpp>
NzResource::NzResource(bool persistent) : NzResource::NzResource(bool persistent) :

View File

@ -18,8 +18,6 @@ m_bufferSize(str.GetSize())
NzString NzStringStream::ToString() const NzString NzStringStream::ToString() const
{ {
NazaraLock(m_mutex)
NzString string; NzString string;
string.Reserve(m_bufferSize); string.Reserve(m_bufferSize);
@ -31,8 +29,6 @@ NzString NzStringStream::ToString() const
NzStringStream& NzStringStream::operator<<(bool boolean) NzStringStream& NzStringStream::operator<<(bool boolean)
{ {
NazaraLock(m_mutex)
m_strings.push_back(NzString::Boolean(boolean)); m_strings.push_back(NzString::Boolean(boolean));
m_bufferSize += m_strings.back().GetSize(); m_bufferSize += m_strings.back().GetSize();
@ -41,8 +37,6 @@ NzStringStream& NzStringStream::operator<<(bool boolean)
NzStringStream& NzStringStream::operator<<(short number) NzStringStream& NzStringStream::operator<<(short number)
{ {
NazaraLock(m_mutex)
m_strings.push_back(NzString::Number(number)); m_strings.push_back(NzString::Number(number));
m_bufferSize += m_strings.back().GetSize(); m_bufferSize += m_strings.back().GetSize();
@ -51,8 +45,6 @@ NzStringStream& NzStringStream::operator<<(short number)
NzStringStream& NzStringStream::operator<<(unsigned short number) NzStringStream& NzStringStream::operator<<(unsigned short number)
{ {
NazaraLock(m_mutex)
m_strings.push_back(NzString::Number(number)); m_strings.push_back(NzString::Number(number));
m_bufferSize += m_strings.back().GetSize(); m_bufferSize += m_strings.back().GetSize();
@ -61,8 +53,6 @@ NzStringStream& NzStringStream::operator<<(unsigned short number)
NzStringStream& NzStringStream::operator<<(int number) NzStringStream& NzStringStream::operator<<(int number)
{ {
NazaraLock(m_mutex)
m_strings.push_back(NzString::Number(number)); m_strings.push_back(NzString::Number(number));
m_bufferSize += m_strings.back().GetSize(); m_bufferSize += m_strings.back().GetSize();
@ -71,8 +61,6 @@ NzStringStream& NzStringStream::operator<<(int number)
NzStringStream& NzStringStream::operator<<(unsigned int number) NzStringStream& NzStringStream::operator<<(unsigned int number)
{ {
NazaraLock(m_mutex)
m_strings.push_back(NzString::Number(number)); m_strings.push_back(NzString::Number(number));
m_bufferSize += m_strings.back().GetSize(); m_bufferSize += m_strings.back().GetSize();
@ -81,8 +69,6 @@ NzStringStream& NzStringStream::operator<<(unsigned int number)
NzStringStream& NzStringStream::operator<<(long number) NzStringStream& NzStringStream::operator<<(long number)
{ {
NazaraLock(m_mutex)
m_strings.push_back(NzString::Number(number)); m_strings.push_back(NzString::Number(number));
m_bufferSize += m_strings.back().GetSize(); m_bufferSize += m_strings.back().GetSize();
@ -91,8 +77,6 @@ NzStringStream& NzStringStream::operator<<(long number)
NzStringStream& NzStringStream::operator<<(unsigned long number) NzStringStream& NzStringStream::operator<<(unsigned long number)
{ {
NazaraLock(m_mutex)
m_strings.push_back(NzString::Number(number)); m_strings.push_back(NzString::Number(number));
m_bufferSize += m_strings.back().GetSize(); m_bufferSize += m_strings.back().GetSize();
@ -101,8 +85,6 @@ NzStringStream& NzStringStream::operator<<(unsigned long number)
NzStringStream& NzStringStream::operator<<(long long number) NzStringStream& NzStringStream::operator<<(long long number)
{ {
NazaraLock(m_mutex)
m_strings.push_back(NzString::Number(number)); m_strings.push_back(NzString::Number(number));
m_bufferSize += m_strings.back().GetSize(); m_bufferSize += m_strings.back().GetSize();
@ -111,8 +93,6 @@ NzStringStream& NzStringStream::operator<<(long long number)
NzStringStream& NzStringStream::operator<<(unsigned long long number) NzStringStream& NzStringStream::operator<<(unsigned long long number)
{ {
NazaraLock(m_mutex)
m_strings.push_back(NzString::Number(number)); m_strings.push_back(NzString::Number(number));
m_bufferSize += m_strings.back().GetSize(); m_bufferSize += m_strings.back().GetSize();
@ -121,8 +101,6 @@ NzStringStream& NzStringStream::operator<<(unsigned long long number)
NzStringStream& NzStringStream::operator<<(float number) NzStringStream& NzStringStream::operator<<(float number)
{ {
NazaraLock(m_mutex)
m_strings.push_back(NzString::Number(number)); m_strings.push_back(NzString::Number(number));
m_bufferSize += m_strings.back().GetSize(); m_bufferSize += m_strings.back().GetSize();
@ -131,8 +109,6 @@ NzStringStream& NzStringStream::operator<<(float number)
NzStringStream& NzStringStream::operator<<(double number) NzStringStream& NzStringStream::operator<<(double number)
{ {
NazaraLock(m_mutex)
m_strings.push_back(NzString::Number(number)); m_strings.push_back(NzString::Number(number));
m_bufferSize += m_strings.back().GetSize(); m_bufferSize += m_strings.back().GetSize();
@ -141,8 +117,6 @@ NzStringStream& NzStringStream::operator<<(double number)
NzStringStream& NzStringStream::operator<<(long double number) NzStringStream& NzStringStream::operator<<(long double number)
{ {
NazaraLock(m_mutex)
m_strings.push_back(NzString::Number(number)); m_strings.push_back(NzString::Number(number));
m_bufferSize += m_strings.back().GetSize(); m_bufferSize += m_strings.back().GetSize();
@ -151,8 +125,6 @@ NzStringStream& NzStringStream::operator<<(long double number)
NzStringStream& NzStringStream::operator<<(char character) NzStringStream& NzStringStream::operator<<(char character)
{ {
NazaraLock(m_mutex)
m_strings.push_back(NzString(character)); m_strings.push_back(NzString(character));
m_bufferSize++; m_bufferSize++;
@ -161,8 +133,6 @@ NzStringStream& NzStringStream::operator<<(char character)
NzStringStream& NzStringStream::operator<<(unsigned char character) NzStringStream& NzStringStream::operator<<(unsigned char character)
{ {
NazaraLock(m_mutex)
m_strings.push_back(NzString(static_cast<char>(character))); m_strings.push_back(NzString(static_cast<char>(character)));
m_bufferSize++; m_bufferSize++;
@ -171,8 +141,6 @@ NzStringStream& NzStringStream::operator<<(unsigned char character)
NzStringStream& NzStringStream::operator<<(const char* string) NzStringStream& NzStringStream::operator<<(const char* string)
{ {
NazaraLock(m_mutex)
m_strings.push_back(string); m_strings.push_back(string);
m_bufferSize += m_strings.back().GetSize(); m_bufferSize += m_strings.back().GetSize();
@ -181,8 +149,6 @@ NzStringStream& NzStringStream::operator<<(const char* string)
NzStringStream& NzStringStream::operator<<(const std::string& string) NzStringStream& NzStringStream::operator<<(const std::string& string)
{ {
NazaraLock(m_mutex)
m_strings.push_back(string); m_strings.push_back(string);
m_bufferSize += string.size(); m_bufferSize += string.size();
@ -191,8 +157,6 @@ NzStringStream& NzStringStream::operator<<(const std::string& string)
NzStringStream& NzStringStream::operator<<(const NzString& string) NzStringStream& NzStringStream::operator<<(const NzString& string)
{ {
NazaraLock(m_mutex)
m_strings.push_back(string); m_strings.push_back(string);
m_bufferSize += string.GetSize(); m_bufferSize += string.GetSize();
@ -201,8 +165,6 @@ NzStringStream& NzStringStream::operator<<(const NzString& string)
NzStringStream& NzStringStream::operator<<(const void* ptr) NzStringStream& NzStringStream::operator<<(const void* ptr)
{ {
NazaraLock(m_mutex)
m_strings.push_back(NzString::Pointer(ptr)); m_strings.push_back(NzString::Pointer(ptr));
m_bufferSize += sizeof(void*)*2; m_bufferSize += sizeof(void*)*2;