diff options
author | Andrew Niefer | 2009-11-13 20:20:21 +0000 |
---|---|---|
committer | Andrew Niefer | 2009-11-13 20:20:21 +0000 |
commit | 0be2d5d341a4365caf6fa6fb7eae3c56d67ec1b5 (patch) | |
tree | 887783615c18a7e13ef3e28e8fdc6b2782d55d23 /bundles/org.eclipse.equinox.executable | |
parent | c70c29c1cda284f217ebadc90224027227c23d67 (diff) | |
download | rt.equinox.framework-0be2d5d341a4365caf6fa6fb7eae3c56d67ec1b5.tar.gz rt.equinox.framework-0be2d5d341a4365caf6fa6fb7eae3c56d67ec1b5.tar.xz rt.equinox.framework-0be2d5d341a4365caf6fa6fb7eae3c56d67ec1b5.zip |
bug 291919 - improved error messages
Diffstat (limited to 'bundles/org.eclipse.equinox.executable')
12 files changed, 139 insertions, 50 deletions
diff --git a/bundles/org.eclipse.equinox.executable/library/carbon/eclipseCarbon.c b/bundles/org.eclipse.equinox.executable/library/carbon/eclipseCarbon.c index e5da4e69a..3bd9a51c6 100644 --- a/bundles/org.eclipse.equinox.executable/library/carbon/eclipseCarbon.c +++ b/bundles/org.eclipse.equinox.executable/library/carbon/eclipseCarbon.c @@ -35,6 +35,8 @@ #define DEBUG 0 +static _TCHAR* noForkingMsg = _T_ECLIPSE("Internal Error, forking the jvm is not supported on MacOS.\n"); + char *findCommand(char *command); /* Global Variables */ @@ -51,7 +53,7 @@ typedef struct { _TCHAR ** vmArgs; _TCHAR ** progArgs; _TCHAR * jarFile; - int result; + JavaResults* result; } StartVMArgs; #ifdef COCOA @@ -337,13 +339,17 @@ void restartLauncher( char* program, char* args[] ) } } -int launchJavaVM( _TCHAR* args[] ) +JavaResults* launchJavaVM( _TCHAR* args[] ) { /*for now always do JNI on Mac, should not come in here */ - return -1; + JavaResults * results = malloc(sizeof(JavaResults)); + results->launchResult = -1; + results->runResult = 0; + results->errorMessage = _tcsdup(noForkingMsg); + return results; } -int startJavaVM( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* jarFile ) +JavaResults* startJavaVM( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* jarFile ) { if (secondThread == 0) { /* Set an environment variable that tells the AWT (if started) we started the JVM on the main thread. */ @@ -379,6 +385,7 @@ int startJavaVM( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* args.vmArgs = vmArgs; args.progArgs = progArgs; args.jarFile = jarFile; + args.result = 0; loopRef = CFRunLoopGetCurrent(); diff --git a/bundles/org.eclipse.equinox.executable/library/eclipse.c b/bundles/org.eclipse.equinox.executable/library/eclipse.c index 204b1009f..d0b39638d 100644 --- a/bundles/org.eclipse.equinox.executable/library/eclipse.c +++ b/bundles/org.eclipse.equinox.executable/library/eclipse.c @@ -187,6 +187,8 @@ _TCHAR** initialArgv = NULL; /* Define error messages. (non-NLS) */ static _TCHAR* exitMsg = _T_ECLIPSE("JVM terminated. Exit code=%d\n%s"); +static _TCHAR* javaFailureMsg = _T_ECLIPSE("Internal Error, unable to determine the results of running the JVM."); +static _TCHAR* returnCodeMsg = _T_ECLIPSE("Java was started but returned exit code=%d\n%s"); static _TCHAR* goVMMsg = _T_ECLIPSE("Start VM: %s\n"); static _TCHAR* pathMsg = _T_ECLIPSE("%s in your current PATH"); static _TCHAR* shareMsg = _T_ECLIPSE("No exit data available."); @@ -354,7 +356,7 @@ JNIEXPORT int run(int argc, _TCHAR* argv[], _TCHAR* vmArgs[]) _TCHAR** progCommandArgs = NULL; _TCHAR** relaunchCommand = NULL; _TCHAR* errorMsg = NULL, *msg = NULL; - int exitCode = 0; + JavaResults* javaResults = NULL; int launchMode; int running = 1; @@ -475,12 +477,20 @@ JNIEXPORT int run(int argc, _TCHAR* argv[], _TCHAR* vmArgs[]) if (debug) _tprintf( goVMMsg, msg ); if(launchMode == LAUNCH_JNI) { - exitCode = startJavaVM(jniLib, vmCommandArgs, progCommandArgs, jarFile); + javaResults = startJavaVM(jniLib, vmCommandArgs, progCommandArgs, jarFile); } else { - exitCode = launchJavaVM(vmCommand); + javaResults = launchJavaVM(vmCommand); } - switch( exitCode ) { + if (javaResults == NULL) { + /* shouldn't happen, but just in case */ + javaResults = malloc(sizeof(JavaResults)); + javaResults->launchResult = -11; + javaResults->runResult = 0; + javaResults->errorMessage = _tcsdup(javaFailureMsg); + } + + switch( javaResults->launchResult + javaResults->runResult ) { case 0: /* normal exit */ running = 0; break; @@ -553,8 +563,18 @@ JNIEXPORT int run(int argc, _TCHAR* argv[], _TCHAR* vmArgs[]) } } if (errorMsg == NULL) { - errorMsg = malloc( (_tcslen(exitMsg) + _tcslen(msg) + 10) * sizeof(_TCHAR) ); - _stprintf( errorMsg, exitMsg, exitCode, msg ); + if (javaResults->runResult) { + /* java was started ok, but returned non-zero exit code */ + errorMsg = malloc( (_tcslen(returnCodeMsg) + _tcslen(msg) + 10) *sizeof(_TCHAR)); + _stprintf(errorMsg, returnCodeMsg,javaResults->runResult, msg); + } else if (javaResults->errorMessage != NULL){ + /* else we had a problem launching java, use custom error message */ + errorMsg = javaResults->errorMessage; + } else { + /* no custom message, use generic message */ + errorMsg = malloc( (_tcslen(exitMsg) + _tcslen(msg) + 10) * sizeof(_TCHAR) ); + _stprintf( errorMsg, exitMsg, javaResults->launchResult, msg ); + } } if (_tcslen(errorMsg) > 0) { @@ -575,7 +595,7 @@ JNIEXPORT int run(int argc, _TCHAR* argv[], _TCHAR* vmArgs[]) restartLauncher(NULL, relaunchCommand); if (launchMode == LAUNCH_JNI) - cleanupVM(exitCode); + cleanupVM(javaResults->launchResult ? javaResults->launchResult : javaResults->runResult); if (sharedID != NULL) { destroySharedData( sharedID ); @@ -595,7 +615,13 @@ JNIEXPORT int run(int argc, _TCHAR* argv[], _TCHAR* vmArgs[]) if ( exitData != NULL ) free( exitData ); if ( splashBitmap != NULL ) free( splashBitmap ); - return exitCode; + if (javaResults == NULL) + return -1; + + /* reuse the running variable for convenience */ + running = javaResults->launchResult != 0 ? javaResults->launchResult : javaResults->runResult; + free(javaResults); + return running; } static _TCHAR** buildLaunchCommand( _TCHAR* program, _TCHAR** vmArgs, _TCHAR** progArgs ) { @@ -1120,9 +1146,10 @@ static _TCHAR* findStartupJar(){ return file; /* old startup.jar? */ - file = checkPath(OLD_STARTUP, programDir, 0); + ch = OLD_STARTUP; + file = checkPath(ch, programDir, 0); if (_tstat( file, &stats ) == 0) - return (file == OLD_STARTUP) ? _tcsdup(OLD_STARTUP) : file; + return (file == ch) ? _tcsdup(ch) : file; return NULL; } diff --git a/bundles/org.eclipse.equinox.executable/library/eclipseJNI.c b/bundles/org.eclipse.equinox.executable/library/eclipseJNI.c index 728abbba1..dc0a94710 100644 --- a/bundles/org.eclipse.equinox.executable/library/eclipseJNI.c +++ b/bundles/org.eclipse.equinox.executable/library/eclipseJNI.c @@ -18,6 +18,13 @@ #include <stdlib.h> #include <string.h> + +static _TCHAR* failedToLoadLibrary = _T_ECLIPSE("Failed to load the JNI shared library \"%s\".\n"); +static _TCHAR* createVMSymbolNotFound = _T_ECLIPSE("The JVM shared library \"%s\"\ndoes not contain the JNI_CreateJavaVM symbol.\n"); +static _TCHAR* failedCreateVM = _T_ECLIPSE("Failed to create the Java Virtual Machine.\n"); +static _TCHAR* internalExpectedVMArgs = _T_ECLIPSE("Internal Error, the JVM argument list is empty.\n"); +static _TCHAR* mainClassNotFound = _T_ECLIPSE("Failed to find a Main Class in \"%s\".\n"); + static JNINativeMethod natives[] = {{"_update_splash", "()V", (void *)&update_splash}, {"_get_splash_handle", "()J", (void *)&get_splash_handle}, {"_set_exit_data", "(Ljava/lang/String;Ljava/lang/String;)V", (void *)&set_exit_data}, @@ -203,7 +210,7 @@ static jstring newJavaString(JNIEnv *env, _TCHAR * str) size_t length = _tcslen(str); jbyteArray bytes = (*env)->NewByteArray(env, length); if(bytes != NULL) { - (*env)->SetByteArrayRegion(env, bytes, 0, length, str); + (*env)->SetByteArrayRegion(env, bytes, 0, length, (jbyte *)str); if (!(*env)->ExceptionOccurred(env)) { if (string_class == NULL) string_class = (*env)->FindClass(env, "java/lang/String"); @@ -259,16 +266,16 @@ static jobjectArray createRunArgs( JNIEnv *env, _TCHAR * args[] ) { return stringArray; } -int startJavaJNI( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* jarFile ) +JavaResults * startJavaJNI( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* jarFile ) { int i; int numVMArgs = -1; - int jvmExitCode = -1; void * jniLibrary; JNI_createJavaVM createJavaVM; JavaVMInitArgs init_args; JavaVMOption * options; char * mainClassName = NULL; + JavaResults * results = NULL; /* JNI reflection */ jclass mainClass = NULL; /* The Main class to load */ @@ -277,14 +284,23 @@ int startJavaJNI( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* jmethodID runMethod = NULL; /* Main.run(String[]) */ jobjectArray methodArgs = NULL; /* Arguments to pass to run */ + results = malloc(sizeof(JavaResults)); + memset(results, 0, sizeof(JavaResults)); + jniLibrary = loadLibrary(libPath); if(jniLibrary == NULL) { - return -1; /*error*/ + results->launchResult = -1; + results->errorMessage = malloc((_tcslen(failedToLoadLibrary) + _tcslen(libPath) + 1) * sizeof(_TCHAR)); + _stprintf(results->errorMessage, failedToLoadLibrary, libPath); + return results; /*error*/ } createJavaVM = (JNI_createJavaVM)findSymbol(jniLibrary, _T_ECLIPSE("JNI_CreateJavaVM")); if(createJavaVM == NULL) { - return -1; /*error*/ + results->launchResult = -2; + results->errorMessage = malloc((_tcslen(createVMSymbolNotFound) + _tcslen(libPath) + 1) * sizeof(_TCHAR)); + _stprintf(results->errorMessage, createVMSymbolNotFound, libPath); + return results; /*error*/ } /* count the vm args */ @@ -292,7 +308,9 @@ int startJavaJNI( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* if(numVMArgs <= 0) { /*error, we expect at least the required vm arg */ - return -1; + results->launchResult = -3; + results->errorMessage = _tcsdup(internalExpectedVMArgs); + return results; } options = malloc(numVMArgs * sizeof(JavaVMOption)); @@ -328,6 +346,7 @@ int startJavaJNI( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* } if(mainClass != NULL) { + results->launchResult = -6; /* this will be reset to 0 below on success */ mainConstructor = (*env)->GetMethodID(env, mainClass, "<init>", "()V"); if(mainConstructor != NULL) { mainObject = (*env)->NewObject(env, mainClass, mainConstructor); @@ -336,19 +355,27 @@ int startJavaJNI( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* if(runMethod != NULL) { methodArgs = createRunArgs(env, progArgs); if(methodArgs != NULL) { - jvmExitCode = (*env)->CallIntMethod(env, mainObject, runMethod, methodArgs); + results->launchResult = 0; + results->runResult = (*env)->CallIntMethod(env, mainObject, runMethod, methodArgs); (*env)->DeleteLocalRef(env, methodArgs); } } (*env)->DeleteLocalRef(env, mainObject); } } - } + } else { + results->launchResult = -5; + results->errorMessage = malloc((_tcslen(mainClassNotFound) + _tcslen(jarFile) + 1) * sizeof(_TCHAR)); + _stprintf(results->errorMessage, mainClassNotFound, jarFile); + } if((*env)->ExceptionOccurred(env)){ (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); } + } else { + results->launchResult = -4; + results->errorMessage = _tcsdup(failedCreateVM); } /* toNarrow allocated new strings, free them */ @@ -356,7 +383,7 @@ int startJavaJNI( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* free( options[i].optionString ); } free(options); - return jvmExitCode; + return results; } static char * getMainClass(JNIEnv *env, _TCHAR * jarFile) { diff --git a/bundles/org.eclipse.equinox.executable/library/eclipseJNI.h b/bundles/org.eclipse.equinox.executable/library/eclipseJNI.h index 138b55177..3ef4b89dc 100644 --- a/bundles/org.eclipse.equinox.executable/library/eclipseJNI.h +++ b/bundles/org.eclipse.equinox.executable/library/eclipseJNI.h @@ -14,6 +14,11 @@ #include "eclipseUnicode.h" #include <jni.h> +typedef struct { + int launchResult; + int runResult; + _TCHAR * errorMessage; +} JavaResults; typedef jint (JNICALL *JNI_createJavaVM)(JavaVM **pvm, JNIEnv **env, void *args); @@ -76,7 +81,7 @@ JNIEXPORT void JNICALL takedown_splash(JNIEnv *, jobject); * be returned to the main launcher, which will display a message if * the termination was not normal. */ -extern int startJavaJNI( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* jarFile ); +extern JavaResults* startJavaJNI( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* jarFile ); extern void cleanupVM( int ); #endif diff --git a/bundles/org.eclipse.equinox.executable/library/eclipseNix.c b/bundles/org.eclipse.equinox.executable/library/eclipseNix.c index acd302e9a..37a08efbd 100644 --- a/bundles/org.eclipse.equinox.executable/library/eclipseNix.c +++ b/bundles/org.eclipse.equinox.executable/library/eclipseNix.c @@ -169,7 +169,7 @@ void processVMArgs(_TCHAR **vmargs[] ) { /* nothing yet */ } -int startJavaVM( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* jarFile ) +JavaResults* startJavaVM( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* jarFile ) { return startJavaJNI(libPath, vmArgs, progArgs, jarFile); } diff --git a/bundles/org.eclipse.equinox.executable/library/eclipseOS.h b/bundles/org.eclipse.equinox.executable/library/eclipseOS.h index a55fec533..5c81dfcb4 100644 --- a/bundles/org.eclipse.equinox.executable/library/eclipseOS.h +++ b/bundles/org.eclipse.equinox.executable/library/eclipseOS.h @@ -13,7 +13,7 @@ #ifndef ECLIPSE_OS_H #define ECLIPSE_OS_H -#include <jni.h> +#include "eclipseJNI.h" #include "eclipseUnicode.h" #ifdef MACOSX @@ -101,10 +101,10 @@ extern void takeDownSplash(); extern void restartLauncher( _TCHAR* program, _TCHAR* args[] ); /* launch the vm in a separate process and wait for it to finish */ -extern int launchJavaVM( _TCHAR* args[] ); +extern JavaResults* launchJavaVM( _TCHAR* args[] ); /* launch the vm in this process using JNI invocation */ -extern int startJavaVM( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* jarFile ); +extern JavaResults* startJavaVM( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* jarFile ); /* do any platform specific processing of the user vmargs */ extern void processVMArgs(_TCHAR **vmargs[] ); diff --git a/bundles/org.eclipse.equinox.executable/library/eclipseShm.c b/bundles/org.eclipse.equinox.executable/library/eclipseShm.c index 7ed3b8107..9934fe54e 100644 --- a/bundles/org.eclipse.equinox.executable/library/eclipseShm.c +++ b/bundles/org.eclipse.equinox.executable/library/eclipseShm.c @@ -13,6 +13,8 @@ #include "eclipseOS.h" #include "eclipseShm.h" +static _TCHAR* ECLIPSE_UNITIALIZED = _T_ECLIPSE("ECLIPSE_UNINITIALIZED"); + #ifdef _WIN32 #include <stdio.h> @@ -32,6 +34,8 @@ int createSharedData(_TCHAR** id, int size) { _stprintf(*id, _T_ECLIPSE("%lx_%lx"), GetCurrentProcessId(), (DWORD) mapHandle); #endif } + /* set the shared data to "uninitialized" */ + setSharedData(*id, ECLIPSE_UNITIALIZED); return 0; } @@ -75,6 +79,7 @@ int getSharedData(_TCHAR* id, _TCHAR** data) { if (mapHandle == NULL) return -1; sharedData = MapViewOfFile(handle, FILE_MAP_WRITE, 0, 0, 0); if (sharedData == NULL) return -1; + if (_tcscmp(sharedData, ECLIPSE_UNITIALIZED)== 0) return 0; if (data != NULL) { size_t length = (_tcslen(sharedData) + 1) * sizeof(_TCHAR); newData = malloc(length); @@ -208,6 +213,7 @@ int createSharedData(char** id, int size) { *id = malloc(9 * sizeof(char)); sprintf(*id, "%x", shmid); } + setSharedData(*id, ECLIPSE_UNITIALIZED); return 0; } @@ -233,6 +239,7 @@ int getSharedData( char* id, char** data ) { if (shmid == -1) return -1; sharedData = shmat(shmid, (void *)0, 0); if (sharedData == (char *)(-1)) return -1; + if (_tcscmp(sharedData, ECLIPSE_UNITIALIZED) == 0) return 0; length = strlen(sharedData) + 1; newData = malloc(length); memcpy(newData, sharedData, length); diff --git a/bundles/org.eclipse.equinox.executable/library/gtk/eclipseGtk.c b/bundles/org.eclipse.equinox.executable/library/gtk/eclipseGtk.c index 343aeb343..003ddd310 100644 --- a/bundles/org.eclipse.equinox.executable/library/gtk/eclipseGtk.c +++ b/bundles/org.eclipse.equinox.executable/library/gtk/eclipseGtk.c @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2005 IBM Corporation and others. + * Copyright (c) 2000, 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -151,9 +151,9 @@ char** getArgVM( char* vm ) return result; } -int launchJavaVM( char* args[] ) +JavaResults* launchJavaVM( char* args[] ) { - int jvmExitCode = 1; + JavaResults* jvmResults = NULL; pid_t jvmProcess; int exitCode; @@ -168,16 +168,21 @@ int launchJavaVM( char* args[] ) 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)) - jvmExitCode = WEXITSTATUS(exitCode); + /* TODO, this should really be a runResult if we could distinguish the launch problem above */ + jvmResults->launchResult = WEXITSTATUS(exitCode); } - return jvmExitCode; + return jvmResults; } diff --git a/bundles/org.eclipse.equinox.executable/library/make_version.mak b/bundles/org.eclipse.equinox.executable/library/make_version.mak index 004b158c5..e7eb8ed0a 100644 --- a/bundles/org.eclipse.equinox.executable/library/make_version.mak +++ b/bundles/org.eclipse.equinox.executable/library/make_version.mak @@ -10,5 +10,5 @@ #******************************************************************************* maj_ver=1 -min_ver=302 +min_ver=303 LIB_VERSION = $(maj_ver)$(min_ver) diff --git a/bundles/org.eclipse.equinox.executable/library/motif/eclipseMotif.c b/bundles/org.eclipse.equinox.executable/library/motif/eclipseMotif.c index 8b32bcbe0..d69fa8a60 100644 --- a/bundles/org.eclipse.equinox.executable/library/motif/eclipseMotif.c +++ b/bundles/org.eclipse.equinox.executable/library/motif/eclipseMotif.c @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2005 IBM Corporation and others. + * Copyright (c) 2000, 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -274,8 +274,9 @@ void fixEnvForNetscape() } #endif /* NETSCAPE_FIX */ -int launchJavaVM( char* args[] ) +JavaResults* launchJavaVM( char* args[] ) { + JavaResults* jvmResults = NULL; int exitCode; #ifdef NETSCAPE_FIX @@ -309,17 +310,22 @@ int launchJavaVM( char* args[] ) 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? */ jvmExitCode = errno; exit( jvmExitCode ); } + 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); - jvmExitCode = ((exitCode & 0x00ff) == 0 ? (exitCode >> 8) : exitCode); /* see wait(2) */ + /* TODO, this should really be a runResult if we could distinguish the launch problem above */ + jvmResults->launchResult = ((exitCode & 0x00ff) == 0 ? (exitCode >> 8) : exitCode); /* see wait(2) */ } /* Return the exit code from the JVM. */ - return jvmExitCode; + return jvmResults; } diff --git a/bundles/org.eclipse.equinox.executable/library/win32/eclipseWin.c b/bundles/org.eclipse.equinox.executable/library/win32/eclipseWin.c index 013400f39..1c035ebed 100644 --- a/bundles/org.eclipse.equinox.executable/library/win32/eclipseWin.c +++ b/bundles/org.eclipse.equinox.executable/library/win32/eclipseWin.c @@ -40,7 +40,7 @@ static _TCHAR* argVM[] = { NULL }; /* Define local variables for running the JVM and detecting its exit. */ static HANDLE jvmProcess = 0; -static int jvmExitCode = 0; +static JavaResults* jvmResults = NULL; static UINT jvmExitTimeout = 100; static UINT_PTR jvmExitTimerId = 99; @@ -372,12 +372,14 @@ void restartLauncher( _TCHAR* program, _TCHAR* args[] ) free(commandLine); } -int launchJavaVM( _TCHAR* args[] ) +JavaResults* launchJavaVM( _TCHAR* args[] ) { MSG msg; _TCHAR* commandLine; jvmProcess = 0; commandLine = buildCommandLine(NULL, args); + jvmResults = malloc(sizeof(JavaResults)); + memset(jvmResults, 0, sizeof(JavaResults)); /* * Start the Java virtual machine. Use CreateProcess() instead of spawnv() @@ -391,7 +393,7 @@ int launchJavaVM( _TCHAR* args[] ) CloseHandle( pi.hThread ); jvmProcess = pi.hProcess; } else { - jvmExitCode = errno; + jvmResults->launchResult = errno; } } @@ -419,7 +421,7 @@ int launchJavaVM( _TCHAR* args[] ) } /* Return the exit code from the JVM. */ - return jvmExitCode; + return jvmResults; } /* Detect JVM Process Termination */ @@ -432,7 +434,7 @@ static void CALLBACK detectJvmExit( HWND hwnd, UINT uMsg, UINT id, DWORD dwTime exitCode != STILL_ACTIVE) { /* Save the JVM exit code. This should cause the loop in launchJavaVM() to exit. */ - jvmExitCode = exitCode; + jvmResults->runResult = exitCode; jvmProcess = 0; } } @@ -441,7 +443,7 @@ void processVMArgs(_TCHAR **vmargs[] ) { /* nothing yet */ } -int startJavaVM( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* jarFile ) +JavaResults* startJavaVM( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* jarFile ) { return startJavaJNI(libPath, vmArgs, progArgs, jarFile); } diff --git a/bundles/org.eclipse.equinox.executable/library/wpf/eclipseWpf.cpp b/bundles/org.eclipse.equinox.executable/library/wpf/eclipseWpf.cpp index 98213ef13..77d431f3b 100644 --- a/bundles/org.eclipse.equinox.executable/library/wpf/eclipseWpf.cpp +++ b/bundles/org.eclipse.equinox.executable/library/wpf/eclipseWpf.cpp @@ -46,7 +46,7 @@ static _TCHAR* argVM[] = { NULL }; /* Define local variables for running the JVM and detecting its exit. */ static int jvmProcess = 0; -static int jvmExitCode = 0; +static JavaResults* jvmResults = NULL; static int jvmExitTimeout = 100; static int jvmExitTimerId = 99; @@ -430,12 +430,15 @@ void restartLauncher( _TCHAR* program, _TCHAR* args[] ) free(commandLine); } -int launchJavaVM( _TCHAR* args[] ) +JavaResults* launchJavaVM( _TCHAR* args[] ) { MSG msg; _TCHAR* commandLine; jvmProcess = -1; commandLine = buildCommandLine(NULL, args); + jvmResults = malloc(sizeof(JavaResults)); + memset(jvmResults, 0, sizeof(JavaResults)); + /* * Start the Java virtual machine. Use CreateProcess() instead of spawnv() * otherwise the arguments cannot be freed since spawnv() segments fault. @@ -456,7 +459,7 @@ int launchJavaVM( _TCHAR* args[] ) if (jvmProcess == -1) { /* Return the error number. */ - jvmExitCode = errno; + jvmResults->launchResult = errno; jvmProcess = 0; } @@ -485,7 +488,7 @@ int launchJavaVM( _TCHAR* args[] ) } /* Return the exit code from the JVM. */ - return jvmExitCode; + return jvmResults; } /* Detect JVM Process Termination */ @@ -497,7 +500,7 @@ static void CALLBACK detectJvmExit () exitCode != STILL_ACTIVE) { /* Save the JVM exit code. This should cause the loop in launchJavaVM() to exit. */ - jvmExitCode = exitCode; + jvmResults->runResult = exitCode; jvmProcess = 0; } } @@ -506,7 +509,7 @@ void processVMArgs(_TCHAR **vmargs[] ) { // /* nothing yet */ } -int startJavaVM( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* jarFile ) +JavaResults* startJavaVM( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* jarFile ) { return startJavaJNI(libPath, vmArgs, progArgs, jarFile); } |