diff --git a/configure.in b/configure.in index 598ac7e..9b281ef 100644 --- a/configure.in +++ b/configure.in @@ -195,6 +195,17 @@ if test x$have_llseek = xyes; then fi +dnl determine if we should use the stubbed pthread code. +AC_ARG_ENABLE(pthreads, +[ --enable-pthreads include POSIX threads support [default=yes]], + , enable_pthreads=yes) +if test x$enable_pthreads = xyes; then + AC_CHECK_HEADER(pthread.h, have_pthread_hdr=yes) + if test x$have_pthread_hdr != xyes; then + enable_pthreads=no + fi +fi + dnl determine if we should use the stubbed CD-ROM detection code. AC_ARG_ENABLE(cdrom, [ --enable-cdrom include CD-ROM support [default=yes]], @@ -218,10 +229,14 @@ if test x$enable_cdrom = xyes; then fi fi +have_non_posix_threads=no + dnl AC_CHECK_HEADER(be/kernel/OS.h, this_is_beos=yes) AC_MSG_CHECKING([if this is BeOS]) if test x$build_os = xbeos; then this_is_beos=yes + enable_pthreads=no + have_non_posix_threads=yes LIBS="$LIBS -lroot -lbe" else this_is_beos=no @@ -233,6 +248,8 @@ AC_MSG_CHECKING([if this is Cygwin]) if test x$build_os = xcygwin; then this_is_cygwin=yes CFLAGS="$CFLAGS -DWIN32" + enable_pthreads=no + have_non_posix_threads=yes else this_is_cygwin=no fi @@ -281,7 +298,7 @@ if test x$we_have_sed = xyes; then if test x$x = xatheos; then this_is_atheos=yes enable_cdrom=no - LDFLAGS="$LDFLAGS -lpthread" + enable_pthreads=no fi AC_MSG_RESULT([$this_is_atheos]) @@ -292,11 +309,26 @@ if test x$enable_cdrom != xyes; then AC_DEFINE([PHYSFS_NO_CDROM_SUPPORT], 1, [define if we have no CD support]) AC_MSG_WARN([***]) AC_MSG_WARN([*** There is no CD-ROM support in this build!]) - AC_MSG_WARN([*** PhysicsFS will just pretend there are no discs!]) - AC_MSG_WARN([*** Is this what you really wanted?]) + AC_MSG_WARN([*** PhysicsFS will just pretend there are no discs.]) + AC_MSG_WARN([*** This may be fine, depending on how PhysicsFS is used,]) + AC_MSG_WARN([*** but is this what you REALLY wanted?]) + AC_MSG_WARN([*** (Maybe fix configure.in, or write a platform driver?)]) AC_MSG_WARN([***]) fi +if test x$enable_pthreads != xyes; then + AC_DEFINE([PHYSFS_NO_PTHREADS_SUPPORT], 1, [define if we have no POSIX threads support]) + if test x$have_non_posix_threads != xyes; then + AC_MSG_WARN([***]) + AC_MSG_WARN([*** There is no thread support in this build!]) + AC_MSG_WARN([*** PhysicsFS will NOT be reentrant!]) + AC_MSG_WARN([*** This may be fine, depending on how PhysicsFS is used,]) + AC_MSG_WARN([*** but is this what you REALLY wanted?]) + AC_MSG_WARN([*** (Maybe fix configure.in, or write a platform driver?)]) + AC_MSG_WARN([***]) + fi +fi + # Checks for header files. AC_HEADER_STDC diff --git a/platform/unix.c b/platform/unix.c index cbb24ef..12dde3b 100644 --- a/platform/unix.c +++ b/platform/unix.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -28,6 +27,10 @@ #include #include +#if (!defined PHYSFS_NO_PTHREADS_SUPPORT) +#include +#endif + #ifdef PHYSFS_HAVE_SYS_UCRED_H # ifdef PHYSFS_HAVE_MNTENT_H # undef PHYSFS_HAVE_MNTENT_H /* don't do both... */ @@ -256,12 +259,6 @@ char *__PHYSFS_platformCalcBaseDir(const char *argv0) } /* __PHYSFS_platformCalcBaseDir */ -PHYSFS_uint64 __PHYSFS_platformGetThreadID(void) -{ - return((PHYSFS_uint64) pthread_self()); -} /* __PHYSFS_platformGetThreadID */ - - /* Much like my college days, try to sleep for 10 milliseconds at a time... */ void __PHYSFS_platformTimeslice(void) { @@ -283,6 +280,22 @@ char *__PHYSFS_platformRealPath(const char *path) } /* __PHYSFS_platformRealPath */ +#if (!defined PHYSFS_NO_PTHREADS_SUPPORT) + +PHYSFS_uint64 __PHYSFS_platformGetThreadID(void) { return(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 + +PHYSFS_uint64 __PHYSFS_platformGetThreadID(void) +{ + return((PHYSFS_uint64) pthread_self()); +} /* __PHYSFS_platformGetThreadID */ + + void *__PHYSFS_platformCreateMutex(void) { int rc; @@ -317,6 +330,9 @@ void __PHYSFS_platformReleaseMutex(void *mutex) pthread_mutex_unlock((pthread_mutex_t *) mutex); } /* __PHYSFS_platformReleaseMutex */ +#endif /* !PHYSFS_NO_PTHREADS_SUPPORT */ + + #endif /* !defined __BEOS__ && !defined WIN32 */ /* end of unix.c ... */