mirror of
https://github.com/openjdk/jdk.git
synced 2026-04-22 12:51:01 +00:00
Merge
This commit is contained in:
commit
75f781fa99
@ -94,15 +94,15 @@ static int numOptions, maxOptions;
|
||||
* Prototypes for functions internal to launcher.
|
||||
*/
|
||||
static void SetClassPath(const char *s);
|
||||
static void SetModulesBootClassPath(const char *s);
|
||||
static void SelectVersion(int argc, char **argv, char **main_class);
|
||||
static jboolean ParseArguments(int *pargc, char ***pargv, char **pjarfile,
|
||||
char **pclassname, int *pret, const char *jvmpath);
|
||||
static jboolean ParseArguments(int *pargc, char ***pargv,
|
||||
int *pmode, char **pwhat,
|
||||
int *pret, const char *jrepath);
|
||||
static jboolean InitializeJVM(JavaVM **pvm, JNIEnv **penv,
|
||||
InvocationFunctions *ifn);
|
||||
static jstring NewPlatformString(JNIEnv *env, char *s);
|
||||
static jobjectArray NewPlatformStringArray(JNIEnv *env, char **strv, int strc);
|
||||
static jclass LoadMainClass(JNIEnv *env, jboolean isJar, char *name);
|
||||
static jclass LoadMainClass(JNIEnv *env, int mode, char *name);
|
||||
|
||||
static void TranslateApplicationArgs(int jargc, const char **jargv, int *pargc, char ***pargv);
|
||||
static jboolean AddApplicationOptions(int cpathc, const char **cpathv);
|
||||
@ -158,18 +158,27 @@ static jboolean IsWildCardEnabled();
|
||||
* Running Java code in primordial thread caused many problems. We will
|
||||
* create a new thread to invoke JVM. See 6316197 for more information.
|
||||
*/
|
||||
static jlong threadStackSize = 0; /* stack size of the new thread */
|
||||
static jlong threadStackSize = 0; /* stack size of the new thread */
|
||||
static jlong maxHeapSize = 0; /* max heap size */
|
||||
static jlong initialHeapSize = 0; /* inital heap size */
|
||||
|
||||
int JNICALL JavaMain(void * args); /* entry point */
|
||||
|
||||
enum LaunchMode { // cf. sun.launcher.LauncherHelper
|
||||
LM_UNKNOWN = 0,
|
||||
LM_CLASS,
|
||||
LM_JAR
|
||||
};
|
||||
|
||||
static const char *launchModeNames[]
|
||||
= { "Unknown", "Main class", "JAR file" };
|
||||
|
||||
typedef struct {
|
||||
int argc;
|
||||
char ** argv;
|
||||
char * jarfile;
|
||||
char * classname;
|
||||
InvocationFunctions ifn;
|
||||
int argc;
|
||||
char **argv;
|
||||
int mode;
|
||||
char *what;
|
||||
InvocationFunctions ifn;
|
||||
} JavaMainArgs;
|
||||
|
||||
/*
|
||||
@ -189,8 +198,8 @@ JLI_Launch(int argc, char ** argv, /* main argc, argc */
|
||||
jint ergo /* ergonomics class policy */
|
||||
)
|
||||
{
|
||||
char *jarfile = 0;
|
||||
char *classname = 0;
|
||||
int mode = LM_UNKNOWN;
|
||||
char *what = NULL;
|
||||
char *cpath = 0;
|
||||
char *main_class = NULL;
|
||||
int ret;
|
||||
@ -277,24 +286,21 @@ JLI_Launch(int argc, char ** argv, /* main argc, argc */
|
||||
SetClassPath(cpath);
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse command line options; if the return value of
|
||||
* ParseArguments is false, the program should exit.
|
||||
/* Parse command line options; if the return value of
|
||||
* ParseArguments is false, the program should exit.
|
||||
*/
|
||||
if (!ParseArguments(&argc, &argv, &jarfile, &classname, &ret, jvmpath)) {
|
||||
if (!ParseArguments(&argc, &argv, &mode, &what, &ret, jrepath))
|
||||
{
|
||||
return(ret);
|
||||
}
|
||||
|
||||
/* Set bootclasspath for modules */
|
||||
SetModulesBootClassPath(jrepath);
|
||||
|
||||
/* Override class path if -jar flag was specified */
|
||||
if (jarfile != 0) {
|
||||
SetClassPath(jarfile);
|
||||
if (mode == LM_JAR) {
|
||||
SetClassPath(what); /* Override class path */
|
||||
}
|
||||
|
||||
/* set the -Dsun.java.command pseudo property */
|
||||
SetJavaCommandLineProp(classname, jarfile, argc, argv);
|
||||
SetJavaCommandLineProp(what, argc, argv);
|
||||
|
||||
/* Set the -Dsun.java.launcher pseudo property */
|
||||
SetJavaLauncherProp();
|
||||
@ -305,7 +311,7 @@ JLI_Launch(int argc, char ** argv, /* main argc, argc */
|
||||
/* Show the splash screen if needed */
|
||||
ShowSplashScreen();
|
||||
|
||||
return ContinueInNewThread(&ifn, argc, argv, jarfile, classname, ret);
|
||||
return ContinueInNewThread(&ifn, argc, argv, mode, what, ret);
|
||||
|
||||
}
|
||||
/*
|
||||
@ -353,13 +359,13 @@ JavaMain(void * _args)
|
||||
JavaMainArgs *args = (JavaMainArgs *)_args;
|
||||
int argc = args->argc;
|
||||
char **argv = args->argv;
|
||||
char *jarfile = args->jarfile;
|
||||
char *classname = args->classname;
|
||||
int mode = args->mode;
|
||||
char *what = args->what;
|
||||
InvocationFunctions ifn = args->ifn;
|
||||
|
||||
JavaVM *vm = 0;
|
||||
JNIEnv *env = 0;
|
||||
jclass mainClass;
|
||||
jclass mainClass = NULL;
|
||||
jmethodID mainID;
|
||||
jobjectArray mainArgs;
|
||||
int ret = 0;
|
||||
@ -385,7 +391,7 @@ JavaMain(void * _args)
|
||||
CHECK_EXCEPTION_LEAVE(1);
|
||||
}
|
||||
/* If the user specified neither a class name nor a JAR file */
|
||||
if (printXUsage || printUsage || (jarfile == 0 && classname == 0)) {
|
||||
if (printXUsage || printUsage || what == 0 || mode == LM_UNKNOWN) {
|
||||
PrintUsage(env, printXUsage);
|
||||
CHECK_EXCEPTION_LEAVE(1);
|
||||
LEAVE();
|
||||
@ -399,11 +405,11 @@ JavaMain(void * _args)
|
||||
(long)(jint)Counter2Micros(end-start));
|
||||
}
|
||||
|
||||
/* At this stage, argc/argv have the applications' arguments */
|
||||
/* At this stage, argc/argv have the application's arguments */
|
||||
if (JLI_IsTraceLauncher()){
|
||||
int i;
|
||||
printf("Main-Class is '%s'\n", classname ? classname : "");
|
||||
printf("Apps' argc is %d\n", argc);
|
||||
printf("%s is '%s'\n", launchModeNames[mode], what);
|
||||
printf("App's argc is %d\n", argc);
|
||||
for (i=0; i < argc; i++) {
|
||||
printf(" argv[%2d] = '%s'\n", i, argv[i]);
|
||||
}
|
||||
@ -431,11 +437,7 @@ JavaMain(void * _args)
|
||||
* 2) Remove the vestages of maintaining main_class through
|
||||
* the environment (and remove these comments).
|
||||
*/
|
||||
if (jarfile != 0) {
|
||||
mainClass = LoadMainClass(env, JNI_TRUE, jarfile);
|
||||
} else {
|
||||
mainClass = LoadMainClass(env, JNI_FALSE, classname);
|
||||
}
|
||||
mainClass = LoadMainClass(env, mode, what);
|
||||
CHECK_EXCEPTION_NULL_LEAVE(mainClass);
|
||||
|
||||
/*
|
||||
@ -697,7 +699,7 @@ AddOption(char *str, void *info)
|
||||
if (JLI_StrCCmp(str, "-Xms") == 0) {
|
||||
jlong tmp;
|
||||
if (parse_size(str + 4, &tmp)) {
|
||||
initialHeapSize = tmp;
|
||||
initialHeapSize = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -718,44 +720,6 @@ SetClassPath(const char *s)
|
||||
JLI_MemFree((char *) s);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the bootclasspath for modules.
|
||||
* A temporary workaround until jigsaw is integrated into JDK 7.
|
||||
*/
|
||||
static void
|
||||
SetModulesBootClassPath(const char *jrepath)
|
||||
{
|
||||
char *def, *s;
|
||||
char pathname[MAXPATHLEN];
|
||||
const char separator[] = { FILE_SEPARATOR, '\0' };
|
||||
const char *orig = jrepath;
|
||||
static const char format[] = "-Xbootclasspath/p:%s";
|
||||
struct stat statbuf;
|
||||
|
||||
/* return if jre/lib/rt.jar exists */
|
||||
JLI_Snprintf(pathname, sizeof(pathname), "%s%slib%srt.jar", jrepath, separator, separator);
|
||||
if (stat(pathname, &statbuf) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* return if jre/classes exists */
|
||||
JLI_Snprintf(pathname, sizeof(pathname), "%s%sclasses", jrepath, separator);
|
||||
if (stat(pathname, &statbuf) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* modularized jre */
|
||||
JLI_Snprintf(pathname, sizeof(pathname), "%s%slib%s*", jrepath, separator, separator);
|
||||
s = (char *) JLI_WildcardExpandClasspath(pathname);
|
||||
def = JLI_MemAlloc(sizeof(format)
|
||||
- 2 /* strlen("%s") */
|
||||
+ JLI_StrLen(s));
|
||||
sprintf(def, format, s);
|
||||
AddOption(def, NULL);
|
||||
if (s != orig)
|
||||
JLI_MemFree((char *) s);
|
||||
}
|
||||
|
||||
/*
|
||||
* The SelectVersion() routine ensures that an appropriate version of
|
||||
* the JRE is running. The specification for the appropriate version
|
||||
@ -1000,16 +964,17 @@ SelectVersion(int argc, char **argv, char **main_class)
|
||||
/*
|
||||
* Parses command line arguments. Returns JNI_FALSE if launcher
|
||||
* should exit without starting vm, returns JNI_TRUE if vm needs
|
||||
* to be started to process given options. *pret (the launcher
|
||||
* to be started to process given options. *pret (the launcher
|
||||
* process return value) is set to 0 for a normal exit.
|
||||
*/
|
||||
static jboolean
|
||||
ParseArguments(int *pargc, char ***pargv, char **pjarfile,
|
||||
char **pclassname, int *pret, const char *jvmpath)
|
||||
ParseArguments(int *pargc, char ***pargv,
|
||||
int *pmode, char **pwhat,
|
||||
int *pret, const char *jrepath)
|
||||
{
|
||||
int argc = *pargc;
|
||||
char **argv = *pargv;
|
||||
jboolean jarflag = JNI_FALSE;
|
||||
int mode = LM_UNKNOWN;
|
||||
char *arg;
|
||||
|
||||
*pret = 0;
|
||||
@ -1019,10 +984,11 @@ ParseArguments(int *pargc, char ***pargv, char **pjarfile,
|
||||
if (JLI_StrCmp(arg, "-classpath") == 0 || JLI_StrCmp(arg, "-cp") == 0) {
|
||||
ARG_CHECK (argc, ARG_ERROR1, arg);
|
||||
SetClassPath(*argv);
|
||||
mode = LM_CLASS;
|
||||
argv++; --argc;
|
||||
} else if (JLI_StrCmp(arg, "-jar") == 0) {
|
||||
ARG_CHECK (argc, ARG_ERROR2, arg);
|
||||
jarflag = JNI_TRUE;
|
||||
mode = LM_JAR;
|
||||
} else if (JLI_StrCmp(arg, "-help") == 0 ||
|
||||
JLI_StrCmp(arg, "-h") == 0 ||
|
||||
JLI_StrCmp(arg, "-?") == 0) {
|
||||
@ -1102,19 +1068,24 @@ ParseArguments(int *pargc, char ***pargv, char **pjarfile,
|
||||
}
|
||||
|
||||
if (--argc >= 0) {
|
||||
if (jarflag) {
|
||||
*pjarfile = *argv++;
|
||||
*pclassname = NULL;
|
||||
} else {
|
||||
*pjarfile = NULL;
|
||||
*pclassname = *argv++;
|
||||
}
|
||||
*pwhat = *argv++;
|
||||
}
|
||||
|
||||
if (*pwhat == NULL) {
|
||||
*pret = 1;
|
||||
} else if (mode == LM_UNKNOWN) {
|
||||
/* default to LM_CLASS if -jar and -cp option are
|
||||
* not specified */
|
||||
mode = LM_CLASS;
|
||||
}
|
||||
|
||||
if (argc >= 0) {
|
||||
*pargc = argc;
|
||||
*pargv = argv;
|
||||
}
|
||||
if (*pjarfile == NULL && *pclassname == NULL) {
|
||||
*pret = 1;
|
||||
}
|
||||
|
||||
*pmode = mode;
|
||||
|
||||
return JNI_TRUE;
|
||||
}
|
||||
|
||||
@ -1263,7 +1234,7 @@ NewPlatformStringArray(JNIEnv *env, char **strv, int strc)
|
||||
* call it for more details refer to the java implementation.
|
||||
*/
|
||||
static jclass
|
||||
LoadMainClass(JNIEnv *env, jboolean isJar, char *name)
|
||||
LoadMainClass(JNIEnv *env, int mode, char *name)
|
||||
{
|
||||
jclass cls;
|
||||
jmethodID mid;
|
||||
@ -1276,9 +1247,9 @@ LoadMainClass(JNIEnv *env, jboolean isJar, char *name)
|
||||
}
|
||||
NULL_CHECK0(cls = FindBootStrapClass(env, "sun/launcher/LauncherHelper"));
|
||||
NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls, "checkAndLoadMain",
|
||||
"(ZZLjava/lang/String;)Ljava/lang/Object;"));
|
||||
"(ZILjava/lang/String;)Ljava/lang/Class;"));
|
||||
str = (*env)->NewStringUTF(env, name);
|
||||
result = (*env)->CallStaticObjectMethod(env, cls, mid, JNI_TRUE, isJar, str);
|
||||
result = (*env)->CallStaticObjectMethod(env, cls, mid, JNI_TRUE, mode, str);
|
||||
|
||||
if (JLI_IsTraceLauncher()) {
|
||||
end = CounterGet();
|
||||
@ -1424,8 +1395,7 @@ AddApplicationOptions(int cpathc, const char **cpathv)
|
||||
* property is not exported by HotSpot to the Java layer.
|
||||
*/
|
||||
void
|
||||
SetJavaCommandLineProp(char *classname, char *jarfile,
|
||||
int argc, char **argv)
|
||||
SetJavaCommandLineProp(char *what, int argc, char **argv)
|
||||
{
|
||||
|
||||
int i = 0;
|
||||
@ -1433,22 +1403,17 @@ SetJavaCommandLineProp(char *classname, char *jarfile,
|
||||
char* javaCommand = NULL;
|
||||
char* dashDstr = "-Dsun.java.command=";
|
||||
|
||||
if (classname == NULL && jarfile == NULL) {
|
||||
if (what == NULL) {
|
||||
/* unexpected, one of these should be set. just return without
|
||||
* setting the property
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
/* if the class name is not set, then use the jarfile name */
|
||||
if (classname == NULL) {
|
||||
classname = jarfile;
|
||||
}
|
||||
|
||||
/* determine the amount of memory to allocate assuming
|
||||
* the individual components will be space separated
|
||||
*/
|
||||
len = JLI_StrLen(classname);
|
||||
len = JLI_StrLen(what);
|
||||
for (i = 0; i < argc; i++) {
|
||||
len += JLI_StrLen(argv[i]) + 1;
|
||||
}
|
||||
@ -1459,7 +1424,7 @@ SetJavaCommandLineProp(char *classname, char *jarfile,
|
||||
/* build the -D string */
|
||||
*javaCommand = '\0';
|
||||
JLI_StrCat(javaCommand, dashDstr);
|
||||
JLI_StrCat(javaCommand, classname);
|
||||
JLI_StrCat(javaCommand, what);
|
||||
|
||||
for (i = 0; i < argc; i++) {
|
||||
/* the components of the string are space separated. In
|
||||
@ -1479,7 +1444,8 @@ SetJavaCommandLineProp(char *classname, char *jarfile,
|
||||
* JVM would like to know if it's created by a standard Sun launcher, or by
|
||||
* user native application, the following property indicates the former.
|
||||
*/
|
||||
void SetJavaLauncherProp() {
|
||||
void
|
||||
SetJavaLauncherProp() {
|
||||
AddOption("-Dsun.java.launcher=SUN_STANDARD", NULL);
|
||||
}
|
||||
|
||||
@ -1913,8 +1879,8 @@ IsWildCardEnabled()
|
||||
}
|
||||
|
||||
static int
|
||||
ContinueInNewThread(InvocationFunctions* ifn, int argc,
|
||||
char **argv, char *jarfile, char *classname, int ret)
|
||||
ContinueInNewThread(InvocationFunctions* ifn, int argc, char **argv,
|
||||
int mode, char *what, int ret)
|
||||
{
|
||||
|
||||
/*
|
||||
@ -1938,8 +1904,8 @@ ContinueInNewThread(InvocationFunctions* ifn, int argc,
|
||||
|
||||
args.argc = argc;
|
||||
args.argv = argv;
|
||||
args.jarfile = jarfile;
|
||||
args.classname = classname;
|
||||
args.mode = mode;
|
||||
args.what = what;
|
||||
args.ifn = *ifn;
|
||||
|
||||
rslt = ContinueInNewThread0(JavaMain, threadStackSize, (void*)&args);
|
||||
|
||||
@ -153,7 +153,7 @@ int ContinueInNewThread0(int (JNICALL *continuation)(void *),
|
||||
|
||||
/* sun.java.launcher.* platform properties. */
|
||||
void SetJavaLauncherPlatformProps(void);
|
||||
void SetJavaCommandLineProp(char* classname, char* jarfile, int argc, char** argv);
|
||||
void SetJavaCommandLineProp(char* what, int argc, char** argv);
|
||||
void SetJavaLauncherProp(void);
|
||||
|
||||
/*
|
||||
@ -178,8 +178,9 @@ jint GetErgoPolicy();
|
||||
|
||||
jboolean ServerClassMachine();
|
||||
|
||||
static int ContinueInNewThread(InvocationFunctions* ifn, int argc, char** argv,
|
||||
char* jarfile, char* classname, int ret);
|
||||
static int ContinueInNewThread(InvocationFunctions* ifn,
|
||||
int argc, char** argv,
|
||||
int mode, char *what, int ret);
|
||||
|
||||
/*
|
||||
* Initialize platform specific settings
|
||||
|
||||
@ -677,8 +677,7 @@ class InetAddress implements java.io.Serializable {
|
||||
|
||||
static InetAddressImpl impl;
|
||||
|
||||
private static HashMap<String, InetAddress[]> lookupTable
|
||||
= new HashMap<String, InetAddress[]>();
|
||||
private static final HashMap<String, Void> lookupTable = new HashMap<>();
|
||||
|
||||
/**
|
||||
* Represents a cache entry
|
||||
@ -737,7 +736,7 @@ class InetAddress implements java.io.Serializable {
|
||||
|
||||
// As we iterate in insertion order we can
|
||||
// terminate when a non-expired entry is found.
|
||||
LinkedList<String> expired = new LinkedList<String>();
|
||||
LinkedList<String> expired = new LinkedList<>();
|
||||
long now = System.currentTimeMillis();
|
||||
for (String key : cache.keySet()) {
|
||||
CacheEntry entry = cache.get(key);
|
||||
@ -1227,43 +1226,45 @@ class InetAddress implements java.io.Serializable {
|
||||
// lookupTable and return null so the
|
||||
// following code would do a lookup itself.
|
||||
if ((addresses = checkLookupTable(host)) == null) {
|
||||
// This is the first thread which looks up the addresses
|
||||
// this host or the cache entry for this host has been
|
||||
// expired so this thread should do the lookup.
|
||||
for (NameService nameService : nameServices) {
|
||||
try {
|
||||
/*
|
||||
* Do not put the call to lookup() inside the
|
||||
* constructor. if you do you will still be
|
||||
* allocating space when the lookup fails.
|
||||
*/
|
||||
try {
|
||||
// This is the first thread which looks up the addresses
|
||||
// this host or the cache entry for this host has been
|
||||
// expired so this thread should do the lookup.
|
||||
for (NameService nameService : nameServices) {
|
||||
try {
|
||||
/*
|
||||
* Do not put the call to lookup() inside the
|
||||
* constructor. if you do you will still be
|
||||
* allocating space when the lookup fails.
|
||||
*/
|
||||
|
||||
addresses = nameService.lookupAllHostAddr(host);
|
||||
success = true;
|
||||
break;
|
||||
} catch (UnknownHostException uhe) {
|
||||
if (host.equalsIgnoreCase("localhost")) {
|
||||
InetAddress[] local = new InetAddress[] { impl.loopbackAddress() };
|
||||
addresses = local;
|
||||
addresses = nameService.lookupAllHostAddr(host);
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
else {
|
||||
addresses = unknown_array;
|
||||
success = false;
|
||||
ex = uhe;
|
||||
} catch (UnknownHostException uhe) {
|
||||
if (host.equalsIgnoreCase("localhost")) {
|
||||
InetAddress[] local = new InetAddress[] { impl.loopbackAddress() };
|
||||
addresses = local;
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
else {
|
||||
addresses = unknown_array;
|
||||
success = false;
|
||||
ex = uhe;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Cache the addresses.
|
||||
cacheAddresses(host, addresses, success);
|
||||
// Delete the host from the lookupTable, and
|
||||
// notify all threads waiting for the monitor
|
||||
// for lookupTable.
|
||||
updateLookupTable(host);
|
||||
if (!success && ex != null)
|
||||
throw ex;
|
||||
// Cache the addresses.
|
||||
cacheAddresses(host, addresses, success);
|
||||
if (!success && ex != null)
|
||||
throw ex;
|
||||
} finally {
|
||||
// Delete host from the lookupTable and notify
|
||||
// all threads waiting on the lookupTable monitor.
|
||||
updateLookupTable(host);
|
||||
}
|
||||
}
|
||||
|
||||
return addresses;
|
||||
@ -1271,16 +1272,13 @@ class InetAddress implements java.io.Serializable {
|
||||
|
||||
|
||||
private static InetAddress[] checkLookupTable(String host) {
|
||||
// make sure addresses is null.
|
||||
InetAddress[] addresses = null;
|
||||
|
||||
synchronized (lookupTable) {
|
||||
// If the host isn't in the lookupTable, add it in the
|
||||
// lookuptable and return null. The caller should do
|
||||
// the lookup.
|
||||
if (lookupTable.containsKey(host) == false) {
|
||||
lookupTable.put(host, null);
|
||||
return addresses;
|
||||
return null;
|
||||
}
|
||||
|
||||
// If the host is in the lookupTable, it means that another
|
||||
@ -1298,10 +1296,11 @@ class InetAddress implements java.io.Serializable {
|
||||
// the host. This thread should retry to get the addresses
|
||||
// from the addressCache. If it doesn't get the addresses from
|
||||
// the cache, it will try to look up the addresses itself.
|
||||
addresses = getCachedAddresses(host);
|
||||
InetAddress[] addresses = getCachedAddresses(host);
|
||||
if (addresses == null) {
|
||||
synchronized (lookupTable) {
|
||||
lookupTable.put(host, null);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -401,6 +401,14 @@ public enum LauncherHelper {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// From src/share/bin/java.c:
|
||||
// enum LaunchMode { LM_UNKNOWN = 0, LM_CLASS, LM_JAR };
|
||||
|
||||
private static final int LM_UNKNOWN = 0;
|
||||
private static final int LM_CLASS = 1;
|
||||
private static final int LM_JAR = 2;
|
||||
|
||||
/**
|
||||
* This method does the following:
|
||||
* 1. gets the classname from a Jar's manifest, if necessary
|
||||
@ -420,24 +428,40 @@ public enum LauncherHelper {
|
||||
* @return
|
||||
* @throws java.io.IOException
|
||||
*/
|
||||
public static Object checkAndLoadMain(boolean printToStderr,
|
||||
boolean isJar, String name) throws IOException {
|
||||
public static Class<?> checkAndLoadMain(boolean printToStderr,
|
||||
int mode,
|
||||
String what) throws IOException
|
||||
{
|
||||
|
||||
ClassLoader ld = ClassLoader.getSystemClassLoader();
|
||||
|
||||
// get the class name
|
||||
String classname = (isJar) ? getMainClassFromJar(name) : name;
|
||||
classname = classname.replace('/', '.');
|
||||
ClassLoader loader = ClassLoader.getSystemClassLoader();
|
||||
Class<?> clazz = null;
|
||||
String cn = null;
|
||||
switch (mode) {
|
||||
case LM_CLASS:
|
||||
cn = what;
|
||||
break;
|
||||
case LM_JAR:
|
||||
cn = getMainClassFromJar(what);
|
||||
break;
|
||||
default:
|
||||
throw new InternalError("" + mode + ": Unknown launch mode");
|
||||
}
|
||||
cn = cn.replace('/', '.');
|
||||
|
||||
PrintStream ostream = (printToStderr) ? System.err : System.out;
|
||||
Class<?> c = null;
|
||||
try {
|
||||
clazz = loader.loadClass(classname);
|
||||
c = ld.loadClass(cn);
|
||||
} catch (ClassNotFoundException cnfe) {
|
||||
ostream.println(getLocalizedMessage("java.launcher.cls.error1", classname));
|
||||
NoClassDefFoundError ncdfe = new NoClassDefFoundError(classname);
|
||||
ostream.println(getLocalizedMessage("java.launcher.cls.error1",
|
||||
cn));
|
||||
NoClassDefFoundError ncdfe = new NoClassDefFoundError(cn);
|
||||
ncdfe.initCause(cnfe);
|
||||
throw ncdfe;
|
||||
}
|
||||
signatureDiagnostic(ostream, clazz);
|
||||
return clazz;
|
||||
signatureDiagnostic(ostream, c);
|
||||
return c;
|
||||
}
|
||||
|
||||
static void signatureDiagnostic(PrintStream ostream, Class<?> clazz) {
|
||||
|
||||
@ -29,12 +29,14 @@
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
// To ensure winsock2.h is used, it has to be included ahead of
|
||||
// windows.h, which includes winsock.h by default.
|
||||
#include <winsock2.h>
|
||||
#include <windows.h>
|
||||
#include <io.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <mmsystem.h>
|
||||
#include <winsock2.h>
|
||||
#include <fcntl.h>
|
||||
#include <process.h>
|
||||
|
||||
@ -147,7 +149,7 @@ md_seek(int filedes, jlong pos)
|
||||
void
|
||||
md_close(int filedes)
|
||||
{
|
||||
(void)close(filedes);
|
||||
(void)closesocket(filedes);
|
||||
}
|
||||
|
||||
int
|
||||
|
||||
@ -1,2 +0,0 @@
|
||||
Simple1NameServiceDescriptor
|
||||
Simple2NameServiceDescriptor
|
||||
@ -1,2 +0,0 @@
|
||||
# name service provider descriptor
|
||||
SimpleNameServiceDescriptor
|
||||
@ -0,0 +1,23 @@
|
||||
# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions
|
||||
|
||||
Simple1NameServiceDescriptor
|
||||
Simple2NameServiceDescriptor
|
||||
@ -25,15 +25,17 @@
|
||||
* @test
|
||||
* @bug 4762344
|
||||
* @summary 2nd nameservice provider is non functional
|
||||
* @build B4762344 SimpleNameService Simple1NameServiceDescriptor Simple2NameServiceDescriptor
|
||||
* @run main/othervm -Dsun.net.spi.nameservice.provider.1=simple1,sun -Dsun.net.spi.nameservice.provider.2=simple2,sun B4762344
|
||||
* @compile -XDignore.symbol.file=true SimpleNameService.java
|
||||
* Simple1NameServiceDescriptor.java
|
||||
* Simple2NameServiceDescriptor.java
|
||||
* @run main/othervm -Dsun.net.spi.nameservice.provider.1=simple1,sun -Dsun.net.spi.nameservice.provider.2=simple2,sun Providers
|
||||
*/
|
||||
|
||||
import java.net.*;
|
||||
import java.util.*;
|
||||
|
||||
|
||||
public class B4762344 {
|
||||
public class Providers {
|
||||
private static String[][] hostnames = new String[][] {
|
||||
// both providers know this host, but with different address
|
||||
new String[] {"blade", "10.0.0.1"},
|
||||
46
jdk/test/sun/net/InetAddress/nameservice/deadlock/Hang.java
Normal file
46
jdk/test/sun/net/InetAddress/nameservice/deadlock/Hang.java
Normal file
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 7012768
|
||||
* @compile -XDignore.symbol.file=true ThrowingNameService.java
|
||||
* ThrowingNameServiceDescriptor.java
|
||||
* @run main/othervm/timeout=30 -Dsun.net.spi.nameservice.provider.1=throwing,sun Hang
|
||||
* @summary InetAddress lookupTable leaks/deadlocks when using unsupported
|
||||
* name service spi
|
||||
*/
|
||||
|
||||
import java.net.InetAddress;
|
||||
|
||||
public class Hang {
|
||||
public static void main(String[] args) throws Exception {
|
||||
try {
|
||||
// 1st attempt - IllegalStateException caught below
|
||||
InetAddress.getByName("host.company.com");
|
||||
} catch (IllegalStateException e) { }
|
||||
|
||||
// 2nd attempt - Stuck here forever if bug exists
|
||||
InetAddress.getByName("host.company.com");
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,22 @@
|
||||
# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
|
||||
ThrowingNameServiceDescriptor
|
||||
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import sun.net.spi.nameservice.NameService;
|
||||
|
||||
public class ThrowingNameService implements NameService {
|
||||
static boolean firstCall = true;
|
||||
|
||||
@Override
|
||||
public InetAddress[] lookupAllHostAddr(String host) throws UnknownHostException {
|
||||
if (firstCall) {
|
||||
firstCall = false;
|
||||
// throw unchecked exception first time round
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
// return any valid address
|
||||
return new InetAddress[] { InetAddress.getLoopbackAddress() };
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHostByAddr(byte[] addr) throws UnknownHostException {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import sun.net.spi.nameservice.*;
|
||||
|
||||
public class ThrowingNameServiceDescriptor implements NameServiceDescriptor {
|
||||
public NameService createNameService() {
|
||||
return new ThrowingNameService();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProviderName() {
|
||||
return "sun";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return "throwing";
|
||||
}
|
||||
}
|
||||
@ -26,8 +26,8 @@
|
||||
* @summary Check that InetAddress doesn't continue to throw UHE
|
||||
* after the name service has recovered and the negative ttl
|
||||
* on the initial lookup has expired.
|
||||
*
|
||||
* @build CacheTest SimpleNameService SimpleNameServiceDescriptor
|
||||
* @compile -XDignore.symbol.file=true SimpleNameService.java
|
||||
* SimpleNameServiceDescriptor.java
|
||||
* @run main/othervm/timeout=200 -Dsun.net.spi.nameservice.provider.1=simple,sun CacheTest
|
||||
*/
|
||||
import java.net.InetAddress;
|
||||
@ -25,15 +25,15 @@
|
||||
* @bug 6442088
|
||||
* @summary Change default DNS caching behavior for code not running under
|
||||
* security manager.
|
||||
*
|
||||
* @build B6442088 SimpleNameService SimpleNameServiceDescriptor
|
||||
* @run main/othervm/timeout=200 -Dsun.net.inetaddr.ttl=20 -Dsun.net.spi.nameservice.provider.1=simple,sun B6442088
|
||||
* @compile -XDignore.symbol.file=true SimpleNameService.java
|
||||
* SimpleNameServiceDescriptor.java
|
||||
* @run main/othervm/timeout=200 -Dsun.net.inetaddr.ttl=20 -Dsun.net.spi.nameservice.provider.1=simple,sun DefaultCaching
|
||||
*/
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.security.Security;
|
||||
|
||||
public class B6442088 {
|
||||
public class DefaultCaching {
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
|
||||
@ -0,0 +1,22 @@
|
||||
# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
|
||||
SimpleNameServiceDescriptor # name service provider descriptor
|
||||
Loading…
x
Reference in New Issue
Block a user