Replaced BeOS mutex implementation. Now all platforms have recursive mutexes.
authorRyan C. Gordon <icculus@icculus.org>
Sat, 24 Mar 2007 05:42:22 +0000
changeset 854 6c3ebc2e627a
parent 853 8df352657911
child 855 0a3d5e54385f
Replaced BeOS mutex implementation. Now all platforms have recursive mutexes.
CHANGELOG.txt
platform/beos.cpp
--- a/CHANGELOG.txt	Sat Mar 24 05:13:54 2007 +0000
+++ b/CHANGELOG.txt	Sat Mar 24 05:42:22 2007 +0000
@@ -2,6 +2,11 @@
  * CHANGELOG.
  */
 
+03242007 - Replaced BeOS semaphores with BLockers for the mutex implementation.
+           It's much simpler, it has "benaphores" built in behind the scenes
+           for faster performance, and it's recursive...also, we were
+           previously setting the PhysicsFS error state if BeOS mutex grabbing
+           failed (a big no no!), and that's now fixed. Good wins all around.
 03222007 - Replaced some Malloc and all the alloca() calls with
            __PHYSFS_smallAlloc(), which will stack allocate small (128 or
            less bytes) blocks and Malloc the rest...naturally these now have
--- a/platform/beos.cpp	Sat Mar 24 05:13:54 2007 +0000
+++ b/platform/beos.cpp	Sat Mar 24 05:42:22 2007 +0000
@@ -20,6 +20,7 @@
 #include <be/storage/Path.h>
 #include <be/kernel/fs_info.h>
 #include <be/device/scsi.h>
+#include <be/support/Locker.h>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -204,43 +205,27 @@
 } /* __PHYSFS_platformCurrentDir */
 
 
-/* !!! FIXME: semaphores are not mutexes... */
 void *__PHYSFS_platformCreateMutex(void)
 {
-    sem_id *retval = (sem_id *) allocator.Malloc(sizeof (sem_id));
-    sem_id rc;
-
-    BAIL_IF_MACRO(retval == NULL, ERR_OUT_OF_MEMORY, NULL);
-    rc = create_sem(1, "PhysicsFS semaphore");
-    if (rc < B_OK)
-    {
-        allocator.Free(retval);
-        BAIL_MACRO(strerror(rc), NULL);
-    } // if
-
-    *retval = rc;
-    return(retval);
+    return(new BLocker("PhysicsFS lock", true));
 } /* __PHYSFS_platformCreateMutex */
 
 
 void __PHYSFS_platformDestroyMutex(void *mutex)
 {
-    delete_sem( *((sem_id *) mutex) );
-    allocator.Free(mutex);
+    delete ((BLocker *) mutex);
 } /* __PHYSFS_platformDestroyMutex */
 
 
 int __PHYSFS_platformGrabMutex(void *mutex)
 {
-    status_t rc = acquire_sem(*((sem_id *) mutex));
-    BAIL_IF_MACRO(rc < B_OK, strerror(rc), 0);
-    return(1);
+    return ((BLocker *) mutex)->Lock() ? 1 : 0;
 } /* __PHYSFS_platformGrabMutex */
 
 
 void __PHYSFS_platformReleaseMutex(void *mutex)
 {
-    release_sem(*((sem_id *) mutex));
+    ((BLocker *) mutex)->Unlock();
 } /* __PHYSFS_platformReleaseMutex */