different methods that can be used:</p>
<ol>
+<li>Using <tt>_glapi_Dispatch</tt> directly in builds for non-multithreaded
+environments.</li>
<li>Using <tt>_glapi_Dispatch</tt> and <tt>_glapi_get_dispatch</tt> in
multithreaded environments.</li>
<li>Using <tt>_glapi_Dispatch</tt> and <tt>pthread_getspecific</tt> in
few preprocessor defines.</p>
<ul>
-<li>If <tt>GLX_USE_TLS</tt> is defined, method #3 is used.</li>
-<li>If <tt>HAVE_PTHREAD</tt> is defined, method #2 is used.</li>
+<li>If <tt>GLX_USE_TLS</tt> is defined, method #4 is used.</li>
+<li>If <tt>HAVE_PTHREAD</tt> is defined, method #3 is used.</li>
+<li>If <tt>WIN32_THREADS</tt> is defined, method #2 is used.</li>
<li>If none of the preceding are defined, method #1 is used.</li>
</ul>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
-#include <pthread.h>
#include <stdint.h>
#include "GL/glxproto.h"
#include "glxconfig.h"
#include "glxhash.h"
+#if defined( HAVE_PTHREAD )
+# include <pthread.h>
+#endif
#include "util/macros.h"
#include "glxextensions.h"
extern int __glXDebug;
/* This is per-thread storage in an MT environment */
+#if defined( HAVE_PTHREAD )
extern void __glXSetCurrentContext(struct glx_context * c);
# endif /* defined( GLX_USE_TLS ) */
+#else
+
+extern struct glx_context *__glXcurrentContext;
+#define __glXGetCurrentContext() __glXcurrentContext
+#define __glXSetCurrentContext(gc) __glXcurrentContext = gc
+
+#endif /* defined( HAVE_PTHREAD ) */
+
extern void __glXSetCurrentContextNull(void);
** Global lock for all threads in this address space using the GLX
** extension
*/
+#if defined( HAVE_PTHREAD )
extern pthread_mutex_t __glXmutex;
#define __glXLock() pthread_mutex_lock(&__glXmutex)
#define __glXUnlock() pthread_mutex_unlock(&__glXmutex)
+#else
+#define __glXLock()
+#define __glXUnlock()
+#endif
/*
** Setup for a command. Initialize the extension for dpy if necessary.
* Client-side GLX interface for current context management.
*/
+#ifdef HAVE_PTHREAD
#include <pthread.h>
+#endif
#include "glxclient.h"
* Current context management and locking
*/
+#if defined( HAVE_PTHREAD )
+
_X_HIDDEN pthread_mutex_t __glXmutex = PTHREAD_MUTEX_INITIALIZER;
# if defined( GLX_USE_TLS )
# endif /* defined( GLX_USE_TLS ) */
+#else
+
+/* not thread safe */
+_X_HIDDEN struct glx_context *__glXcurrentContext = &dummyContext;
+
+#endif
+
_X_HIDDEN void
__glXSetCurrentContextNull(void)
__thread void *__glX_tls_Context = NULL;
-#if !defined(GLX_USE_TLS)
+#if defined(HAVE_PTHREAD) && !defined(GLX_USE_TLS)
extern "C" struct glx_context *
__glXGetCurrentContext()
{