summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>1999-12-16 17:31:59 +0000
committerBrian Paul <[email protected]>1999-12-16 17:31:59 +0000
commitbb72d326a0c5f24a05bb586d64fbacc6b8172048 (patch)
tree60132b2260f1e4ce9114bf3036a927e1cd31d906
parentc11371a4e5a600a0c3a5b8e052ff4b4e4fb22820 (diff)
thread support now works
-rw-r--r--src/mesa/glapi/glapi.c110
-rw-r--r--src/mesa/glapi/glapi.h10
2 files changed, 85 insertions, 35 deletions
diff --git a/src/mesa/glapi/glapi.c b/src/mesa/glapi/glapi.c
index fc782f734fd..da8d1237756 100644
--- a/src/mesa/glapi/glapi.c
+++ b/src/mesa/glapi/glapi.c
@@ -1,4 +1,4 @@
-/* $Id: glapi.c,v 1.14 1999/12/16 12:38:11 brianp Exp $ */
+/* $Id: glapi.c,v 1.15 1999/12/16 17:31:59 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -44,39 +44,78 @@
#include "glapioffsets.h"
#include "glapitable.h"
+#include <stdio.h>
+
/* Flag to indicate whether thread-safe dispatch is enabled */
-static GLboolean ThreadSafe = GL_TRUE;
+static GLboolean ThreadSafe = GL_FALSE;
/* This is used when thread safety is disabled */
static struct _glapi_table *Dispatch = &__glapi_noop_table;
#if defined(THREADS)
-#include "mthreads.h"
-static MesaTSD mesa_dispatch_tsd;
-static void mesa_dispatch_thread_init() {
- MesaInitTSD(&mesa_dispatch_tsd);
+
+#include "glthread.h"
+
+static _glthread_TSD DispatchTSD;
+
+static void dispatch_thread_init()
+{
+ _glthread_InitTSD(&DispatchTSD);
}
+
#endif
-#define DISPATCH_SETUP \
- const struct _glapi_table *dispatch; \
- if (ThreadSafe) { \
- dispatch = _glapi_get_dispatch(); \
- } \
- else { \
- dispatch = Dispatch; \
+static GLuint MaxDispatchOffset = sizeof(struct _glapi_table) / sizeof(void *) - 1;
+static GLboolean GetSizeCalled = GL_FALSE;
+
+
+
+/*
+ * We should call this periodically from a function such as glXMakeCurrent
+ * in order to test if multiple threads are being used. When we detect
+ * that situation we should then call _glapi_enable_thread_safety()
+ */
+void
+_glapi_check_multithread(void)
+{
+#if defined(THREADS)
+ if (!ThreadSafe) {
+ static unsigned long knownID;
+ static GLboolean firstCall = GL_TRUE;
+ if (firstCall) {
+ knownID = _glthread_GetID();
+ firstCall = GL_FALSE;
+ }
+ else if (knownID != _glthread_GetID()) {
+ ThreadSafe = GL_TRUE;
+ }
+ }
+ if (ThreadSafe) {
+ /* make sure that this thread's dispatch pointer isn't null */
+ if (!_glapi_get_dispatch()) {
+ _glapi_set_dispatch(NULL);
+ }
}
+#endif
+}
-#define DISPATCH(FUNC, ARGS) (dispatch->FUNC) ARGS
-static GLuint MaxDispatchOffset = sizeof(struct _glapi_table) / sizeof(void *);
-static GLboolean GetSizeCalled = GL_FALSE;
+/*
+ * Enable thread safe mode. Once enabled, can't be disabled.
+ */
+void
+_glapi_enable_thread_safety(void)
+{
+ ThreadSafe = GL_TRUE;
+}
+
+
/*
@@ -96,22 +135,26 @@ _glapi_set_dispatch(struct _glapi_table *dispatch)
#endif
#if defined(THREADS)
- MesaSetTSD(&mesa_dispatch_tsd, (void*) dispatch, mesa_dispatch_thread_init);
+ _glthread_SetTSD(&DispatchTSD, (void*) dispatch, dispatch_thread_init);
#else
Dispatch = dispatch;
#endif
}
+
/*
- * Get the global or per-thread dispatch table pointer.
+ * Return pointer to current dispatch table for calling thread.
*/
struct _glapi_table *
_glapi_get_dispatch(void)
{
#if defined(THREADS)
- /* return this thread's dispatch pointer */
- return (struct _glapi_table *) MesaGetTSD(&mesa_dispatch_tsd);
+ if (ThreadSafe) {
+ return (struct _glapi_table *) _glthread_GetTSD(&DispatchTSD);
+ }
+ else
+ return Dispatch;
#else
return Dispatch;
#endif
@@ -119,14 +162,6 @@ _glapi_get_dispatch(void)
-void
-_glapi_enable_thread_safety(void)
-{
- ThreadSafe = GL_TRUE;
-}
-
-
-
/*
* Return size of dispatch table struct as number of functions (or
* slots).
@@ -196,7 +231,7 @@ get_static_proc_address(const char *funcName)
/**********************************************************************
* Extension function management.
- **********************************************************************/
+ */
struct _glapi_ext_entrypoint {
@@ -410,7 +445,7 @@ _glapi_check_table(const struct _glapi_table *table)
-/*
+/**********************************************************************
* Generate the GL entrypoint functions here.
*/
@@ -422,6 +457,21 @@ _glapi_check_table(const struct _glapi_table *table)
#define NAME(func) gl##func
#endif
+#define DISPATCH_SETUP \
+ const struct _glapi_table *dispatch; \
+ if (ThreadSafe) { \
+ dispatch = _glapi_get_dispatch(); \
+ assert(dispatch); \
+ } \
+ else { \
+ dispatch = Dispatch; \
+ }
+
+#define DISPATCH(FUNC, ARGS) (dispatch->FUNC) ARGS
+
+
+
+
#include "glapitemp.h"
diff --git a/src/mesa/glapi/glapi.h b/src/mesa/glapi/glapi.h
index 8cc86a3c2df..e1114820faa 100644
--- a/src/mesa/glapi/glapi.h
+++ b/src/mesa/glapi/glapi.h
@@ -1,4 +1,4 @@
-/* $Id: glapi.h,v 1.8 1999/12/16 12:38:54 brianp Exp $ */
+/* $Id: glapi.h,v 1.9 1999/12/16 17:31:59 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -36,6 +36,10 @@ struct _glapi_table;
extern void
+_glapi_check_multithread(void);
+
+
+extern void
_glapi_set_dispatch(struct _glapi_table *dispatch);
@@ -43,10 +47,6 @@ extern struct _glapi_table *
_glapi_get_dispatch(void);
-extern void
-_glapi_enable_thread_safety(void);
-
-
extern GLuint
_glapi_get_dispatch_table_size(void);