Blob Blame History Raw
diff -up allegro-4.4.2/src/unix/uthreads.c~ allegro-4.4.2/src/unix/uthreads.c
--- allegro-4.4.2/src/unix/uthreads.c~	2009-11-22 02:17:42.000000000 +0100
+++ allegro-4.4.2/src/unix/uthreads.c	2014-10-29 15:00:24.977558559 +0100
@@ -303,32 +303,27 @@ struct bg_manager _bg_man_pthreads = {
 
 
 
-/* custom mutex that supports nested locking */
-struct my_mutex {
-   int lock_count;                /* level of nested locking     */
-   pthread_t owner;               /* thread which owns the mutex */
-   pthread_mutex_t actual_mutex;  /* underlying mutex object     */
-};
-
-
-
 /* _unix_create_mutex:
  *  Creates a mutex and returns a pointer to it.
  */
 void *_unix_create_mutex(void)
 {
-   struct my_mutex *mx;
+   pthread_mutex_t *mx;
+   pthread_mutexattr_t attr;
 
-   mx = _AL_MALLOC(sizeof(struct my_mutex));
+   mx = _AL_MALLOC(sizeof(pthread_mutex_t));
    if (!mx) {
       *allegro_errno = ENOMEM;
       return NULL;
    }
 
-   mx->lock_count = 0;
-   mx->owner = (pthread_t) 0;
+   pthread_mutexattr_init(&attr);
+   if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0)
+       abort(); /* XXX */
 
-   pthread_mutex_init(&mx->actual_mutex, NULL);
+   pthread_mutex_init(mx, &attr);
+
+   pthread_mutexattr_destroy(&attr);
 
    return (void *)mx;
 }
@@ -340,11 +335,8 @@ void *_unix_create_mutex(void)
  */
 void _unix_destroy_mutex(void *handle)
 {
-   struct my_mutex *mx = (struct my_mutex *)handle;
-
-   pthread_mutex_destroy(&mx->actual_mutex);
-
-   _AL_FREE(mx);
+   pthread_mutex_destroy(handle);
+   _AL_FREE(handle);
 }
 
 
@@ -354,14 +346,7 @@ void _unix_destroy_mutex(void *handle)
  */
 void _unix_lock_mutex(void *handle)
 {
-   struct my_mutex *mx = (struct my_mutex *)handle;
-
-   if (mx->owner != pthread_self()) {
-      pthread_mutex_lock(&mx->actual_mutex);
-      mx->owner = pthread_self();      
-   }
-
-   mx->lock_count++;
+   pthread_mutex_lock(handle);
 }
 
 
@@ -371,14 +356,7 @@ void _unix_lock_mutex(void *handle)
  */
 void _unix_unlock_mutex(void *handle)
 {
-   struct my_mutex *mx = (struct my_mutex *)handle;
-
-   mx->lock_count--;
-
-   if (mx->lock_count == 0) {
-      mx->owner = (pthread_t) 0;
-      pthread_mutex_unlock(&mx->actual_mutex);
-   }
+   pthread_mutex_unlock(handle);
 }
 
 #endif	/* ALLEGRO_HAVE_LIBPTHREAD */