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 #include +#include + // #define MEM_DEBUG #ifdef MEM_DEBUG @@ -51,6 +53,9 @@ static std::map 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 @@ -108,6 +119,8 @@ template AUD_Reference(U* reference) { + AUD_ReferenceHandler::mutex_type::scoped_lock lock(AUD_ReferenceHandler::getMutex()); + m_original = reference; m_reference = dynamic_cast(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 explicit AUD_Reference(const AUD_Reference& ref) { + AUD_ReferenceHandler::mutex_type::scoped_lock lock(AUD_ReferenceHandler::getMutex()); + m_original = ref.get(); m_reference = dynamic_cast(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;