xserver: Branch 'xorg-server-1.4-apple'

Jeremy Huddleston jeremyhu at kemper.freedesktop.org
Fri Jan 16 14:07:12 PST 2009


 dix/main.c |   14 ++++++++++++++
 mi/mieq.c  |   25 ++++++++++++++++++++-----
 2 files changed, 34 insertions(+), 5 deletions(-)

New commits:
commit 035c36ffa5da9d3c1bb98531977215e725684631
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Fri Jan 16 14:06:46 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
    (cherry picked from commit 94e417ac87a98cd5c6bf2d7c495d702748398931)

diff --git a/dix/main.c b/dix/main.c
index 76f9871..ebc4a68 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -242,6 +242,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[])
@@ -445,6 +451,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
+
 	Dispatch();
 
 	/* Now free up whatever must be freed */
diff --git a/mi/mieq.c b/mi/mieq.c
index 6559158..79f5981 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>
@@ -84,6 +79,25 @@ typedef struct _EventQueue {
 
 static EventQueueRec miEventQueue;
 
+#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)
 {
@@ -111,6 +125,7 @@ void
 mieqEnqueue(DeviceIntPtr pDev, xEvent *e)
 {
 #ifdef XQUARTZ
+    wait_for_server_init();
     pthread_mutex_lock(&miEventQueueMutex);
 #endif
     unsigned int           oldtail = miEventQueue.tail;


More information about the xorg-commit mailing list