/* We supports warmup for UI stack that is performed in parallel *toVMinitialization. *ThishelpstoimprovestartupofUIapplicationaswarmupphase *mightbelongduetoinitializationofOSorhardwareresources. *ItisnotCPUboundandthereforeitdoesnotinterferewithVMinit. *ObviouslysuchwarmuponlyhassenseforUIappsandthereforeitneeds *tobeexplicitlyrequestedbypassing-Dsun.awt.warmup=trueproperty *(thisisalwaysthecaseforplugin/javaws). * *ImplementationlaunchesnewthreadafterVMstartsanduseittoperform *warmupcode(platformdependent). *ThisthreadislaterreusedasAWTtoolkitthreadasgraphicstoolkit *oftenassumethattheyareusedfromthesamethreadtheywerelaunchedon. * *AtthemomentweonlysupportwarmupforD3D.Itonlypossibleonwindows *andonlyifotherflagsdonotprohibitthis(e.g.OpenGLsupportrequested).
*/ #undef ENABLE_AWT_PRELOAD #ifndef JAVA_ARGS /* turn off AWT preloading for javac, jar, etc */ /* CR6999872: fastdebug crashes if awt library is loaded before JVM is
* initialized*/ #if !defined(DEBUG) #define ENABLE_AWT_PRELOAD #endif #endif
#ifdef ENABLE_AWT_PRELOAD /* "AWT was preloaded" flag; *turnedonbyAWTPreload().
*/ int awtPreloaded = 0;
/* Calls a function with the name specified *thefunctionmustbeint(*fn)(void).
*/ int AWTPreload(constchar *funcName); /* stops AWT preloading */ void AWTPreloadStop();
/* D3D preloading */ /* -1: not initialized; 0: OFF, 1: ON */ int awtPreloadD3D = -1; /* command line parameter to switch D3D preloading on */ #define PARAM_PRELOAD_D3D "-Dsun.awt.warmup" /* D3D/OpenGL management parameters */ #define PARAM_NODDRAW "-Dsun.java2d.noddraw" #define PARAM_D3D "-Dsun.java2d.d3d" #define PARAM_OPENGL "-Dsun.java2d.opengl" /* function in awt.dll (src/windows/native/sun/java2d/d3d/D3DPipelineManager.cpp) */ #define D3D_PRELOAD_FUNC "preloadD3D"
/* Extracts value of a parameter with the specified name *fromcommandlineargument(returnspointerintheargument). *ReturnsNULLiftheargumentdoesnotcontainstheparameter. *e.g.: *GetParamValue("theParam","theParam=value")returnspointerto"value".
*/ constchar * GetParamValue(constchar *paramName, constchar *arg) {
size_t nameLen = JLI_StrLen(paramName); if (JLI_StrNCmp(paramName, arg, nameLen) == 0) { /* arg[nameLen] is valid (may contain final NULL) */ if (arg[nameLen] == '=') { return arg + nameLen + 1;
}
} return NULL;
}
jvmpath[0] = '\0'; if (!GetJVMPath(jrepath, jvmtype, jvmpath, so_jvmpath)) {
JLI_ReportErrorMessage(CFG_ERROR8, jvmtype, jvmpath); exit(4);
} /* If we got here, jvmpath has been correctly initialized. */
/* Check if we need preload AWT */ #ifdef ENABLE_AWT_PRELOAD
argv = *pargv; for (i = 0; i < *pargc ; i++) { /* Tests the "turn on" parameter only if not set yet. */ if (awtPreloadD3D < 0) { if (GetBoolParamValue(PARAM_PRELOAD_D3D, argv[i]) == 1) {
awtPreloadD3D = 1;
}
} /* Test parameters which can disable preloading if not already disabled. */ if (awtPreloadD3D != 0) { if (GetBoolParamValue(PARAM_NODDRAW, argv[i]) == 1
|| GetBoolParamValue(PARAM_D3D, argv[i]) == 0
|| GetBoolParamValue(PARAM_OPENGL, argv[i]) == 1)
{
awtPreloadD3D = 0; /* no need to test the rest of the parameters */ break;
}
}
} #endif/* ENABLE_AWT_PRELOAD */
}
static jboolean
LoadMSVCRT()
{ // Only do this once staticint loaded = 0; char crtpath[MAXPATHLEN];
if (GetApplicationHome(path, pathsize)) { /* Is JRE co-located with the application? */
JLI_Snprintf(javadll, sizeof(javadll), "%s\\bin\\" JAVA_DLL, path); if (stat(javadll, &s) == 0) {
JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE;
} /* ensure storage for path + \jre + NULL */ if ((JLI_StrLen(path) + 4 + 1) > (size_t) pathsize) {
JLI_TraceLauncher("Insufficient space to store JRE path\n"); return JNI_FALSE;
} /* Does this app ship a private JRE in <apphome>\jre directory? */
JLI_Snprintf(javadll, sizeof (javadll), "%s\\jre\\bin\\" JAVA_DLL, path); if (stat(javadll, &s) == 0) {
JLI_StrCat(path, "\\jre");
JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE;
}
}
/* Try getting path to JRE from path to JLI.DLL */ if (GetApplicationHomeFromDll(path, pathsize)) {
JLI_Snprintf(javadll, sizeof(javadll), "%s\\bin\\" JAVA_DLL, path); if (stat(javadll, &s) == 0) {
JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE;
}
}
#ifdef USE_REGISTRY_LOOKUP /* Lookup public JRE using Windows registry. */ if (GetPublicJREHome(path, pathsize)) {
JLI_TraceLauncher("JRE path is %s\n", path); return JNI_TRUE;
} #endif
/* Load the Java VM DLL */ if ((handle = LoadLibrary(jvmpath)) == 0) {
JLI_ReportErrorMessage(DLL_ERROR4, (char *)jvmpath); return JNI_FALSE;
}
/* Now get the function addresses */
ifn->CreateJavaVM =
(void *)GetProcAddress(handle, "JNI_CreateJavaVM");
ifn->GetDefaultJavaVMInitArgs =
(void *)GetProcAddress(handle, "JNI_GetDefaultJavaVMInitArgs"); if (ifn->CreateJavaVM == 0 || ifn->GetDefaultJavaVMInitArgs == 0) {
JLI_ReportErrorMessage(JNI_ERROR1, (char *)jvmpath); return JNI_FALSE;
}
return JNI_TRUE;
}
/* *Removesthetrailingfilenameandonesub-folderfromapath. *Ifbufis"c:\foo\bin\javac",thenput"c:\foo"intobuf.
*/
jboolean
TruncatePath(char *buf)
{ char *cp;
*JLI_StrRChr(buf, '\\') = '\0'; /* remove .exe file name */ if ((cp = JLI_StrRChr(buf, '\\')) == 0) { /* This happens if the application is in a drive root, and
* there is no bin directory. */
buf[0] = '\0'; return JNI_FALSE;
}
*cp = '\0'; /* remove the bin\ part */ return JNI_TRUE;
}
if ((errval = GetLastError()) != 0) { /* Platform SDK / DOS Error */ int n = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|
FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, errval, 0, (LPTSTR)&errtext, 0, NULL); if (errtext == NULL || n == 0) { /* Paranoia check */
errtext = "";
n = 0;
} else {
freeit = JNI_TRUE; if (n > 2) { /* Drop final CR, LF */ if (errtext[n - 1] == '\n') n--; if (errtext[n - 1] == '\r') n--;
errtext[n] = '\0';
}
}
} else { /* C runtime error that has no corresponding DOS error code */
errtext = strerror(save_errno);
}
if (IsJavaw()) { char *message; int mlen; /* get the length of the string we need */ int len = mlen = _vscprintf(fmt, vl) + 1; if (freeit) {
mlen += (int)JLI_StrLen(errtext);
}
/* *StartsAWTpreloading
*/ int AWTPreload(constchar *funcName)
{ int result = -1; /* load AWT library once (if several preload function should be called) */ if (hPreloadAwt == NULL) { /* awt.dll is not loaded yet */ char libraryPath[MAXPATHLEN];
size_t jrePathLen = 0;
HMODULE hJava = NULL;
HMODULE hVerify = NULL;
while (1) { /* awt.dll depends on jvm.dll & java.dll; *jvm.dllisalreadyloaded,soweneedonlyjava.dll; *java.dlldependsonMSVCRTlib&verify.dll.
*/ if (!GetJREPath(libraryPath, MAXPATHLEN)) { break;
}
/* save path length */
jrePathLen = JLI_StrLen(libraryPath);
if (jrePathLen + JLI_StrLen("\\bin\\verify.dll") >= MAXPATHLEN) { /* jre path is too long, the library path will not fit there; *reportandabortpreloading
*/
JLI_ReportErrorMessage(JRE_ERROR11); break;
}
/* *Atthispointwehavetheargumentstotheapplication,andweneedto *checkwithoriginalstdargsinordertocomparewhichofthesetruly *needsexpansion.cmdtoargswillspecifythisifitfindsabare *(unquoted)argumentcontainingaglobcharacter(s)ie.*or?
*/
jobjectArray
CreateApplicationArgs(JNIEnv *env, char **strv, int argc)
{ int i, j, idx;
size_t tlen;
jobjectArray outArray, inArray; char *arg, **nargv;
jboolean needs_expansion = JNI_FALSE;
jmethodID mid; int stdargc;
StdArg *stdargs; int *appArgIdx; int isTool;
jclass cls = GetLauncherHelperClass(env);
NULL_CHECK0(cls);
if (argc == 0) { return NewPlatformStringArray(env, strv, argc);
} // the holy grail we need to compare with.
stdargs = JLI_GetStdArgs();
stdargc = JLI_GetStdArgc();
// sanity check, this should never happen if (argc > stdargc) {
JLI_TraceLauncher("Warning: app args is larger than the original, %d %d\n", argc, stdargc);
JLI_TraceLauncher("passing arguments as-is.\n"); return NewPlatformStringArray(env, strv, argc);
}
// sanity check, match the args we have, to the holy grail
idx = JLI_GetAppArgIndex();
// First arg index is NOT_FOUND if (idx < 0) { // The only allowed value should be NOT_FOUND (-1) unless another change introduces // a different negative index
assert (idx == -1);
JLI_TraceLauncher("Warning: first app arg index not found, %d\n", idx);
JLI_TraceLauncher("passing arguments as-is.\n"); return NewPlatformStringArray(env, strv, argc);
}
isTool = (idx == 0); if (isTool) { idx++; } // skip tool name
JLI_TraceLauncher("AppArgIndex: %d points to %s\n", idx, stdargs[idx].arg);
appArgIdx = calloc(argc, sizeof(int)); for (i = idx, j = 0; i < stdargc; i++) { if (isTool) { // filter -J used by tools to pass JVM options
arg = stdargs[i].arg; if (arg[0] == '-' && arg[1] == 'J') { continue;
}
}
appArgIdx[j++] = i;
} // sanity check, ensure same number of arguments for application if (j != argc) {
JLI_TraceLauncher("Warning: app args count doesn't match, %d %d\n", j, argc);
JLI_TraceLauncher("passing arguments as-is.\n");
JLI_MemFree(appArgIdx); return NewPlatformStringArray(env, strv, argc);
}
// make a copy of the args which will be expanded in java if required.
nargv = (char **)JLI_MemAlloc(argc * sizeof(char*)); for (i = 0; i < argc; i++) {
jboolean arg_expand;
j = appArgIdx[i];
arg_expand = (JLI_StrCmp(stdargs[j].arg, strv[i]) == 0)
? stdargs[j].has_wildcard
: JNI_FALSE; if (needs_expansion == JNI_FALSE)
needs_expansion = arg_expand;
// indicator char + String + NULL terminator, the java method will strip // out the first character, the indicator character, so no matter what // we add the indicator
tlen = 1 + JLI_StrLen(strv[i]) + 1;
nargv[i] = (char *) JLI_MemAlloc(tlen); if (JLI_Snprintf(nargv[i], tlen, "%c%s", arg_expand ? 'T' : 'F',
strv[i]) < 0) { return NULL;
}
JLI_TraceLauncher("%s\n", nargv[i]);
}
if (!needs_expansion) { // clean up any allocated memory and return back the old arguments for (i = 0 ; i < argc ; i++) {
JLI_MemFree(nargv[i]);
}
JLI_MemFree(nargv);
JLI_MemFree(appArgIdx); return NewPlatformStringArray(env, strv, argc);
}
NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls, "expandArgs", "([Ljava/lang/String;)[Ljava/lang/String;"));
// expand the arguments that require expansion, the java method will strip // out the indicator character.
NULL_CHECK0(inArray = NewPlatformStringArray(env, nargv, argc));
outArray = (*env)->CallStaticObjectMethod(env, cls, mid, inArray); for (i = 0; i < argc; i++) {
JLI_MemFree(nargv[i]);
}
JLI_MemFree(nargv);
JLI_MemFree(appArgIdx); return outArray;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.