summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Reid <dreid@php.net>2002-10-05 11:26:17 +0000
committerDavid Reid <dreid@php.net>2002-10-05 11:26:17 +0000
commit2a0fbded3dc3f366cf3e4bfd3a42c7a2f5d2b745 (patch)
tree16a454a99aa47c8b954271b995bd200712af8326
parent4ca381aacfc77f43d02895d7ced4ecd36b5a286e (diff)
downloadphp-git-2a0fbded3dc3f366cf3e4bfd3a42c7a2f5d2b745.tar.gz
Add BeOS thread support to TSRM. This should not impact on any other OS's
but allows us to build PHP with threading support and therefore we can build as an Apache 2 module. The locking is currently done using benaphores but this may be reviewed.
-rw-r--r--TSRM/TSRM.c26
-rw-r--r--TSRM/TSRM.h10
-rw-r--r--TSRM/threads.m443
-rw-r--r--TSRM/tsrm.m420
-rw-r--r--TSRM/tsrm_virtual_cwd.c6
5 files changed, 76 insertions, 29 deletions
diff --git a/TSRM/TSRM.c b/TSRM/TSRM.c
index f391a8c40b..2f50307aa4 100644
--- a/TSRM/TSRM.c
+++ b/TSRM/TSRM.c
@@ -95,9 +95,10 @@ static pthread_key_t tls_key;
static int tls_key;
#elif defined(TSRM_WIN32)
static DWORD tls_key;
+#elif defined(BETHREADS)
+static int32 tls_key;
#endif
-
/* Startup TSRM (call once for the entire process) */
TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debug_level, char *debug_filename)
{
@@ -110,6 +111,8 @@ TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debu
st_key_create(&tls_key, 0);
#elif defined(TSRM_WIN32)
tls_key = TlsAlloc();
+#elif defined(BETHREADS)
+ tls_key = tls_allocate();
#endif
tsrm_error_file = stderr;
@@ -258,6 +261,8 @@ static void allocate_new_resource(tsrm_tls_entry **thread_resources_ptr, THREAD_
st_thread_setspecific(tls_key, (void *) *thread_resources_ptr);
#elif defined(TSRM_WIN32)
TlsSetValue(tls_key, (void *) *thread_resources_ptr);
+#elif defined(BETHREADS)
+ tls_set(tls_key, (void*) *thread_resources_ptr);
#endif
if (tsrm_new_thread_begin_handler) {
@@ -297,6 +302,8 @@ TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id)
thread_resources = st_thread_getspecific(tls_key);
#elif defined(TSRM_WIN32)
thread_resources = TlsGetValue(tls_key);
+#elif defined(BETHREADS)
+ thread_resources = (tsrm_tls_entry*)tls_get(tls_key);
#else
thread_resources = NULL;
#endif
@@ -423,6 +430,8 @@ TSRM_API THREAD_T tsrm_thread_id(void)
return PIThread_getCurrent();
#elif defined(TSRM_ST)
return st_thread_self();
+#elif defined(BETHREADS)
+ return find_thread(NULL);
#endif
}
@@ -454,6 +463,10 @@ TSRM_API MUTEX_T tsrm_mutex_alloc(void)
mutexp = PIPlatform_allocLocalMutex();
#elif defined(TSRM_ST)
mutexp = st_mutex_new();
+#elif defined(BETHREADS)
+ mutexp = (beos_ben*)malloc(sizeof(beos_ben));
+ mutexp->ben = 0;
+ mutexp->sem = create_sem(1, "PHP sempahore");
#endif
#ifdef THR_DEBUG
printf("Mutex created thread: %d\n",mythreadid());
@@ -481,6 +494,9 @@ TSRM_API void tsrm_mutex_free(MUTEX_T mutexp)
PISync_delete(mutexp);
#elif defined(TSRM_ST)
st_mutex_destroy(mutexp);
+#elif defined(BETHREADS)
+ delete_sem(mutexp->sem);
+ free(mutexp);
#endif
}
#ifdef THR_DEBUG
@@ -508,6 +524,10 @@ TSRM_API int tsrm_mutex_lock(MUTEX_T mutexp)
return PISync_lock(mutexp);
#elif defined(TSRM_ST)
return st_mutex_lock(mutexp);
+#elif defined(BETHREADS)
+ if (atomic_add(&mutexp->ben, 1) != 0)
+ return acquire_sem(mutexp->sem);
+ return 0;
#endif
}
@@ -531,6 +551,10 @@ TSRM_API int tsrm_mutex_unlock(MUTEX_T mutexp)
return PISync_unlock(mutexp);
#elif defined(TSRM_ST)
return st_mutex_unlock(mutexp);
+#elif defined(BETHREADS)
+ if (atomic_add(&mutexp->ben, -1) != 1)
+ return release_sem(mutexp->sem);
+ return 0;
#endif
}
diff --git a/TSRM/TSRM.h b/TSRM/TSRM.h
index d13a4fd1cf..a80500d6db 100644
--- a/TSRM/TSRM.h
+++ b/TSRM/TSRM.h
@@ -47,6 +47,9 @@
# include <pthread.h>
#elif defined(TSRM_ST)
# include <st.h>
+#elif defined(BETHREADS)
+#include <kernel/OS.h>
+#include <TLS.h>
#endif
typedef int ts_rsrc_id;
@@ -73,6 +76,13 @@ typedef int ts_rsrc_id;
#elif defined(TSRM_ST)
# define THREAD_T st_thread_t
# define MUTEX_T st_mutex_t
+#elif defined(BETHREADS)
+# define THREAD_T thread_id
+typedef struct {
+ sem_id sem;
+ int32 ben;
+} beos_ben;
+# define MUTEX_T beos_ben *
#endif
typedef void (*ts_allocate_ctor)(void *, void ***);
diff --git a/TSRM/threads.m4 b/TSRM/threads.m4
index e0f934e556..790579656e 100644
--- a/TSRM/threads.m4
+++ b/TSRM/threads.m4
@@ -102,26 +102,31 @@ dnl -threads gcc (HP-UX)
dnl
AC_DEFUN(PTHREADS_CHECK,[
-save_CFLAGS=$CFLAGS
-save_LIBS=$LIBS
-PTHREADS_ASSIGN_VARS
-PTHREADS_CHECK_COMPILE
-LIBS=$save_LIBS
-CFLAGS=$save_CFLAGS
+if test "$beos_threads" = "1"; then
+ pthreads_working="yes"
+ ac_cv_pthreads_cflags=""
+else
+ save_CFLAGS=$CFLAGS
+ save_LIBS=$LIBS
+ PTHREADS_ASSIGN_VARS
+ PTHREADS_CHECK_COMPILE
+ LIBS=$save_LIBS
+ CFLAGS=$save_CFLAGS
-AC_CACHE_CHECK(for pthreads_cflags,ac_cv_pthreads_cflags,[
-ac_cv_pthreads_cflags=
-if test "$pthreads_working" != "yes"; then
- for flag in -kthread -pthread -pthreads -mthreads -Kthread -threads -mt -qthreaded; do
- ac_save=$CFLAGS
- CFLAGS="$CFLAGS $flag"
- PTHREADS_CHECK_COMPILE
- CFLAGS=$ac_save
- if test "$pthreads_working" = "yes"; then
- ac_cv_pthreads_cflags=$flag
- break
- fi
- done
+ AC_CACHE_CHECK(for pthreads_cflags,ac_cv_pthreads_cflags,[
+ ac_cv_pthreads_cflags=
+ if test "$pthreads_working" != "yes"; then
+ for flag in -kthread -pthread -pthreads -mthreads -Kthread -threads -mt -qthreaded; do
+ ac_save=$CFLAGS
+ CFLAGS="$CFLAGS $flag"
+ PTHREADS_CHECK_COMPILE
+ CFLAGS=$ac_save
+ if test "$pthreads_working" = "yes"; then
+ ac_cv_pthreads_cflags=$flag
+ break
+ fi
+ done
+ fi
fi
])
diff --git a/TSRM/tsrm.m4 b/TSRM/tsrm.m4
index 61462f1f96..f9f9e4dcd2 100644
--- a/TSRM/tsrm.m4
+++ b/TSRM/tsrm.m4
@@ -73,15 +73,19 @@ sinclude(TSRM/threads.m4)
AC_DEFUN(TSRM_CHECK_PTHREADS,[
PTHREADS_CHECK
-
-if test "$pthreads_working" != "yes"; then
- AC_MSG_ERROR(Your system seems to lack POSIX threads.)
-fi
-
-AC_DEFINE(PTHREADS, 1, Whether to use Pthreads)
-AC_MSG_CHECKING(for POSIX threads)
-AC_MSG_RESULT(yes)
+if test "$beos_threads" = "1"; then
+ AC_DEFINE(BETHREADS, 1, Whether to use native BeOS threads)
+else
+ if test "$pthreads_working" != "yes"; then
+ AC_MSG_ERROR(Your system seems to lack POSIX threads.)
+ fi
+
+ AC_DEFINE(PTHREADS, 1, Whether to use Pthreads)
+
+ AC_MSG_CHECKING(for POSIX threads)
+ AC_MSG_RESULT(yes)
+fi
])
diff --git a/TSRM/tsrm_virtual_cwd.c b/TSRM/tsrm_virtual_cwd.c
index bcfff1339c..31157aaae9 100644
--- a/TSRM/tsrm_virtual_cwd.c
+++ b/TSRM/tsrm_virtual_cwd.c
@@ -41,6 +41,10 @@
#include "tsrm_nw.h"
#endif
+#ifdef __BEOS__
+#define realpath(x,y) strcpy(y,x)
+#endif
+
#define VIRTUAL_CWD_DEBUG 0
#include "TSRM.h"
@@ -298,7 +302,7 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
if (path_length == 0)
return (0);
-#if !defined(TSRM_WIN32) && !defined(__BEOS__) && !defined(NETWARE)
+#if !defined(TSRM_WIN32) && !defined(NETWARE)
if (IS_ABSOLUTE_PATH(path, path_length)) {
if (realpath(path, resolved_path)) {
path = resolved_path;