added current context functions, made ThreadSafe public
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 17 Dec 1999 14:51:28 +0000 (14:51 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Fri, 17 Dec 1999 14:51:28 +0000 (14:51 +0000)
src/mesa/glapi/glapi.c
src/mesa/glapi/glapi.h

index 47dd1dfe4437105e1c946f2faeff474c265f5c2f..ed1a0c97da1d2f4fe3e939d852d7c5b8dba849c6 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: glapi.c,v 1.17 1999/12/17 12:20:23 brianp Exp $ */
+/* $Id: glapi.c,v 1.18 1999/12/17 14:51:28 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
 
 
 /* Flag to indicate whether thread-safe dispatch is enabled */
-static GLboolean ThreadSafe = GL_FALSE;
+GLboolean _glapi_ThreadSafe = GL_FALSE;
 
 /* This is used when thread safety is disabled */
 static struct _glapi_table *Dispatch = &__glapi_noop_table;
 
+/* Used when thread safety disabled */
+void *_glapi_CurrentContext = NULL;
+
 
 #if defined(THREADS)
 
@@ -66,6 +69,14 @@ static void dispatch_thread_init()
    _glthread_InitTSD(&DispatchTSD);
 }
 
+
+static _glthread_TSD ContextTSD;
+
+static void context_thread_init()
+{
+   _glthread_InitTSD(&ContextTSD);
+}
+
 #endif
 
 
@@ -84,7 +95,7 @@ void
 _glapi_check_multithread(void)
 {
 #if defined(THREADS)
-   if (!ThreadSafe) {
+   if (!_glapi_ThreadSafe) {
       static unsigned long knownID;
       static GLboolean firstCall = GL_TRUE;
       if (firstCall) {
@@ -92,10 +103,10 @@ _glapi_check_multithread(void)
          firstCall = GL_FALSE;
       }
       else if (knownID != _glthread_GetID()) {
-         ThreadSafe = GL_TRUE;
+         _glapi_ThreadSafe = GL_TRUE;
       }
    }
-   if (ThreadSafe) {
+   if (_glapi_ThreadSafe) {
       /* make sure that this thread's dispatch pointer isn't null */
       if (!_glapi_get_dispatch()) {
          _glapi_set_dispatch(NULL);
@@ -106,6 +117,49 @@ _glapi_check_multithread(void)
 
 
 
+/*
+ * Set the current context pointer for this thread.
+ * The context pointer is an opaque type which should be cast to
+ * void from the real context pointer type.
+ */
+void
+_glapi_set_current_context(void *context)
+{
+#if defined(THREADS)
+   _glthread_SetTSD(&ContextTSD, context, context_thread_init);
+   if (_glapi_ThreadSafe)
+      _glapi_CurrentContext = NULL;  /* to help with debugging */
+   else
+      _glapi_CurrentContext = context;
+#else
+   _glapi_CurrentContext = context;
+#endif
+}
+
+
+
+/*
+ * Get the current context pointer for this thread.
+ * The context pointer is an opaque type which should be cast from
+ * void to the real context pointer type.
+ */
+void *
+_glapi_get_current_context(void)
+{
+#if defined(THREADS)
+   if (_glapi_ThreadSafe) {
+      return _glthread_GetTSD(&ContextTSD);
+   }
+   else {
+      return _glapi_CurrentContext;
+   }
+#else
+   return _glapi_CurrentContext;
+#endif
+}
+
+
+
 /*
  * Set the global or per-thread dispatch table pointer.
  */
@@ -124,7 +178,7 @@ _glapi_set_dispatch(struct _glapi_table *dispatch)
 
 #if defined(THREADS)
    _glthread_SetTSD(&DispatchTSD, (void*) dispatch, dispatch_thread_init);
-   if (ThreadSafe)
+   if (_glapi_ThreadSafe)
       Dispatch = NULL;  /* to help with debugging */
    else
       Dispatch = dispatch;
@@ -142,7 +196,7 @@ struct _glapi_table *
 _glapi_get_dispatch(void)
 {
 #if defined(THREADS)
-   if (ThreadSafe) {
+   if (_glapi_ThreadSafe) {
       return (struct _glapi_table *) _glthread_GetTSD(&DispatchTSD);
    }
    else {
@@ -453,7 +507,7 @@ _glapi_check_table(const struct _glapi_table *table)
 
 #define DISPATCH_SETUP                 \
    const struct _glapi_table *dispatch;        \
-   if (ThreadSafe) {                   \
+   if (_glapi_ThreadSafe) {            \
       dispatch = _glapi_get_dispatch();        \
    }                                   \
    else {                              \
index 9f12b2c08ef86052a55379c605ff7bf4d4509c2f..5486819da53fafb4ba1677c03f04b857be6f1ee0 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: glapi.h,v 1.10 1999/12/16 17:33:44 brianp Exp $ */
+/* $Id: glapi.h,v 1.11 1999/12/17 14:51:29 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
 struct _glapi_table;
 
 
+extern GLboolean _glapi_ThreadSafe;
+
+extern void *_glapi_CurrentContext;
+
+
 extern void
 _glapi_check_multithread(void);
 
 
+extern void
+_glapi_set_current_context(void *context);
+
+
+extern void *
+_glapi_get_current_context(void);
+
+
 extern void
 _glapi_set_dispatch(struct _glapi_table *dispatch);