1
0
Эх сурвалжийг харах

Stub code for platforms without functional pthreads.

Ryan C. Gordon 23 жил өмнө
parent
commit
cdac19f131
2 өөрчлөгдсөн 58 нэмэгдсэн , 10 устгасан
  1. 35 3
      configure.in
  2. 23 7
      platform/unix.c

+ 35 - 3
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

+ 23 - 7
platform/unix.c

@@ -17,7 +17,6 @@
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
-#include <pthread.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <pwd.h>
@@ -28,6 +27,10 @@
 #include <errno.h>
 #include <sys/mount.h>
 
+#if (!defined PHYSFS_NO_PTHREADS_SUPPORT)
+#include <pthread.h>
+#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 ... */