XQuartz: More startup / threading house cleaning.
(cherry picked from commit 72653c24c0
)
This commit is contained in:
parent
ab5abdc7af
commit
cf5a4210a4
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -100,6 +100,6 @@
|
|||
|
||||
#endif /* __OBJC__ */
|
||||
|
||||
void X11ControllerMain(int argc, const char **argv);
|
||||
void X11ControllerMain(int argc, char **argv, char **envp);
|
||||
|
||||
#endif /* X11CONTROLLER_H */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user