From 26d31ad1c7f4c550d73419ecf76912d844186b30 Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Date: Tue, 5 Aug 2008 15:14:08 -0700 Subject: [PATCH] XQuartz: Added code and made comments more helpful for debugging first-client-auth bug. (cherry picked from commit a8f0d32216e321b8ae6da182be9b1ea792f6e004) --- hw/xquartz/darwinEvents.c | 33 +++++++++++++++++++++++---- hw/xquartz/darwinEvents.h | 3 --- hw/xquartz/mach-startup/bundle-main.c | 10 ++++---- hw/xquartz/mach-startup/stub.c | 12 +++++----- 4 files changed, 40 insertions(+), 18 deletions(-) diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c index da10e208e..9b39baab4 100644 --- a/hw/xquartz/darwinEvents.c +++ b/hw/xquartz/darwinEvents.c @@ -83,12 +83,28 @@ static int old_flags = 0; // last known modifier state static int fd_add[FD_ADD_MAX]; int fd_add_count = 0; static pthread_mutex_t fd_add_lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t fd_add_ready_cond = PTHREAD_COND_INITIALIZER; +static pthread_t fd_add_tid = NULL; static xEvent *darwinEvents = NULL; static pthread_mutex_t mieq_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t mieq_ready_cond = PTHREAD_COND_INITIALIZER; +/*** Pthread Magics ***/ +static pthread_t create_thread(void *func, void *arg) { + pthread_attr_t attr; + pthread_t tid; + + pthread_attr_init (&attr); + pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM); + pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); + pthread_create (&tid, &attr, func, arg); + pthread_attr_destroy (&attr); + + return tid; +} + static inline void darwinEvents_lock(void) { int err; if((err = pthread_mutex_lock(&mieq_lock))) { @@ -339,18 +355,21 @@ void DarwinListenOnOpenFD(int fd) { else ErrorF("FD Addition buffer at max. Dropping fd addition request.\n"); + pthread_cond_broadcast(&fd_add_ready_cond); pthread_mutex_unlock(&fd_add_lock); #else xquartz_launchd_fd = fd; #endif } -void DarwinProcessFDAdditionQueue() { +static void DarwinProcessFDAdditionQueue_thread(void *args) { pthread_mutex_lock(&fd_add_lock); - while(fd_add_count) { - DarwinSendDDXEvent(kXquartzListenOnOpenFD, 1, fd_add[--fd_add_count]); + while(true) { + while(fd_add_count) { + DarwinSendDDXEvent(kXquartzListenOnOpenFD, 1, fd_add[--fd_add_count]); + } + pthread_cond_wait(&fd_add_ready_cond, &fd_add_lock); } - pthread_mutex_unlock(&fd_add_lock); } static void kXquartzListenOnOpenFDHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, int nevents) { @@ -358,7 +377,8 @@ static void kXquartzListenOnOpenFDHandler(int screenNum, xEventPtr xe, DeviceInt TA_SERVER(); for (i=0; i