diff options
author | Jeremy Huddleston <jeremyhu@freedesktop.org> | 2008-04-28 11:47:49 -0700 |
---|---|---|
committer | Jeremy Huddleston <jeremyhu@freedesktop.org> | 2008-04-28 11:49:19 -0700 |
commit | e9734306088e12f2cd68bf347ecf8415be4f0268 (patch) | |
tree | 965436e7dee15bd9c27d131b0d139b5bf5be0c60 | |
parent | 4b46fc931e61bec0abd6a86062e46dd7a408e745 (diff) |
XQuartz: More startup / threading house cleaning.
(cherry picked from commit 72653c24c00dfba64ce35a3d400598bcd77defc1)
-rw-r--r-- | hw/xquartz/X11Application.h | 2 | ||||
-rw-r--r-- | hw/xquartz/X11Application.m | 7 | ||||
-rw-r--r-- | hw/xquartz/X11Controller.h | 2 | ||||
-rw-r--r-- | hw/xquartz/X11Controller.m | 4 | ||||
-rw-r--r-- | hw/xquartz/quartz.h | 1 | ||||
-rw-r--r-- | hw/xquartz/quartzStartup.c | 50 |
6 files changed, 28 insertions, 38 deletions
diff --git a/hw/xquartz/X11Application.h b/hw/xquartz/X11Application.h index 3869df92f..8e7fed23b 100644 --- a/hw/xquartz/X11Application.h +++ b/hw/xquartz/X11Application.h @@ -71,7 +71,7 @@ void X11ApplicationSetCanQuit (int state); void X11ApplicationServerReady (void); void X11ApplicationShowHideMenubar (int state); -void X11ApplicationMain(int argc, const char **argv); +void X11ApplicationMain(int argc, char **argv, char **envp); extern int X11EnableKeyEquivalents; extern int quartzHasRoot, quartzEnableRootless; diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m index 76804373e..e10e71e10 100644 --- a/hw/xquartz/X11Application.m +++ b/hw/xquartz/X11Application.m @@ -47,9 +47,6 @@ #include <mach/mach.h> #include <unistd.h> -#include <pthread.h> -extern pthread_cond_t server_can_start_cond; - #define DEFAULTS_FILE "/usr/X11/lib/X11/xserver/Xquartz.plist" int X11EnableKeyEquivalents = TRUE; @@ -776,7 +773,7 @@ environment?", @"Startup xinitrc dialog"); [X11App prefs_synchronize]; } -void X11ApplicationMain (int argc, const char **argv) { +void X11ApplicationMain (int argc, char **argv, char **envp) { NSAutoreleasePool *pool; #ifdef DEBUG @@ -804,7 +801,7 @@ void X11ApplicationMain (int argc, const char **argv) { NSMaxY([[NSScreen mainScreen] visibleFrame]); /* Tell the server thread that it can proceed */ - pthread_cond_broadcast(&server_can_start_cond); + QuartzInitServer(argc, argv, envp); [NSApp run]; /* not reached */ diff --git a/hw/xquartz/X11Controller.h b/hw/xquartz/X11Controller.h index d33752ead..7942bc44b 100644 --- a/hw/xquartz/X11Controller.h +++ b/hw/xquartz/X11Controller.h @@ -100,6 +100,6 @@ #endif /* __OBJC__ */ -void X11ControllerMain(int argc, const char **argv); +void X11ControllerMain(int argc, char **argv, char **envp); #endif /* X11CONTROLLER_H */ diff --git a/hw/xquartz/X11Controller.m b/hw/xquartz/X11Controller.m index 01470e55f..df328f38c 100644 --- a/hw/xquartz/X11Controller.m +++ b/hw/xquartz/X11Controller.m @@ -756,6 +756,6 @@ objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row @end -void X11ControllerMain(int argc, const char **argv) { - X11ApplicationMain (argc, argv); +void X11ControllerMain(int argc, char **argv, char **envp) { + X11ApplicationMain (argc, argv, envp); } diff --git a/hw/xquartz/quartz.h b/hw/xquartz/quartz.h index e11602391..1b6d71f20 100644 --- a/hw/xquartz/quartz.h +++ b/hw/xquartz/quartz.h @@ -128,6 +128,7 @@ Bool QuartzAddScreen(int index, ScreenPtr pScreen); Bool QuartzSetupScreen(int index, ScreenPtr pScreen); void QuartzInitOutput(int argc,char **argv); void QuartzInitInput(int argc, char **argv); +void QuartzInitServer(int argc, char **argv, char **envp); void QuartzGiveUp(void); void QuartzProcessEvent(xEvent *xe); void QuartzDisplayChangedHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, int nevents); diff --git a/hw/xquartz/quartzStartup.c b/hw/xquartz/quartzStartup.c index 34eaf8a03..7b6a1a6fa 100644 --- a/hw/xquartz/quartzStartup.c +++ b/hw/xquartz/quartzStartup.c @@ -58,19 +58,10 @@ struct arg { char **envp; }; -pthread_cond_t server_can_start_cond = PTHREAD_COND_INITIALIZER; - static void server_thread (void *arg) { - struct arg *args = (struct arg *)arg; - - /* Wait to be told we can continue */ - pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; - pthread_mutex_lock(&mutex); - pthread_cond_wait(&server_can_start_cond, &mutex); - pthread_mutex_unlock(&mutex); - pthread_mutex_destroy(&mutex); - - exit (dix_main(args->argc, args->argv, args->envp)); + struct arg args = *((struct arg *)arg); + free(arg); + exit (dix_main(args.argc, args.argv, args.envp)); } static pthread_t create_thread (void *func, void *arg) { @@ -86,16 +77,27 @@ static pthread_t create_thread (void *func, void *arg) { return tid; } +void QuartzInitServer(int argc, char **argv, char **envp) { + struct arg *args = (struct arg*)malloc(sizeof(struct arg)); + if(!args) + FatalError("Could not allocate memory.\n"); + + args->argc = argc; + args->argv = argv; + args->envp = envp; + + APPKIT_THREAD_ID = pthread_self(); + SERVER_THREAD_ID = create_thread(server_thread, args); + + if (!SERVER_THREAD_ID) { + FatalError("can't create secondary thread\n"); + } +} + int main(int argc, char **argv, char **envp) { int i; int fd[2]; - /* Store the args to pass to dix_main() */ - struct arg args; - args.argc = argc; - args.argv = argv; - args.envp = envp; - // Make a pipe to pass events assert( pipe(fd) == 0 ); darwinEventReadFD = fd[0]; @@ -112,18 +114,8 @@ int main(int argc, char **argv, char **envp) { /* Create the audio mutex */ QuartzAudioInit(); - - pthread_cond_init(&server_can_start_cond, NULL); - - APPKIT_THREAD_ID = pthread_self(); - SERVER_THREAD_ID = create_thread(server_thread, &args); - - if (!SERVER_THREAD_ID) { - ErrorF("can't create secondary thread\n"); - exit (1); - } QuartzMoveToForeground(); - X11ControllerMain(argc, (const char **)argv); + X11ControllerMain(argc, argv, envp); exit(0); } |