BeOS thread support (Philippe Houdoin)
authorBrian Paul <brian.paul@tungstengraphics.com>
Mon, 12 Nov 2001 23:50:12 +0000 (23:50 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Mon, 12 Nov 2001 23:50:12 +0000 (23:50 +0000)
src/mesa/glapi/glthread.c
src/mesa/glapi/glthread.h

index 16b3336b9f4b668a39889c068ddfa3aca4bb6a0d..778fa4873c89ca1863df59d87f3ee0715201c89b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: glthread.c,v 1.8 2001/03/12 00:48:38 gareth Exp $ */
+/* $Id: glthread.c,v 1.9 2001/11/12 23:50:12 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -292,6 +292,46 @@ _glthread_SetTSD(_glthread_TSD *tsd, void *ptr)
 
 
 
+/*
+ * BeOS threads
+ */
+#ifdef BEOS_THREADS
+
+unsigned long
+_glthread_GetID(void)
+{
+   return (unsigned long) find_thread(NULL);
+}
+
+void
+_glthread_InitTSD(_glthread_TSD *tsd)
+{
+   tsd->key = tls_allocate();
+   tsd->initMagic = INIT_MAGIC;
+}
+
+void *
+_glthread_GetTSD(_glthread_TSD *tsd)
+{
+   if (tsd->initMagic != (int) INIT_MAGIC) {
+      _glthread_InitTSD(tsd);
+   }
+   return tls_get(tsd->key);
+}
+
+void
+_glthread_SetTSD(_glthread_TSD *tsd, void *ptr)
+{
+   if (tsd->initMagic != (int) INIT_MAGIC) {
+      _glthread_InitTSD(tsd);
+   }
+   tls_set(tsd->key, ptr);
+}
+
+#endif /* BEOS_THREADS */
+
+
+
 #else  /* THREADS */
 
 
index 639c46e427e2a0663875902849f1eca85188f82a..9ac51aef8216651042e767fb23fc9ca51a4d03b2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: glthread.h,v 1.8 2001/03/12 00:48:38 gareth Exp $ */
+/* $Id: glthread.h,v 1.9 2001/11/12 23:50:12 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -202,6 +202,39 @@ typedef xmutex_rec _glthread_Mutex;
 
 
 
+/*
+ * BeOS threads. R5.x required.
+ */
+#ifdef BEOS_THREADS
+#include <kernel/OS.h>
+#include <support/TLS.h>
+
+typedef struct {
+   int32        key;
+   int          initMagic;
+} _glthread_TSD;
+
+typedef thread_id _glthread_Thread;
+
+/* Use Benaphore, aka speeder semaphore */
+typedef struct {
+    int32   lock;
+    sem_id  sem;
+} benaphore;
+typedef benaphore _glthread_Mutex;
+
+#define _glthread_DECLARE_STATIC_MUTEX(name)  static _glthread_Mutex name = { 0,
+create_sem(0, #name"_benaphore") }
+#define _glthread_INIT_MUTEX(name)    name.sem = create_sem(0,
+#name"_benaphore"), name.lock = 0
+#define _glthread_LOCK_MUTEX(name)    if((atomic_add(&(name.lock), 1)) >= 1)
+acquire_sem(name.sem)
+#define _glthread_UNLOCK_MUTEX(name)  if((atomic_add(&(name.lock), -1)) > 1)
+release_sem(name.sem)
+
+#endif /* BEOS_THREADS */
+
+
 
 #ifndef THREADS