JavaResults* launchJavaVM( char* args[] ) { JavaResults* jvmResults = NULL; pid_t jvmProcess; int exitCode; #ifdef MOZILLA_FIX fixEnvForMozilla(); #endif /* MOZILLA_FIX */ jvmProcess = fork(); if (jvmProcess == 0) { /* Child process ... start the JVM */ execv(args[0], args); /* The JVM would not start ... return error code to parent process. */ /* TODO, how to distinguish this as a launch problem to the other process? */ _exit(errno); } jvmResults = malloc(sizeof(JavaResults)); memset(jvmResults, 0, sizeof(JavaResults)); /* If the JVM is still running, wait for it to terminate. */ if (jvmProcess != 0) { waitpid(jvmProcess, &exitCode, 0); if (WIFEXITED(exitCode)) /* TODO, this should really be a runResult if we could distinguish the launch problem above */ jvmResults->launchResult = WEXITSTATUS(exitCode); } return jvmResults; }
JavaResults* launchJavaVM( char* args[] ) { JavaResults* jvmResults = NULL; pid_t jvmProcess, finishedProcess = 0; int exitCode; #ifdef MOZILLA_FIX fixEnvForMozilla(); #endif /* MOZILLA_FIX */ jvmProcess = fork(); if (jvmProcess == 0) { /* Child process ... start the JVM */ execv(args[0], args); /* The JVM would not start ... return error code to parent process. */ /* TODO, how to distinguish this as a launch problem to the other process? */ _exit(errno); } jvmResults = malloc(sizeof(JavaResults)); memset(jvmResults, 0, sizeof(JavaResults)); /* If the JVM is still running, wait for it to terminate. */ if (jvmProcess != 0) { /* When attempting a file open, we need to spin the event loop * for setAppWindowTimerProc to run. When that succeeds or times out, * we can stop the event loop and just wait on the child process. */ if (openFilePath != NULL) { struct timespec sleepTime; sleepTime.tv_sec = 0; sleepTime.tv_nsec = 5e+8; // 500 milliseconds while(openFileTimeout > 0 && !windowPropertySet && (finishedProcess = waitpid(jvmProcess, &exitCode, WNOHANG)) == 0) { dispatchMessages(); nanosleep(&sleepTime, NULL); } } if (finishedProcess == 0) waitpid(jvmProcess, &exitCode, 0); if (WIFEXITED(exitCode)) /* TODO, this should really be a runResult if we could distinguish the launch problem above */ jvmResults->launchResult = WEXITSTATUS(exitCode); } return jvmResults; }