Made use of atomic variables

In order to replace mutex-protected integer values (Performance
improvement)


Former-commit-id: d40ed2444111f00dab372f2371fe91cfd9cd2472
This commit is contained in:
Lynix
2013-05-03 23:12:58 +02:00
parent aa1399b750
commit 459c7a4d07
8 changed files with 41 additions and 118 deletions

View File

@@ -17,7 +17,7 @@ m_resourceReferenceCount(0)
}
NzResource::NzResource(const NzResource& resource) :
m_resourcePersistent(resource.m_resourcePersistent),
m_resourcePersistent(resource.m_resourcePersistent.load()),
m_resourceReferenceCount(0)
{
}
@@ -49,22 +49,16 @@ void NzResource::AddResourceListener(NzResourceListener* listener, int index) co
void NzResource::AddResourceReference() const
{
NazaraLock(m_mutex)
m_resourceReferenceCount++;
}
unsigned int NzResource::GetResourceReferenceCount() const
{
NazaraLock(m_mutex)
return m_resourceReferenceCount;
}
bool NzResource::IsPersistent() const
{
NazaraLock(m_mutex)
return m_resourcePersistent;
}
@@ -77,34 +71,11 @@ bool NzResource::RemoveResourceListener(NzResourceListener* listener) const
else
NazaraError(NzString::Pointer(listener) + " is not a listener of " + NzString::Pointer(this));
// RemoveResourceReference()
#if NAZARA_CORE_SAFE
if (m_resourceReferenceCount == 0)
{
NazaraError("Impossible to remove reference (Ref. counter is already 0)");
return false;
}
#endif
if (--m_resourceReferenceCount == 0 && !m_resourcePersistent)
{
NazaraMutexUnlock(m_mutex);
delete this;
return true; // On vient d'être supprimé
}
else
{
NazaraMutexUnlock(m_mutex);
return false;
}
return RemoveResourceReference();
}
bool NzResource::RemoveResourceReference() const
{
NazaraMutexLock(m_mutex);
#if NAZARA_CORE_SAFE
if (m_resourceReferenceCount == 0)
{
@@ -115,34 +86,26 @@ bool NzResource::RemoveResourceReference() const
if (--m_resourceReferenceCount == 0 && !m_resourcePersistent)
{
NazaraMutexUnlock(m_mutex);
delete this; // Suicide
return true;
}
else
return false;
}
bool NzResource::SetPersistent(bool persistent, bool checkReferenceCount)
{
m_resourcePersistent = persistent;
if (checkReferenceCount && !persistent && m_resourceReferenceCount == 0)
{
delete this;
return true;
}
else
{
NazaraMutexUnlock(m_mutex);
return false;
}
}
void NzResource::SetPersistent(bool persistent, bool checkReferenceCount)
{
NazaraMutexLock(m_mutex);
m_resourcePersistent = persistent;
if (checkReferenceCount && !persistent && m_resourceReferenceCount == 0)
{
NazaraMutexUnlock(m_mutex);
delete this;
}
else
{
NazaraMutexUnlock(m_mutex);
}
}
void NzResource::NotifyCreated()

View File

@@ -136,11 +136,7 @@ NzString::NzString(const NzString& string) :
m_sharedString(string.m_sharedString)
{
if (m_sharedString != &emptyString)
{
NazaraMutexLock(m_sharedString->mutex);
m_sharedString->refCount++;
NazaraMutexUnlock(m_sharedString->mutex);
}
}
NzString::NzString(NzString&& string) noexcept :
@@ -4237,11 +4233,7 @@ NzString& NzString::operator=(const NzString& string)
m_sharedString = string.m_sharedString;
if (m_sharedString != &emptyString)
{
NazaraMutexLock(m_sharedString->mutex);
m_sharedString->refCount++;
NazaraMutexUnlock(m_sharedString->mutex);
}
return *this;
}
@@ -5091,7 +5083,6 @@ void NzString::EnsureOwnership()
if (m_sharedString == &emptyString)
return;
NazaraLock(m_sharedString->mutex);
if (m_sharedString->refCount > 1)
{
m_sharedString->refCount--;
@@ -5115,11 +5106,7 @@ void NzString::ReleaseString()
if (m_sharedString == &emptyString)
return;
NazaraMutexLock(m_sharedString->mutex);
bool freeSharedString = (--m_sharedString->refCount == 0);
NazaraMutexUnlock(m_sharedString->mutex);
if (freeSharedString)
if (--m_sharedString->refCount == 0)
{
delete[] m_sharedString->string;
delete m_sharedString;

View File

@@ -9,6 +9,7 @@
#include <Nazara/Core/LockGuard.hpp>
#include <Nazara/Core/Mutex.hpp>
#include <Nazara/Core/Thread.hpp>
#include <atomic>
#include <queue>
#include <vector>
#include <Nazara/Core/Debug.hpp>
@@ -28,7 +29,7 @@ namespace
NzMutex waiterConditionVariableMutex;
NzMutex workerConditionVariableMutex;
volatile bool running = true;
unsigned int taskCount; ///TODO: Atomic
std::atomic<unsigned int> taskCount;
};
TaskSchedulerImpl* s_impl = nullptr;