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