[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46036] trunk/blender/intern/audaspace/ intern: Hopefully a fix for [#31097] glibc error when playing sound using BGE
Joerg Mueller
nexyon at gmail.com
Sat Apr 28 15:37:44 CEST 2012
Revision: 46036
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46036
Author: nexyon
Date: 2012-04-28 13:37:44 +0000 (Sat, 28 Apr 2012)
Log Message:
-----------
Hopefully a fix for [#31097] glibc error when playing sound using BGE
Modified Paths:
--------------
trunk/blender/intern/audaspace/intern/AUD_Reference.h
trunk/blender/intern/audaspace/intern/AUD_ReferenceHandler.cpp
Modified: trunk/blender/intern/audaspace/intern/AUD_Reference.h
===================================================================
--- trunk/blender/intern/audaspace/intern/AUD_Reference.h 2012-04-28 13:16:29 UTC (rev 46035)
+++ trunk/blender/intern/audaspace/intern/AUD_Reference.h 2012-04-28 13:37:44 UTC (rev 46036)
@@ -31,6 +31,7 @@
#include <map>
#include <cstddef>
+#include <pthread.h>
// #define MEM_DEBUG
@@ -49,8 +50,13 @@
* Saves the reference counts.
*/
static std::map<void*, unsigned int> m_references;
+ static pthread_mutex_t m_mutex;
+ static bool m_mutex_initialised;
public:
+
+ static pthread_mutex_t* getMutex();
+
/**
* Reference increment.
* \param reference The reference.
@@ -108,6 +114,7 @@
template <class U>
AUD_Reference(U* reference)
{
+ pthread_mutex_lock(AUD_ReferenceHandler::getMutex());
m_original = reference;
m_reference = dynamic_cast<T*>(reference);
AUD_ReferenceHandler::incref(m_original);
@@ -115,6 +122,7 @@
if(m_reference != NULL)
std::cerr << "+" << typeid(*m_reference).name() << std::endl;
#endif
+ pthread_mutex_unlock(AUD_ReferenceHandler::getMutex());
}
AUD_Reference()
@@ -129,6 +137,7 @@
*/
AUD_Reference(const AUD_Reference& ref)
{
+ pthread_mutex_lock(AUD_ReferenceHandler::getMutex());
m_original = ref.m_original;
m_reference = ref.m_reference;
AUD_ReferenceHandler::incref(m_original);
@@ -136,11 +145,13 @@
if(m_reference != NULL)
std::cerr << "+" << typeid(*m_reference).name() << std::endl;
#endif
+ pthread_mutex_unlock(AUD_ReferenceHandler::getMutex());
}
template <class U>
explicit AUD_Reference(const AUD_Reference<U>& ref)
{
+ pthread_mutex_lock(AUD_ReferenceHandler::getMutex());
m_original = ref.get();
m_reference = dynamic_cast<T*>(ref.get());
AUD_ReferenceHandler::incref(m_original);
@@ -148,6 +159,7 @@
if(m_reference != NULL)
std::cerr << "+" << typeid(*m_reference).name() << std::endl;
#endif
+ pthread_mutex_unlock(AUD_ReferenceHandler::getMutex());
}
/**
@@ -156,12 +168,14 @@
*/
~AUD_Reference()
{
+ pthread_mutex_lock(AUD_ReferenceHandler::getMutex());
#ifdef MEM_DEBUG
if(m_reference != NULL)
std::cerr << "-" << typeid(*m_reference).name() << std::endl;
#endif
if(AUD_ReferenceHandler::decref(m_original))
delete m_reference;
+ pthread_mutex_unlock(AUD_ReferenceHandler::getMutex());
}
/**
@@ -173,6 +187,8 @@
if(&ref == this)
return *this;
+ pthread_mutex_lock(AUD_ReferenceHandler::getMutex());
+
#ifdef MEM_DEBUG
if(m_reference != NULL)
std::cerr << "-" << typeid(*m_reference).name() << std::endl;
@@ -188,6 +204,8 @@
std::cerr << "+" << typeid(*m_reference).name() << std::endl;
#endif
+ pthread_mutex_unlock(AUD_ReferenceHandler::getMutex());
+
return *this;
}
Modified: trunk/blender/intern/audaspace/intern/AUD_ReferenceHandler.cpp
===================================================================
--- trunk/blender/intern/audaspace/intern/AUD_ReferenceHandler.cpp 2012-04-28 13:16:29 UTC (rev 46035)
+++ trunk/blender/intern/audaspace/intern/AUD_ReferenceHandler.cpp 2012-04-28 13:37:44 UTC (rev 46036)
@@ -29,3 +29,24 @@
#include "AUD_Reference.h"
std::map<void*, unsigned int> AUD_ReferenceHandler::m_references;
+pthread_mutex_t AUD_ReferenceHandler::m_mutex;
+bool AUD_ReferenceHandler::m_mutex_initialised = false;
+
+pthread_mutex_t *AUD_ReferenceHandler::getMutex()
+{
+ if(!m_mutex_initialised)
+ {
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+
+ pthread_mutex_init(&m_mutex, &attr);
+
+ pthread_mutexattr_destroy(&attr);
+
+ m_mutex_initialised = true;
+ }
+
+ return &m_mutex;
+}
+
More information about the Bf-blender-cvs
mailing list