diff --git a/dix/main.c b/dix/main.c index fbd64138e..b4000bd71 100644 --- a/dix/main.c +++ b/dix/main.c @@ -238,6 +238,12 @@ static int indexForScanlinePad[ 65 ] = { #endif #ifdef XQUARTZ +#include + +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[]) @@ -428,6 +434,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 1762d5490..88eda10fa 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 #endif -#ifdef XQUARTZ -#include -static pthread_mutex_t miEventQueueMutex = PTHREAD_MUTEX_INITIALIZER; -#endif - # define NEED_EVENTS # include # include @@ -84,6 +79,25 @@ typedef struct _EventQueue { static EventQueueRec miEventQueue; +#ifdef XQUARTZ +#include +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;