|
@@ -21,10 +21,6 @@
|
|
|
#include <time.h>
|
|
#include <time.h>
|
|
|
#include <errno.h>
|
|
#include <errno.h>
|
|
|
|
|
|
|
|
-#if (!defined PHYSFS_NO_THREAD_SUPPORT)
|
|
|
|
|
-#include <pthread.h>
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
#ifdef PHYSFS_HAVE_SYS_UCRED_H
|
|
#ifdef PHYSFS_HAVE_SYS_UCRED_H
|
|
|
# ifdef PHYSFS_HAVE_MNTENT_H
|
|
# ifdef PHYSFS_HAVE_MNTENT_H
|
|
|
# undef PHYSFS_HAVE_MNTENT_H /* don't do both... */
|
|
# undef PHYSFS_HAVE_MNTENT_H /* don't do both... */
|
|
@@ -355,93 +351,6 @@ int __PHYSFS_platformSetDefaultAllocator(PHYSFS_Allocator *a)
|
|
|
return 0; /* just use malloc() and friends. */
|
|
return 0; /* just use malloc() and friends. */
|
|
|
} /* __PHYSFS_platformSetDefaultAllocator */
|
|
} /* __PHYSFS_platformSetDefaultAllocator */
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-#if (defined PHYSFS_NO_THREAD_SUPPORT)
|
|
|
|
|
-
|
|
|
|
|
-void *__PHYSFS_platformGetThreadID(void) { return ((void *) 0x0001); }
|
|
|
|
|
-void *__PHYSFS_platformCreateMutex(void) { return ((void *) 0x0001); }
|
|
|
|
|
-void __PHYSFS_platformDestroyMutex(void *mutex) {}
|
|
|
|
|
-int __PHYSFS_platformGrabMutex(void *mutex) { return 1; }
|
|
|
|
|
-void __PHYSFS_platformReleaseMutex(void *mutex) {}
|
|
|
|
|
-
|
|
|
|
|
-#else
|
|
|
|
|
-
|
|
|
|
|
-typedef struct
|
|
|
|
|
-{
|
|
|
|
|
- pthread_mutex_t mutex;
|
|
|
|
|
- pthread_t owner;
|
|
|
|
|
- PHYSFS_uint32 count;
|
|
|
|
|
-} PthreadMutex;
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-void *__PHYSFS_platformGetThreadID(void)
|
|
|
|
|
-{
|
|
|
|
|
- return ( (void *) ((size_t) pthread_self()) );
|
|
|
|
|
-} /* __PHYSFS_platformGetThreadID */
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-void *__PHYSFS_platformCreateMutex(void)
|
|
|
|
|
-{
|
|
|
|
|
- int rc;
|
|
|
|
|
- PthreadMutex *m = (PthreadMutex *) allocator.Malloc(sizeof (PthreadMutex));
|
|
|
|
|
- BAIL_IF_MACRO(m == NULL, ERR_OUT_OF_MEMORY, NULL);
|
|
|
|
|
- rc = pthread_mutex_init(&m->mutex, NULL);
|
|
|
|
|
- if (rc != 0)
|
|
|
|
|
- {
|
|
|
|
|
- allocator.Free(m);
|
|
|
|
|
- BAIL_MACRO(strerror(rc), NULL);
|
|
|
|
|
- } /* if */
|
|
|
|
|
-
|
|
|
|
|
- m->count = 0;
|
|
|
|
|
- m->owner = (pthread_t) 0xDEADBEEF;
|
|
|
|
|
- return ((void *) m);
|
|
|
|
|
-} /* __PHYSFS_platformCreateMutex */
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-void __PHYSFS_platformDestroyMutex(void *mutex)
|
|
|
|
|
-{
|
|
|
|
|
- PthreadMutex *m = (PthreadMutex *) mutex;
|
|
|
|
|
-
|
|
|
|
|
- /* Destroying a locked mutex is a bug, but we'll try to be helpful. */
|
|
|
|
|
- if ((m->owner == pthread_self()) && (m->count > 0))
|
|
|
|
|
- pthread_mutex_unlock(&m->mutex);
|
|
|
|
|
-
|
|
|
|
|
- pthread_mutex_destroy(&m->mutex);
|
|
|
|
|
- allocator.Free(m);
|
|
|
|
|
-} /* __PHYSFS_platformDestroyMutex */
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-int __PHYSFS_platformGrabMutex(void *mutex)
|
|
|
|
|
-{
|
|
|
|
|
- PthreadMutex *m = (PthreadMutex *) mutex;
|
|
|
|
|
- pthread_t tid = pthread_self();
|
|
|
|
|
- if (m->owner != tid)
|
|
|
|
|
- {
|
|
|
|
|
- if (pthread_mutex_lock(&m->mutex) != 0)
|
|
|
|
|
- return 0;
|
|
|
|
|
- m->owner = tid;
|
|
|
|
|
- } /* if */
|
|
|
|
|
-
|
|
|
|
|
- m->count++;
|
|
|
|
|
- return 1;
|
|
|
|
|
-} /* __PHYSFS_platformGrabMutex */
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-void __PHYSFS_platformReleaseMutex(void *mutex)
|
|
|
|
|
-{
|
|
|
|
|
- PthreadMutex *m = (PthreadMutex *) mutex;
|
|
|
|
|
- if (m->owner == pthread_self())
|
|
|
|
|
- {
|
|
|
|
|
- if (--m->count == 0)
|
|
|
|
|
- {
|
|
|
|
|
- m->owner = (pthread_t) 0xDEADBEEF;
|
|
|
|
|
- pthread_mutex_unlock(&m->mutex);
|
|
|
|
|
- } /* if */
|
|
|
|
|
- } /* if */
|
|
|
|
|
-} /* __PHYSFS_platformReleaseMutex */
|
|
|
|
|
-
|
|
|
|
|
-#endif /* !PHYSFS_NO_THREAD_SUPPORT */
|
|
|
|
|
-
|
|
|
|
|
#endif /* PHYSFS_PLATFORM_UNIX */
|
|
#endif /* PHYSFS_PLATFORM_UNIX */
|
|
|
|
|
|
|
|
/* end of unix.c ... */
|
|
/* end of unix.c ... */
|