XQuartz: More startup / threading house cleaning.

(cherry picked from commit 72653c24c0)
This commit is contained in:
Jeremy Huddleston 2008-04-28 11:47:49 -07:00
parent ab5abdc7af
commit cf5a4210a4
6 changed files with 28 additions and 38 deletions

View File

@ -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;

View File

@ -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 */

View File

@ -100,6 +100,6 @@
#endif /* __OBJC__ */
void X11ControllerMain(int argc, const char **argv);
void X11ControllerMain(int argc, char **argv, char **envp);
#endif /* X11CONTROLLER_H */

View File

@ -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);
}

View File

@ -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);

View File

@ -64,19 +64,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) {
@ -92,16 +83,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];
@ -118,18 +120,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);
}