Page MenuHome

AUD_Reference-race-condition.patch

AUD_Reference-race-condition.patch

Index: intern/audaspace/intern/AUD_Reference.h
===================================================================
--- intern/audaspace/intern/AUD_Reference.h (revisão 45981)
+++ intern/audaspace/intern/AUD_Reference.h (cópia de trabalho)
@@ -32,6 +32,8 @@
#include <map>
#include <cstddef>
+#include <boost/thread/recursive_mutex.hpp>
+
// #define MEM_DEBUG
#ifdef MEM_DEBUG
@@ -51,6 +53,9 @@
static std::map<void*, unsigned int> m_references;
public:
+
+ typedef boost::recursive_mutex mutex_type;
+
/**
* Reference increment.
* \param reference The reference.
@@ -88,6 +93,12 @@
}
return false;
}
+
+ static inline mutex_type &getMutex(void)
+ {
+ static mutex_type m;
+ return m;
+ }
};
template <class T>
@@ -108,6 +119,8 @@
template <class U>
AUD_Reference(U* reference)
{
+ AUD_ReferenceHandler::mutex_type::scoped_lock lock(AUD_ReferenceHandler::getMutex());
+
m_original = reference;
m_reference = dynamic_cast<T*>(reference);
AUD_ReferenceHandler::incref(m_original);
@@ -129,6 +142,8 @@
*/
AUD_Reference(const AUD_Reference& ref)
{
+ AUD_ReferenceHandler::mutex_type::scoped_lock lock(AUD_ReferenceHandler::getMutex());
+
m_original = ref.m_original;
m_reference = ref.m_reference;
AUD_ReferenceHandler::incref(m_original);
@@ -141,6 +156,8 @@
template <class U>
explicit AUD_Reference(const AUD_Reference<U>& ref)
{
+ AUD_ReferenceHandler::mutex_type::scoped_lock lock(AUD_ReferenceHandler::getMutex());
+
m_original = ref.get();
m_reference = dynamic_cast<T*>(ref.get());
AUD_ReferenceHandler::incref(m_original);
@@ -156,6 +173,8 @@
*/
~AUD_Reference()
{
+ AUD_ReferenceHandler::mutex_type::scoped_lock lock(AUD_ReferenceHandler::getMutex());
+
#ifdef MEM_DEBUG
if(m_reference != NULL)
std::cerr << "-" << typeid(*m_reference).name() << std::endl;
@@ -170,6 +189,8 @@
*/
AUD_Reference& operator=(const AUD_Reference& ref)
{
+ AUD_ReferenceHandler::mutex_type::scoped_lock lock(AUD_ReferenceHandler::getMutex());
+
if(&ref == this)
return *this;

File Metadata

Mime Type
text/x-diff
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
82/7f/d876b63e6710d737939c5b7dbf11

Event Timeline