summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMatthieu Herrb <matthieu@cvs.openbsd.org>2007-11-26 15:10:20 +0000
committerMatthieu Herrb <matthieu@cvs.openbsd.org>2007-11-26 15:10:20 +0000
commitaa7166e35549c4430392bd941a3ccfec192e2872 (patch)
tree5ca44ae85fd664e68f4a5d1455846e56ba21c827 /lib
parentb83cd4bcb4274dd56b5ea1d199151e093350a8ef (diff)
Re-enable pthread support in libGL, by providing proper weak stubs in
libX11 (together with other pthread stubs, already there for libX11). ok kurt@, art@, kettenis@
Diffstat (limited to 'lib')
-rw-r--r--lib/libGL/Makefile8
-rw-r--r--lib/libX11/Makefile.bsd-wrapper4
-rw-r--r--lib/libX11/src/UIThrStubs.c73
3 files changed, 76 insertions, 9 deletions
diff --git a/lib/libGL/Makefile b/lib/libGL/Makefile
index 969310729..149db7ed5 100644
--- a/lib/libGL/Makefile
+++ b/lib/libGL/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.10 2007/11/25 10:18:21 matthieu Exp $
+# $OpenBSD: Makefile,v 1.11 2007/11/26 15:10:19 matthieu Exp $
all: ${OBJS}
LIB= GL
@@ -35,9 +35,15 @@ CPPFLAGS+= \
-I${X11BASE}/include \
-I${X11BASE}/include/drm \
-DGLX_INDIRECT_RENDERING \
+ -DPTHREADS \
-DHAVE_ALIAS \
-D_REENTRANT
+.if ${XENOCARA_BUILD_DRI} == "y"
+CPPFLAGS+= \
+ -DGLX_DIRECT_RENDERING
+.endif
+
.if ${MACHINE_ARCH} == "i386"
CPPFLAGS += \
-DUSE_X86_ASM \
diff --git a/lib/libX11/Makefile.bsd-wrapper b/lib/libX11/Makefile.bsd-wrapper
index b2369cecf..0a42e0f2d 100644
--- a/lib/libX11/Makefile.bsd-wrapper
+++ b/lib/libX11/Makefile.bsd-wrapper
@@ -1,6 +1,6 @@
-# $OpenBSD: Makefile.bsd-wrapper,v 1.4 2007/09/30 10:35:10 matthieu Exp $
+# $OpenBSD: Makefile.bsd-wrapper,v 1.5 2007/11/26 15:10:19 matthieu Exp $
-SHARED_LIBS= X11 11.0
+SHARED_LIBS= X11 11.1
CONFIGURE_ARGS= --without-xcb --enable-tcp-transport --enable-unix-transport --enable-IPv6
diff --git a/lib/libX11/src/UIThrStubs.c b/lib/libX11/src/UIThrStubs.c
index 13df9e7ce..50da0e4c6 100644
--- a/lib/libX11/src/UIThrStubs.c
+++ b/lib/libX11/src/UIThrStubs.c
@@ -48,6 +48,11 @@
* distinguishing each of the drafts.
*/
+static int _Xthr_once_stub_(void *, void (*)(void));
+static int _Xthr_key_create_stub_(unsigned int *, void (*)(void *));
+static int _Xthr_setspecific_stub_(unsigned int, const void *);
+static void *_Xthr_getspecific_stub_(unsigned int);
+
#ifdef CTHREADS
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -113,9 +118,10 @@ int pthread_cond_destroy() __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
int pthread_cond_wait() __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
int pthread_cond_signal() __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
int pthread_cond_broadcast() __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
-int pthread_key_create() __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
-void *pthread_getspecific() __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
-int pthread_setspecific() __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
+int pthread_key_create() __attribute__ ((weak, alias ("_Xthr_key_create_stub_")));
+void *pthread_getspecific() __attribute__ ((weak, alias ("_Xthr_getspecific_stub_")));
+int pthread_setspecific() __attribute__ ((weak, alias ("_Xthr_setspecific_stub_")));
+int pthread_once() __attribute__ ((weak, alias ("_Xthr_once_stub_")));
#else /* __GNUC__ */
#pragma weak pthread_self = _Xthr_self_stub_
#pragma weak pthread_mutex_init = _Xthr_zero_stub_
@@ -128,9 +134,10 @@ int pthread_setspecific() __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
#pragma weak pthread_cond_signal = _Xthr_zero_stub_
#pragma weak pthread_cond_broadcast = _Xthr_zero_stub_
/* These are added for libGL */
-#pragma weak pthread_key_create = _Xthr_zero_stub_
-#pragma weak pthread_getspecific = _Xthr_zero_stub_
-#pragma weak pthread_setspecific = _Xthr_zero_stub_
+#pragma weak pthread_key_create = _Xthr_key_create_stub_
+#pragma weak pthread_getspecific = _Xthr_getspecific_stub_
+#pragma weak pthread_setspecific = _Xthr_setspecific_stub_
+#pragam weak pthread_once = _Xthr_once_stub_
#endif /* __GNUC__ */
#if defined(_DECTHREADS_) || defined(linux)
#pragma weak pthread_equal = _Xthr_equal_stub_ /* See Xthreads.h! */
@@ -158,3 +165,57 @@ _Xthr_zero_stub_()
{
return(0);
}
+
+static int
+_Xthr_once_stub_(void *id, void (*routine)(void))
+{
+ static int done = 0;
+
+ if (!done) {
+ routine();
+ done++;
+ }
+}
+
+#include <errno.h>
+
+#define XTHR_KEYS_CHUNK 100
+
+static void **_Xthr_keys_ = NULL;
+static unsigned int _Xthr_last_key_ = 0;
+
+static int
+_Xthr_key_create_stub_(unsigned int *key, void (*destructor)(void *))
+{
+ void **tmp;
+
+ if ((_Xthr_last_key_ % XTHR_KEYS_CHUNK) == 0) {
+ tmp = recalloc(_Xthr_keys_, 1,
+ _Xthr_last_key_ + XTHR_KEYS_CHUNK*sizeof(void *));
+ if (tmp == NULL) {
+ free(_Xthr_keys_);
+ return ENOMEM;
+ }
+ _Xthr_keys_ = tmp;
+ }
+ *key = _Xthr_last_key_++;
+ return 0;
+}
+
+static int
+_Xthr_setspecific_stub_(unsigned int key, const void *value)
+{
+ if (_Xthr_last_key_ == 0 || key >= _Xthr_last_key_)
+ return EINVAL;
+ _Xthr_keys_[key] = value;
+ return 0;
+}
+
+static void *
+_Xthr_getspecific_stub_(unsigned int key)
+{
+ if (_Xthr_last_key_ == 0 || key >= _Xthr_last_key_)
+ return NULL;
+ return(_Xthr_keys_[key]);
+}
+