[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