xserver: Branch 'xorg-server-1.6-apple' - 2 commits
Jeremy Huddleston
jeremyhu at kemper.freedesktop.org
Fri Jan 16 13:55:15 PST 2009
dix/main.c | 14 ++++++++++++++
mi/mieq.c | 36 ++++++++++++++++++++++--------------
2 files changed, 36 insertions(+), 14 deletions(-)
New commits:
commit 94e417ac87a98cd5c6bf2d7c495d702748398931
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date: Fri Jan 16 13:54:08 2009 -0800
XQuartz: mieq: Wait for the server to finish initializing before letting other threads mieqEnqueue
Avoid possible race condition whereby one thread might call mieqEnqueue before InitAndStartDevices finishes
diff --git a/dix/main.c b/dix/main.c
index ee2e10d..0527621 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -234,6 +234,12 @@ static int indexForScanlinePad[ 65 ] = {
#endif
#ifdef XQUARTZ
+#include <pthread.h>
+
+BOOL serverInitComplete = FALSE;
+pthread_mutex_t serverInitCompleteMutex = PTHREAD_MUTEX_INITIALIZER;
+pthread_cond_t serverInitCompleteCond = PTHREAD_COND_INITIALIZER;
+
int dix_main(int argc, char *argv[], char *envp[])
#else
int main(int argc, char *argv[], char *envp[])
@@ -378,6 +384,14 @@ int main(int argc, char *argv[], char *envp[])
}
}
+#ifdef XQUARTZ
+ /* Let the other threads know the server is done with its init */
+ pthread_mutex_lock(&serverInitCompleteMutex);
+ serverInitComplete = TRUE;
+ pthread_cond_broadcast(&serverInitCompleteCond);
+ pthread_mutex_unlock(&serverInitCompleteMutex);
+#endif
+
NotifyParentProcess();
Dispatch();
diff --git a/mi/mieq.c b/mi/mieq.c
index 15ba8e7..8d68ca1 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -36,11 +36,6 @@ in this Software without prior written authorization from The Open Group.
#include <dix-config.h>
#endif
-#ifdef XQUARTZ
-#include <pthread.h>
-static pthread_mutex_t miEventQueueMutex = PTHREAD_MUTEX_INITIALIZER;
-#endif
-
# define NEED_EVENTS
# include <X11/X.h>
# include <X11/Xmd.h>
@@ -87,6 +82,25 @@ typedef struct _EventQueue {
static EventQueueRec miEventQueue;
static EventListPtr masterEvents; /* for use in mieqProcessInputEvents */
+#ifdef XQUARTZ
+#include <pthread.h>
+static pthread_mutex_t miEventQueueMutex = PTHREAD_MUTEX_INITIALIZER;
+
+extern BOOL serverInitComplete;
+extern pthread_mutex_t serverInitCompleteMutex;
+extern pthread_cond_t serverInitCompleteCond;
+
+static inline void wait_for_server_init(void) {
+ /* If the server hasn't finished initializing, wait for it... */
+ if(!serverInitComplete) {
+ pthread_mutex_lock(&serverInitCompleteMutex);
+ while(!serverInitComplete)
+ pthread_cond_wait(&serverInitCompleteCond, &serverInitCompleteMutex);
+ pthread_mutex_unlock(&serverInitCompleteMutex);
+ }
+}
+#endif
+
Bool
mieqInit(void)
{
@@ -145,6 +159,7 @@ mieqEnqueue(DeviceIntPtr pDev, xEvent *e)
int evlen;
#ifdef XQUARTZ
+ wait_for_server_init();
pthread_mutex_lock(&miEventQueueMutex);
#endif
commit e917a1cd30f720e6e51253c5041f02232522c9af
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date: Fri Jan 16 13:20:44 2009 -0800
Revert "mieq: Avoid possible race condition whereby one thread might call mieqEnqueue before InitAndStartDevices finishes"
This reverts commit 3c596c061e75848cfa76dd9259c23a3f3a67444c.
Gonna do this in a less hackish way using a notification that the server is done initializing first.
diff --git a/mi/mieq.c b/mi/mieq.c
index 43cd0e7..15ba8e7 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -248,14 +248,7 @@ mieqEnqueue(DeviceIntPtr pDev, xEvent *e)
evt->event->u.keyButtonPointer.time = miEventQueue.lastEventTime;
miEventQueue.lastEventTime = evt->event->u.keyButtonPointer.time;
-
- /* Avoid possible crash when multithreaded and mieqEnqueue is called before
- * InitAndStartDevices finishes.
- */
- if(pDev && pDev->spriteInfo && pDev->spriteInfo->sprite)
- miEventQueue.events[oldtail].pScreen = EnqueueScreen(pDev);
- else
- miEventQueue.events[oldtail].pScreen = NULL;
+ miEventQueue.events[oldtail].pScreen = EnqueueScreen(pDev);
miEventQueue.events[oldtail].pDev = pDev;
miEventQueue.lastMotion = isMotion;
@@ -408,7 +401,7 @@ mieqProcessInputEvents(void)
/* Custom event handler */
handler = miEventQueue.handlers[type];
- if (screen && screen != DequeueScreen(dev) && !handler) {
+ if (screen != DequeueScreen(dev) && !handler) {
/* Assumption - screen switching can only occur on motion events. */
DequeueScreen(dev) = screen;
x = event->u.keyButtonPointer.rootX;
More information about the xorg-commit
mailing list