# HG changeset patch # User bpb # Date 1520267262 28800 # Node ID 97288886180cf6b6ca69358026495eaf76c2ae04 # Parent 73385a708426504c600dda2bb78bfed3bf525106 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64 Summary: Move to using centralized native build and remove obsolete .so files Reviewed-by: alanb, erikj diff -r 73385a708426 -r 97288886180c make/test/JtregNativeJdk.gmk --- a/make/test/JtregNativeJdk.gmk Sun Mar 04 18:46:07 2018 -0800 +++ b/make/test/JtregNativeJdk.gmk Mon Mar 05 08:27:42 2018 -0800 @@ -1,5 +1,5 @@ # -# Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2015, 2018, 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 @@ -50,6 +50,7 @@ ifneq ($(OPENJDK_TARGET_OS), windows) BUILD_JDK_JTREG_NATIVE_SRC += $(TOPDIR)/test/jdk/java/nio/channels/FileChannel/directio + BUILD_JDK_JTREG_NATIVE_SRC += $(TOPDIR)/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel endif BUILD_JDK_JTREG_OUTPUT_DIR := $(OUTPUTDIR)/support/test/jdk/jtreg/native @@ -59,9 +60,14 @@ ifeq ($(OPENJDK_TARGET_OS), windows) WIN_LIB_JAVA := $(SUPPORT_OUTPUTDIR)/native/java.base/libjava/java.lib BUILD_JDK_JTREG_LIBRARIES_LIBS_libstringPlatformChars := $(WIN_LIB_JAVA) +else ifeq ($(OPENJDK_TARGET_OS), linux) + BUILD_JDK_JTREG_LIBRARIES_LIBS_libstringPlatformChars := -ljava + BUILD_JDK_JTREG_LIBRARIES_LIBS_libDirectIO := -ljava + BUILD_JDK_JTREG_LIBRARIES_LIBS_libInheritedChannel := -ljava else ifeq ($(OPENJDK_TARGET_OS), solaris) BUILD_JDK_JTREG_LIBRARIES_LIBS_libstringPlatformChars := -ljava -lc BUILD_JDK_JTREG_LIBRARIES_LIBS_libDirectIO := -ljava -lc + BUILD_JDK_JTREG_LIBRARIES_LIBS_libInheritedChannel := -ljava -lc else BUILD_JDK_JTREG_LIBRARIES_LIBS_libstringPlatformChars := -ljava BUILD_JDK_JTREG_LIBRARIES_LIBS_libDirectIO := -ljava diff -r 73385a708426 -r 97288886180c test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java --- a/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java Sun Mar 04 18:46:07 2018 -0800 +++ b/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java Mon Mar 05 08:27:42 2018 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018 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 @@ -34,7 +34,7 @@ * jdk.test.lib.Platform * jdk.test.lib.process.* * StateTest StateTestService EchoTest EchoService CloseTest Launcher Util - * @run testng/othervm InheritedChannelTest + * @run testng/othervm/native InheritedChannelTest * @key intermittent */ @@ -68,9 +68,7 @@ private static final String OS_ARCH = ARCH.equals("i386") ? "i586" : ARCH; private static final Path LD_LIBRARY_PATH - = Paths.get(TEST_SRC, "lib", OS_NAME + "-" + OS_ARCH); - - private static final Path LAUNCHERLIB = LD_LIBRARY_PATH.resolve("libLauncher.so"); + = Paths.get(System.getProperty("java.library.path")); @DataProvider public Object[][] testCases() { @@ -99,11 +97,6 @@ @Test(dataProvider = "testCases") public void test(String desc, List opts) throws Throwable { - if (!Files.exists(LAUNCHERLIB)) { - System.out.println("Cannot find " + LAUNCHERLIB - + " - library not available for this system"); - return; - } System.out.println("LD_LIBRARY_PATH=" + LD_LIBRARY_PATH); List args = new ArrayList<>(); diff -r 73385a708426 -r 97288886180c test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/Launcher.c --- a/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/Launcher.c Sun Mar 04 18:46:07 2018 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,165 +0,0 @@ -/* - * - * - * A simple launcher to launch a program as if it was launched by inetd. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "jni.h" - -#include "Launcher.h" - -/* - * Throws the exception of the given class name and detail message - */ -static void ThrowException(JNIEnv *env, const char *name, const char *msg) { - jclass cls = (*env)->FindClass(env, name); - if (cls != NULL) { - (*env)->ThrowNew(env, cls, msg); - } -} - -/* - * Convert a jstring to an ISO 8859_1 encoded C string - */ -static char* getString8859_1Chars(JNIEnv *env, jstring jstr) { - int i; - char *result; - jint len = (*env)->GetStringLength(env, jstr); - const jchar *str = (*env)->GetStringCritical(env, jstr, 0); - if (str == 0) { - return NULL; - } - - result = (char*)malloc(len+1); - if (result == 0) { - (*env)->ReleaseStringCritical(env, jstr, str); - ThrowException(env, "java/lang/OutOfMemoryError", NULL); - return NULL; - } - - for (i=0; iReleaseStringCritical(env, jstr, str); - return result; -} - - -/* - * Class: Launcher - * Method: launch0 - * Signature: ([Ljava/lang/String;I)V - */ -JNIEXPORT void JNICALL Java_Launcher_launch0 - (JNIEnv *env, jclass cls, jobjectArray cmdarray, jint serviceFd) -{ - pid_t pid; - DIR* dp; - struct dirent* dirp; - int thisFd; - char** cmdv; - int i, cmdlen; - - /* - * Argument 0 of the command array is the program name. - * Here we just extract the program name and any arguments into - * a command array suitable for use with execvp. - */ - cmdlen = (*env)->GetArrayLength(env, cmdarray); - if (cmdlen == 0) { - ThrowException(env, "java/lang/IllegalArgumentException", - "command array must at least include the program name"); - return; - } - cmdv = (char **)malloc((cmdlen + 1) * sizeof(char *)); - if (cmdv == NULL) { - ThrowException(env, "java/lang/OutOfMemoryError", NULL); - return; - } - - for (i=0; iGetObjectArrayElement(env, cmdarray, i); - cmdv[i] = (char *) getString8859_1Chars(env, str); - if (cmdv[i] == NULL) { - return; - } - } - - /* - * Command array must have NULL as the last entry - */ - cmdv[cmdlen] = NULL; - - /* - * Launch the program. As this isn't a complete inetd or Runtime.exec - * implementation we don't have a reaper to pick up child exit status. - */ -#ifdef __solaris__ - pid = fork1(); -#else - pid = fork(); -#endif - if (pid != 0) { - if (pid < 0) { - ThrowException(env, "java/io/IOException", "fork failed"); - } - return; - } - - /* - * We need to close all file descriptors except for serviceFd. To - * get the list of open file descriptos we read through /proc/self/fd - * but to open this requires a file descriptor. We could use a specific - * file descriptor and fdopendir but Linux doesn't seem to support - * fdopendir. Instead we use opendir and make an assumption on the - * file descriptor that is used (by opening & closing a file). - */ - thisFd = open("/dev/null", O_RDONLY); - if (thisFd < 0) { - _exit(-1); - } - close(thisFd); - - if ((dp = opendir("/proc/self/fd")) == NULL) { - _exit(-1); - } - - while ((dirp = readdir(dp)) != NULL) { - if (isdigit(dirp->d_name[0])) { - int fd = strtol(dirp->d_name, NULL, 10); - if (fd != serviceFd && fd != thisFd) { - close(fd); - } - } - } - closedir(dp); - - /* - * At this point all file descriptors are closed except for - * serviceFd. We not dup 0,1,2 to this file descriptor and - * close serviceFd. This should leave us with only 0,1,2 - * open and all connected to the same socket. - */ - dup2(serviceFd, STDIN_FILENO); - dup2(serviceFd, STDOUT_FILENO); - dup2(serviceFd, STDERR_FILENO); - close(serviceFd); - - execvp(cmdv[0], cmdv); - _exit(-1); -} diff -r 73385a708426 -r 97288886180c test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/Launcher.java --- a/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/Launcher.java Sun Mar 04 18:46:07 2018 -0800 +++ b/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/Launcher.java Mon Mar 05 08:27:42 2018 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2018, 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 @@ -35,7 +35,7 @@ public class Launcher { static { - System.loadLibrary("Launcher"); + System.loadLibrary("InheritedChannel"); } private static native void launch0(String cmdarray[], int fd) throws IOException; diff -r 73385a708426 -r 97288886180c test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/Makefile --- a/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/Makefile Sun Mar 04 18:46:07 2018 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -# -# -# Makefile for building libLauncher.so -# -# To build libLauncher.so requires :- -# JAVA_HOME environment variable -# cc (Solaris) or gcc (Linux) on PATH -# -# The library is created in a architecture specific directory :- -# -# lib/solaris-sparc/libLauncher.so (Solaris/SPARC) -# lib/solaris-i586/libLauncher.so (Solaris/x86) -# lib/linux-i586/libLauncher.so (Linux/x86) - -ECHO = echo -MKDIR = mkdir -UNAME = uname - -uname := $(shell uname) - -ifeq ($(uname), SunOS) - PLATFORM = solaris - ISAINFO = isainfo - ARCH_DATA_MODEL=64 - ARCH := $(shell $(ISAINFO) -n) - CC = cc - LD = ld - CFLAGS = -D_REENTRANT -D__solaris__ - LDFLAGS_COMMON = -G - EXTRA_LIBS = -lc - CC += -m64 -Kpic -endif - -ifeq ($(uname), Linux) - PLATFORM = linux - archExpr = case "`$(UNAME) -m`" in \ - i[3-6]86) \ - $(ECHO) i586 \ - ;; \ - sparc*) \ - $(ECHO) sparc \ - ;; \ - *) \ - $(UNAME) -m \ - ;; \ - esac - ARCH := $(shell $(archExpr) ) - CC = gcc - CFLAGS = -fno-strict-aliasing -fPIC -W -Wall - LD = ld - LDFLAGS_COMMON = -shared - EXTRA_LIBS = -lc -endif - -LIBDIR=lib/$(PLATFORM)-$(ARCH) -LAUNCHERLIB=$(LIBDIR)/libLauncher.so - -all: java_home $(LAUNCHERLIB) - -$(LAUNCHERLIB) : $(LIBDIR) $(LIBDIR)/Launcher.o - $(LD) $(LDFLAGS_COMMON) -o $(LAUNCHERLIB) $(LIBDIR)/Launcher.o $(EXTRA_LIBS) - -$(LIBDIR): - @$(MKDIR) -p $(LIBDIR) - -$(LIBDIR)/Launcher.o : Launcher.c \ - Launcher.h - $(CC) -c $(CFLAGS) -o $(LIBDIR)/Launcher.o \ - -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/$(PLATFORM) Launcher.c - -Launcher.class Launcher.h : Launcher.java - $(JAVA_HOME)/bin/javac -h . Launcher.java - -java_home: -ifndef JAVA_HOME - @$(ECHO) "ERROR: Your JAVA_HOME environment variable is not set." - exit 1 -endif - diff -r 73385a708426 -r 97288886180c test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/README --- a/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/README Sun Mar 04 18:46:07 2018 -0800 +++ b/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/README Mon Mar 05 08:27:42 2018 -0800 @@ -1,33 +1,16 @@ - The unit tests in this directory depend on a native launcher library -(libLauncher.so). This native library is built off-line and the -resulting libLauncher.so for each processor/OS combination is checked -into the workspace. The reason for this is because the test environment -may not have the required compilers/build environment. +(libInheritedChannel.so). This library is built by executing -In order to rebuild libLauncher.so the following is required :- - -1. Check-out each of the shared libraries (sccs edit) +$ make test-image-jdk-jtreg-native -2. Edit Launcher.c with the appropriate changes - -3. Execute the make script (gnumake all) on each processor/OS so -that the appropriate lib//libLauncher.so is built. +in the root directory of the OpenJDK clone. It will generate +libInheritedChannel.so in two locations: -4. Test the changes - -5. Check-in each of the shared library (sccs delget) - - -For step 4 (re-building libLauncher.so) the following environment is required: +$ $JDK_ROOT/build/$PLATFORM/support/test/jdk/jtreg/native/lib/libInheritedChannel.so +$ $JDK_ROOT/build/$PLATFORM/images/test/jdk/jtreg/native/libInheritedChannel.so -(a) JAVA_HOME needs to be set to J2SE directory, eg:- - export JAVA_HOME=/usr/local/java/jdk1.5/solaris-sparc +The test may then be run using jtreg for example as follows: -(b) For Solaris the SOS8 'cc' needs to be on the PATH, check using: - # cc -V - cc: Sun C 5.5 2003/03/12 - -(c) Execute the make script :- - Solaris: gnumake all - Linux: gmake all +$ jtreg -s -w:/tmp -r:/tmp -va -dir:$JDK_ROOT/test/jdk \ +-nativepath:$JDK_ROOT/build/$PLATFORM/support/test/jdk/jtreg/native/lib \ +java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java diff -r 73385a708426 -r 97288886180c test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/lib/linux-i586/libLauncher.so Binary file test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/lib/linux-i586/libLauncher.so has changed diff -r 73385a708426 -r 97288886180c test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/lib/solaris-amd64/libLauncher.so Binary file test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/lib/solaris-amd64/libLauncher.so has changed diff -r 73385a708426 -r 97288886180c test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/lib/solaris-sparcv9/libLauncher.so Binary file test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/lib/solaris-sparcv9/libLauncher.so has changed diff -r 73385a708426 -r 97288886180c test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/libInheritedChannel.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/libInheritedChannel.c Mon Mar 05 08:27:42 2018 -0800 @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2003, 2018, 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. + */ + +/* + * A simple launcher to launch a program as if it was launched by inetd. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "jni.h" + +/* + * Throws the exception of the given class name and detail message + */ +static void ThrowException(JNIEnv *env, const char *name, const char *msg) { + jclass cls = (*env)->FindClass(env, name); + if (cls != NULL) { + (*env)->ThrowNew(env, cls, msg); + } +} + +/* + * Convert a jstring to an ISO 8859_1 encoded C string + */ +static char* getString8859_1Chars(JNIEnv *env, jstring jstr) { + int i; + char *result; + jint len = (*env)->GetStringLength(env, jstr); + const jchar *str = (*env)->GetStringCritical(env, jstr, 0); + if (str == 0) { + return NULL; + } + + result = (char*)malloc(len+1); + if (result == 0) { + (*env)->ReleaseStringCritical(env, jstr, str); + ThrowException(env, "java/lang/OutOfMemoryError", NULL); + return NULL; + } + + for (i=0; iReleaseStringCritical(env, jstr, str); + return result; +} + + +/* + * Class: Launcher + * Method: launch0 + * Signature: ([Ljava/lang/String;I)V + */ +JNIEXPORT void JNICALL Java_Launcher_launch0 + (JNIEnv *env, jclass cls, jobjectArray cmdarray, jint serviceFd) +{ + pid_t pid; + DIR* dp; + struct dirent* dirp; + int thisFd; + char** cmdv; + int i, cmdlen; + + /* + * Argument 0 of the command array is the program name. + * Here we just extract the program name and any arguments into + * a command array suitable for use with execvp. + */ + cmdlen = (*env)->GetArrayLength(env, cmdarray); + if (cmdlen == 0) { + ThrowException(env, "java/lang/IllegalArgumentException", + "command array must at least include the program name"); + return; + } + cmdv = (char **)malloc((cmdlen + 1) * sizeof(char *)); + if (cmdv == NULL) { + ThrowException(env, "java/lang/OutOfMemoryError", NULL); + return; + } + + for (i=0; iGetObjectArrayElement(env, cmdarray, i); + cmdv[i] = (char *) getString8859_1Chars(env, str); + if (cmdv[i] == NULL) { + return; + } + } + + /* + * Command array must have NULL as the last entry + */ + cmdv[cmdlen] = NULL; + + /* + * Launch the program. As this isn't a complete inetd or Runtime.exec + * implementation we don't have a reaper to pick up child exit status. + */ +#ifdef __solaris__ + pid = fork1(); +#else + pid = fork(); +#endif + if (pid != 0) { + if (pid < 0) { + ThrowException(env, "java/io/IOException", "fork failed"); + } + return; + } + + /* + * We need to close all file descriptors except for serviceFd. To + * get the list of open file descriptos we read through /proc/self/fd + * but to open this requires a file descriptor. We could use a specific + * file descriptor and fdopendir but Linux doesn't seem to support + * fdopendir. Instead we use opendir and make an assumption on the + * file descriptor that is used (by opening & closing a file). + */ + thisFd = open("/dev/null", O_RDONLY); + if (thisFd < 0) { + _exit(-1); + } + close(thisFd); + + if ((dp = opendir("/proc/self/fd")) == NULL) { + _exit(-1); + } + + while ((dirp = readdir(dp)) != NULL) { + if (isdigit(dirp->d_name[0])) { + int fd = strtol(dirp->d_name, NULL, 10); + if (fd != serviceFd && fd != thisFd) { + close(fd); + } + } + } + closedir(dp); + + /* + * At this point all file descriptors are closed except for + * serviceFd. We not dup 0,1,2 to this file descriptor and + * close serviceFd. This should leave us with only 0,1,2 + * open and all connected to the same socket. + */ + dup2(serviceFd, STDIN_FILENO); + dup2(serviceFd, STDOUT_FILENO); + dup2(serviceFd, STDERR_FILENO); + close(serviceFd); + + execvp(cmdv[0], cmdv); + _exit(-1); +}