summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Huddleston <jeremyhu@freedesktop.org>2008-04-28 11:47:49 -0700
committerJeremy Huddleston <jeremyhu@freedesktop.org>2008-04-28 11:49:19 -0700
commite9734306088e12f2cd68bf347ecf8415be4f0268 (patch)
tree965436e7dee15bd9c27d131b0d139b5bf5be0c60
parent4b46fc931e61bec0abd6a86062e46dd7a408e745 (diff)
XQuartz: More startup / threading house cleaning.
(cherry picked from commit 72653c24c00dfba64ce35a3d400598bcd77defc1)
-rw-r--r--hw/xquartz/X11Application.h2
-rw-r--r--hw/xquartz/X11Application.m7
-rw-r--r--hw/xquartz/X11Controller.h2
-rw-r--r--hw/xquartz/X11Controller.m4
-rw-r--r--hw/xquartz/quartz.h1
-rw-r--r--hw/xquartz/quartzStartup.c50
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);
}