jdk/src/java.base/share/native/libjli/java.c
changeset 41966 bac52fa6e617
parent 41814 a0333150713e
child 42338 a60f280f803c
equal deleted inserted replaced
41965:015dea372cb3 41966:bac52fa6e617
     1 /*
     1 /*
     2  * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     7  * published by the Free Software Foundation.  Oracle designates this
    76 static const char *_launcher_name;
    76 static const char *_launcher_name;
    77 static jboolean _is_java_args = JNI_FALSE;
    77 static jboolean _is_java_args = JNI_FALSE;
    78 static jboolean _have_classpath = JNI_FALSE;
    78 static jboolean _have_classpath = JNI_FALSE;
    79 static const char *_fVersion;
    79 static const char *_fVersion;
    80 static jboolean _wc_enabled = JNI_FALSE;
    80 static jboolean _wc_enabled = JNI_FALSE;
    81 static jint _ergo_policy = DEFAULT_POLICY;
       
    82 
    81 
    83 /*
    82 /*
    84  * Entries for splash screen environment variables.
    83  * Entries for splash screen environment variables.
    85  * putenv is performed in SelectVersion. We need
    84  * putenv is performed in SelectVersion. We need
    86  * them in memory until UnsetEnv, so they are made static
    85  * them in memory until UnsetEnv, so they are made static
   216         const char* pname,                      /* program name */
   215         const char* pname,                      /* program name */
   217         const char* lname,                      /* launcher name */
   216         const char* lname,                      /* launcher name */
   218         jboolean javaargs,                      /* JAVA_ARGS */
   217         jboolean javaargs,                      /* JAVA_ARGS */
   219         jboolean cpwildcard,                    /* classpath wildcard*/
   218         jboolean cpwildcard,                    /* classpath wildcard*/
   220         jboolean javaw,                         /* windows-only javaw */
   219         jboolean javaw,                         /* windows-only javaw */
   221         jint ergo                               /* ergonomics class policy */
   220         jint ergo                               /* unused */
   222 )
   221 )
   223 {
   222 {
   224     int mode = LM_UNKNOWN;
   223     int mode = LM_UNKNOWN;
   225     char *what = NULL;
   224     char *what = NULL;
   226     char *main_class = NULL;
   225     char *main_class = NULL;
   234     _fVersion = fullversion;
   233     _fVersion = fullversion;
   235     _launcher_name = lname;
   234     _launcher_name = lname;
   236     _program_name = pname;
   235     _program_name = pname;
   237     _is_java_args = javaargs;
   236     _is_java_args = javaargs;
   238     _wc_enabled = cpwildcard;
   237     _wc_enabled = cpwildcard;
   239     _ergo_policy = ergo;
       
   240 
   238 
   241     InitLauncher(javaw);
   239     InitLauncher(javaw);
   242     DumpState();
   240     DumpState();
   243     if (JLI_IsTraceLauncher()) {
   241     if (JLI_IsTraceLauncher()) {
   244         int i;
   242         int i;
   429         PrintUsage(env, printXUsage);
   427         PrintUsage(env, printXUsage);
   430         CHECK_EXCEPTION_LEAVE(1);
   428         CHECK_EXCEPTION_LEAVE(1);
   431         LEAVE();
   429         LEAVE();
   432     }
   430     }
   433 
   431 
   434     FreeKnownVMs();  /* after last possible PrintUsage() */
   432     FreeKnownVMs(); /* after last possible PrintUsage */
   435 
   433 
   436     if (JLI_IsTraceLauncher()) {
   434     if (JLI_IsTraceLauncher()) {
   437         end = CounterGet();
   435         end = CounterGet();
   438         JLI_TraceLauncher("%ld micro seconds to InitializeJVM\n",
   436         JLI_TraceLauncher("%ld micro seconds to InitializeJVM\n",
   439                (long)(jint)Counter2Micros(end-start));
   437                (long)(jint)Counter2Micros(end-start));
   667     *pargc = newArgvIdx;
   665     *pargc = newArgvIdx;
   668 
   666 
   669     /* use the default VM type if not specified (no alias processing) */
   667     /* use the default VM type if not specified (no alias processing) */
   670     if (jvmtype == NULL) {
   668     if (jvmtype == NULL) {
   671       char* result = knownVMs[0].name+1;
   669       char* result = knownVMs[0].name+1;
   672       /* Use a different VM type if we are on a server class machine? */
       
   673       if ((knownVMs[0].flag == VM_IF_SERVER_CLASS) &&
       
   674           (ServerClassMachine() == JNI_TRUE)) {
       
   675         result = knownVMs[0].server_class+1;
       
   676       }
       
   677       JLI_TraceLauncher("Default VM: %s\n", result);
   670       JLI_TraceLauncher("Default VM: %s\n", result);
   678       return result;
   671       return result;
   679     }
   672     }
   680 
   673 
   681     /* if using an alternate VM, no alias processing */
   674     /* if using an alternate VM, no alias processing */
  1775     jmethodID showSettingsID;
  1768     jmethodID showSettingsID;
  1776     jstring joptString;
  1769     jstring joptString;
  1777     jclass cls = GetLauncherHelperClass(env);
  1770     jclass cls = GetLauncherHelperClass(env);
  1778     NULL_CHECK(cls);
  1771     NULL_CHECK(cls);
  1779     NULL_CHECK(showSettingsID = (*env)->GetStaticMethodID(env, cls,
  1772     NULL_CHECK(showSettingsID = (*env)->GetStaticMethodID(env, cls,
  1780             "showSettings", "(ZLjava/lang/String;JJJZ)V"));
  1773             "showSettings", "(ZLjava/lang/String;JJJ)V"));
  1781     NULL_CHECK(joptString = (*env)->NewStringUTF(env, optString));
  1774     NULL_CHECK(joptString = (*env)->NewStringUTF(env, optString));
  1782     (*env)->CallStaticVoidMethod(env, cls, showSettingsID,
  1775     (*env)->CallStaticVoidMethod(env, cls, showSettingsID,
  1783                                  USE_STDERR,
  1776                                  USE_STDERR,
  1784                                  joptString,
  1777                                  joptString,
  1785                                  (jlong)initialHeapSize,
  1778                                  (jlong)initialHeapSize,
  1786                                  (jlong)maxHeapSize,
  1779                                  (jlong)maxHeapSize,
  1787                                  (jlong)threadStackSize,
  1780                                  (jlong)threadStackSize);
  1788                                  ServerClassMachine());
       
  1789 }
  1781 }
  1790 
  1782 
  1791 /**
  1783 /**
  1792  * List modules supported by the runtime
  1784  * List modules supported by the runtime
  1793  */
  1785  */
  1810  * Prints default usage or the Xusage message, see sun.launcher.LauncherHelper.java
  1802  * Prints default usage or the Xusage message, see sun.launcher.LauncherHelper.java
  1811  */
  1803  */
  1812 static void
  1804 static void
  1813 PrintUsage(JNIEnv* env, jboolean doXUsage)
  1805 PrintUsage(JNIEnv* env, jboolean doXUsage)
  1814 {
  1806 {
  1815   jmethodID initHelp, vmSelect, vmSynonym, vmErgo, printHelp, printXUsageMessage;
  1807   jmethodID initHelp, vmSelect, vmSynonym, printHelp, printXUsageMessage;
  1816   jstring jprogname, vm1, vm2;
  1808   jstring jprogname, vm1, vm2;
  1817   int i;
  1809   int i;
  1818   jclass cls = GetLauncherHelperClass(env);
  1810   jclass cls = GetLauncherHelperClass(env);
  1819   NULL_CHECK(cls);
  1811   NULL_CHECK(cls);
  1820   if (doXUsage) {
  1812   if (doXUsage) {
  1829                                         "(Ljava/lang/String;Ljava/lang/String;)V"));
  1821                                         "(Ljava/lang/String;Ljava/lang/String;)V"));
  1830 
  1822 
  1831     NULL_CHECK(vmSynonym = (*env)->GetStaticMethodID(env, cls,
  1823     NULL_CHECK(vmSynonym = (*env)->GetStaticMethodID(env, cls,
  1832                                         "appendVmSynonymMessage",
  1824                                         "appendVmSynonymMessage",
  1833                                         "(Ljava/lang/String;Ljava/lang/String;)V"));
  1825                                         "(Ljava/lang/String;Ljava/lang/String;)V"));
  1834     NULL_CHECK(vmErgo = (*env)->GetStaticMethodID(env, cls,
       
  1835                                         "appendVmErgoMessage", "(ZLjava/lang/String;)V"));
       
  1836 
  1826 
  1837     NULL_CHECK(printHelp = (*env)->GetStaticMethodID(env, cls,
  1827     NULL_CHECK(printHelp = (*env)->GetStaticMethodID(env, cls,
  1838                                         "printHelpMessage", "(Z)V"));
  1828                                         "printHelpMessage", "(Z)V"));
  1839 
  1829 
  1840     NULL_CHECK(jprogname = (*env)->NewStringUTF(env, _program_name));
  1830     NULL_CHECK(jprogname = (*env)->NewStringUTF(env, _program_name));
  1843     (*env)->CallStaticVoidMethod(env, cls, initHelp, jprogname);
  1833     (*env)->CallStaticVoidMethod(env, cls, initHelp, jprogname);
  1844     CHECK_EXCEPTION_RETURN();
  1834     CHECK_EXCEPTION_RETURN();
  1845 
  1835 
  1846 
  1836 
  1847     /* Assemble the other variant part of the usage */
  1837     /* Assemble the other variant part of the usage */
  1848     if ((knownVMs[0].flag == VM_KNOWN) ||
       
  1849         (knownVMs[0].flag == VM_IF_SERVER_CLASS)) {
       
  1850       NULL_CHECK(vm1 = (*env)->NewStringUTF(env, knownVMs[0].name));
       
  1851       NULL_CHECK(vm2 =  (*env)->NewStringUTF(env, knownVMs[0].name+1));
       
  1852       (*env)->CallStaticVoidMethod(env, cls, vmSelect, vm1, vm2);
       
  1853       CHECK_EXCEPTION_RETURN();
       
  1854     }
       
  1855     for (i=1; i<knownVMsCount; i++) {
  1838     for (i=1; i<knownVMsCount; i++) {
  1856       if (knownVMs[i].flag == VM_KNOWN) {
  1839       if (knownVMs[i].flag == VM_KNOWN) {
  1857         NULL_CHECK(vm1 =  (*env)->NewStringUTF(env, knownVMs[i].name));
  1840         NULL_CHECK(vm1 =  (*env)->NewStringUTF(env, knownVMs[i].name));
  1858         NULL_CHECK(vm2 =  (*env)->NewStringUTF(env, knownVMs[i].name+1));
  1841         NULL_CHECK(vm2 =  (*env)->NewStringUTF(env, knownVMs[i].name+1));
  1859         (*env)->CallStaticVoidMethod(env, cls, vmSelect, vm1, vm2);
  1842         (*env)->CallStaticVoidMethod(env, cls, vmSelect, vm1, vm2);
  1865         NULL_CHECK(vm1 =  (*env)->NewStringUTF(env, knownVMs[i].name));
  1848         NULL_CHECK(vm1 =  (*env)->NewStringUTF(env, knownVMs[i].name));
  1866         NULL_CHECK(vm2 =  (*env)->NewStringUTF(env, knownVMs[i].alias+1));
  1849         NULL_CHECK(vm2 =  (*env)->NewStringUTF(env, knownVMs[i].alias+1));
  1867         (*env)->CallStaticVoidMethod(env, cls, vmSynonym, vm1, vm2);
  1850         (*env)->CallStaticVoidMethod(env, cls, vmSynonym, vm1, vm2);
  1868         CHECK_EXCEPTION_RETURN();
  1851         CHECK_EXCEPTION_RETURN();
  1869       }
  1852       }
  1870     }
       
  1871 
       
  1872     /* The first known VM is the default */
       
  1873     {
       
  1874       jboolean isServerClassMachine = ServerClassMachine();
       
  1875 
       
  1876       const char* defaultVM  =  knownVMs[0].name+1;
       
  1877       if ((knownVMs[0].flag == VM_IF_SERVER_CLASS) && isServerClassMachine) {
       
  1878         defaultVM = knownVMs[0].server_class+1;
       
  1879       }
       
  1880 
       
  1881       NULL_CHECK(vm1 =  (*env)->NewStringUTF(env, defaultVM));
       
  1882       (*env)->CallStaticVoidMethod(env, cls, vmErgo, isServerClassMachine,  vm1);
       
  1883       CHECK_EXCEPTION_RETURN();
       
  1884     }
  1853     }
  1885 
  1854 
  1886     /* Complete the usage message and print to stderr*/
  1855     /* Complete the usage message and print to stderr*/
  1887     (*env)->CallStaticVoidMethod(env, cls, printHelp, USE_STDERR);
  1856     (*env)->CallStaticVoidMethod(env, cls, printHelp, USE_STDERR);
  1888   }
  1857   }
  2009                 } else if (!JLI_StrCCmp(tmpPtr, "IGNORE")) {
  1978                 } else if (!JLI_StrCCmp(tmpPtr, "IGNORE")) {
  2010                     vmType = VM_IGNORE;
  1979                     vmType = VM_IGNORE;
  2011                 } else if (!JLI_StrCCmp(tmpPtr, "ERROR")) {
  1980                 } else if (!JLI_StrCCmp(tmpPtr, "ERROR")) {
  2012                     vmType = VM_ERROR;
  1981                     vmType = VM_ERROR;
  2013                 } else if (!JLI_StrCCmp(tmpPtr, "IF_SERVER_CLASS")) {
  1982                 } else if (!JLI_StrCCmp(tmpPtr, "IF_SERVER_CLASS")) {
  2014                     tmpPtr += JLI_StrCSpn(tmpPtr, whiteSpace);
  1983                     /* ignored */
  2015                     if (*tmpPtr != 0) {
       
  2016                         tmpPtr += JLI_StrSpn(tmpPtr, whiteSpace);
       
  2017                     }
       
  2018                     if (*tmpPtr == 0) {
       
  2019                         JLI_ReportErrorMessage(CFG_WARN4, lineno, jvmCfgName);
       
  2020                     } else {
       
  2021                         /* Null terminate server class VM name */
       
  2022                         serverClassVMName = tmpPtr;
       
  2023                         tmpPtr += JLI_StrCSpn(tmpPtr, whiteSpace);
       
  2024                         *tmpPtr = 0;
       
  2025                         vmType = VM_IF_SERVER_CLASS;
       
  2026                     }
       
  2027                 } else {
  1984                 } else {
  2028                     JLI_ReportErrorMessage(CFG_WARN5, lineno, &jvmCfgName[0]);
  1985                     JLI_ReportErrorMessage(CFG_WARN5, lineno, &jvmCfgName[0]);
  2029                     vmType = VM_KNOWN;
  1986                     vmType = VM_KNOWN;
  2030                 }
  1987                 }
  2031             }
  1988             }
  2041             case VM_ALIASED_TO:
  1998             case VM_ALIASED_TO:
  2042                 knownVMs[cnt].alias = JLI_StringDup(altVMName);
  1999                 knownVMs[cnt].alias = JLI_StringDup(altVMName);
  2043                 JLI_TraceLauncher("    name: %s  vmType: %s  alias: %s\n",
  2000                 JLI_TraceLauncher("    name: %s  vmType: %s  alias: %s\n",
  2044                    knownVMs[cnt].name, "VM_ALIASED_TO", knownVMs[cnt].alias);
  2001                    knownVMs[cnt].name, "VM_ALIASED_TO", knownVMs[cnt].alias);
  2045                 break;
  2002                 break;
  2046             case VM_IF_SERVER_CLASS:
       
  2047                 knownVMs[cnt].server_class = JLI_StringDup(serverClassVMName);
       
  2048                 JLI_TraceLauncher("    name: %s  vmType: %s  server_class: %s\n",
       
  2049                     knownVMs[cnt].name, "VM_IF_SERVER_CLASS", knownVMs[cnt].server_class);
       
  2050                 break;
       
  2051             }
  2003             }
  2052             cnt++;
  2004             cnt++;
  2053         }
  2005         }
  2054     }
  2006     }
  2055     fclose(jvmCfg);
  2007     fclose(jvmCfg);
  2193 
  2145 
  2194 const char*
  2146 const char*
  2195 GetLauncherName()
  2147 GetLauncherName()
  2196 {
  2148 {
  2197     return _launcher_name;
  2149     return _launcher_name;
  2198 }
       
  2199 
       
  2200 jint
       
  2201 GetErgoPolicy()
       
  2202 {
       
  2203     return _ergo_policy;
       
  2204 }
  2150 }
  2205 
  2151 
  2206 jboolean
  2152 jboolean
  2207 IsJavaArgs()
  2153 IsJavaArgs()
  2208 {
  2154 {
  2265     printf("\tjavargs:%s\n", (_is_java_args == JNI_TRUE) ? "on" : "off");
  2211     printf("\tjavargs:%s\n", (_is_java_args == JNI_TRUE) ? "on" : "off");
  2266     printf("\tprogram name:%s\n", GetProgramName());
  2212     printf("\tprogram name:%s\n", GetProgramName());
  2267     printf("\tlauncher name:%s\n", GetLauncherName());
  2213     printf("\tlauncher name:%s\n", GetLauncherName());
  2268     printf("\tjavaw:%s\n", (IsJavaw() == JNI_TRUE) ? "on" : "off");
  2214     printf("\tjavaw:%s\n", (IsJavaw() == JNI_TRUE) ? "on" : "off");
  2269     printf("\tfullversion:%s\n", GetFullVersion());
  2215     printf("\tfullversion:%s\n", GetFullVersion());
  2270     printf("\tergo_policy:");
       
  2271     switch(GetErgoPolicy()) {
       
  2272         case NEVER_SERVER_CLASS:
       
  2273             printf("NEVER_ACT_AS_A_SERVER_CLASS_MACHINE\n");
       
  2274             break;
       
  2275         case ALWAYS_SERVER_CLASS:
       
  2276             printf("ALWAYS_ACT_AS_A_SERVER_CLASS_MACHINE\n");
       
  2277             break;
       
  2278         default:
       
  2279             printf("DEFAULT_ERGONOMICS_POLICY\n");
       
  2280     }
       
  2281 }
  2216 }
  2282 
  2217 
  2283 /*
  2218 /*
  2284  * Return JNI_TRUE for an option string that has no effect but should
  2219  * Return JNI_TRUE for an option string that has no effect but should
  2285  * _not_ be passed on to the vm; return JNI_FALSE otherwise.  On
  2220  * _not_ be passed on to the vm; return JNI_FALSE otherwise.  On