Mercurial > hg > release > icedtea7-forest-2.6 > jdk
changeset 8972:c28a0dbea537
8024900: PPC64: Enable new build on AIX (jdk part)
8024854: PPC64: Basic changes and files to build the class library on AIX
Reviewed-by: alanb, prr, sla, chegar, michaelm, mullan, art, erikj
Contributed-by: luchsh@linux.vnet.ibm.com, spoole@linux.vnet.ibm.com, thomas.stuefe@sap.com
line wrap: on
line diff
--- a/make/com/sun/java/pack/mapfile-vers Fri Jul 29 18:03:42 2016 +0100 +++ b/make/com/sun/java/pack/mapfile-vers Fri Oct 07 03:00:13 2016 +0100 @@ -26,7 +26,12 @@ # Define library interface. -SUNWprivate_1.1 { +# On older SuSE releases the linker will complain about: +# Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable +# So we better completely omit the version for now. +# + +{ global: Java_com_sun_java_util_jar_pack_NativeUnpack_finish; Java_com_sun_java_util_jar_pack_NativeUnpack_getNextFile;
--- a/make/com/sun/java/pack/mapfile-vers-unpack200 Fri Jul 29 18:03:42 2016 +0100 +++ b/make/com/sun/java/pack/mapfile-vers-unpack200 Fri Oct 07 03:00:13 2016 +0100 @@ -25,7 +25,12 @@ # Define library interface. -SUNWprivate_1.1 { +# On older SuSE releases the linker will complain about: +# Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable +# So we better completely omit the version for now. +# + +{ local: *; };
--- a/make/com/sun/nio/Makefile Fri Jul 29 18:03:42 2016 +0100 +++ b/make/com/sun/nio/Makefile Fri Oct 07 03:00:13 2016 +0100 @@ -29,8 +29,12 @@ BUILDDIR = ../../.. include $(BUILDDIR)/common/Defs.gmk + +# MMM: disable for now +ifeq (, $(findstring $(PLATFORM), macosx aix)) include $(BUILDDIR)/common/Subdirs.gmk SUBDIRS = sctp +endif all build clean clobber:: $(SUBDIRS-loop)
--- a/make/com/sun/security/auth/module/Makefile Fri Jul 29 18:03:42 2016 +0100 +++ b/make/com/sun/security/auth/module/Makefile Fri Oct 07 03:00:13 2016 +0100 @@ -67,7 +67,7 @@ include FILES_c_solaris.gmk endif # solaris -ifneq (,$(findstring $(PLATFORM), linux macosx)) +ifneq (,$(findstring $(PLATFORM), linux macosx aix)) LIBRARY = jaas_unix include FILES_export_unix.gmk include FILES_c_unix.gmk
--- a/make/com/sun/tools/attach/Exportedfiles.gmk Fri Jul 29 18:03:42 2016 +0100 +++ b/make/com/sun/tools/attach/Exportedfiles.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -47,3 +47,8 @@ FILES_export = \ sun/tools/attach/BsdVirtualMachine.java endif + +ifeq ($(PLATFORM), aix) +FILES_export = \ + sun/tools/attach/AixVirtualMachine.java +endif
--- a/make/com/sun/tools/attach/FILES_c.gmk Fri Jul 29 18:03:42 2016 +0100 +++ b/make/com/sun/tools/attach/FILES_c.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -43,3 +43,8 @@ FILES_c = \ BsdVirtualMachine.c endif + +ifeq ($(PLATFORM), aix) +FILES_c = \ + AixVirtualMachine.c +endif
--- a/make/com/sun/tools/attach/FILES_java.gmk Fri Jul 29 18:03:42 2016 +0100 +++ b/make/com/sun/tools/attach/FILES_java.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -32,7 +32,7 @@ com/sun/tools/attach/spi/AttachProvider.java \ sun/tools/attach/HotSpotAttachProvider.java \ sun/tools/attach/HotSpotVirtualMachine.java - + ifeq ($(PLATFORM), solaris) FILES_java += \ sun/tools/attach/SolarisAttachProvider.java @@ -48,11 +48,16 @@ sun/tools/attach/BsdAttachProvider.java endif +ifeq ($(PLATFORM), aix) +FILES_java += \ + sun/tools/attach/AixAttachProvider.java +endif + # # Files that need to be copied # SERVICEDIR = $(CLASSBINDIR)/META-INF/services - + FILES_copy = \ $(SERVICEDIR)/com.sun.tools.attach.spi.AttachProvider
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/common/Defs-aix.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,391 @@ +# +# Copyright (c) 1995, 2012, 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. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# 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. +# + +# +# Makefile to specify compiler flags for programs and libraries +# targeted to AIX. Should not contain any rules. +# +# WARNING: This file is shared with other workspaces. +# So when it includes other files, it must use JDK_TOPDIR. +# + +# Warning: the following variables are overridden by Defs.gmk. Set +# values will be silently ignored: +# CFLAGS (set $(OTHER_CFLAGS) instead) +# CPPFLAGS (set $(OTHER_CPPFLAGS) instead) +# CXXFLAGS (set $(OTHER_CXXFLAGS) instead) +# LDFLAGS (set $(OTHER_LDFAGS) instead) +# LDLIBS (set $(EXTRA_LIBS) instead) +# LDLIBS_COMMON (set $(EXTRA_LIBS) instead) +# LINTFLAGS (set $(OTHER_LINTFLAGS) instead) +# +# Note: CPPFLAGS are used in C and C++ compiles. +# + +# Get shared JDK settings +include $(JDK_MAKE_SHARED_DIR)/Defs.gmk + +# define these to avoid picking up ones from aliases or from +# non-standard locations +# + +AR = $(USRBIN_PATH)ar +BASENAME = $(UNIXCOMMAND_PATH)basename +CAT = $(UNIXCOMMAND_PATH)cat +CD = cd # intrinsic unix command +CHMOD = $(UNIXCOMMAND_PATH)chmod +CMP = $(USRBIN_PATH)cmp +COMPRESS = $(USRBIN_PATH)compress +CP = $(UNIXCOMMAND_PATH)cp +CPIO = $(UNIXCOMMAND_PATH)cpio +CUT = $(USRBIN_PATH)cut +DATE = $(UNIXCOMMAND_PATH)date +DF = $(UNIXCOMMAND_PATH)df +DIFF = $(USRBIN_PATH)diff +DIRNAME = $(USRBIN_PATH)dirname +ECHO = echo # intrinsic unix command, with backslash-escaped character interpretation +EGREP = $(UNIXCOMMAND_PATH)egrep +EXPR = $(USRBIN_PATH)expr + +FIND = $(UNIXCOMMAND_PATH)find + +HEAD = $(USRBIN_PATH)head +GREP = $(UNIXCOMMAND_PATH)grep +GUNZIP = $(UNIXCOMMAND_PATH)gunzip +LEX = $(USRBIN_PATH)lex +LN = $(UNIXCOMMAND_PATH)ln +LS = $(UNIXCOMMAND_PATH)ls +M4 = $(USRBIN_PATH)m4 +MKDIR = $(UNIXCOMMAND_PATH)mkdir +MV = $(UNIXCOMMAND_PATH)mv +NAWK = $(USRBIN_PATH)awk +PWD = $(UNIXCOMMAND_PATH)pwd +#RM is defined by GNU Make as 'rm -f' +RMDIR = $(UNIXCOMMAND_PATH)rmdir +RPM = $(UNIXCOMMAND_PATH)rpm +SED = $(UNIXCOMMAND_PATH)sed +SH = $(UNIXCOMMAND_PATH)sh +SORT = $(UNIXCOMMAND_PATH)sort +STRIP = $(USRBIN_PATH)strip +TAIL = $(USRBIN_PATH)tail + +TAR = tar # We need GNU TAR which must be found trough PATH (may be in /opt/freeware/bin or /usr/local/bin) + +TEST = $(USRBIN_PATH)test +TOUCH = $(UNIXCOMMAND_PATH)touch +TR = $(USRBIN_PATH)tr +TRUE = $(UNIXCOMMAND_PATH)true +UNAME = $(UNIXCOMMAND_PATH)uname +UNIQ = $(USRBIN_PATH)uniq +UNZIPSFX = $(USRBIN_PATH)unzipsfx +YACC = $(USRBIN_PATH)yacc + +ZIPEXE = zip # Must be found trough PATH (may be in /opt/freeware/bin or /usr/local/bin) + +OS_VERSION = $(shell $(UNAME) -v) +OS_NAME = aix + +ARCH_DATA_MODEL=64 + +LIBARCH = ppc64 + +# Value of Java os.arch property +ARCHPROP = $(LIBARCH) + +BINDIR = $(OUTPUTDIR)/bin + +# where is unwanted output to be delivered? +DEV_NULL = /dev/null +export DEV_NULL + +CLASSPATH_SEPARATOR = : + +ifndef PLATFORM_SRC + PLATFORM_SRC = $(BUILDDIR)/../src/solaris +endif # PLATFORM_SRC + +# Location of the various .properties files specific to Linux platform +ifndef PLATFORM_PROPERTIES + PLATFORM_PROPERTIES = $(BUILDDIR)/../src/solaris/lib +endif # PLATFORM_SRC + +# Platform specific closed sources +ifndef OPENJDK + ifndef CLOSED_PLATFORM_SRC + CLOSED_PLATFORM_SRC = $(BUILDDIR)/../src/closed/solaris + endif +endif + +# platform specific include files +PLATFORM_INCLUDE_NAME = $(PLATFORM) +PLATFORM_INCLUDE = $(INCLUDEDIR)/$(PLATFORM_INCLUDE_NAME) + +# OBJECT_SUFFIX, LIBRARY_SUFFIX, EXE_SUFFICS etc. are set in +# j2se/make/common/shared/Platform.gmk . Just override those which differ for AIX. +# suffix used for make dependencies files. +# -qmakedep outputs .u, not .d +override DEPEND_SUFFIX = u +# suffix used for lint files +LINT_SUFFIX = ln +# The suffix applied to the library name for FDLIBM +FDDLIBM_SUFFIX = a +# The suffix applied to scripts (.bat for windows, nothing for unix) +SCRIPT_SUFFIX = +# CC compiler object code output directive flag value +CC_OBJECT_OUTPUT_FLAG = -o #trailing blank required! +CC_PROGRAM_OUTPUT_FLAG = -o #trailing blank required! + +# On AIX we don't have any issues using javah and javah_g. +JAVAH_SUFFIX = $(SUFFIX) + +# +# Default optimization +# + +ifndef OPTIMIZATION_LEVEL + ifeq ($(PRODUCT), java) + OPTIMIZATION_LEVEL = HIGHER + else + OPTIMIZATION_LEVEL = LOWER + endif +endif +ifndef FASTDEBUG_OPTIMIZATION_LEVEL + FASTDEBUG_OPTIMIZATION_LEVEL = LOWER +endif + +CC_OPT/LOWER = -O2 +CC_OPT/HIGHER = -O3 + +CC_OPT = $(CC_OPT/$(OPTIMIZATION_LEVEL)) + +# +# Selection of warning messages +# +CFLAGS_SHARED_OPTION=-qmkshrobj +CXXFLAGS_SHARED_OPTION=-qmkshrobj + +# +# If -Xa is in CFLAGS_COMMON it will end up ahead of $(POPT) for the +# optimized build, and that ordering of the flags completely freaks +# out cc. Hence, -Xa is instead in each CFLAGS variant. +# The extra options to the C++ compiler prevent it from: +# - adding runpath (dump -Lv) to *your* C++ compile install dir +# - adding stubs to various things such as thr_getspecific (hence -nolib) +# - creating Templates.DB in current directory (arch specific) +CFLAGS_COMMON = -qchars=signed +PIC_CODE_LARGE = -qpic=large +PIC_CODE_SMALL = -qpic=small +GLOBAL_KPIC = $(PIC_CODE_LARGE) +CFLAGS_COMMON += $(GLOBAL_KPIC) $(GCC_WARNINGS) +# save compiler options into object file +CFLAGS_COMMON += -qsaveopt + +# preserve absolute source file infos in debug infos +CFLAGS_COMMON += -qfullpath + +# We want to be able to debug an opt build as well. +CFLAGS_OPT = -g $(POPT) +CFLAGS_DBG = -g + +CXXFLAGS_COMMON = $(GLOBAL_KPIC) -DCC_NOEX $(GCC_WARNINGS) +# We want to be able to debug an opt build as well. +CXXFLAGS_OPT = -g $(POPT) +CXXFLAGS_DBG = -g + +# FASTDEBUG: Optimize the code in the -g versions, gives us a faster debug java +ifeq ($(FASTDEBUG), true) + CFLAGS_DBG += -O2 + CXXFLAGS_DBG += -O2 +endif + +CPP_ARCH_FLAGS = -DARCH='"$(ARCH)"' + +# Alpha arch does not like "alpha" defined (potential general arch cleanup issue here) +ifneq ($(ARCH),alpha) + CPP_ARCH_FLAGS += -D$(ARCH) +else + CPP_ARCH_FLAGS += -D_$(ARCH)_ +endif + +# turn `=' into `+='. +CPPFLAGS_COMMON += -D$(ARCH) -DARCH='"$(ARCH)"' -DAIX $(VERSION_DEFINES) \ + -D_LARGEFILE64_SOURCE -D_GNU_SOURCE -D_REENTRANT + +# zip lib +CPPFLAGS_COMMON += -DSTDC + +# turn on USE_PTHREADS +CPPFLAGS_COMMON += -DUSE_PTHREADS +CFLAGS_COMMON += -DUSE_PTHREADS + +CFLAGS_COMMON += -q64 +CPPFLAGS_COMMON += -q64 + +# define PPC64 +CFLAGS_COMMON += -DPPC64 +CPPFLAGS_COMMON += -DPPC64 + +LDFLAGS_COMMON += -b64 + +# enable dynamic runtime linking & strip the absolute paths from the coff section +LDFLAGS_COMMON += -brtl -bnolibpath + +# Additional link parameters for AIX +LDFLAGS_COMMON += -liconv + +CPPFLAGS_OPT = +CPPFLAGS_DBG += -DDEBUG + +LDFLAGS_COMMON += -L$(LIBDIR)/$(LIBARCH) +LDFLAGS_OPT = +LDFLAGS_DBG = + +# Export symbols +OTHER_LDFLAGS += -bexpall + +# +# Post Processing of libraries/executables +# +ifeq ($(VARIANT), OPT) + ifneq ($(NO_STRIP), true) + ifneq ($(DEBUG_BINARIES), true) + # Debug 'strip -g' leaves local function Elf symbols (better stack + # traces) + # We want to be able to debug an opt build as well. + # POST_STRIP_PROCESS = $(STRIP) -g + endif + endif +endif + +# javac Boot Flags +JAVAC_BOOT_FLAGS = -J-Xmx128m + +# +# Use: ld $(LD_MAPFILE_FLAG) mapfile *.o +# +LD_MAPFILE_FLAG = -Xlinker --version-script -Xlinker + +# +# Support for Quantify. +# +ifdef QUANTIFY +QUANTIFY_CMD = quantify +QUANTIFY_OPTIONS = -cache-dir=/tmp/quantify -always-use-cache-dir=yes +LINK_PRE_CMD = $(QUANTIFY_CMD) $(QUANTIFY_OPTIONS) +endif + +# +# Path and option to link against the VM, if you have to. Note that +# there are libraries that link against only -ljava, but they do get +# -L to the -ljvm, this is because -ljava depends on -ljvm, whereas +# the library itself should not. +# +VM_NAME = server +JVMLIB = -L$(LIBDIR)/$(LIBARCH)/$(VM_NAME) -ljvm$(SUFFIX) +JAVALIB = -ljava$(SUFFIX) $(JVMLIB) + +# Part of INCREMENTAL_BUILD mechanism. +# Compiler emits things like: path/file.o: file.h +# We want something like: relative_path/file.o relative_path/file.d: file.h +CC_DEPEND = -qmakedep +#CC_DEPEND_FILTER = $(SED) -e 's!$*\.$(OBJECT_SUFFIX)!$(dir $@)& $(dir $@)$*.$(DEPEND_SUFFIX)!g' +CC_DEPEND_FILTER = $(SED) -e '/:[ ]*[/]/d' -e 's!$*\.$(OBJECT_SUFFIX)!$(dir $@)& $(dir $@)$*.$(DEPEND_SUFFIX)!g' | $(SORT) -u + +# Runtime graphics library search paths... +OPENWIN_RUNTIME_LIB = +AWT_RUNPATH = + +# +# We want to privatize JVM symbols on AIX. This is so the user can +# write a function called FindClass and this should not override the +# FindClass that is inside the JVM. At this point in time we are not +# concerned with other JNI libraries because we hope that there will +# not be as many clashes there. +# +PRIVATIZE_JVM_SYMBOLS = false + +USE_PTHREADS = true +#override ALT_CODESET_KEY = _NL_CTYPE_CODESET_NAME +override AWT_RUNPATH = +override HAVE_ALTZONE = false +override HAVE_FILIOH = false +override HAVE_GETHRTIME = false +override HAVE_GETHRVTIME = false +override HAVE_SIGIGNORE = true +override LEX_LIBRARY = -lfl +ifeq ($(STATIC_CXX),true) +override LIBCXX = -Wl,-bstatic -lc_r -Wl,-bdynamic +else +override LIBCXX = +endif +override LIBPOSIX4 = +override LIBSOCKET = +override LIBNSL = +override LIBTHREAD = +override MOOT_PRIORITIES = true +override OPENWIN_LIB = $(OPENWIN_HOME)/lib +override SUN_CMM_SUBDIR = +override THREADS_FLAG = native +override USE_GNU_M4 = true +override USING_GNU_TAR = true +override WRITE_LIBVERSION = false + +# USE_EXECNAME forces the launcher to look up argv[0] on $PATH, and put the +# resulting resolved absolute name of the executable in the environment +# variable EXECNAME. That executable name is then used that to locate the +# installation area. +override USE_EXECNAME = true + +# If your platform has DPS, it will have Type1 fonts too, in which case +# it is best to enable DPS support until such time as 2D's rasteriser +# can fully handle Type1 fonts in all cases. Default is "yes". +# HAVE_DPS should only be "no" if the platform has no DPS headers or libs +# DPS (Displayable PostScript) is available on Solaris machines +HAVE_DPS = no + +# +# Japanese manpages +# +JA_SOURCE_ENCODING = eucJP +JA_TARGET_ENCODINGS = eucJP UTF-8 PCK + +# Settings for the JDI - Serviceability Agent binding. +HOTSPOT_SALIB_PATH = $(HOTSPOT_IMPORT_PATH)/jre/lib/$(LIBARCH) +OPTIMIZED_SALIB_NAME = $(LIB_PREFIX)saproc$(OPT_SUFFIX).$(LIBRARY_SUFFIX) +DEBUG_SALIB_NAME = $(LIB_PREFIX)saproc$(DBG_SUFFIX).$(LIBRARY_SUFFIX) + +INCLUDE_SA = false +export OBJECT_MODE=64 + +# Macro to check it's input file for banned dependencies and verify the +# binary built properly. Relies on process exit code. +define binary_file_verification # binary_file +( \ + $(ECHO) "Checking for mapfile use in: $1" && \ + if [ "`$(NM) -u $1 | $(EGREP) 'SUNWprivate'`" = "" ] ; then \ + $(ECHO) "WARNING: File was not built with a mapfile: $1"; \ + fi \ +) +endef
--- a/make/common/Defs-linux.gmk Fri Jul 29 18:03:42 2016 +0100 +++ b/make/common/Defs-linux.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -197,6 +197,8 @@ LDFLAGS_COMMON_sparc += -m32 -mcpu=v9 CFLAGS_REQUIRED_arm += -fsigned-char -D_LITTLE_ENDIAN CFLAGS_REQUIRED_ppc += -fsigned-char -D_BIG_ENDIAN +CFLAGS_REQUIRED_ppc64 += -m64 +LDFLAGS_COMMON_ppc64 += -m64 -L/lib64 -Wl,-melf64ppc ifeq ($(ZERO_BUILD), true) CFLAGS_REQUIRED = $(ZERO_ARCHFLAG) ifeq ($(ZERO_ENDIANNESS), little) @@ -306,6 +308,9 @@ CPPFLAGS_COMMON += -D_LP64=1 endif +# turn on USE_PTHREADS +CPPFLAGS_COMMON += -DUSE_PTHREADS + CPPFLAGS_OPT = -DNDEBUG CPPFLAGS_DBG = -DDEBUG ifneq ($(PRODUCT), java) @@ -432,7 +437,7 @@ override LIBDL = -ldl override MOOT_PRIORITIES = true override NO_INTERRUPTIBLE_IO = true -ifeq ($(ARCH), amd64) +ifeq ($(ARCH), $(findstring $(ARCH), amd64 ppc64)) override OPENWIN_LIB = $(OPENWIN_HOME)/lib64 else override OPENWIN_LIB = $(OPENWIN_HOME)/lib
--- a/make/common/Defs.gmk Fri Jul 29 18:03:42 2016 +0100 +++ b/make/common/Defs.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -182,6 +182,9 @@ ifeq ($(PLATFORM), macosx) USING_SYSTEM_FT_LIB=true endif + ifeq ($(PLATFORM), aix) + USING_SYSTEM_FT_LIB=true + endif else ifeq ($(DEVTOOLS_FT_DIR_EXISTS), true) FREETYPE_LIB_PATH = $(DEVTOOLS_FT_DIR)/lib @@ -258,6 +261,11 @@ LDLIBS_COMMON = -pthread endif + # AIX port: do not link launchers (e.g. java, javac) against libjava.so and libjvm.so + ifeq ($(PLATFORM), aix) + LDLIBS_COMMON = + endif + endif # PROGRAM LDLIBS_COMMON += $(EXTRA_LIBS)
--- a/make/common/Program.gmk Fri Jul 29 18:03:42 2016 +0100 +++ b/make/common/Program.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -112,6 +112,15 @@ endif # PLATFORM LINUX endif # PLATFORM linux solaris +# AIX can not handle $ORIGIN so we have to link with the static JLI version (libjli.a) +# (see make/java/jli/Makfile for where we build libjli.a) +ifeq ($(PLATFORM), aix) + LDFLAGS += -L$(OUTPUTDIR)/tmp/java/jli/$(OBJDIRNAME)/static + OTHER_LDLIBS += -ljli + # We need the following line to make incremental builds work + $(ACTUAL_PROGRAM):: $(OUTPUTDIR)/tmp/java/jli/$(OBJDIRNAME)/static/libjli.a +endif # PLATFORM aix + ifeq ($(PLATFORM), windows) JLI_LCF = $(OUTPUTDIR)/tmp/java/jli/$(OBJDIRNAME)/jli.lcf ifdef STATIC_JLI @@ -233,7 +242,12 @@ endif endif - $(ACTUAL_PROGRAM):: $(FILES_o) + ifeq ($(PLATFORM), aix) + # We need the following line to make incremental builds work on AIX if libjli.a changes + $(ACTUAL_PROGRAM):: $(FILES_o) $(OUTPUTDIR)/tmp/java/jli/$(OBJDIRNAME)/static/libjli.a + else + $(ACTUAL_PROGRAM):: $(FILES_o) + endif @$(prep-target) @set -- $?; \ $(ECHO) Rebuilding $@ because of $$1 $$2 $$3 $$4 $$5 $$6 $${7:+...};
--- a/make/common/Release.gmk Fri Jul 29 18:03:42 2016 +0100 +++ b/make/common/Release.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -180,6 +180,12 @@ JA_DIRNAME=ja_JP.UTF-8 endif # linux +ifeq ($(PLATFORM), aix) + MANBASEDIRS=$(JDK_TOPDIR)/src/linux/doc $(IMPORTDOCDIR) + MAN1SUBDIR=man + JA_DIRNAME=ja_JP.UTF-8 +endif # aix + define copy-man-pages $(MKDIR) -p $1/man/man1 for manbase in $(MANBASEDIRS:%=%/$(MAN1SUBDIR)) ; do \ @@ -203,7 +209,7 @@ done $(java-vm-cleanup) if [ "$(JA_DIRNAME)" != "" ] ; then \ - $(CD) $1/man && $(RM) ja && $(LN) -s $(JA_DIRNAME) ja; \ + $(CD) $1/man && $(RM) -r ja && $(LN) -s $(JA_DIRNAME) ja; \ fi endef @@ -1097,7 +1103,7 @@ @# So for Linux, make use of the -T option (like Solaris' -I option) of @# obtaining the list of files from a file. MKS tar has no such option. - ifneq (,$(findstring $(PLATFORM), linux macosx)) + ifneq (,$(findstring $(PLATFORM), linux macosx aix)) for d in $(SOURCE_DIRS); do \ $(RM) $(ABS_TEMPDIR)/src-files.list; \ ($(CD) $$d && \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/common/shared/Compiler-xlc_r.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,37 @@ +# +# Copyright (c) 2005, 2010, 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. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# 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. +# + +# +# Aix Compiler settings +# + +COMPILER_NAME=Aix xlc compiler + +CC = $(COMPILER_PATH)xlc_r +CPP = $(COMPILER_PATH)xlc_r -E +CXX = $(COMPILER_PATH)xlC_r +LINT = /bin/lint +SHARED_LIBRARY_FLAG = -qmkshrobj +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/common/shared/Defs-aix.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,167 @@ +# +# Copyright (c) 2005, 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. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# 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. +# + +# +# Definitions for AIX. +# + +# Default for COMPILER_WARNINGS_FATAL on AIX (C & C++ compiler warnings) +ifndef COMPILER_WARNINGS_FATAL + COMPILER_WARNINGS_FATAL=false +endif + +# AIX should use parallel compilation for best build times +ifndef COMPILE_APPROACH + COMPILE_APPROACH = parallel +endif + +# Indication that we are doing an incremental build. +# This may trigger the creation of make depend files. +ifndef INCREMENTAL_BUILD + INCREMENTAL_BUILD = false +endif + +# FullPath just makes sure it never ends with a / and no duplicates +define FullPath +$(shell cd $1 2> $(DEV_NULL) && pwd) +endef + +# OptFullPath: Absolute path name of a dir that might not initially exist. +define OptFullPath +$(shell if [ "$1" != "" -a -d "$1" ]; then (cd $1 && pwd); else echo "$1"; fi) +endef + +# Location on system where jdk installs might be +USRJDKINSTANCES_PATH =/opt/java + +# UNIXCOMMAND_PATH: path to where the most common Unix commands are. +# NOTE: Must end with / so that it could be empty, allowing PATH usage. +ifneq "$(origin ALT_UNIXCOMMAND_PATH)" "undefined" + UNIXCOMMAND_PATH :=$(call PrefixPath,$(ALT_UNIXCOMMAND_PATH)) +else + UNIXCOMMAND_PATH = /bin/ +endif + +# USRBIN_PATH: path to where the most common Unix commands are. +# NOTE: Must end with / so that it could be empty, allowing PATH usage. +ifneq "$(origin ALT_USRBIN_PATH)" "undefined" + USRBIN_PATH :=$(call PrefixPath,$(ALT_USRBIN_PATH)) +else + USRBIN_PATH = /usr/bin/ +endif + +# UNIXCCS_PATH: path to where the Solaris ported UNIX commands can be found +# NOTE: Must end with / so that it could be empty, allowing PATH usage. +ifneq "$(origin ALT_UNIXCCS_PATH)" "undefined" + UNIXCCS_PATH :=$(call PrefixPath,$(ALT_UNIXCCS_PATH)) +else + UNIXCCS_PATH = /usr/ccs/bin/ +endif + +# SLASH_JAVA: location of all network accessable files +ifdef ALT_SLASH_JAVA + SLASH_JAVA :=$(ALT_SLASH_JAVA) +else + SLASH_JAVA := $(call DirExists,/java,/java,/NOT-SET) +endif + +# JDK_DEVTOOLS_DIR: common path for all the java devtools +ifdef ALT_JDK_DEVTOOLS_DIR + JDK_DEVTOOLS_DIR =$(ALT_JDK_DEVTOOLS_DIR) +else + JDK_DEVTOOLS_DIR =$(SLASH_JAVA)/devtools +endif + +# COMPILER_PATH: path to where the compiler and tools are installed. +# NOTE: Must end with / so that it could be empty, allowing PATH usage. +ifneq "$(origin ALT_COMPILER_PATH)" "undefined" + COMPILER_PATH :=$(call PrefixPath,$(ALT_COMPILER_PATH)) +else + COMPILER_PATH =/usr/bin/ +endif + +# DEVTOOLS_PATH: for other tools required for building (such as zip, etc.) +# NOTE: Must end with / so that it could be empty, allowing PATH usage. +ifneq "$(origin ALT_DEVTOOLS_PATH)" "undefined" + DEVTOOLS_PATH :=$(call PrefixPath,$(ALT_DEVTOOLS_PATH)) +else + DEVTOOLS_PATH =/usr/bin/ +endif + +# _BOOTDIR1: First choice for a Bootstrap JDK, previous released JDK. +# _BOOTDIR2: Second choice +ifndef ALT_BOOTDIR + _BOOTDIR1 =$(SLASH_JAVA)/re/jdk/$(PREVIOUS_JDK_VERSION)/archive/fcs/binaries/$(PLATFORM)-$(ARCH) + _BOOTDIR2 =$(USRJDKINSTANCES_PATH)/jdk$(PREVIOUS_JDK_VERSION) +endif + +# Always build headless on AIX +BUILD_HEADLESS = true +LIBM=-lm + + +_CUPS_HEADERS_PATH=/usr/include + +# Import JDK images allow for partial builds, components not built are +# imported (or copied from) these import areas when needed. + +# BUILD_JDK_IMPORT_PATH: location of JDK install trees to import for +# multiple platforms, e.g. windows-i586, solaris-sparc, linux-586, etc. +ifdef ALT_BUILD_JDK_IMPORT_PATH + BUILD_JDK_IMPORT_PATH :=$(call FullPath,$(ALT_BUILD_JDK_IMPORT_PATH)) +else + BUILD_JDK_IMPORT_PATH = $(PROMOTED_BUILD_BINARIES) +endif +BUILD_JDK_IMPORT_PATH:=$(call AltCheckValue,BUILD_JDK_IMPORT_PATH) + +# JDK_IMPORT_PATH: location of JDK install tree (this version) to import +ifdef ALT_JDK_IMPORT_PATH + JDK_IMPORT_PATH :=$(call FullPath,$(ALT_JDK_IMPORT_PATH)) +else + JDK_IMPORT_PATH = $(BUILD_JDK_IMPORT_PATH)/$(PLATFORM)-$(ARCH)$(_JDK_IMPORT_VARIANT) +endif +JDK_IMPORT_PATH:=$(call AltCheckValue,JDK_IMPORT_PATH) + +# HOTSPOT_IMPORT_PATH: location of hotspot pre-built files +ifdef ALT_HOTSPOT_IMPORT_PATH + HOTSPOT_IMPORT_PATH :=$(call FullPath,$(ALT_HOTSPOT_IMPORT_PATH)) +else + HOTSPOT_IMPORT_PATH =$(JDK_IMPORT_PATH) +endif +HOTSPOT_IMPORT_PATH:=$(call AltCheckValue,HOTSPOT_IMPORT_PATH) + + +# HOTSPOT_SERVER_PATH: location of server jvm library file. +ifdef ALT_HOTSPOT_SERVER_PATH + HOTSPOT_SERVER_PATH :=$(call FullPath,$(ALT_HOTSPOT_SERVER_PATH)) +else + HOTSPOT_SERVER_PATH =$(HOTSPOT_IMPORT_PATH)/$(ARCH_VM_SUBDIR)/server +endif +HOTSPOT_SERVER_PATH:=$(call AltCheckValue,HOTSPOT_SERVER_PATH) + +# We don't do anything useful here currently. +define binary_file_verification # binary_file +endef +
--- a/make/common/shared/Defs-java.gmk Fri Jul 29 18:03:42 2016 +0100 +++ b/make/common/shared/Defs-java.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -90,7 +90,7 @@ ifeq ($(ARCH_DATA_MODEL), 32) JAVAC_JVM_FLAGS += -J-XX:ThreadStackSize=768 else - JAVAC_JVM_FLAGS += -J-XX:ThreadStackSize=1536 + JAVAC_JVM_FLAGS += -J-XX:ThreadStackSize=2096 endif JAVAC_JVM_FLAGS += $(JAVA_TOOLS_FLAGS:%=-J%) @@ -188,7 +188,7 @@ JAVAH_CMD = $(JAVA_TOOLS_DIR)/javah \ $(JAVAHFLAGS) JAVADOC_CMD = $(JAVA_TOOLS_DIR)/javadoc $(JAVA_TOOLS_FLAGS:%=-J%) \ - $(JAVADOCFLAGS) + $(JAVADOCFLAGS) endif # Override of what javac to use (see deploy workspace)
--- a/make/common/shared/Defs-utils.gmk Fri Jul 29 18:03:42 2016 +0100 +++ b/make/common/shared/Defs-utils.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -74,6 +74,10 @@ UTILS_DEVTOOL_PATH=$(DEVTOOLS_PATH) endif +ifeq ($(PLATFORM),aix) + UTILS_CCS_BIN_PATH=$(USRBIN_PATH) +endif + # Utilities ifdef CROSS_COMPILE_ARCH AR = $(COMPILER_PATH)ar
--- a/make/common/shared/Defs-versions.gmk Fri Jul 29 18:03:42 2016 +0100 +++ b/make/common/shared/Defs-versions.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -49,6 +49,11 @@ override CC_VERSION = llvm endif +# AIX uses xlc_r by default +ifeq ($(PLATFORM), aix) + override CC_VERSION = xlc_r +endif + ########################################################################## # # List of JDK official minimum, expected, or required versions:
--- a/make/common/shared/Platform.gmk Fri Jul 29 18:03:42 2016 +0100 +++ b/make/common/shared/Platform.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -151,6 +151,16 @@ MB_OF_MEMORY:=$(shell /usr/sbin/prtconf 2>/dev/null | fgrep 'Memory size:' | expand | cut -d' ' -f3) endif +ifeq ($(SYSTEM_UNAME), AIX) + PLATFORM = aix + ARCH=ppc64 + ARCH_DATA_MODEL=64 + ARCH_FAMILY=$(ARCH) + LIBARCH=$(ARCH) + ARCHPROP = $(LIBARCH) +endif + + # Platform settings specific to Linux ifeq ($(SYSTEM_UNAME), Linux) PLATFORM = linux
--- a/make/java/fdlibm/Makefile Fri Jul 29 18:03:42 2016 +0100 +++ b/make/java/fdlibm/Makefile Fri Oct 07 03:00:13 2016 +0100 @@ -66,6 +66,13 @@ FASTDEBUG_OPTIMIZATION_LEVEL = NONE endif +ifeq ($(PLATFORM),aix) + # Turn all optimizations off + OPTIMIZATION_LEVEL = NONE + FASTDEBUG_OPTIMIZATION_LEVEL = NONE + OTHER_CFLAGS += -qfloat=nomaf +endif + # # Include path. #
--- a/make/java/java/Makefile Fri Jul 29 18:03:42 2016 +0100 +++ b/make/java/java/Makefile Fri Oct 07 03:00:13 2016 +0100 @@ -457,6 +457,9 @@ HELPER_EXE = $(LIBDIR)/$(LIBARCH)/jspawnhelper BUILDHELPER = +ifeq ($(PLATFORM), aix) + BUILDHELPER = 1 +endif ifeq ($(PLATFORM), solaris) BUILDHELPER = 1 endif @@ -467,8 +470,12 @@ ARCHFLAG = ifeq ($(ARCH_DATA_MODEL), 64) +ifeq ($(PLATFORM), aix) +ARCHFLAG = -q64 +else ARCHFLAG = -m64 endif +endif ifdef BUILDHELPER
--- a/make/java/jli/Makefile Fri Jul 29 18:03:42 2016 +0100 +++ b/make/java/jli/Makefile Fri Oct 07 03:00:13 2016 +0100 @@ -205,20 +205,37 @@ -framework ApplicationServices # Add solaris sources containing common logic to the header path OTHER_INCLUDES += -I$(LAUNCHER_SOLARIS_PLATFORM_SRC) -endif # PLATFORM -STATIC_LIBRARY_DIR = $(OBJDIR)/static -STATIC_LIBRARY_NAME = lib$(LIBRARY).a -STATIC_LIBRARY = $(STATIC_LIBRARY_DIR)/$(STATIC_LIBRARY_NAME) + STATIC_LIBRARY_DIR = $(OBJDIR)/static + STATIC_LIBRARY_NAME = lib$(LIBRARY).a + STATIC_LIBRARY = $(STATIC_LIBRARY_DIR)/$(STATIC_LIBRARY_NAME) -$(STATIC_LIBRARY_DIR): | $(OBJDIR) + $(STATIC_LIBRARY_DIR): | $(OBJDIR) @$(MKDIR) $(STATIC_LIBRARY_DIR) -$(STATIC_LIBRARY): $(STATIC_LIBRARY_DIR) + $(STATIC_LIBRARY): $(STATIC_LIBRARY_DIR) @$(prep-target) $(AR) $(ARFLAGS) $@ $(FILES_o) -library:: $(STATIC_LIBRARY) + library:: $(STATIC_LIBRARY) +endif # PLATFORM + +# AIX can not handle $ORIGIN so we have to link with a static version of JLI. +# (see make/common/Program.gmk for how we link the Java executables) +ifeq ($(PLATFORM), aix) + STATIC_LIBRARY_DIR = $(OBJDIR)/static + STATIC_LIBRARY_NAME = lib$(LIBRARY).a + STATIC_LIBRARY = $(STATIC_LIBRARY_DIR)/$(STATIC_LIBRARY_NAME) + + $(STATIC_LIBRARY_DIR): | $(OBJDIR) + @$(MKDIR) $(STATIC_LIBRARY_DIR) + + $(STATIC_LIBRARY): $(STATIC_LIBRARY_DIR) $(FILES_o) + @$(prep-target) + $(AR) $(ARFLAGS) $@ $(FILES_o) + + library:: $(STATIC_LIBRARY) +endif # PLATFORM aix vpath %.c $(LAUNCHER_SHARE_SRC) $(LAUNCHER_PLATFORM_SRC) ifneq ($(SYSTEM_ZLIB),true)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/java/main/java/mapfile-ppc64 Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,43 @@ +# +# Copyright (c) 2004, 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. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# 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. +# +# +# Specify what global symbols we export. Note that we're not really +# interested in declaring a version, simply scoping the file is sufficient. +# +# On older SuSE releases the linker will complain about: +# Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable +# So we better completely omit the version for now. +# + +{ + global: + main; # Provides basic adb symbol offsets + environ; # Public symbols and required by Java run time + _environ; + __environ_lock; + + local: + *; +};
--- a/make/java/management/Makefile Fri Jul 29 18:03:42 2016 +0100 +++ b/make/java/management/Makefile Fri Oct 07 03:00:13 2016 +0100 @@ -85,6 +85,12 @@ endif # PLATFORM macosx +ifeq ($(PLATFORM),aix) # PLATFORM aix + +OTHER_LDLIBS += -lperfstat + +endif # PLATFORM aix + endif # PLATFORM #
--- a/make/java/net/FILES_c.gmk Fri Jul 29 18:03:42 2016 +0100 +++ b/make/java/net/FILES_c.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -46,6 +46,10 @@ FILES_c += linux_close.c endif +ifeq ($(PLATFORM), aix) + FILES_c += linux_close.c +endif + ifeq ($(PLATFORM), macosx) FILES_c += bsd_close.c endif
--- a/make/java/nio/Makefile Fri Jul 29 18:03:42 2016 +0100 +++ b/make/java/nio/Makefile Fri Oct 07 03:00:13 2016 +0100 @@ -330,11 +330,79 @@ sun/nio/fs/BsdNativeDispatcher.java \ sun/nio/fs/UnixCopyFile.java \ sun/nio/fs/UnixNativeDispatcher.java - + FILES_gen += \ sun/nio/fs/UnixConstants.java endif # PLATFORM = bsd, macosx +ifeq ($(PLATFORM), aix) +FILES_java += \ + sun/nio/ch/AbstractPollSelectorImpl.java \ + sun/nio/ch/AixAsynchronousChannelProvider.java \ + sun/nio/ch/AixPollPort.java \ + sun/nio/ch/InheritedChannel.java \ + sun/nio/ch/PollSelectorProvider.java \ + sun/nio/ch/PollSelectorImpl.java \ + sun/nio/ch/Port.java \ + sun/nio/ch/SimpleAsynchronousFileChannelImpl.java \ + sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java \ + sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \ + \ + sun/nio/fs/GnomeFileTypeDetector.java \ + sun/nio/fs/AixFileStore.java \ + sun/nio/fs/AixFileSystem.java \ + sun/nio/fs/AixFileSystemProvider.java \ + sun/nio/fs/PollingWatchService.java \ + sun/nio/fs/UnixChannelFactory.java \ + sun/nio/fs/UnixCopyFile.java \ + sun/nio/fs/UnixDirectoryStream.java \ + sun/nio/fs/UnixException.java \ + sun/nio/fs/UnixFileAttributeViews.java \ + sun/nio/fs/UnixFileAttributes.java \ + sun/nio/fs/UnixFileKey.java \ + sun/nio/fs/UnixFileModeAttribute.java \ + sun/nio/fs/UnixFileStore.java \ + sun/nio/fs/UnixFileStoreAttributes.java \ + sun/nio/fs/UnixFileSystem.java \ + sun/nio/fs/UnixFileSystemProvider.java \ + sun/nio/fs/UnixMountEntry.java \ + sun/nio/fs/AixNativeDispatcher.java \ + sun/nio/fs/UnixNativeDispatcher.java \ + sun/nio/fs/UnixPath.java \ + sun/nio/fs/UnixSecureDirectoryStream.java \ + sun/nio/fs/UnixUriUtils.java \ + sun/nio/fs/UnixUserPrincipals.java + +FILES_c += \ + AixPollPort.c \ + InheritedChannel.c \ + NativeThread.c \ + PollArrayWrapper.c \ + UnixAsynchronousServerSocketChannelImpl.c \ + UnixAsynchronousSocketChannelImpl.c \ + \ + GnomeFileTypeDetector.c \ + UnixCopyFile.c \ + AixNativeDispatcher.c \ + UnixNativeDispatcher.c + +FILES_export += \ + sun/nio/ch/AixPollPort.java \ + sun/nio/ch/InheritedChannel.java \ + sun/nio/ch/NativeThread.java \ + sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java \ + sun/nio/ch/UnixAsynchronousSocketChannelImpl.java \ + \ + sun/nio/fs/GnomeFileTypeDetector.java \ + sun/nio/fs/UnixCopyFile.java \ + sun/nio/fs/AixNativeDispatcher.java \ + sun/nio/fs/UnixNativeDispatcher.java + +FILES_gen += \ + sun/nio/fs/UnixConstants.java +endif # PLATFORM = aix + + ifeq ($(PLATFORM), macosx) FILES_java += \ sun/nio/ch/KQueueSelectorProvider.java \ @@ -393,6 +461,9 @@ ifeq ($(PLATFORM), solaris) OTHER_LDLIBS += $(JVMLIB) $(LIBSOCKET) -lposix4 $(LIBDL) -lsendfile \ -L$(LIBDIR)/$(LIBARCH) -ljava -lnet +endif +ifeq ($(PLATFORM), aix) +OTHER_LDLIBS += -L$(LIBDIR)/$(LIBARCH) -ljava -lnet endif # PLATFORM #
--- a/make/java/npt/Makefile Fri Jul 29 18:03:42 2016 +0100 +++ b/make/java/npt/Makefile Fri Oct 07 03:00:13 2016 +0100 @@ -70,7 +70,7 @@ endif # Add location of iconv header -ifeq ($(PLATFORM), macosx)) +ifeq ($(PLATFORM), macosx) OTHER_LDLIBS += -liconv endif
--- a/make/javax/sound/SoundDefs.gmk Fri Jul 29 18:03:42 2016 +0100 +++ b/make/javax/sound/SoundDefs.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -44,6 +44,10 @@ CPPFLAGS += -DX_PLATFORM=X_MACOSX endif # PLATFORM macosx +ifeq ($(PLATFORM), aix) + CPPFLAGS += -DX_PLATFORM=X_AIX +endif # PLATFORM aix + ifeq ($(PLATFORM), solaris) CPPFLAGS += -DX_PLATFORM=X_SOLARIS @@ -86,6 +90,10 @@ CPPFLAGS += -DX_ARCH=X_PPC endif # ARCH ppc + ifeq ($(ARCH), ppc64) + CPPFLAGS += -DX_ARCH=X_PPC + endif # ARCH ppc64 + endif
--- a/make/jpda/transport/socket/Makefile Fri Jul 29 18:03:42 2016 +0100 +++ b/make/jpda/transport/socket/Makefile Fri Oct 07 03:00:13 2016 +0100 @@ -42,7 +42,7 @@ OTHER_LDLIBS += $(LIBNSL) $(LIBSOCKET) -lpthread endif -ifeq ($(PLATFORM), macosx)) +ifeq ($(PLATFORM), macosx) LIBSOCKET = OTHER_LDLIBS += -pthread endif
--- a/make/sun/awt/Makefile Fri Jul 29 18:03:42 2016 +0100 +++ b/make/sun/awt/Makefile Fri Oct 07 03:00:13 2016 +0100 @@ -127,6 +127,14 @@ OTHER_LDLIBS = $(JVMLIB) $(LIBM) $(LIBDL) endif +ifeq ($(PLATFORM), aix) +FILES_c = $(FILES_2D_c) +FILES_c += awt_LoadLibrary.c +OTHER_CFLAGS += -DMLIB_NO_LIBSUNMATH +OTHER_CFLAGS += -DMOTIF_VERSION=2 +OTHER_LDLIBS = -L$(LIBDIR)/$(LIBARCH) -lmlib_image $(JVMLIB) $(LIBM) +endif + FILES_c += initIDs.c ifeq ($(PLATFORM), macosx) @@ -517,6 +525,25 @@ # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ MAC OS X endif # PLATFORM +ifeq ($(PLATFORM), aix) +# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv AIX + +ifdef OPENJDK + +FONTCONFIGS_SRC = $(PLATFORM_SRC)/classes/sun/awt/fontconfigs +_FONTCONFIGS = \ + fontconfig.properties +else + +$(error "Currently we only support the 'OPENJDK' configuration for AIX") + +endif + +FONTCONFIGS_SRC_PREFIX = $(PLATFORM). + +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AIX +endif # PLATFORM + FONTCONFIGS = $(_FONTCONFIGS:%=$(LIBDIR)/%.src) BINARYFONTCONFIGS = $(_FONTCONFIGS:%.properties=$(LIBDIR)/%.bfc)
--- a/make/sun/awt/mawt.gmk Fri Jul 29 18:03:42 2016 +0100 +++ b/make/sun/awt/mawt.gmk Fri Oct 07 03:00:13 2016 +0100 @@ -240,7 +240,7 @@ $(wildcard /usr/include/X11/extensions)) endif -ifeq ($(PLATFORM), macosx)) +ifeq ($(PLATFORM), macosx) CPPFLAGS += -I$(OPENWIN_HOME)/include/X11/extensions \ -I$(OPENWIN_HOME)/include endif
--- a/make/sun/font/Makefile Fri Jul 29 18:03:42 2016 +0100 +++ b/make/sun/font/Makefile Fri Oct 07 03:00:13 2016 +0100 @@ -194,7 +194,7 @@ # Libraries to link, and other C flags. # -ifeq ($(PLATFORM), macosx)) +ifeq ($(PLATFORM), macosx) OTHER_INCLUDES += -I$(X11_PATH)/include OTHER_LDLIBS += -lawt $(LIBM) $(LIBCXX) ifeq ($(OS_VENDOR),Apple) @@ -207,6 +207,10 @@ # Note that on Solaris, fontmanager is built against the headless library. LDFLAGS += -L$(LIBDIR)/$(LIBARCH)/headless OTHER_LDLIBS += -lawt -L$(LIBDIR)/$(LIBARCH)/xawt -lmawt -lc $(LIBM) $(LIBCXX) +else +ifeq ($(PLATFORM), aix) + LDFLAGS += -L$(LIBDIR)/$(LIBARCH)/headless + OTHER_LDLIBS += -G -lawt -lc $(LIBM) $(LIBCXX) else # PLATFORM is linux OTHER_LDLIBS += -lawt $(LIBM) $(LIBCXX) ifeq ("$(CC_VER_MAJOR)", "3") @@ -214,12 +218,13 @@ endif endif endif +endif endif # PLATFORM # set up compile flags.. -ifeq ($(PLATFORM), macosx)) +ifeq ($(PLATFORM), macosx) CPPFLAGS += -I$(CLASSHDRDIR) endif
--- a/make/sun/jawt/Makefile Fri Jul 29 18:03:42 2016 +0100 +++ b/make/sun/jawt/Makefile Fri Oct 07 03:00:13 2016 +0100 @@ -142,6 +142,10 @@ -framework Cocoa endif # PLATFORM +ifeq ($(PLATFORM), aix) + OTHER_LDLIBS = -L$(LIBDIR)/$(LIBARCH) -lawt -L$(LIBDIR)/$(LIBARCH)/xawt -lmawt +endif # PLATFORM + endif # PLATFORM #
--- a/make/sun/splashscreen/Makefile Fri Jul 29 18:03:42 2016 +0100 +++ b/make/sun/splashscreen/Makefile Fri Oct 07 03:00:13 2016 +0100 @@ -83,7 +83,7 @@ -framework JavaNativeFoundation else ifneq ($(PLATFORM), windows) CFLAGS += -DWITH_X11 - ifeq ($(PLATFORM), macosx)) + ifeq ($(PLATFORM), macosx) OTHER_LDLIBS += -liconv CPPFLAGS += -I$(OPENWIN_HOME)/include \ -I$(OPENWIN_HOME)/include/X11/extensions
--- a/make/sun/xawt/Makefile Fri Jul 29 18:03:42 2016 +0100 +++ b/make/sun/xawt/Makefile Fri Oct 07 03:00:13 2016 +0100 @@ -63,11 +63,18 @@ dummy := $(shell $(MKDIR) -p $(LIB_LOCATION)) endif -ifeq ($(PLATFORM), macosx)) +ifeq ($(PLATFORM), macosx) LDFLAGS += -pthread dummy := $(shell $(MKDIR) -p $(LIB_LOCATION)) endif +# The Xrender headers/libraries will most probaly be under /opt/freeware on AIX +# This could/should be made configurable with ALT_XRENDER_HEADERS_PATH/ALT_XRENDER_LIB_PATH +ifeq ($(PLATFORM), aix) +LDFLAGS += -L/opt/freeware/lib +CPPFLAGS += -I/opt/freeware/include +endif + # Since this library will be living in a subdirectory below the other libraries # we need to add an extra runpath so that libraries in the upper directory # are found at runtime.
--- a/make/tools/freetypecheck/Makefile Fri Jul 29 18:03:42 2016 +0100 +++ b/make/tools/freetypecheck/Makefile Fri Oct 07 03:00:13 2016 +0100 @@ -35,7 +35,7 @@ # Used on openjdk only ifeq ($(OPENJDK),true) -# Start with CFLAGS (which gets us the required -xarch setting on solaris) +# Start with FT_CFLAGS (which gets us the required -xarch setting on solaris) ifeq ($(PLATFORM), windows) FT_OPTIONS = /nologo /c FREETYPE_DLL = $(FREETYPE_LIB_PATH)/freetype.dll @@ -44,16 +44,16 @@ FT_LD_OPTIONS += /manifest endif else - FT_OPTIONS = $(CFLAGS) + FT_OPTIONS = $(FT_CFLAGS) FT_LD_OPTIONS = -L$(FREETYPE_LIB_PATH) # Add runtime lib search path to ensure test will be runnable - ifeq ($(PLATFORM), solaris) - FT_LD_OPTIONS += -R $(FREETYPE_LIB_PATH) -lfreetype + ifeq ($(PLATFORM), linux) + FT_LD_OPTIONS += -Wl,-rpath -Wl,$(FREETYPE_LIB_PATH) -lfreetype else ifeq ($(PLATFORM), macosx) FT_LD_OPTIONS += -lfreetype -lz - else # linux - FT_LD_OPTIONS += -Wl,-rpath -Wl,$(FREETYPE_LIB_PATH) -lfreetype + else # everything else + FT_LD_OPTIONS += -R $(FREETYPE_LIB_PATH) -lfreetype endif endif endif @@ -68,10 +68,10 @@ # On windows we need to copy dll to test dir to ensure it will be found # at runtime -$(FT_TEST): freetypecheck.c +$(FT_TEST): FRC $(prep-target) ifeq ($(PLATFORM), windows) - $(CC) $(FT_OPTIONS) $(CC_OBJECT_OUTPUT_FLAG)$(FT_OBJ) $< + $(CC) $(FT_OPTIONS) $(CC_OBJECT_OUTPUT_FLAG)$(FT_OBJ) freetypecheck.c $(LINK) $(FT_LD_OPTIONS) /OUT:$(FT_TEST) $(FT_OBJ) $(CP) $(FREETYPE_DLL) $(@D)/ ifdef MT @@ -79,7 +79,7 @@ $(MT) /manifest $(FT_TEST).manifest /outputresource:$(FT_TEST);#1 endif else - @$(CC) $(FT_OPTIONS) $(CC_PROGRAM_OUTPUT_FLAG)$@ $< $(FT_LD_OPTIONS) + $(CC) $(FT_OPTIONS) $(CC_PROGRAM_OUTPUT_FLAG)$@ freetypecheck.c $(FT_LD_OPTIONS) endif else @@ -93,3 +93,6 @@ clean:: $(RM) $(FT_TEST) +# Force rule +FRC: +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/tools/sharing/classlist.aix Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,2406 @@ +java/lang/Object +java/lang/String +java/io/Serializable +java/lang/Comparable +java/lang/CharSequence +java/lang/Class +java/lang/reflect/GenericDeclaration +java/lang/reflect/Type +java/lang/reflect/AnnotatedElement +java/lang/Cloneable +java/lang/ClassLoader +java/lang/System +java/lang/Throwable +java/lang/Error +java/lang/ThreadDeath +java/lang/Exception +java/lang/RuntimeException +java/security/ProtectionDomain +java/security/AccessControlContext +java/lang/ClassNotFoundException +java/lang/NoClassDefFoundError +java/lang/LinkageError +java/lang/ClassCastException +java/lang/ArrayStoreException +java/lang/VirtualMachineError +java/lang/OutOfMemoryError +java/lang/StackOverflowError +java/lang/IllegalMonitorStateException +java/lang/ref/Reference +java/lang/ref/SoftReference +java/lang/ref/WeakReference +java/lang/ref/FinalReference +java/lang/ref/PhantomReference +java/lang/ref/Finalizer +java/lang/Thread +java/lang/Runnable +java/lang/ThreadGroup +java/lang/Thread$UncaughtExceptionHandler +java/util/Properties +java/util/Hashtable +java/util/Map +java/util/Dictionary +java/lang/reflect/AccessibleObject +java/lang/reflect/Field +java/lang/reflect/Member +java/lang/reflect/Method +java/lang/reflect/Constructor +sun/reflect/MagicAccessorImpl +sun/reflect/MethodAccessorImpl +sun/reflect/MethodAccessor +sun/reflect/ConstructorAccessorImpl +sun/reflect/ConstructorAccessor +sun/reflect/DelegatingClassLoader +sun/reflect/ConstantPool +sun/reflect/UnsafeStaticFieldAccessorImpl +sun/reflect/UnsafeFieldAccessorImpl +sun/reflect/FieldAccessorImpl +sun/reflect/FieldAccessor +java/util/Vector +java/util/List +java/util/Collection +java/lang/Iterable +java/util/RandomAccess +java/util/AbstractList +java/util/AbstractCollection +java/lang/StringBuffer +java/lang/AbstractStringBuilder +java/lang/Appendable +java/lang/StackTraceElement +java/nio/Buffer +java/lang/Boolean +java/lang/Character +java/lang/Float +java/lang/Number +java/lang/Double +java/lang/Byte +java/lang/Short +java/lang/Integer +java/lang/Long +java/lang/NullPointerException +java/lang/ArithmeticException +java/io/ObjectStreamField +java/lang/String$CaseInsensitiveComparator +java/util/Comparator +java/lang/RuntimePermission +java/security/BasicPermission +java/security/Permission +java/security/Guard +sun/misc/SoftCache +java/util/AbstractMap +java/lang/ref/ReferenceQueue +java/lang/ref/ReferenceQueue$Null +java/lang/ref/ReferenceQueue$Lock +java/util/HashMap +java/lang/annotation/Annotation +java/util/HashMap$Entry +java/util/Map$Entry +java/security/AccessController +java/lang/reflect/ReflectPermission +sun/reflect/ReflectionFactory$GetReflectionFactoryAction +java/security/PrivilegedAction +java/util/Stack +sun/reflect/ReflectionFactory +java/lang/ref/Reference$Lock +java/lang/ref/Reference$ReferenceHandler +java/lang/ref/Finalizer$FinalizerThread +java/util/Hashtable$EmptyEnumerator +java/util/Enumeration +java/util/Hashtable$EmptyIterator +java/util/Iterator +java/util/Hashtable$Entry +java/nio/charset/Charset +sun/nio/cs/StandardCharsets +sun/nio/cs/FastCharsetProvider +java/nio/charset/spi/CharsetProvider +sun/nio/cs/StandardCharsets$Aliases +sun/util/PreHashedMap +sun/nio/cs/StandardCharsets$Classes +sun/nio/cs/StandardCharsets$Cache +java/lang/ThreadLocal +java/util/concurrent/atomic/AtomicInteger +sun/misc/Unsafe +java/lang/NoSuchMethodError +java/lang/IncompatibleClassChangeError +sun/reflect/Reflection +java/util/Collections +java/util/Collections$EmptySet +java/util/AbstractSet +java/util/Set +java/util/Collections$EmptyList +java/util/Collections$EmptyMap +java/util/Collections$ReverseComparator +java/util/Collections$SynchronizedMap +java/lang/Class$3 +java/lang/reflect/Modifier +java/lang/reflect/ReflectAccess +sun/reflect/LangReflectAccess +java/util/Arrays +java/lang/Math +sun/nio/cs/US_ASCII +sun/nio/cs/HistoricallyNamedCharset +sun/misc/VM +java/lang/StringCoding +java/lang/ThreadLocal$ThreadLocalMap +java/lang/ThreadLocal$ThreadLocalMap$Entry +java/lang/StringCoding$StringDecoder +sun/nio/cs/US_ASCII$Decoder +java/nio/charset/CharsetDecoder +java/nio/charset/CodingErrorAction +java/nio/ByteBuffer +java/nio/HeapByteBuffer +java/nio/Bits +java/nio/ByteOrder +java/nio/CharBuffer +java/lang/Readable +java/nio/HeapCharBuffer +java/nio/charset/CoderResult +java/nio/charset/CoderResult$1 +java/nio/charset/CoderResult$Cache +java/nio/charset/CoderResult$2 +sun/misc/Version +java/io/FileInputStream +java/io/InputStream +java/io/Closeable +java/io/FileDescriptor +java/io/FileOutputStream +java/io/OutputStream +java/io/Flushable +java/io/BufferedInputStream +java/io/FilterInputStream +java/util/concurrent/atomic/AtomicReferenceFieldUpdater +java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl +sun/reflect/misc/ReflectUtil +java/io/PrintStream +java/io/FilterOutputStream +java/io/BufferedOutputStream +java/io/OutputStreamWriter +java/io/Writer +sun/nio/cs/StreamEncoder +sun/security/action/GetPropertyAction +sun/nio/cs/US_ASCII$Encoder +java/nio/charset/CharsetEncoder +sun/nio/cs/Surrogate$Parser +sun/nio/cs/Surrogate +java/io/BufferedWriter +java/lang/Runtime +java/io/File +java/io/FileSystem +java/io/UnixFileSystem +java/io/ExpiringCache +java/io/ExpiringCache$1 +java/util/LinkedHashMap +java/util/LinkedHashMap$Entry +java/lang/StringBuilder +java/io/File$1 +sun/misc/JavaIODeleteOnExitAccess +sun/misc/SharedSecrets +java/lang/ClassLoader$3 +java/lang/StringCoding$StringEncoder +java/io/ExpiringCache$Entry +java/lang/ClassLoader$NativeLibrary +java/lang/Terminator +java/lang/Terminator$1 +sun/misc/SignalHandler +sun/misc/Signal +sun/misc/NativeSignalHandler +java/io/Console +java/io/Console$1 +sun/misc/JavaIOAccess +java/io/Console$1$1 +java/lang/Shutdown +java/util/ArrayList +java/lang/Shutdown$Lock +java/lang/ApplicationShutdownHooks +java/util/IdentityHashMap +sun/misc/OSEnvironment +java/lang/System$2 +sun/misc/JavaLangAccess +java/lang/Compiler +java/lang/Compiler$1 +sun/misc/Launcher +sun/misc/Launcher$Factory +java/net/URLStreamHandlerFactory +sun/misc/Launcher$ExtClassLoader +java/net/URLClassLoader +java/security/SecureClassLoader +sun/security/util/Debug +java/net/URLClassLoader$7 +sun/misc/JavaNetAccess +java/util/StringTokenizer +sun/misc/Launcher$ExtClassLoader$1 +java/security/PrivilegedExceptionAction +sun/misc/MetaIndex +java/io/BufferedReader +java/io/Reader +java/io/FileReader +java/io/InputStreamReader +sun/nio/cs/StreamDecoder +java/lang/reflect/Array +sun/net/www/ParseUtil +java/util/BitSet +java/io/ObjectStreamClass +java/net/URL +java/util/Locale +java/util/concurrent/ConcurrentHashMap +java/util/concurrent/ConcurrentMap +java/util/concurrent/ConcurrentHashMap$Segment +java/util/concurrent/locks/ReentrantLock +java/util/concurrent/locks/Lock +java/util/concurrent/locks/ReentrantLock$NonfairSync +java/util/concurrent/locks/ReentrantLock$Sync +java/util/concurrent/locks/AbstractQueuedSynchronizer +java/util/concurrent/locks/AbstractOwnableSynchronizer +java/util/concurrent/locks/AbstractQueuedSynchronizer$Node +java/util/concurrent/ConcurrentHashMap$HashEntry +java/lang/CharacterDataLatin1 +java/net/Parts +sun/net/www/protocol/file/Handler +java/net/URLStreamHandler +java/lang/Class$1 +sun/reflect/ReflectionFactory$1 +sun/reflect/NativeConstructorAccessorImpl +sun/reflect/DelegatingConstructorAccessorImpl +java/util/HashSet +sun/misc/URLClassPath +sun/net/www/protocol/jar/Handler +sun/misc/Launcher$AppClassLoader +sun/misc/Launcher$AppClassLoader$1 +java/lang/SystemClassLoaderAction +java/net/URLClassLoader$1 +sun/misc/URLClassPath$3 +sun/misc/URLClassPath$JarLoader +sun/misc/URLClassPath$Loader +java/security/PrivilegedActionException +sun/misc/URLClassPath$FileLoader +sun/misc/URLClassPath$FileLoader$1 +sun/misc/Resource +sun/nio/ByteBuffered +java/security/CodeSource +java/security/Permissions +java/security/PermissionCollection +sun/net/www/protocol/file/FileURLConnection +sun/net/www/URLConnection +java/net/URLConnection +java/net/UnknownContentHandler +java/net/ContentHandler +sun/net/www/MessageHeader +java/io/FilePermission +java/io/FilePermission$1 +sun/security/provider/PolicyFile +java/security/Policy +java/security/Policy$UnsupportedEmptyCollection +java/io/FilePermissionCollection +java/security/AllPermission +java/security/UnresolvedPermission +java/security/BasicPermissionCollection +java/security/Principal +java/security/cert/Certificate +java/util/AbstractList$Itr +java/util/IdentityHashMap$KeySet +java/util/IdentityHashMap$KeyIterator +java/util/IdentityHashMap$IdentityHashMapIterator +java/io/DeleteOnExitHook +java/util/LinkedHashSet +java/util/HashMap$KeySet +java/util/LinkedHashMap$KeyIterator +java/util/LinkedHashMap$LinkedHashIterator +java/awt/Frame +java/awt/MenuContainer +java/awt/Window +javax/accessibility/Accessible +java/awt/Container +java/awt/Component +java/awt/image/ImageObserver +java/lang/InterruptedException +java/awt/Label +java/util/logging/Logger +java/util/logging/Handler +java/util/logging/Level +java/util/logging/LogManager +java/util/logging/LogManager$1 +java/beans/PropertyChangeSupport +java/util/logging/LogManager$LogNode +java/util/logging/LoggingPermission +java/util/logging/LogManager$Cleaner +java/util/logging/LogManager$RootLogger +java/util/logging/LogManager$2 +java/util/Properties$LineReader +java/util/Hashtable$Enumerator +java/beans/PropertyChangeEvent +java/util/EventObject +java/awt/Component$AWTTreeLock +sun/awt/DebugHelper +sun/awt/NativeLibLoader +sun/security/action/LoadLibraryAction +java/awt/GraphicsEnvironment +java/awt/GraphicsEnvironment$1 +java/lang/ProcessEnvironment +java/lang/ProcessEnvironment$Variable +java/lang/ProcessEnvironment$ExternalData +java/lang/ProcessEnvironment$Value +java/lang/ProcessEnvironment$StringEnvironment +java/util/Collections$UnmodifiableMap +sun/awt/DebugHelperStub +java/awt/Toolkit +java/awt/Toolkit$3 +sun/util/CoreResourceBundleControl +java/util/ResourceBundle$Control +java/util/Arrays$ArrayList +java/util/Collections$UnmodifiableRandomAccessList +java/util/Collections$UnmodifiableList +java/util/Collections$UnmodifiableCollection +java/util/ResourceBundle +java/util/ResourceBundle$1 +java/util/ResourceBundle$RBClassLoader +java/util/ResourceBundle$RBClassLoader$1 +java/util/ResourceBundle$CacheKey +java/util/ResourceBundle$LoaderReference +java/util/ResourceBundle$CacheKeyReference +java/util/ResourceBundle$SingleFormatControl +sun/awt/resources/awt +java/util/ListResourceBundle +java/awt/Toolkit$1 +java/io/FileNotFoundException +java/io/IOException +java/awt/event/KeyEvent +java/awt/event/InputEvent +java/awt/event/ComponentEvent +java/awt/AWTEvent +java/awt/event/NativeLibLoader +java/util/WeakHashMap +java/util/WeakHashMap$Entry +java/awt/Component$DummyRequestFocusController +sun/awt/RequestFocusController +java/awt/LayoutManager +java/awt/LightweightDispatcher +java/awt/event/AWTEventListener +java/util/EventListener +java/awt/Dimension +java/awt/geom/Dimension2D +java/util/concurrent/atomic/AtomicBoolean +java/awt/ComponentOrientation +java/awt/Component$2 +java/lang/NoSuchMethodException +sun/awt/AppContext +sun/awt/AppContext$1 +sun/awt/AppContext$2 +sun/awt/MostRecentKeyValue +java/awt/Cursor +sun/awt/X11GraphicsEnvironment +sun/java2d/SunGraphicsEnvironment +sun/java2d/FontSupport +sun/awt/DisplayChangedListener +sun/java2d/SunGraphicsEnvironment$TTFilter +java/io/FilenameFilter +sun/java2d/SunGraphicsEnvironment$T1Filter +sun/awt/X11GraphicsEnvironment$1 +sun/awt/SunToolkit +sun/awt/WindowClosingSupport +sun/awt/WindowClosingListener +sun/awt/ComponentFactory +sun/awt/InputMethodSupport +java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject +java/util/concurrent/locks/Condition +sun/awt/AWTAutoShutdown +sun/awt/AWTAutoShutdown$PeerMap +sun/awt/SunToolkit$6 +java/awt/Dialog$ModalExclusionType +java/lang/Enum +java/awt/Dialog +java/awt/Dialog$ModalityType +java/awt/ModalEventFilter +java/awt/EventFilter +sun/reflect/UnsafeFieldAccessorFactory +sun/reflect/UnsafeQualifiedStaticObjectFieldAccessorImpl +sun/reflect/UnsafeQualifiedStaticFieldAccessorImpl +sun/awt/SunDisplayChanger +sun/java2d/SunGraphicsEnvironment$1 +java/io/StreamTokenizer +sun/font/FontManager +sun/font/FileFont +sun/font/PhysicalFont +sun/font/Font2D +sun/font/CompositeFont +java/util/HashMap$Values +java/util/HashMap$ValueIterator +java/util/HashMap$HashIterator +sun/font/FontManager$1 +java/awt/Font +java/awt/geom/AffineTransform +sun/font/AttributeValues +sun/font/EAttribute +java/text/AttributedCharacterIterator$Attribute +java/lang/Class$4 +sun/reflect/NativeMethodAccessorImpl +sun/reflect/DelegatingMethodAccessorImpl +java/awt/font/TextAttribute +java/lang/Integer$IntegerCache +sun/font/TrueTypeFont +java/awt/font/FontRenderContext +java/awt/RenderingHints +sun/awt/SunHints +sun/awt/SunHints$Key +java/awt/RenderingHints$Key +sun/awt/SunHints$Value +sun/awt/SunHints$LCDContrastKey +sun/font/Type1Font +java/awt/geom/Point2D$Float +java/awt/geom/Point2D +sun/font/StrikeMetrics +java/awt/geom/Rectangle2D$Float +java/awt/geom/Rectangle2D +java/awt/geom/RectangularShape +java/awt/Shape +java/awt/geom/GeneralPath +java/awt/geom/Path2D$Float +java/awt/geom/Path2D +sun/font/CharToGlyphMapper +sun/font/PhysicalStrike +sun/font/FontStrike +sun/font/GlyphList +sun/font/StrikeCache +sun/java2d/Disposer +sun/java2d/Disposer$1 +sun/font/StrikeCache$1 +sun/font/FontManager$FontRegistrationInfo +sun/awt/motif/MFontConfiguration +sun/awt/FontConfiguration +sun/awt/FontDescriptor +java/util/Scanner +java/util/regex/Pattern +java/util/regex/Pattern$8 +java/util/regex/Pattern$Node +java/util/regex/Pattern$LastNode +java/util/regex/Pattern$GroupHead +java/util/regex/Pattern$CharPropertyNames +java/util/regex/Pattern$CharPropertyNames$1 +java/util/regex/Pattern$CharPropertyNames$CharPropertyFactory +java/util/regex/Pattern$CharPropertyNames$2 +java/util/regex/Pattern$CharPropertyNames$5 +java/util/regex/Pattern$CharPropertyNames$3 +java/util/regex/Pattern$CharPropertyNames$6 +java/util/regex/Pattern$CharPropertyNames$CloneableProperty +java/util/regex/Pattern$CharProperty +java/util/regex/Pattern$CharPropertyNames$4 +java/util/regex/Pattern$CharPropertyNames$7 +java/util/regex/Pattern$CharPropertyNames$8 +java/util/regex/Pattern$CharPropertyNames$9 +java/util/regex/Pattern$CharPropertyNames$10 +java/util/regex/Pattern$CharPropertyNames$11 +java/util/regex/Pattern$CharPropertyNames$12 +java/util/regex/Pattern$CharPropertyNames$13 +java/util/regex/Pattern$CharPropertyNames$14 +java/util/regex/Pattern$CharPropertyNames$15 +java/util/regex/Pattern$CharPropertyNames$16 +java/util/regex/Pattern$CharPropertyNames$17 +java/util/regex/Pattern$CharPropertyNames$18 +java/util/regex/Pattern$CharPropertyNames$19 +java/util/regex/Pattern$CharPropertyNames$20 +java/util/regex/Pattern$CharPropertyNames$21 +java/util/regex/Pattern$Curly +java/util/regex/Pattern$Slice +java/util/regex/Pattern$Begin +java/util/regex/Pattern$First +java/util/regex/Pattern$Start +java/util/regex/Pattern$TreeInfo +java/util/regex/Pattern$All +java/util/regex/Pattern$BitClass +java/util/regex/Pattern$BmpCharProperty +java/util/regex/Pattern$6 +java/util/regex/Pattern$CharProperty$1 +java/util/regex/Pattern$10 +sun/nio/ch/FileChannelImpl +java/nio/channels/FileChannel +java/nio/channels/ByteChannel +java/nio/channels/ReadableByteChannel +java/nio/channels/Channel +java/nio/channels/WritableByteChannel +java/nio/channels/GatheringByteChannel +java/nio/channels/ScatteringByteChannel +java/nio/channels/spi/AbstractInterruptibleChannel +java/nio/channels/InterruptibleChannel +sun/nio/ch/Util +sun/nio/ch/IOUtil +sun/nio/ch/FileDispatcher +sun/nio/ch/NativeDispatcher +sun/nio/ch/Reflect +java/nio/MappedByteBuffer +sun/nio/ch/Reflect$1 +sun/nio/ch/NativeThreadSet +java/nio/channels/Channels +java/util/Scanner$1 +sun/misc/LRUCache +java/util/regex/Matcher +java/util/regex/MatchResult +java/text/NumberFormat +java/text/Format +java/text/spi/NumberFormatProvider +java/util/spi/LocaleServiceProvider +sun/util/LocaleServiceProviderPool +sun/util/LocaleServiceProviderPool$1 +java/util/ServiceLoader +java/util/ServiceLoader$LazyIterator +java/util/ServiceLoader$1 +java/util/HashMap$EntrySet +java/util/LinkedHashMap$EntryIterator +sun/misc/Launcher$1 +sun/misc/URLClassPath$2 +java/lang/ClassLoader$2 +sun/misc/URLClassPath$1 +java/net/URLClassLoader$3 +sun/misc/CompoundEnumeration +sun/misc/URLClassPath$JarLoader$1 +sun/misc/FileURLMapper +java/net/URLClassLoader$3$1 +sun/util/resources/LocaleData +sun/util/resources/LocaleData$1 +sun/util/resources/LocaleData$LocaleDataResourceBundleControl +sun/util/LocaleDataMetaInfo +sun/text/resources/FormatData +java/util/ResourceBundle$BundleReference +sun/text/resources/FormatData_en +sun/text/resources/FormatData_en_US +java/text/DecimalFormatSymbols +java/text/spi/DecimalFormatSymbolsProvider +java/util/Currency +java/util/Currency$1 +java/util/CurrencyData +java/util/spi/CurrencyNameProvider +sun/util/resources/CurrencyNames +sun/util/resources/LocaleNamesBundle +sun/util/resources/OpenListResourceBundle +sun/util/resources/CurrencyNames_en_US +java/text/DecimalFormat +java/text/FieldPosition +java/text/DigitList +java/math/RoundingMode +java/util/regex/Pattern$GroupTail +java/util/regex/Pattern$Ctype +java/util/regex/Pattern$Ques +java/util/regex/Pattern$GroupCurly +java/util/regex/Pattern$5 +java/util/regex/Pattern$Loop +java/util/regex/Pattern$Prolog +java/util/regex/Pattern$9 +java/util/regex/Pattern$BranchConn +java/util/regex/Pattern$Branch +java/nio/channels/spi/AbstractInterruptibleChannel$1 +sun/nio/ch/Interruptible +sun/nio/ch/NativeThread +sun/nio/ch/DirectBuffer +java/nio/DirectByteBuffer +java/nio/DirectByteBuffer$Deallocator +sun/misc/Cleaner +sun/nio/ch/IOStatus +java/util/regex/ASCII +java/io/DataInputStream +java/io/DataInput +java/lang/Short$ShortCache +java/util/HashMap$KeyIterator +sun/font/CompositeFontDescriptor +sun/font/Font2DHandle +sun/font/FontFamily +java/awt/GraphicsDevice +sun/awt/X11GraphicsDevice +sun/awt/X11GraphicsConfig +java/awt/GraphicsConfiguration +java/awt/ImageCapabilities +sun/java2d/x11/X11SurfaceData +sun/java2d/SurfaceData +java/awt/Transparency +sun/java2d/DisposerTarget +sun/java2d/InvalidPipeException +java/lang/IllegalStateException +sun/java2d/NullSurfaceData +sun/java2d/loops/SurfaceType +sun/awt/image/PixelConverter +sun/awt/image/PixelConverter$Xrgb +sun/awt/image/PixelConverter$Argb +sun/awt/image/PixelConverter$ArgbPre +sun/awt/image/PixelConverter$Xbgr +sun/awt/image/PixelConverter$Rgba +sun/awt/image/PixelConverter$RgbaPre +sun/awt/image/PixelConverter$Ushort565Rgb +sun/awt/image/PixelConverter$Ushort555Rgb +sun/awt/image/PixelConverter$Ushort555Rgbx +sun/awt/image/PixelConverter$Ushort4444Argb +sun/awt/image/PixelConverter$ByteGray +sun/awt/image/PixelConverter$UshortGray +sun/awt/image/PixelConverter$Rgbx +sun/awt/image/PixelConverter$Bgrx +sun/awt/image/PixelConverter$ArgbBm +java/awt/image/ColorModel +java/awt/image/DirectColorModel +java/awt/image/PackedColorModel +java/awt/color/ColorSpace +java/awt/color/ICC_Profile +sun/awt/color/ProfileDeferralInfo +sun/awt/color/ProfileDeferralMgr +java/awt/color/ICC_ProfileRGB +java/awt/color/ICC_Profile$1 +sun/awt/color/ProfileActivator +java/awt/color/ICC_ColorSpace +sun/java2d/pipe/NullPipe +sun/java2d/pipe/PixelDrawPipe +sun/java2d/pipe/PixelFillPipe +sun/java2d/pipe/ShapeDrawPipe +sun/java2d/pipe/TextPipe +sun/java2d/pipe/DrawImagePipe +java/awt/image/IndexColorModel +sun/java2d/pipe/LoopPipe +sun/java2d/pipe/OutlineTextRenderer +sun/java2d/pipe/SolidTextRenderer +sun/java2d/pipe/GlyphListLoopPipe +sun/java2d/pipe/GlyphListPipe +sun/java2d/pipe/AATextRenderer +sun/java2d/pipe/LCDTextRenderer +sun/java2d/pipe/AlphaColorPipe +sun/java2d/pipe/CompositePipe +sun/java2d/pipe/PixelToShapeConverter +sun/java2d/pipe/TextRenderer +sun/java2d/pipe/SpanClipRenderer +sun/java2d/pipe/Region +sun/java2d/pipe/RegionIterator +sun/java2d/pipe/DuctusShapeRenderer +sun/java2d/pipe/DuctusRenderer +sun/java2d/pipe/AlphaPaintPipe +sun/java2d/pipe/SpanShapeRenderer$Composite +sun/java2d/pipe/SpanShapeRenderer +sun/java2d/pipe/GeneralCompositePipe +sun/java2d/pipe/DrawImage +sun/java2d/loops/RenderCache +sun/java2d/loops/RenderCache$Entry +sun/java2d/loops/XORComposite +java/awt/Composite +sun/font/X11TextRenderer +sun/java2d/loops/GraphicsPrimitive +sun/java2d/x11/X11PMBlitLoops +sun/java2d/loops/Blit +sun/java2d/loops/GraphicsPrimitiveMgr +sun/java2d/loops/CompositeType +sun/java2d/SunGraphics2D +sun/awt/ConstrainableGraphics +java/awt/Graphics2D +java/awt/Graphics +java/awt/Color +java/awt/Paint +java/awt/AlphaComposite +sun/java2d/loops/BlitBg +sun/java2d/loops/ScaledBlit +sun/java2d/loops/FillRect +sun/java2d/loops/FillSpans +sun/java2d/loops/DrawLine +sun/java2d/loops/DrawRect +sun/java2d/loops/DrawPolygons +sun/java2d/loops/DrawPath +sun/java2d/loops/FillPath +sun/java2d/loops/MaskBlit +sun/java2d/loops/MaskFill +sun/java2d/loops/DrawGlyphList +sun/java2d/loops/DrawGlyphListAA +sun/java2d/loops/DrawGlyphListLCD +sun/java2d/loops/TransformHelper +java/awt/BasicStroke +java/awt/Stroke +sun/misc/PerformanceLogger +sun/misc/PerformanceLogger$TimeData +sun/java2d/pipe/ValidatePipe +sun/java2d/loops/CustomComponent +sun/java2d/loops/GraphicsPrimitiveProxy +sun/java2d/loops/GeneralRenderer +sun/java2d/loops/GraphicsPrimitiveMgr$1 +sun/java2d/loops/GraphicsPrimitiveMgr$2 +sun/java2d/x11/X11PMBlitLoops$DelegateBlitLoop +sun/java2d/x11/X11PMBlitBgLoops +sun/java2d/x11/X11SurfaceData$LazyPipe +sun/awt/X11GraphicsConfig$X11GCDisposerRecord +sun/java2d/DisposerRecord +java/awt/BorderLayout +java/awt/LayoutManager2 +java/awt/Rectangle +java/awt/Toolkit$2 +sun/awt/X11/XToolkit +sun/awt/X11/XConstants +sun/awt/UNIXToolkit +java/util/TreeMap +java/util/NavigableMap +java/util/SortedMap +sun/awt/X11/XlibWrapper +sun/awt/X11/XUtilConstants +sun/awt/X11/XProtocolConstants +sun/awt/X11/XCursorFontConstants +sun/awt/X11/XlibWrapper$1 +sun/awt/X11/XToolkit$4 +sun/awt/X11/XModifierKeymap +sun/awt/X11/XWrapperBase +sun/awt/X11/Native +sun/awt/X11/Native$1 +java/awt/EventQueue +sun/awt/X11/XToolkit$7 +java/util/EmptyStackException +java/lang/reflect/InvocationTargetException +java/awt/EventDispatchThread +java/awt/event/PaintEvent +java/awt/event/MouseEvent +sun/awt/PeerEvent +java/awt/event/InvocationEvent +java/awt/ActiveEvent +java/awt/EventQueueItem +sun/awt/X11/XToolkit$1 +sun/awt/X11/XToolkit$XErrorHandler +sun/awt/X11/XToolkit$5 +sun/awt/X11/XEventDispatcher +sun/awt/SunToolkit$ModalityListenerList +sun/awt/ModalityListener +sun/awt/SunToolkit$1 +java/util/MissingResourceException +java/awt/Queue +sun/awt/PostEventQueue +java/util/LinkedList +java/util/Deque +java/util/Queue +java/util/AbstractSequentialList +java/util/LinkedList$Entry +sun/awt/X11/AwtScreenData +sun/awt/X11/XWM +sun/awt/X11/MWMConstants +sun/awt/X11/XAtom +java/awt/Insets +sun/awt/X11/XWM$1 +sun/awt/X11/XWM$2 +sun/awt/X11/XSetWindowAttributes +sun/awt/X11/XErrorEvent +sun/awt/X11/XNETProtocol +sun/awt/X11/XStateProtocol +sun/awt/X11/XLayerProtocol +sun/awt/X11/XProtocol +sun/awt/X11/XProtocol$1 +sun/awt/X11/WindowPropertyGetter +sun/awt/X11/UnsafeXDisposerRecord +sun/awt/X11/XPropertyCache +sun/awt/X11/XWINProtocol +sun/awt/X11/XAtomList +sun/awt/X11/XToolkit$3 +sun/awt/X11/XAnyEvent +sun/awt/X11/IXAnyEvent +java/awt/Window$WindowDisposerRecord +java/awt/KeyboardFocusManager +java/awt/KeyEventDispatcher +java/awt/KeyEventPostProcessor +java/awt/AWTKeyStroke +java/awt/AWTKeyStroke$1 +java/awt/DefaultKeyboardFocusManager +java/awt/DefaultFocusTraversalPolicy +java/awt/ContainerOrderFocusTraversalPolicy +java/awt/FocusTraversalPolicy +java/awt/MutableBoolean +java/util/Collections$UnmodifiableSet +sun/awt/HeadlessToolkit +sun/awt/X11/XKeyboardFocusManagerPeer +java/awt/peer/KeyboardFocusManagerPeer +sun/awt/X11/XKeyboardFocusManagerPeer$1 +sun/awt/X11/XFramePeer +java/awt/peer/FramePeer +java/awt/peer/WindowPeer +java/awt/peer/ContainerPeer +java/awt/peer/ComponentPeer +sun/awt/X11/XDecoratedPeer +sun/awt/X11/XWindowPeer +sun/awt/X11/XPanelPeer +java/awt/peer/PanelPeer +sun/awt/X11/XCanvasPeer +java/awt/peer/CanvasPeer +sun/awt/X11/XComponentPeer +java/awt/dnd/peer/DropTargetPeer +sun/awt/X11/XWindow +sun/awt/X11ComponentPeer +sun/awt/X11/XBaseWindow +sun/awt/X11/XCreateWindowParams +java/lang/Long$LongCache +sun/awt/X11/XBaseWindow$InitialiseState +sun/awt/X11/XBaseWindow$StateLock +sun/awt/X11/AwtGraphicsConfigData +sun/awt/X11/XVisualInfo +java/awt/SystemColor +sun/awt/X11/MotifColorUtilities +java/lang/StrictMath +sun/awt/X11/XRepaintArea +sun/awt/RepaintArea +sun/awt/X11/XWindowAttributesData +java/util/concurrent/locks/LockSupport +sun/awt/X11/WindowDimensions +java/awt/Point +java/util/TreeMap$Entry +sun/nio/cs/UTF_8 +sun/nio/cs/Unicode +sun/nio/cs/UTF_8$Encoder +sun/nio/cs/UTF_8$Decoder +sun/nio/cs/Surrogate$Generator +sun/awt/X11/XPropertyEvent +sun/awt/X11/XDropTargetEventProcessor +sun/awt/X11/XDragSourceContextPeer +sun/awt/X11/XDragSourceProtocolListener +sun/awt/dnd/SunDragSourceContextPeer +java/awt/dnd/peer/DragSourceContextPeer +sun/awt/X11/XAwtState +sun/awt/X11/XBaseWindow$1 +sun/awt/X11/XRootWindow +sun/nio/cs/ISO_8859_1 +sun/nio/cs/ISO_8859_1$Encoder +sun/nio/cs/ISO_8859_1$Decoder +sun/java2d/x11/X11SurfaceData$X11WindowSurfaceData +sun/java2d/loops/RenderLoops +sun/java2d/loops/GraphicsPrimitiveMgr$PrimitiveSpec +sun/java2d/DefaultDisposerRecord +sun/java2d/x11/X11Renderer +sun/awt/X11/XGlobalCursorManager +sun/awt/GlobalCursorManager +sun/awt/X11/XToolkit$6 +java/awt/Cursor$CursorDisposer +java/awt/AWTException +java/awt/HeadlessException +java/lang/UnsupportedOperationException +sun/reflect/UnsafeLongFieldAccessorImpl +sun/reflect/UnsafeIntegerFieldAccessorImpl +sun/awt/X11/XClientMessageEvent +sun/awt/X11/XIconInfo +sun/awt/X11/XAWTIcon32_java_icon16_png +sun/awt/X11/XAWTIcon32_java_icon24_png +sun/awt/X11/XAWTIcon32_java_icon32_png +sun/awt/X11/XAWTIcon32_java_icon48_png +sun/awt/X11/XSizeHints +sun/awt/X11/XContentWindow +sun/awt/X11/XFocusProxyWindow +sun/awt/X11/XWMHints +java/util/LinkedList$ListItr +java/util/ListIterator +sun/awt/SunToolkit$2 +java/awt/image/BufferStrategy +java/awt/dnd/DropTarget +java/awt/dnd/DropTargetListener +java/awt/event/ComponentListener +java/awt/event/FocusListener +java/awt/event/HierarchyListener +java/awt/event/HierarchyBoundsListener +java/awt/event/KeyListener +java/awt/event/MouseListener +java/awt/event/MouseMotionListener +java/awt/event/MouseWheelListener +java/awt/event/InputMethodListener +java/awt/Component$NativeInLightFixer +java/awt/event/ContainerListener +javax/accessibility/AccessibleContext +sun/reflect/UnsafeObjectFieldAccessorImpl +java/awt/peer/LightweightPeer +sun/awt/X11/XLabelPeer +java/awt/peer/LabelPeer +sun/awt/X11/XMapEvent +sun/awt/X11/XQueryTree +sun/awt/X11/XConfigureEvent +sun/awt/X11/PropMwmHints +sun/awt/GlobalCursorManager$NativeUpdater +javax/swing/JFrame +javax/swing/WindowConstants +javax/swing/RootPaneContainer +javax/swing/TransferHandler$HasGetTransferHandler +javax/swing/JLabel +javax/swing/SwingConstants +javax/swing/JComponent +javax/swing/JComponent$1 +javax/swing/SwingUtilities +javax/swing/JRootPane +sun/security/action/GetBooleanAction +javax/swing/event/EventListenerList +javax/swing/JPanel +java/awt/FlowLayout +javax/swing/UIManager +javax/swing/UIManager$LookAndFeelInfo +sun/swing/SwingUtilities2 +sun/swing/SwingUtilities2$LSBCacheEntry +javax/swing/UIManager$LAFState +javax/swing/UIDefaults +javax/swing/MultiUIDefaults +javax/swing/UIManager$1 +javax/swing/plaf/metal/MetalLookAndFeel +javax/swing/plaf/basic/BasicLookAndFeel +javax/swing/LookAndFeel +sun/swing/DefaultLookup +javax/swing/plaf/metal/OceanTheme +javax/swing/plaf/metal/DefaultMetalTheme +javax/swing/plaf/metal/MetalTheme +javax/swing/plaf/ColorUIResource +javax/swing/plaf/UIResource +sun/swing/PrintColorUIResource +javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate +javax/swing/plaf/FontUIResource +sun/swing/SwingLazyValue +javax/swing/UIDefaults$LazyValue +javax/swing/UIDefaults$ActiveValue +javax/swing/plaf/InsetsUIResource +sun/swing/SwingUtilities2$2 +javax/swing/plaf/basic/BasicLookAndFeel$2 +javax/swing/plaf/DimensionUIResource +javax/swing/UIDefaults$LazyInputMap +java/lang/Character$CharacterCache +javax/swing/plaf/metal/MetalLookAndFeel$MetalLazyValue +javax/swing/plaf/metal/MetalLookAndFeel$FontActiveValue +java/awt/print/PrinterJob +sun/swing/SwingUtilities2$AATextInfo +sun/awt/X11/XAWTXSettings +sun/awt/X11/XMSelectionListener +sun/awt/XSettings +sun/awt/X11/XMSelection +sun/awt/X11/XMSelection$1 +javax/swing/plaf/metal/MetalLookAndFeel$AATextListener +java/beans/PropertyChangeListener +java/beans/PropertyChangeListenerProxy +java/util/EventListenerProxy +sun/awt/EventListenerAggregate +javax/swing/UIDefaults$ProxyLazyValue +javax/swing/plaf/metal/OceanTheme$1 +javax/swing/plaf/metal/OceanTheme$2 +javax/swing/plaf/metal/OceanTheme$3 +javax/swing/plaf/metal/OceanTheme$4 +javax/swing/plaf/metal/OceanTheme$5 +javax/swing/plaf/metal/OceanTheme$6 +javax/swing/RepaintManager +javax/swing/RepaintManager$DisplayChangedHandler +javax/swing/SwingPaintEventDispatcher +sun/awt/PaintEventDispatcher +javax/swing/UIManager$2 +javax/swing/UIManager$3 +java/awt/PopupMenu +java/awt/Menu +java/awt/MenuItem +java/awt/MenuComponent +java/io/ObjectOutputStream +java/io/ObjectOutput +java/io/DataOutput +java/io/ObjectStreamConstants +java/io/PrintWriter +java/io/ObjectInputStream +java/io/ObjectInput +java/awt/Event +java/awt/im/InputContext +java/awt/event/MouseWheelEvent +java/awt/BufferCapabilities +sun/awt/CausedFocusEvent$Cause +java/awt/PointerInfo +java/awt/Component$BaselineResizeBehavior +java/awt/FontMetrics +java/awt/Image +java/awt/image/ImageProducer +java/awt/image/VolatileImage +java/awt/im/InputMethodRequests +java/awt/event/FocusEvent +java/awt/event/InputMethodEvent +java/awt/event/HierarchyEvent +javax/accessibility/AccessibleStateSet +com/sun/swing/internal/plaf/metal/resources/metal +sun/util/ResourceBundleEnumeration +com/sun/swing/internal/plaf/basic/resources/basic +javax/swing/plaf/basic/BasicPanelUI +javax/swing/plaf/PanelUI +javax/swing/plaf/ComponentUI +sun/reflect/misc/MethodUtil +sun/reflect/misc/MethodUtil$1 +java/util/jar/JarFile +java/util/zip/ZipFile +java/util/zip/ZipConstants +java/util/jar/JavaUtilJarAccessImpl +sun/misc/JavaUtilJarAccess +sun/misc/JarIndex +java/util/zip/ZipEntry +java/util/jar/JarFile$JarFileEntry +java/util/jar/JarEntry +sun/misc/URLClassPath$JarLoader$2 +sun/net/www/protocol/jar/JarURLConnection +java/net/JarURLConnection +sun/net/www/protocol/jar/JarFileFactory +sun/net/www/protocol/jar/URLJarFile$URLJarFileCloseController +java/net/HttpURLConnection +sun/net/www/protocol/jar/URLJarFile +sun/net/www/protocol/jar/URLJarFile$URLJarFileEntry +sun/net/www/protocol/jar/JarURLConnection$JarURLInputStream +java/util/zip/ZipFile$ZipFileInputStream +java/security/AllPermissionCollection +java/lang/IllegalAccessException +javax/swing/JPasswordField +javax/swing/JTextField +javax/swing/text/JTextComponent +javax/swing/Scrollable +javax/swing/JLayeredPane +javax/swing/JRootPane$1 +javax/swing/ArrayTable +javax/swing/JInternalFrame +javax/swing/JRootPane$RootLayout +javax/swing/BufferStrategyPaintManager +javax/swing/RepaintManager$PaintManager +javax/swing/plaf/metal/MetalRootPaneUI +javax/swing/plaf/basic/BasicRootPaneUI +javax/swing/plaf/RootPaneUI +javax/swing/plaf/basic/BasicRootPaneUI$RootPaneInputMap +javax/swing/plaf/ComponentInputMapUIResource +javax/swing/ComponentInputMap +javax/swing/InputMap +javax/swing/plaf/InputMapUIResource +javax/swing/KeyStroke +java/awt/VKCollection +sun/reflect/UnsafeQualifiedStaticIntegerFieldAccessorImpl +javax/swing/plaf/basic/LazyActionMap +javax/swing/plaf/ActionMapUIResource +javax/swing/ActionMap +javax/swing/LayoutFocusTraversalPolicy +javax/swing/SortingFocusTraversalPolicy +javax/swing/InternalFrameFocusTraversalPolicy +javax/swing/SwingContainerOrderFocusTraversalPolicy +javax/swing/SwingDefaultFocusTraversalPolicy +javax/swing/LayoutComparator +javax/swing/plaf/metal/MetalLabelUI +javax/swing/plaf/basic/BasicLabelUI +javax/swing/plaf/LabelUI +javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate$1 +javax/swing/plaf/basic/BasicHTML +javax/swing/SystemEventQueueUtilities +javax/swing/SystemEventQueueUtilities$SystemEventQueue +sun/awt/NullComponentPeer +java/awt/event/WindowEvent +java/awt/EventQueue$1 +java/awt/EventDispatchThread$1 +java/awt/Conditional +java/awt/EventDispatchThread$HierarchyEventFilter +java/awt/EventFilter$FilterAction +sun/awt/dnd/SunDropTargetEvent +java/awt/event/ActionEvent +java/util/jar/Manifest +java/io/ByteArrayInputStream +java/util/jar/Attributes +java/util/jar/Manifest$FastInputStream +java/util/jar/Attributes$Name +sun/misc/ASCIICaseInsensitiveComparator +java/util/jar/JarVerifier +java/io/ByteArrayOutputStream +sun/misc/ExtensionDependency +java/lang/Package +sun/security/util/ManifestEntryVerifier +sun/security/provider/Sun +java/security/Provider +java/security/Provider$ServiceKey +java/security/Provider$EngineDescription +sun/security/provider/Sun$1 +java/security/Security +java/security/Security$1 +sun/misc/FloatingDecimal +sun/misc/FloatingDecimal$1 +sun/security/provider/NativePRNG +java/security/SecureRandomSpi +sun/security/provider/NativePRNG$1 +sun/security/provider/NativePRNG$RandomIO +sun/misc/BASE64Decoder +sun/misc/CharacterDecoder +sun/security/util/SignatureFileVerifier +java/awt/event/KeyAdapter +java/lang/NumberFormatException +java/lang/IllegalArgumentException +java/io/FileWriter +java/net/Authenticator +java/net/MalformedURLException +javax/swing/text/Element +javax/swing/text/Document +javax/swing/text/PlainDocument +javax/swing/text/AbstractDocument +javax/swing/text/GapContent +javax/swing/text/AbstractDocument$Content +javax/swing/text/GapVector +javax/swing/text/GapContent$MarkVector +javax/swing/text/GapContent$MarkData +javax/swing/text/StyleContext +javax/swing/text/AbstractDocument$AttributeContext +javax/swing/text/StyleConstants +javax/swing/text/StyleConstants$CharacterConstants +javax/swing/text/AttributeSet$CharacterAttribute +javax/swing/text/StyleConstants$FontConstants +javax/swing/text/AttributeSet$FontAttribute +javax/swing/text/StyleConstants$ColorConstants +javax/swing/text/AttributeSet$ColorAttribute +javax/swing/text/StyleConstants$ParagraphConstants +javax/swing/text/AttributeSet$ParagraphAttribute +javax/swing/text/StyleContext$FontKey +javax/swing/text/SimpleAttributeSet +javax/swing/text/MutableAttributeSet +javax/swing/text/AttributeSet +javax/swing/text/SimpleAttributeSet$EmptyAttributeSet +javax/swing/text/StyleContext$NamedStyle +javax/swing/text/Style +javax/swing/text/SimpleAttributeSet$1 +javax/swing/text/StyleContext$SmallAttributeSet +javax/swing/text/AbstractDocument$BidiRootElement +javax/swing/text/AbstractDocument$BranchElement +javax/swing/text/AbstractDocument$AbstractElement +javax/swing/tree/TreeNode +javax/swing/text/AbstractDocument$1 +javax/swing/text/AbstractDocument$BidiElement +javax/swing/text/AbstractDocument$LeafElement +javax/swing/text/GapContent$StickyPosition +javax/swing/text/Position +javax/swing/text/StyleContext$KeyEnumeration +javax/swing/text/GapContent$InsertUndo +javax/swing/undo/AbstractUndoableEdit +javax/swing/undo/UndoableEdit +javax/swing/text/AbstractDocument$DefaultDocumentEvent +javax/swing/event/DocumentEvent +javax/swing/undo/CompoundEdit +javax/swing/event/DocumentEvent$EventType +javax/swing/text/Segment +java/text/CharacterIterator +javax/swing/text/Utilities +javax/swing/text/SegmentCache +javax/swing/text/SegmentCache$CachedSegment +javax/swing/event/UndoableEditEvent +javax/swing/text/AbstractDocument$ElementEdit +javax/swing/event/DocumentEvent$ElementChange +java/net/Socket +java/net/InetAddress +java/net/InetAddress$Cache +java/net/InetAddress$Cache$Type +java/net/InetAddressImplFactory +java/net/Inet4AddressImpl +java/net/InetAddressImpl +java/net/InetAddress$1 +sun/net/spi/nameservice/NameService +sun/net/util/IPAddressUtil +java/util/RandomAccessSubList +java/util/SubList +java/util/SubList$1 +java/util/AbstractList$ListItr +java/net/Inet4Address +java/net/InetSocketAddress +java/net/SocketAddress +java/net/SocksSocketImpl +java/net/SocksConsts +java/net/PlainSocketImpl +java/net/SocketImpl +java/net/SocketOptions +java/net/SocketException +java/net/SocksSocketImpl$5 +java/net/ProxySelector +sun/net/spi/DefaultProxySelector +sun/net/spi/DefaultProxySelector$1 +sun/net/NetProperties +sun/net/NetProperties$1 +sun/net/spi/DefaultProxySelector$NonProxyInfo +java/net/Inet6Address +java/net/URI +java/net/URI$Parser +java/net/Proxy +java/net/Proxy$Type +java/net/ConnectException +javax/swing/JMenu +javax/swing/MenuElement +javax/swing/JMenuItem +javax/swing/AbstractButton +java/awt/ItemSelectable +javax/swing/event/MenuListener +javax/swing/JCheckBoxMenuItem +javax/swing/Icon +javax/swing/JButton +java/awt/event/WindowListener +java/net/URLClassLoader$2 +javax/swing/ImageIcon +javax/swing/ImageIcon$1 +java/awt/MediaTracker +sun/misc/SoftCache$ValueCell +sun/awt/image/URLImageSource +sun/awt/image/InputStreamImageSource +sun/awt/image/ImageFetchable +sun/awt/image/ToolkitImage +java/awt/Image$1 +sun/awt/image/SurfaceManager$ImageAccessor +sun/awt/image/SurfaceManager +sun/awt/image/NativeLibLoader +java/awt/ImageMediaEntry +java/awt/MediaEntry +sun/awt/image/ImageRepresentation +java/awt/image/ImageConsumer +sun/awt/image/ImageWatched +sun/awt/image/ImageWatched$Link +sun/awt/image/ImageWatched$WeakLink +sun/awt/image/ImageConsumerQueue +sun/awt/image/ImageFetcher +sun/awt/image/FetcherInfo +sun/awt/image/ImageFetcher$1 +sun/awt/image/GifImageDecoder +sun/awt/image/ImageDecoder +sun/awt/image/GifFrame +java/awt/image/Raster +java/awt/image/DataBufferByte +java/awt/image/DataBuffer +java/awt/image/PixelInterleavedSampleModel +java/awt/image/ComponentSampleModel +java/awt/image/SampleModel +sun/awt/image/ByteInterleavedRaster +sun/awt/image/ByteComponentRaster +sun/awt/image/SunWritableRaster +java/awt/image/WritableRaster +java/awt/image/BufferedImage +java/awt/image/WritableRenderedImage +java/awt/image/RenderedImage +sun/awt/image/IntegerComponentRaster +sun/awt/image/BytePackedRaster +java/awt/Canvas +sun/font/FontDesignMetrics +sun/font/FontStrikeDesc +sun/font/CompositeStrike +sun/font/FontStrikeDisposer +sun/font/StrikeCache$SoftDisposerRef +sun/font/StrikeCache$DisposableStrike +sun/font/TrueTypeFont$TTDisposerRecord +sun/font/TrueTypeFont$1 +java/io/RandomAccessFile +java/nio/ByteBufferAsIntBufferB +java/nio/IntBuffer +sun/font/TrueTypeFont$DirectoryEntry +java/nio/ByteBufferAsShortBufferB +java/nio/ShortBuffer +sun/nio/cs/UTF_16 +sun/nio/cs/UTF_16$Decoder +sun/nio/cs/UnicodeDecoder +sun/font/FileFontStrike +sun/font/FileFont$FileFontDisposer +sun/font/TrueTypeGlyphMapper +sun/font/CMap +sun/font/CMap$NullCMapClass +sun/font/CMap$CMapFormat4 +java/nio/ByteBufferAsCharBufferB +sun/font/FontDesignMetrics$KeyReference +sun/awt/image/PNGImageDecoder +sun/awt/image/PNGFilterInputStream +java/util/zip/InflaterInputStream +java/util/zip/Inflater +sun/awt/EventQueueItem +sun/awt/SunToolkit$3 +sun/awt/X11/XExposeEvent +sun/awt/X11/ComponentAccessor +sun/awt/X11/ComponentAccessor$1 +sun/reflect/UnsafeBooleanFieldAccessorImpl +sun/awt/event/IgnorePaintEvent +java/awt/image/DataBufferInt +java/awt/image/SinglePixelPackedSampleModel +sun/awt/image/IntegerInterleavedRaster +sun/java2d/x11/X11RemoteOffScreenImage +sun/awt/image/RemoteOffScreenImage +sun/awt/image/OffScreenImage +sun/java2d/x11/X11RemoteOffScreenImage$X11RemoteSurfaceManager +sun/awt/image/OffScreenSurfaceManager +sun/awt/image/CachingSurfaceManager +sun/awt/image/RasterListener +sun/awt/image/BufImgSurfaceData +sun/java2d/opengl/GLXGraphicsConfig +sun/java2d/opengl/OGLGraphicsConfig +sun/java2d/x11/X11SurfaceData$X11PixmapSurfaceData +sun/awt/image/WritableRasterNative +sun/awt/image/DataBufferNative +sun/java2d/SurfaceManagerFactory +sun/java2d/x11/X11CachingSurfaceManager +sun/java2d/opengl/GLXSurfaceData +sun/java2d/opengl/OGLSurfaceData +sun/font/CompositeGlyphMapper +sun/java2d/loops/FontInfo +java/util/Date +sun/util/calendar/CalendarSystem +sun/util/calendar/Gregorian +sun/util/calendar/BaseCalendar +sun/util/calendar/AbstractCalendar +java/util/TimeZone +java/lang/InheritableThreadLocal +sun/util/calendar/ZoneInfo +sun/util/calendar/ZoneInfoFile +sun/util/calendar/ZoneInfoFile$1 +java/util/TimeZone$1 +sun/util/calendar/Gregorian$Date +sun/util/calendar/BaseCalendar$Date +sun/util/calendar/CalendarDate +sun/util/calendar/CalendarUtils +java/util/TimeZone$DisplayNames +sun/util/TimeZoneNameUtility +sun/util/resources/TimeZoneNames +sun/util/resources/TimeZoneNamesBundle +sun/util/resources/TimeZoneNames_en +java/util/spi/TimeZoneNameProvider +java/lang/ProcessBuilder +java/lang/ProcessImpl +java/lang/UNIXProcess +java/lang/Process +java/lang/UNIXProcess$Gate +java/lang/UNIXProcess$1 +java/lang/UNIXProcess$1$1 +java/lang/UNIXProcess$1$1$1 +java/net/ServerSocket +java/util/Random +java/util/concurrent/atomic/AtomicLong +java/lang/InternalError +java/io/StringReader +java/lang/SecurityException +java/io/FilterReader +java/lang/reflect/Proxy +java/lang/reflect/InvocationHandler +java/lang/NoSuchFieldException +java/lang/InstantiationException +java/lang/ArrayIndexOutOfBoundsException +java/lang/IndexOutOfBoundsException +javax/swing/JDialog +sun/awt/X11/XClipboard +sun/awt/datatransfer/SunClipboard +java/awt/datatransfer/Clipboard +java/awt/datatransfer/SystemFlavorMap +java/awt/datatransfer/FlavorMap +java/awt/datatransfer/FlavorTable +java/awt/datatransfer/SystemFlavorMap$1 +sun/net/ProgressMonitor +sun/net/DefaultProgressMeteringPolicy +sun/net/ProgressMeteringPolicy +java/awt/datatransfer/SystemFlavorMap$2 +java/awt/datatransfer/MimeType +java/io/Externalizable +java/awt/datatransfer/MimeTypeParameterList +sun/awt/datatransfer/DataTransferer +java/util/Collections$SynchronizedSet +java/util/Collections$SynchronizedCollection +java/awt/datatransfer/DataFlavor +java/awt/datatransfer/DataFlavor$1 +sun/awt/datatransfer/DataTransferer$CharsetComparator +sun/awt/datatransfer/DataTransferer$IndexedComparator +sun/nio/cs/UTF_16LE +sun/nio/cs/UTF_16BE +sun/awt/datatransfer/DataTransferer$DataFlavorComparator +java/rmi/Remote +sun/awt/datatransfer/DataTransferer$1 +sun/awt/X11/XDataTransferer +sun/awt/datatransfer/ToolkitThreadBlockedHandler +javax/imageio/ImageTypeSpecifier +sun/awt/X11/XSelection +sun/security/action/GetIntegerAction +sun/awt/X11/XSelection$IncrementalTransferHandler +sun/awt/X11/XSelection$SelectionEventHandler +java/awt/datatransfer/Transferable +java/io/EOFException +java/util/Vector$1 +java/util/zip/ZipFile$1 +java/util/zip/ZipFile$2 +java/util/jar/JarFile$1 +java/util/PropertyResourceBundle +java/util/ResourceBundle$Control$1 +java/util/Hashtable$EntrySet +java/lang/IllegalAccessError +java/text/MessageFormat +java/text/MessageFormat$Field +java/text/Format$Field +java/lang/CloneNotSupportedException +sun/reflect/MethodAccessorGenerator +sun/reflect/AccessorGenerator +sun/reflect/ClassFileConstants +java/lang/Void +sun/reflect/ByteVectorFactory +sun/reflect/ByteVectorImpl +sun/reflect/ByteVector +sun/reflect/ClassFileAssembler +sun/reflect/UTF8 +sun/reflect/Label +sun/reflect/Label$PatchInfo +sun/reflect/MethodAccessorGenerator$1 +sun/reflect/ClassDefiner +sun/reflect/ClassDefiner$1 +sun/reflect/BootstrapConstructorAccessorImpl +java/awt/event/ActionListener +javax/swing/Timer +javax/swing/Timer$DoPostEvent +javax/swing/TimerQueue +javax/swing/TimerQueue$1 +javax/swing/ToolTipManager +java/awt/event/MouseAdapter +javax/swing/ToolTipManager$insideTimerAction +javax/swing/ToolTipManager$outsideTimerAction +javax/swing/ToolTipManager$stillInsideTimerAction +javax/swing/ToolTipManager$Actions +sun/swing/UIAction +javax/swing/Action +javax/swing/ToolTipManager$MoveBeforeEnterListener +java/awt/event/MouseMotionAdapter +java/util/Hashtable$ValueCollection +javax/swing/event/CaretListener +javax/swing/JToolBar +javax/swing/JSplitPane +javax/swing/border/Border +javax/swing/JToggleButton +javax/swing/border/EmptyBorder +javax/swing/border/AbstractBorder +javax/swing/DefaultButtonModel +javax/swing/ButtonModel +javax/swing/AbstractButton$Handler +javax/swing/event/ChangeListener +java/awt/event/ItemListener +javax/swing/plaf/metal/MetalButtonUI +javax/swing/plaf/basic/BasicButtonUI +javax/swing/plaf/ButtonUI +javax/swing/plaf/metal/MetalBorders +javax/swing/plaf/BorderUIResource$CompoundBorderUIResource +javax/swing/border/CompoundBorder +javax/swing/plaf/metal/MetalBorders$ButtonBorder +javax/swing/plaf/basic/BasicBorders$MarginBorder +javax/swing/plaf/basic/BasicButtonListener +java/awt/AWTEventMulticaster +java/awt/event/WindowFocusListener +java/awt/event/WindowStateListener +java/awt/event/AdjustmentListener +java/awt/event/TextListener +javax/swing/event/AncestorListener +java/beans/VetoableChangeListener +javax/swing/ButtonGroup +javax/swing/JToggleButton$ToggleButtonModel +javax/swing/plaf/metal/MetalToggleButtonUI +javax/swing/plaf/basic/BasicToggleButtonUI +javax/swing/plaf/metal/MetalBorders$ToggleButtonBorder +java/awt/CardLayout +javax/swing/Box +javax/swing/plaf/metal/MetalBorders$TextFieldBorder +javax/swing/plaf/metal/MetalBorders$Flush3DBorder +javax/swing/BoxLayout +javax/swing/JMenuBar +javax/swing/DefaultSingleSelectionModel +javax/swing/SingleSelectionModel +javax/swing/plaf/basic/BasicMenuBarUI +javax/swing/plaf/MenuBarUI +javax/swing/plaf/basic/DefaultMenuLayout +javax/swing/plaf/metal/MetalBorders$MenuBarBorder +javax/swing/plaf/basic/BasicMenuBarUI$Handler +javax/swing/KeyboardManager +javax/swing/event/MenuEvent +javax/swing/JMenu$MenuChangeListener +javax/swing/JMenuItem$MenuItemFocusListener +javax/swing/plaf/basic/BasicMenuUI +javax/swing/plaf/basic/BasicMenuItemUI +javax/swing/plaf/MenuItemUI +javax/swing/plaf/metal/MetalBorders$MenuItemBorder +javax/swing/plaf/metal/MetalIconFactory +javax/swing/plaf/metal/MetalIconFactory$MenuArrowIcon +javax/swing/plaf/basic/BasicMenuUI$Handler +javax/swing/event/MenuKeyListener +javax/swing/plaf/basic/BasicMenuItemUI$Handler +javax/swing/event/MenuDragMouseListener +javax/swing/event/MouseInputListener +javax/swing/event/ChangeEvent +java/awt/event/ContainerEvent +javax/swing/plaf/metal/MetalIconFactory$MenuItemArrowIcon +javax/swing/JPopupMenu +javax/swing/plaf/basic/BasicPopupMenuUI +javax/swing/plaf/PopupMenuUI +javax/swing/plaf/basic/BasicLookAndFeel$AWTEventHelper +java/awt/event/AWTEventListenerProxy +java/awt/Toolkit$SelectiveAWTEventListener +java/awt/Toolkit$ToolkitEventMulticaster +javax/swing/plaf/basic/BasicLookAndFeel$1 +javax/swing/plaf/metal/MetalBorders$PopupMenuBorder +javax/swing/plaf/basic/BasicPopupMenuUI$BasicPopupMenuListener +javax/swing/event/PopupMenuListener +javax/swing/plaf/basic/BasicPopupMenuUI$BasicMenuKeyListener +javax/swing/plaf/basic/BasicPopupMenuUI$MouseGrabber +javax/swing/MenuSelectionManager +javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper +javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper$1 +java/awt/event/FocusAdapter +javax/swing/JMenu$WinListener +java/awt/event/WindowAdapter +javax/swing/JPopupMenu$Separator +javax/swing/JSeparator +javax/swing/plaf/metal/MetalPopupMenuSeparatorUI +javax/swing/plaf/metal/MetalSeparatorUI +javax/swing/plaf/basic/BasicSeparatorUI +javax/swing/plaf/SeparatorUI +javax/swing/JComboBox +javax/swing/event/ListDataListener +javax/swing/event/CaretEvent +javax/swing/text/TabExpander +javax/swing/JScrollBar +java/awt/Adjustable +javax/swing/event/MouseInputAdapter +javax/swing/JScrollBar$ModelListener +javax/swing/DefaultBoundedRangeModel +javax/swing/BoundedRangeModel +javax/swing/plaf/metal/MetalScrollBarUI +javax/swing/plaf/basic/BasicScrollBarUI +javax/swing/plaf/ScrollBarUI +javax/swing/plaf/metal/MetalBumps +javax/swing/plaf/metal/MetalScrollButton +javax/swing/plaf/basic/BasicArrowButton +javax/swing/plaf/basic/BasicScrollBarUI$TrackListener +javax/swing/plaf/basic/BasicScrollBarUI$ArrowButtonListener +javax/swing/plaf/basic/BasicScrollBarUI$ModelListener +javax/swing/plaf/metal/MetalScrollBarUI$ScrollBarListener +javax/swing/plaf/basic/BasicScrollBarUI$PropertyChangeHandler +javax/swing/plaf/basic/BasicScrollBarUI$Handler +javax/swing/plaf/basic/BasicScrollBarUI$ScrollListener +javax/swing/CellRendererPane +java/util/HashMap$EntryIterator +javax/swing/border/MatteBorder +sun/font/StandardGlyphVector +java/awt/font/GlyphVector +sun/font/StandardGlyphVector$GlyphStrike +sun/font/CoreMetrics +sun/font/FontLineMetrics +java/awt/font/LineMetrics +javax/swing/ComboBoxModel +javax/swing/ListModel +javax/swing/ListCellRenderer +javax/swing/DefaultComboBoxModel +javax/swing/MutableComboBoxModel +javax/swing/AbstractListModel +javax/swing/JComboBox$1 +javax/swing/AncestorNotifier +javax/swing/plaf/metal/MetalComboBoxUI +javax/swing/plaf/basic/BasicComboBoxUI +javax/swing/plaf/ComboBoxUI +javax/swing/plaf/metal/MetalComboBoxUI$MetalComboBoxLayoutManager +javax/swing/plaf/basic/BasicComboBoxUI$ComboBoxLayoutManager +javax/swing/plaf/basic/BasicComboPopup +javax/swing/plaf/basic/ComboPopup +javax/swing/plaf/basic/BasicComboPopup$EmptyListModelClass +javax/swing/border/LineBorder +javax/swing/plaf/basic/BasicComboPopup$1 +javax/swing/JList +javax/swing/DropMode +javax/swing/DefaultListSelectionModel +javax/swing/ListSelectionModel +javax/swing/plaf/basic/BasicListUI +javax/swing/plaf/ListUI +javax/swing/plaf/basic/BasicListUI$ListTransferHandler +javax/swing/TransferHandler +javax/swing/TransferHandler$TransferAction +javax/swing/DefaultListCellRenderer$UIResource +javax/swing/DefaultListCellRenderer +javax/swing/TransferHandler$SwingDropTarget +java/awt/dnd/DropTargetContext +javax/swing/TransferHandler$DropHandler +javax/swing/TransferHandler$TransferSupport +javax/swing/plaf/basic/BasicListUI$Handler +javax/swing/event/ListSelectionListener +javax/swing/plaf/basic/DragRecognitionSupport$BeforeDrag +javax/swing/plaf/basic/BasicComboPopup$Handler +javax/swing/JScrollPane +javax/swing/ScrollPaneConstants +javax/swing/ScrollPaneLayout$UIResource +javax/swing/ScrollPaneLayout +javax/swing/JViewport +javax/swing/ViewportLayout +javax/swing/plaf/basic/BasicViewportUI +javax/swing/plaf/ViewportUI +javax/swing/JScrollPane$ScrollBar +javax/swing/JViewport$ViewListener +java/awt/event/ComponentAdapter +javax/swing/plaf/metal/MetalScrollPaneUI +javax/swing/plaf/basic/BasicScrollPaneUI +javax/swing/plaf/ScrollPaneUI +javax/swing/plaf/metal/MetalBorders$ScrollPaneBorder +javax/swing/plaf/basic/BasicScrollPaneUI$Handler +javax/swing/plaf/metal/MetalScrollPaneUI$1 +javax/swing/plaf/basic/BasicComboBoxRenderer$UIResource +javax/swing/plaf/basic/BasicComboBoxRenderer +javax/swing/plaf/metal/MetalComboBoxEditor$UIResource +javax/swing/plaf/metal/MetalComboBoxEditor +javax/swing/plaf/basic/BasicComboBoxEditor +javax/swing/ComboBoxEditor +javax/swing/plaf/basic/BasicComboBoxEditor$BorderlessTextField +javax/swing/JTextField$NotifyAction +javax/swing/text/TextAction +javax/swing/AbstractAction +javax/swing/text/JTextComponent$MutableCaretEvent +javax/swing/plaf/metal/MetalTextFieldUI +javax/swing/plaf/basic/BasicTextFieldUI +javax/swing/plaf/basic/BasicTextUI +javax/swing/text/ViewFactory +javax/swing/plaf/TextUI +javax/swing/plaf/basic/BasicTextUI$BasicCursor +javax/swing/text/DefaultEditorKit +javax/swing/text/EditorKit +javax/swing/text/DefaultEditorKit$InsertContentAction +javax/swing/text/DefaultEditorKit$DeletePrevCharAction +javax/swing/text/DefaultEditorKit$DeleteNextCharAction +javax/swing/text/DefaultEditorKit$ReadOnlyAction +javax/swing/text/DefaultEditorKit$DeleteWordAction +javax/swing/text/DefaultEditorKit$WritableAction +javax/swing/text/DefaultEditorKit$CutAction +javax/swing/text/DefaultEditorKit$CopyAction +javax/swing/text/DefaultEditorKit$PasteAction +javax/swing/text/DefaultEditorKit$VerticalPageAction +javax/swing/text/DefaultEditorKit$PageAction +javax/swing/text/DefaultEditorKit$InsertBreakAction +javax/swing/text/DefaultEditorKit$BeepAction +javax/swing/text/DefaultEditorKit$NextVisualPositionAction +javax/swing/text/DefaultEditorKit$BeginWordAction +javax/swing/text/DefaultEditorKit$EndWordAction +javax/swing/text/DefaultEditorKit$PreviousWordAction +javax/swing/text/DefaultEditorKit$NextWordAction +javax/swing/text/DefaultEditorKit$BeginLineAction +javax/swing/text/DefaultEditorKit$EndLineAction +javax/swing/text/DefaultEditorKit$BeginParagraphAction +javax/swing/text/DefaultEditorKit$EndParagraphAction +javax/swing/text/DefaultEditorKit$BeginAction +javax/swing/text/DefaultEditorKit$EndAction +javax/swing/text/DefaultEditorKit$DefaultKeyTypedAction +javax/swing/text/DefaultEditorKit$InsertTabAction +javax/swing/text/DefaultEditorKit$SelectWordAction +javax/swing/text/DefaultEditorKit$SelectLineAction +javax/swing/text/DefaultEditorKit$SelectParagraphAction +javax/swing/text/DefaultEditorKit$SelectAllAction +javax/swing/text/DefaultEditorKit$UnselectAction +javax/swing/text/DefaultEditorKit$ToggleComponentOrientationAction +javax/swing/text/DefaultEditorKit$DumpModelAction +javax/swing/plaf/basic/BasicTextUI$TextTransferHandler +javax/swing/text/Position$Bias +javax/swing/plaf/basic/BasicTextUI$RootView +javax/swing/text/View +javax/swing/plaf/basic/BasicTextUI$UpdateHandler +javax/swing/event/DocumentListener +javax/swing/plaf/basic/BasicTextUI$DragListener +javax/swing/plaf/basic/BasicComboBoxEditor$UIResource +javax/swing/plaf/basic/BasicTextUI$BasicCaret +javax/swing/text/DefaultCaret +javax/swing/text/Caret +javax/swing/text/DefaultCaret$Handler +java/awt/datatransfer/ClipboardOwner +javax/swing/plaf/basic/BasicTextUI$BasicHighlighter +javax/swing/text/DefaultHighlighter +javax/swing/text/LayeredHighlighter +javax/swing/text/Highlighter +javax/swing/text/Highlighter$Highlight +javax/swing/text/DefaultHighlighter$DefaultHighlightPainter +javax/swing/text/LayeredHighlighter$LayerPainter +javax/swing/text/Highlighter$HighlightPainter +javax/swing/text/DefaultHighlighter$SafeDamager +javax/swing/text/FieldView +javax/swing/text/PlainView +javax/swing/text/JTextComponent$DefaultKeymap +javax/swing/text/Keymap +javax/swing/text/JTextComponent$KeymapWrapper +javax/swing/text/JTextComponent$KeymapActionMap +javax/swing/plaf/basic/BasicTextUI$FocusAction +javax/swing/plaf/basic/BasicTextUI$TextActionWrapper +javax/swing/JTextArea +javax/swing/JEditorPane +javax/swing/JTextField$ScrollRepainter +javax/swing/plaf/metal/MetalComboBoxEditor$1 +javax/swing/plaf/metal/MetalComboBoxEditor$EditorBorder +javax/swing/plaf/metal/MetalComboBoxUI$MetalPropertyChangeListener +javax/swing/plaf/basic/BasicComboBoxUI$PropertyChangeHandler +javax/swing/plaf/basic/BasicComboBoxUI$Handler +javax/swing/plaf/metal/MetalComboBoxButton +javax/swing/plaf/metal/MetalComboBoxIcon +javax/swing/plaf/metal/MetalComboBoxButton$1 +javax/swing/plaf/basic/BasicComboBoxUI$DefaultKeySelectionManager +javax/swing/JComboBox$KeySelectionManager +javax/swing/JToolBar$DefaultToolBarLayout +javax/swing/plaf/metal/MetalToolBarUI +javax/swing/plaf/basic/BasicToolBarUI +javax/swing/plaf/ToolBarUI +javax/swing/plaf/metal/MetalBorders$ToolBarBorder +javax/swing/plaf/metal/MetalLookAndFeel$MetalLazyValue$1 +javax/swing/plaf/metal/MetalBorders$RolloverButtonBorder +javax/swing/plaf/metal/MetalBorders$RolloverMarginBorder +javax/swing/plaf/basic/BasicBorders$RadioButtonBorder +javax/swing/plaf/basic/BasicBorders$ButtonBorder +javax/swing/plaf/basic/BasicBorders$RolloverMarginBorder +javax/swing/plaf/metal/MetalToolBarUI$MetalDockingListener +javax/swing/plaf/basic/BasicToolBarUI$DockingListener +javax/swing/plaf/basic/BasicToolBarUI$Handler +javax/swing/border/EtchedBorder +javax/swing/JToolBar$Separator +javax/swing/plaf/basic/BasicToolBarSeparatorUI +sun/awt/color/CMM +java/applet/Applet +java/awt/Panel +com/sun/awt/AWTUtilities +javax/swing/KeyboardManager$ComponentKeyStrokePair +sun/awt/EmbeddedFrame +sun/awt/im/InputMethodContext +java/awt/im/spi/InputMethodContext +sun/awt/im/InputContext +sun/awt/im/InputMethodManager +sun/awt/im/ExecutableInputMethodManager +sun/awt/X11/XInputMethodDescriptor +sun/awt/X11InputMethodDescriptor +java/awt/im/spi/InputMethodDescriptor +sun/awt/im/InputMethodLocator +sun/awt/im/ExecutableInputMethodManager$2 +sun/misc/Service +sun/misc/Service$LazyIterator +java/util/TreeSet +java/util/NavigableSet +java/util/SortedSet +javax/swing/SizeRequirements +javax/swing/plaf/basic/BasicGraphicsUtils +java/awt/event/AdjustmentEvent +java/awt/MenuBar +sun/awt/X11/XComponentPeer$2 +java/awt/SequencedEvent +java/beans/PropertyVetoException +java/awt/DefaultKeyboardFocusManager$TypeAheadMarker +java/awt/KeyboardFocusManager$HeavyweightFocusRequest +java/awt/KeyboardFocusManager$LightweightFocusRequest +sun/awt/KeyboardFocusManagerPeerImpl +sun/awt/SunToolkit$7 +java/awt/Window$1DisposeAction +java/awt/LightweightDispatcher$2 +sun/awt/X11/XReparentEvent +sun/awt/X11/XWindowAttributes +javax/swing/SystemEventQueueUtilities$ComponentWorkRequest +sun/awt/X11/XFocusChangeEvent +sun/awt/X11/XComponentPeer$1 +sun/awt/X11/XUnmapEvent +java/io/StringWriter +javax/swing/JWindow +java/io/UnsupportedEncodingException +java/net/UnknownHostException +java/nio/channels/SocketChannel +java/nio/channels/spi/AbstractSelectableChannel +java/nio/channels/SelectableChannel +java/net/SocketImplFactory +javax/swing/UnsupportedLookAndFeelException +java/lang/UnsatisfiedLinkError +javax/swing/Box$Filler +javax/swing/JComponent$2 +sun/net/www/MimeTable +java/net/FileNameMap +sun/net/www/MimeTable$1 +sun/net/www/MimeTable$2 +sun/net/www/MimeEntry +java/net/URLConnection$1 +java/text/SimpleDateFormat +java/text/DateFormat +java/text/DateFormat$Field +java/util/Calendar +java/util/GregorianCalendar +sun/util/resources/CalendarData +sun/util/resources/CalendarData_en +java/text/DateFormatSymbols +java/text/spi/DateFormatSymbolsProvider +java/text/DontCareFieldPosition +java/text/DontCareFieldPosition$1 +java/text/Format$FieldDelegate +javax/swing/plaf/BorderUIResource +javax/swing/BorderFactory +javax/swing/border/BevelBorder +javax/swing/plaf/metal/MetalIconFactory$TreeFolderIcon +javax/swing/plaf/metal/MetalIconFactory$FolderIcon16 +java/util/zip/ZipInputStream +java/io/PushbackInputStream +java/util/zip/CRC32 +java/util/zip/Checksum +java/lang/Thread$State +javax/swing/SwingUtilities$SharedOwnerFrame +javax/swing/JTable +javax/swing/event/TableModelListener +javax/swing/event/TableColumnModelListener +javax/swing/event/CellEditorListener +javax/swing/event/RowSorterListener +javax/swing/BufferStrategyPaintManager$BufferInfo +java/awt/Component$BltSubRegionBufferStrategy +sun/awt/SubRegionShowable +java/awt/Component$BltBufferStrategy +sun/awt/image/SunVolatileImage +sun/awt/image/BufferedImageGraphicsConfig +sun/print/PrinterGraphicsConfig +sun/java2d/x11/X11VolatileSurfaceManager +sun/awt/image/VolatileSurfaceManager +java/awt/print/PrinterGraphics +java/awt/PrintGraphics +java/awt/GraphicsCallback$PaintCallback +java/awt/GraphicsCallback +sun/awt/SunGraphicsCallback +javax/swing/JRadioButton +java/lang/ClassFormatError +javax/swing/JTabbedPane +javax/swing/JTabbedPane$ModelListener +javax/swing/plaf/metal/MetalTabbedPaneUI +javax/swing/plaf/basic/BasicTabbedPaneUI +javax/swing/plaf/TabbedPaneUI +javax/swing/plaf/metal/MetalTabbedPaneUI$TabbedPaneLayout +javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneLayout +javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneScrollLayout +javax/swing/plaf/basic/BasicTabbedPaneUI$Handler +sun/swing/ImageIconUIResource +javax/swing/GrayFilter +java/awt/image/RGBImageFilter +java/awt/image/ImageFilter +java/awt/image/FilteredImageSource +org/w3c/dom/Node +org/xml/sax/SAXException +javax/xml/parsers/ParserConfigurationException +org/xml/sax/EntityResolver +java/security/NoSuchAlgorithmException +java/security/GeneralSecurityException +java/util/zip/GZIPInputStream +java/util/zip/DeflaterOutputStream +org/xml/sax/InputSource +javax/xml/parsers/DocumentBuilderFactory +javax/xml/parsers/FactoryFinder +javax/xml/parsers/SecuritySupport +javax/xml/parsers/SecuritySupport$2 +javax/xml/parsers/SecuritySupport$5 +javax/xml/parsers/SecuritySupport$1 +javax/xml/parsers/SecuritySupport$4 +javax/xml/parsers/DocumentBuilder +org/w3c/dom/Document +org/xml/sax/helpers/DefaultHandler +org/xml/sax/DTDHandler +org/xml/sax/ContentHandler +org/xml/sax/ErrorHandler +org/xml/sax/SAXNotSupportedException +org/xml/sax/Locator +org/xml/sax/SAXNotRecognizedException +org/xml/sax/SAXParseException +org/w3c/dom/NodeList +org/w3c/dom/events/EventTarget +org/w3c/dom/traversal/DocumentTraversal +org/w3c/dom/events/DocumentEvent +org/w3c/dom/ranges/DocumentRange +org/w3c/dom/Entity +org/w3c/dom/Element +org/w3c/dom/CharacterData +org/w3c/dom/CDATASection +org/w3c/dom/Text +org/xml/sax/AttributeList +org/w3c/dom/DOMException +org/w3c/dom/Notation +org/w3c/dom/DocumentType +org/w3c/dom/Attr +org/w3c/dom/EntityReference +org/w3c/dom/ProcessingInstruction +org/w3c/dom/Comment +org/w3c/dom/DocumentFragment +org/w3c/dom/events/Event +org/w3c/dom/events/MutationEvent +org/w3c/dom/traversal/TreeWalker +org/w3c/dom/ranges/Range +org/w3c/dom/traversal/NodeIterator +org/w3c/dom/events/EventException +org/w3c/dom/NamedNodeMap +java/lang/StringIndexOutOfBoundsException +java/awt/GridLayout +javax/swing/plaf/metal/MetalRadioButtonUI +javax/swing/plaf/basic/BasicRadioButtonUI +javax/swing/plaf/basic/BasicBorders +javax/swing/plaf/metal/MetalIconFactory$RadioButtonIcon +java/awt/event/ItemEvent +java/awt/CardLayout$Card +javax/swing/JCheckBox +javax/swing/event/ListSelectionEvent +javax/swing/plaf/metal/MetalCheckBoxUI +javax/swing/plaf/metal/MetalIconFactory$CheckBoxIcon +java/lang/ExceptionInInitializerError +com/sun/java/swing/plaf/windows/WindowsTabbedPaneUI +javax/swing/JProgressBar +javax/swing/JProgressBar$ModelListener +javax/swing/plaf/metal/MetalProgressBarUI +javax/swing/plaf/basic/BasicProgressBarUI +javax/swing/plaf/ProgressBarUI +javax/swing/plaf/BorderUIResource$LineBorderUIResource +javax/swing/plaf/basic/BasicProgressBarUI$Handler +javax/swing/tree/TreeModel +javax/swing/table/TableCellRenderer +javax/swing/table/JTableHeader +javax/swing/event/TreeExpansionListener +javax/swing/table/AbstractTableModel +javax/swing/table/TableModel +javax/swing/table/DefaultTableCellRenderer +javax/swing/JTree +javax/swing/tree/TreeSelectionModel +javax/swing/tree/DefaultTreeCellRenderer +javax/swing/tree/TreeCellRenderer +javax/swing/table/TableCellEditor +javax/swing/CellEditor +javax/swing/JToolTip +javax/swing/table/TableColumn +javax/swing/table/DefaultTableColumnModel +javax/swing/table/TableColumnModel +javax/swing/table/DefaultTableModel +javax/swing/event/TableModelEvent +sun/swing/table/DefaultTableCellHeaderRenderer +javax/swing/plaf/basic/BasicTableHeaderUI +javax/swing/plaf/TableHeaderUI +javax/swing/plaf/basic/BasicTableHeaderUI$1 +javax/swing/plaf/basic/BasicTableHeaderUI$MouseInputHandler +javax/swing/DefaultCellEditor +javax/swing/tree/TreeCellEditor +javax/swing/AbstractCellEditor +javax/swing/plaf/basic/BasicTableUI +javax/swing/plaf/TableUI +javax/swing/plaf/basic/BasicTableUI$TableTransferHandler +javax/swing/plaf/basic/BasicTableUI$Handler +javax/swing/tree/DefaultTreeSelectionModel +javax/swing/tree/TreePath +javax/swing/plaf/metal/MetalTreeUI +javax/swing/plaf/basic/BasicTreeUI +javax/swing/plaf/TreeUI +javax/swing/plaf/basic/BasicTreeUI$Actions +javax/swing/plaf/basic/BasicTreeUI$TreeTransferHandler +javax/swing/plaf/metal/MetalTreeUI$LineListener +javax/swing/plaf/basic/BasicTreeUI$Handler +javax/swing/event/TreeModelListener +javax/swing/event/TreeSelectionListener +javax/swing/event/SwingPropertyChangeSupport +javax/swing/tree/VariableHeightLayoutCache +javax/swing/tree/AbstractLayoutCache +javax/swing/tree/RowMapper +javax/swing/plaf/basic/BasicTreeUI$NodeDimensionsHandler +javax/swing/tree/AbstractLayoutCache$NodeDimensions +javax/swing/JTree$TreeModelHandler +javax/swing/tree/VariableHeightLayoutCache$TreeStateNode +javax/swing/tree/DefaultMutableTreeNode +javax/swing/tree/MutableTreeNode +javax/swing/tree/DefaultMutableTreeNode$1 +javax/swing/tree/DefaultMutableTreeNode$PreorderEnumeration +javax/swing/event/TableColumnModelEvent +java/text/ParseException +java/text/NumberFormat$Field +javax/swing/event/UndoableEditListener +javax/swing/filechooser/FileFilter +javax/swing/tree/DefaultTreeModel +javax/swing/tree/DefaultTreeCellEditor +javax/swing/tree/DefaultTreeCellEditor$1 +javax/swing/tree/DefaultTreeCellEditor$DefaultTextField +javax/swing/DefaultCellEditor$1 +javax/swing/DefaultCellEditor$EditorDelegate +javax/swing/tree/DefaultTreeCellEditor$EditorContainer +javax/swing/JTree$TreeSelectionRedirector +javax/swing/event/TreeModelEvent +javax/swing/plaf/metal/MetalSplitPaneUI +javax/swing/plaf/basic/BasicSplitPaneUI +javax/swing/plaf/SplitPaneUI +javax/swing/plaf/basic/BasicSplitPaneDivider +javax/swing/plaf/basic/BasicBorders$SplitPaneBorder +javax/swing/plaf/metal/MetalSplitPaneDivider +javax/swing/plaf/basic/BasicSplitPaneDivider$DividerLayout +javax/swing/plaf/basic/BasicSplitPaneDivider$MouseHandler +javax/swing/plaf/basic/BasicBorders$SplitPaneDividerBorder +javax/swing/plaf/basic/BasicSplitPaneUI$BasicHorizontalLayoutManager +javax/swing/plaf/basic/BasicSplitPaneUI$1 +javax/swing/plaf/basic/BasicSplitPaneUI$Handler +javax/swing/plaf/metal/MetalSplitPaneDivider$1 +javax/swing/plaf/basic/BasicSplitPaneDivider$OneTouchActionHandler +javax/swing/plaf/metal/MetalSplitPaneDivider$2 +javax/swing/border/TitledBorder +javax/swing/plaf/basic/BasicTextAreaUI +java/util/Collections$UnmodifiableCollection$1 +java/io/InterruptedIOException +java/net/NoRouteToHostException +java/net/BindException +javax/swing/tree/PathPlaceHolder +javax/swing/event/TreeSelectionEvent +javax/swing/JList$3 +javax/swing/JList$ListSelectionHandler +javax/swing/JSlider +javax/swing/JSlider$ModelListener +javax/swing/plaf/metal/MetalSliderUI +javax/swing/plaf/basic/BasicSliderUI +javax/swing/plaf/SliderUI +javax/swing/plaf/basic/BasicSliderUI$Actions +javax/swing/plaf/metal/MetalIconFactory$HorizontalSliderThumbIcon +javax/swing/plaf/metal/MetalIconFactory$VerticalSliderThumbIcon +javax/swing/plaf/basic/BasicSliderUI$TrackListener +javax/swing/plaf/basic/BasicSliderUI$Handler +javax/swing/plaf/basic/BasicSliderUI$ScrollListener +javax/swing/plaf/metal/MetalSliderUI$MetalPropertyListener +javax/swing/plaf/basic/BasicSliderUI$PropertyChangeHandler +sun/java2d/HeadlessGraphicsEnvironment +java/util/Hashtable$KeySet +java/awt/FontFormatException +sun/java2d/SunGraphicsEnvironment$2 +sun/font/Type1Font$1 +java/nio/channels/FileChannel$MapMode +sun/nio/ch/FileChannelImpl$Unmapper +sun/nio/ch/Util$3 +java/nio/DirectByteBufferR +java/nio/charset/Charset$3 +sun/nio/cs/ext/ExtendedCharsets +sun/nio/cs/AbstractCharsetProvider +sun/nio/cs/ext/SJIS +sun/nio/cs/ext/SJIS$Decoder +sun/nio/cs/ext/DelegatableDecoder +sun/nio/cs/ext/JIS_X_0208_Decoder +sun/nio/cs/ext/DoubleByteDecoder +sun/nio/cs/ext/JIS_X_0201$Decoder +sun/nio/cs/SingleByteDecoder +java/lang/CharacterData00 +javax/swing/DefaultListModel +javax/swing/event/ListDataEvent +javax/sound/sampled/DataLine +javax/sound/sampled/Line +javax/sound/sampled/Line$Info +javax/sound/sampled/DataLine$Info +javax/sound/sampled/Control$Type +javax/sound/sampled/FloatControl$Type +javax/sound/sampled/LineUnavailableException +javax/sound/sampled/UnsupportedAudioFileException +javax/swing/JRadioButtonMenuItem +javax/swing/JMenuItem$AccessibleJMenuItem +javax/swing/AbstractButton$AccessibleAbstractButton +javax/accessibility/AccessibleAction +javax/accessibility/AccessibleValue +javax/accessibility/AccessibleText +javax/accessibility/AccessibleExtendedComponent +javax/accessibility/AccessibleComponent +javax/swing/JComponent$AccessibleJComponent +java/awt/Container$AccessibleAWTContainer +java/awt/Component$AccessibleAWTComponent +javax/accessibility/AccessibleRelationSet +javax/accessibility/AccessibleState +javax/accessibility/AccessibleBundle +javax/swing/plaf/basic/BasicCheckBoxMenuItemUI +javax/swing/plaf/metal/MetalIconFactory$CheckBoxMenuItemIcon +javax/swing/JCheckBoxMenuItem$AccessibleJCheckBoxMenuItem +javax/swing/plaf/basic/BasicRadioButtonMenuItemUI +javax/swing/plaf/metal/MetalIconFactory$RadioButtonMenuItemIcon +sun/awt/image/ImageDecoder$1 +javax/swing/JTabbedPane$Page +java/net/DatagramSocket +java/net/MulticastSocket +java/net/DatagramPacket +sun/net/InetAddressCachePolicy +sun/net/InetAddressCachePolicy$1 +sun/net/InetAddressCachePolicy$2 +java/net/InetAddress$CacheEntry +java/net/PlainDatagramSocketImpl +java/net/DatagramSocketImpl +java/net/NetworkInterface +java/net/InterfaceAddress +java/text/Collator +java/text/spi/CollatorProvider +sun/text/resources/CollationData +sun/text/resources/CollationData_en +sun/util/EmptyListResourceBundle +java/text/RuleBasedCollator +java/text/CollationRules +java/text/RBCollationTables +java/text/RBTableBuilder +java/text/RBCollationTables$BuildAPI +sun/text/IntHashtable +sun/text/UCompactIntArray +sun/text/normalizer/NormalizerImpl +sun/text/normalizer/ICUData +sun/text/normalizer/NormalizerDataReader +sun/text/normalizer/ICUBinary$Authenticate +sun/text/normalizer/ICUBinary +sun/text/normalizer/NormalizerImpl$FCDTrieImpl +sun/text/normalizer/Trie$DataManipulate +sun/text/normalizer/NormalizerImpl$NormTrieImpl +sun/text/normalizer/NormalizerImpl$AuxTrieImpl +sun/text/normalizer/IntTrie +sun/text/normalizer/Trie +sun/text/normalizer/CharTrie +sun/text/normalizer/CharTrie$FriendAgent +sun/text/normalizer/UnicodeSet +sun/text/normalizer/UnicodeMatcher +sun/text/normalizer/NormalizerImpl$DecomposeArgs +java/text/MergeCollation +java/text/PatternEntry$Parser +java/text/PatternEntry +java/text/EntryPair +sun/text/ComposedCharIter +sun/text/normalizer/UTF16 +sun/net/www/protocol/http/Handler +java/io/ObjectInputStream$BlockDataInputStream +java/io/ObjectInputStream$PeekInputStream +java/io/ObjectInputStream$HandleTable +java/io/ObjectInputStream$ValidationList +java/io/Bits +java/io/ObjectStreamClass$Caches +java/io/ObjectStreamClass$WeakClassKey +java/io/ObjectStreamClass$EntryFuture +java/io/ObjectStreamClass$2 +sun/reflect/SerializationConstructorAccessorImpl +java/io/ObjectStreamClass$FieldReflectorKey +java/io/ObjectStreamClass$FieldReflector +java/io/ObjectStreamClass$1 +java/io/DataOutputStream +java/io/ObjectStreamClass$MemberSignature +java/io/ObjectStreamClass$3 +java/io/ObjectStreamClass$4 +java/io/ObjectStreamClass$5 +java/security/MessageDigest +java/security/MessageDigestSpi +sun/security/jca/GetInstance +sun/security/jca/Providers +sun/security/jca/ProviderList +sun/security/jca/ProviderConfig +sun/security/jca/ProviderList$3 +sun/security/jca/ProviderList$1 +sun/security/jca/ProviderList$2 +sun/security/jca/ProviderConfig$1 +sun/security/jca/ProviderConfig$3 +java/security/Provider$Service +java/security/Provider$UString +sun/security/provider/SHA +sun/security/provider/DigestBase +sun/security/jca/GetInstance$Instance +java/security/MessageDigest$Delegate +sun/security/provider/ByteArrayAccess +java/io/ObjectStreamClass$ClassDataSlot +java/io/ObjectInputStream$CallbackContext +sun/reflect/UnsafeQualifiedStaticLongFieldAccessorImpl +java/security/SignatureException +java/security/InvalidKeyException +java/security/KeyException +java/security/Signature +java/security/SignatureSpi +java/io/ObjectOutputStream$BlockDataOutputStream +sun/security/provider/DSAPublicKey +java/security/interfaces/DSAPublicKey +java/security/interfaces/DSAKey +java/security/PublicKey +java/security/Key +sun/security/x509/X509Key +java/io/ObjectOutputStream$HandleTable +java/io/ObjectOutputStream$ReplaceTable +sun/security/x509/AlgorithmId +sun/security/util/DerEncoder +sun/security/util/BitArray +sun/security/util/DerOutputStream +sun/security/util/DerValue +java/math/BigInteger +java/security/interfaces/DSAParams +sun/security/util/DerInputStream +sun/security/util/DerInputBuffer +sun/security/util/ObjectIdentifier +java/security/AlgorithmParameters +java/security/AlgorithmParametersSpi +sun/security/provider/DSAParameters +sun/security/util/ByteArrayLexOrder +sun/security/util/ByteArrayTagOrder +sun/security/util/DerIndefLenConverter +java/io/InvalidClassException +java/io/ObjectStreamException +java/io/ObjectInputStream$GetFieldImpl +java/io/ObjectInputStream$GetField +sun/security/jca/ServiceId +sun/security/jca/ProviderList$ServiceList +sun/security/jca/ProviderList$ServiceList$1 +java/security/Signature$Delegate +java/security/interfaces/DSAPrivateKey +java/security/PrivateKey +sun/security/provider/DSA$SHA1withDSA +sun/security/provider/DSA +java/security/spec/DSAParameterSpec +java/security/spec/AlgorithmParameterSpec +java/math/MutableBigInteger +java/math/SignedMutableBigInteger +java/awt/EventQueue$1AWTInvocationLock +javax/swing/SystemEventQueueUtilities$RunnableCanvas +javax/swing/SystemEventQueueUtilities$RunnableCanvasGraphics +java/awt/Component$FlipBufferStrategy +java/awt/SentEvent +sun/awt/X11/XDestroyWindowEvent +sun/awt/X11/XDropTargetRegistry +sun/awt/X11/XEmbeddedFramePeer +sun/awt/X11/XDragAndDropProtocols +sun/awt/X11/XDropTargetContextPeer +sun/awt/dnd/SunDropTargetContextPeer +java/awt/dnd/peer/DropTargetContextPeer +sun/awt/X11/XDropTargetContextPeer$XDropTargetProtocolListenerImpl +sun/awt/X11/XDropTargetProtocolListener +sun/awt/X11/XDnDDragSourceProtocol +sun/awt/X11/XDragSourceProtocol +sun/awt/X11/MotifDnDDragSourceProtocol +sun/awt/X11/XDnDDropTargetProtocol +sun/awt/X11/XDropTargetProtocol +sun/awt/X11/MotifDnDDropTargetProtocol +sun/awt/X11/XDnDConstants +sun/awt/X11/MotifDnDConstants +javax/swing/JTable$2 +javax/swing/JTable$Resizable3 +javax/swing/JTable$Resizable2 +javax/swing/JTable$5 +javax/swing/event/AncestorEvent +sun/font/FontDesignMetrics$MetricsKey +java/awt/geom/Line2D$Float +java/awt/geom/Line2D +com/sun/java/swing/plaf/gtk/GTKLookAndFeel +javax/swing/plaf/synth/SynthLookAndFeel +javax/swing/plaf/synth/DefaultSynthStyleFactory +javax/swing/plaf/synth/SynthStyleFactory +sun/swing/BakedArrayList +javax/swing/plaf/synth/SynthLookAndFeel$Handler +javax/swing/plaf/synth/SynthDefaultLookup +com/sun/java/swing/plaf/gtk/GTKEngine +com/sun/java/swing/plaf/gtk/GTKDefaultEngine +com/sun/java/swing/plaf/gtk/GTKEngine$Settings +com/sun/java/swing/plaf/gtk/GTKStyleFactory +com/sun/java/swing/plaf/gtk/PangoFonts +sun/font/FontManager$FontConfigInfo +com/sun/java/swing/plaf/gtk/GTKLookAndFeel$WeakPCL +javax/swing/plaf/synth/Region +javax/swing/plaf/synth/SynthLookAndFeel$AATextListener +com/sun/java/swing/plaf/gtk/GTKNativeEngine +com/sun/java/swing/plaf/gtk/GTKNativeEngine$WidgetType +com/sun/java/swing/plaf/gtk/GTKRegion +com/sun/java/swing/plaf/gtk/GTKDefaultStyle +com/sun/java/swing/plaf/gtk/GTKStyle +com/sun/java/swing/plaf/gtk/GTKConstants +javax/swing/plaf/synth/SynthStyle +javax/swing/plaf/synth/SynthGraphicsUtils +com/sun/java/swing/plaf/gtk/GTKGraphicsUtils +com/sun/java/swing/plaf/gtk/GTKStyle$GTKStockIcon +sun/swing/plaf/synth/SynthIcon +com/sun/java/swing/plaf/gtk/GTKColorType +javax/swing/plaf/synth/ColorType +com/sun/java/swing/plaf/gtk/resources/gtk +com/sun/swing/internal/plaf/synth/resources/synth +com/sun/java/swing/plaf/gtk/GTKStyle$GTKLazyValue +com/sun/java/swing/plaf/gtk/GTKLookAndFeel$1FontLazyValue +com/sun/java/swing/plaf/gtk/GTKLookAndFeel$2 +com/sun/java/swing/plaf/gtk/GTKLookAndFeel$3 +javax/swing/plaf/synth/SynthPanelUI +javax/swing/plaf/synth/SynthConstants +javax/swing/plaf/synth/SynthContext +javax/swing/plaf/synth/SynthBorder +javax/swing/plaf/synth/SynthRootPaneUI +javax/swing/plaf/synth/SynthLabelUI +javax/swing/plaf/synth/SynthButtonUI +javax/swing/plaf/synth/SynthToggleButtonUI +javax/swing/plaf/basic/BasicBorders$FieldBorder +javax/swing/plaf/synth/SynthMenuBarUI +javax/swing/plaf/synth/DefaultMenuLayout +javax/swing/plaf/synth/SynthMenuUI +javax/swing/plaf/synth/SynthUI +com/sun/java/swing/plaf/gtk/GTKIconFactory +com/sun/java/swing/plaf/gtk/GTKIconFactory$MenuArrowIcon +com/sun/java/swing/plaf/gtk/GTKIconFactory$DelegatingIcon +com/sun/java/swing/plaf/gtk/GTKConstants$ArrowType +javax/swing/plaf/basic/BasicIconFactory +javax/swing/plaf/basic/BasicIconFactory$MenuItemCheckIcon +javax/swing/plaf/synth/SynthMenuItemUI +javax/swing/plaf/synth/SynthPopupMenuUI +javax/swing/plaf/synth/SynthSeparatorUI +javax/swing/plaf/synth/SynthScrollBarUI +javax/swing/plaf/synth/SynthArrowButton +javax/swing/plaf/synth/SynthArrowButton$SynthArrowButtonUI +javax/swing/plaf/synth/SynthComboBoxUI +javax/swing/plaf/synth/SynthComboPopup +javax/swing/plaf/synth/SynthListUI +javax/swing/plaf/synth/SynthListUI$SynthListCellRenderer +javax/swing/plaf/synth/SynthViewportUI +javax/swing/plaf/synth/SynthScrollPaneUI +javax/swing/plaf/synth/SynthScrollPaneUI$ViewportBorder +javax/swing/plaf/synth/SynthComboBoxUI$SynthComboBoxRenderer +javax/swing/plaf/synth/SynthComboBoxUI$SynthComboBoxEditor +javax/swing/plaf/synth/SynthTextFieldUI +javax/swing/plaf/synth/SynthToolBarUI +javax/swing/plaf/synth/SynthToolBarUI$SynthToolBarLayoutManager +com/sun/java/swing/plaf/gtk/GTKIconFactory$ToolBarHandleIcon +com/sun/java/swing/plaf/gtk/GTKConstants$Orientation +sun/awt/X11/XTranslateCoordinates +com/sun/java/swing/plaf/gtk/GTKPainter +javax/swing/plaf/synth/SynthPainter +javax/swing/plaf/synth/SynthPainter$1 +com/sun/java/swing/plaf/gtk/GTKConstants$PositionType +com/sun/java/swing/plaf/gtk/GTKConstants$ShadowType +java/io/ObjectInputStream$HandleTable$HandleList +sun/java2d/pipe/ShapeSpanIterator +sun/java2d/pipe/SpanIterator +sun/dc/path/PathConsumer +sun/dc/pr/PathStroker +sun/dc/pr/PathDasher +java/awt/geom/LineIterator +java/awt/geom/PathIterator +sun/applet/Main +sun/applet/AppletMessageHandler +sun/applet/resources/MsgAppletViewer +sun/applet/AppletSecurity +sun/awt/AWTSecurityManager +java/lang/SecurityManager +java/security/DomainCombiner +sun/applet/AppletSecurity$1 +java/lang/SecurityManager$1 +java/security/SecurityPermission +java/util/PropertyPermission +sun/applet/AppletViewer +java/applet/AppletContext +java/awt/print/Printable +sun/security/util/SecurityConstants +java/awt/AWTPermission +java/net/NetPermission +java/net/SocketPermission +javax/security/auth/AuthPermission +java/lang/Thread$1 +java/util/logging/LogManager$5 +java/util/logging/LogManager$6 +sun/applet/StdAppletViewerFactory +sun/applet/AppletViewerFactory +sun/applet/AppletViewer$UserActionListener +sun/applet/AppletViewerPanel +sun/applet/AppletPanel +java/applet/AppletStub +sun/misc/MessageUtils +sun/applet/AppletPanel$10 +java/security/Policy$1 +sun/security/provider/PolicyFile$1 +sun/security/provider/PolicyInfo +sun/security/provider/PolicyFile$3 +sun/security/util/PropertyExpander +sun/security/provider/PolicyParser +sun/security/util/PolicyUtil +sun/security/provider/PolicyParser$GrantEntry +sun/security/provider/PolicyParser$PermissionEntry +sun/security/provider/PolicyFile$PolicyEntry +sun/security/provider/PolicyFile$6 +sun/security/provider/PolicyFile$7 +sun/security/provider/SelfPermission +java/net/SocketPermissionCollection +java/util/PropertyPermissionCollection +sun/applet/AppletPanel$9 +sun/applet/AppletClassLoader +sun/applet/AppletClassLoader$4 +sun/applet/AppletThreadGroup +sun/applet/AppContextCreator +sun/applet/AppletPanel$1 +sun/awt/X11/XMenuBarPeer +java/awt/peer/MenuBarPeer +java/awt/peer/MenuComponentPeer +sun/awt/X11/XBaseMenuWindow +sun/awt/X11/XMenuPeer +java/awt/peer/MenuPeer +java/awt/peer/MenuItemPeer +sun/awt/X11/XMenuItemPeer +java/awt/MenuShortcut +sun/awt/X11/XMenuWindow +sun/awt/X11/XMenuBarPeer$1 +sun/awt/X11/XMenuItemPeer$TextMetrics +sun/awt/AppContext$3 +sun/awt/MostRecentThreadAppContext +sun/awt/X11/XMenuBarPeer$MappingData +sun/awt/X11/XBaseMenuWindow$MappingData +sun/applet/AppletViewer$1 +sun/applet/AppletViewer$1AppletEventListener +sun/applet/AppletListener +sun/applet/AppletEventMulticaster +sun/misc/Queue +sun/misc/QueueElement +sun/applet/AppletEvent +sun/applet/AppletClassLoader$1 +sun/awt/X11/XBaseMenuWindow$3 +java/awt/DefaultKeyboardFocusManager$DefaultKeyboardFocusManagerSentEvent +sun/awt/CausedFocusEvent +sun/awt/X11/XWindow$1 +java/net/URLClassLoader$4 +sun/applet/AppletClassLoader$2 +javax/swing/JApplet +java/lang/ClassLoader$1 +sun/security/provider/PolicyFile$5 +java/security/PermissionsEnumerator +java/util/Collections$1 +sun/applet/AppletPanel$11 +sun/applet/AppletPanel$8 +sun/applet/AppletPanel$2 +sun/applet/AppletPanel$3 +sun/applet/AppletPanel$6 +javax/swing/BufferStrategyPaintManager$1 +# f3ac8b467e7f8c49
--- a/src/share/classes/sun/nio/ch/FileChannelImpl.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/share/classes/sun/nio/ch/FileChannelImpl.java Fri Oct 07 03:00:13 2016 +0100 @@ -373,7 +373,8 @@ if (!isOpen()) return; do { - rv = nd.force(fd, metaData); + // Added parameter writable for AIX platform port. + rv = nd.force(fd, metaData, writable); } while ((rv == IOStatus.INTERRUPTED) && isOpen()); } finally { threads.remove(ti);
--- a/src/share/classes/sun/nio/ch/FileDispatcher.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/share/classes/sun/nio/ch/FileDispatcher.java Fri Oct 07 03:00:13 2016 +0100 @@ -36,7 +36,17 @@ public static final int RET_EX_LOCK = 1; // Obtained exclusive lock public static final int INTERRUPTED = 2; // Request interrupted - abstract int force(FileDescriptor fd, boolean metaData) throws IOException; + // Calling fsync on an AIX file descriptor that is opened only for reading + // results in an error (EBADF: The FileDescriptor parameter is not a valid + // file descriptor open for writing.). Therefore, it is necessary to prevent + // the JVM from calling fsync for read-only file descriptors. + // The fsync system call is used indirectly in the force method of the file + // channel. The native method force moved from the file channel class to the + // file dispatcher class in JDK 7. Due to this, it is not as easy anymore to + // read the corresponding attribute of the file channel as it was done prior + // to JDK 7. For JDK 7 a new parameter is added to the force method that + // indicates whether a file is opened for writing. + abstract int force(FileDescriptor fd, boolean metaData, boolean writable) throws IOException; abstract int truncate(FileDescriptor fd, long size) throws IOException;
--- a/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java Fri Oct 07 03:00:13 2016 +0100 @@ -160,7 +160,8 @@ try { begin(); do { - n = nd.force(fdObj, metaData); + // Added parameter writing for AIX platform port. + n = nd.force(fdObj, metaData, writing); } while ((n == IOStatus.INTERRUPTED) && isOpen()); } finally { end(n >= 0);
--- a/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java Fri Oct 07 03:00:13 2016 +0100 @@ -1298,7 +1298,7 @@ String osName = AccessController.doPrivileged( new GetPropertyAction("os.name")); if ("SunOS".equals(osName) || "Linux".equals(osName) - || osName.contains("OS X")) { + || osName.contains("OS X") || osName.contains("AIX")) { charset("x-COMPOUND_TEXT", "COMPOUND_TEXT", new String[] { "COMPOUND_TEXT", // JDK historical
--- a/src/share/classes/sun/tools/attach/META-INF/services/com.sun.tools.attach.spi.AttachProvider Fri Jul 29 18:03:42 2016 +0100 +++ b/src/share/classes/sun/tools/attach/META-INF/services/com.sun.tools.attach.spi.AttachProvider Fri Oct 07 03:00:13 2016 +0100 @@ -31,3 +31,4 @@ #[windows]sun.tools.attach.WindowsAttachProvider #[linux]sun.tools.attach.LinuxAttachProvider #[macosx]sun.tools.attach.BsdAttachProvider +#[aix]sun.tools.attach.AixAttachProvider
--- a/src/share/native/common/check_code.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/share/native/common/check_code.c Fri Oct 07 03:00:13 2016 +0100 @@ -90,6 +90,41 @@ #include "classfile_constants.h" #include "opcodes.in_out" +/* On AIX malloc(0) and calloc(0, ...) return a NULL pointer, which is legal, + * but the code here does not handles it. So we wrap the methods and return non-NULL + * pointers even if we allocate 0 bytes. + */ +#ifdef _AIX +static int aix_dummy; +static void* aix_malloc(size_t len) { + if (len == 0) { + return &aix_dummy; + } + return malloc(len); +} + +static void* aix_calloc(size_t n, size_t size) { + if (n == 0) { + return &aix_dummy; + } + return calloc(n, size); +} + +static void aix_free(void* p) { + if (p == &aix_dummy) { + return; + } + free(p); +} + +#undef malloc +#undef calloc +#undef free +#define malloc aix_malloc +#define calloc aix_calloc +#define free aix_free +#endif + #ifdef __APPLE__ /* use setjmp/longjmp versions that do not save/restore the signal mask */ #define setjmp _setjmp
--- a/src/share/native/java/net/net_util.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/share/native/java/net/net_util.c Fri Oct 07 03:00:13 2016 +0100 @@ -28,6 +28,11 @@ #include "jni_util.h" #include "net_util.h" +#ifdef _AIX +/* Initialize stubs for blocking I/O workarounds (see src/solaris/native/java/net/linux_close.c) */ +void linux_close_init(); +#endif + int IPv6_supported() ; static int IPv6_available; @@ -68,6 +73,10 @@ */ IPv6_available = IPv6_supported() & (!preferIPv4Stack); initLocalAddrTable (); +#ifdef _AIX + /* Initialize stubs for blocking I/O workarounds (see src/solaris/native/java/net/linux_close.c) */ + linux_close_init(); +#endif parseExclusiveBindProperty(env); return JNI_VERSION_1_2;
--- a/src/share/native/sun/awt/medialib/mlib_sys.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/share/native/sun/awt/medialib/mlib_sys.c Fri Oct 07 03:00:13 2016 +0100 @@ -84,7 +84,7 @@ void *__mlib_malloc(mlib_u32 size) { -#ifdef _MSC_VER +#if defined(_MSC_VER) || defined(AIX) /* * Currently, all MS C compilers for Win32 platforms default to 8 byte * alignment. -- from stdlib.h of MS VC++5.0.
--- a/src/share/native/sun/awt/medialib/mlib_types.h Fri Jul 29 18:03:42 2016 +0100 +++ b/src/share/native/sun/awt/medialib/mlib_types.h Fri Oct 07 03:00:13 2016 +0100 @@ -57,7 +57,7 @@ typedef float mlib_f32; typedef double mlib_d64; -#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) || defined(__GNUC__) +#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) || defined(__GNUC__) || defined(AIX) #if defined(MACOSX) #include <stddef.h> /* for ptrdiff_t */ @@ -65,6 +65,9 @@ #elif defined(__linux__) #include <stdint.h> /* for uintptr_t */ #include <malloc.h> /* for ptrdiff_t */ +#elif defined(AIX) +#include <stdint.h> /* for uintptr_t */ +#include <stddef.h> /* for ptrdiff_t */ #else #include <link.h> /* for uintptr_t */ #include <stddef.h> /* for ptrdiff_t */ @@ -81,7 +84,7 @@ #define MLIB_S64_CONST(x) x##L #define MLIB_U64_CONST(x) x##UL -#elif (__STDC__ - 0 == 0) || defined(__GNUC__) +#elif (__STDC__ - 0 == 0) || defined(__GNUC__) || defined(AIX) #if defined(_NO_LONGLONG)
--- a/src/share/native/sun/java2d/opengl/OGLFuncs.h Fri Jul 29 18:03:42 2016 +0100 +++ b/src/share/native/sun/java2d/opengl/OGLFuncs.h Fri Oct 07 03:00:13 2016 +0100 @@ -26,7 +26,7 @@ #ifndef OGLFuncs_h_Included #define OGLFuncs_h_Included -#ifdef MACOSX +#if defined(MACOSX) || defined(AIX) #include <dlfcn.h> #endif #include "jni.h"
--- a/src/share/native/sun/security/ec/impl/ecc_impl.h Fri Jul 29 18:03:42 2016 +0100 +++ b/src/share/native/sun/security/ec/impl/ecc_impl.h Fri Oct 07 03:00:13 2016 +0100 @@ -66,6 +66,13 @@ typedef enum boolean { B_FALSE, B_TRUE } boolean_t; #endif /* _ALLBSD_SOURCE */ +#ifdef AIX +#define B_FALSE FALSE +#define B_TRUE TRUE +typedef unsigned char uint8_t; +typedef unsigned long ulong_t; +#endif /* AIX */ + #ifdef _WIN32 typedef unsigned char uint8_t; typedef unsigned long ulong_t;
--- a/src/solaris/back/exec_md.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/back/exec_md.c Fri Oct 07 03:00:13 2016 +0100 @@ -30,8 +30,8 @@ #include "sys.h" #include "util.h" -#if defined(LINUX) || defined(_ALLBSD_SOURCE) - /* Linux */ +#if defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(AIX) + /* Linux, AIX */ #define FORK() fork() #else /* Solaris (make sure we always get the POSIX-specified behavior) */
--- a/src/solaris/bin/java_md_solinux.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/bin/java_md_solinux.c Fri Oct 07 03:00:13 2016 +0100 @@ -41,7 +41,11 @@ #define JVM_DLL "libjvm.so" #define JAVA_DLL "libjava.so" +#ifdef AIX +#define LD_LIBRARY_PATH "LIBPATH" +#else #define LD_LIBRARY_PATH "LD_LIBRARY_PATH" +#endif /* help jettison the LD_LIBRARY_PATH settings in the future */ #ifndef SETENV_REQUIRED @@ -288,6 +292,11 @@ char *dmllp = NULL; char *p; /* a utility pointer */ +#ifdef AIX + /* We always have to set the LIBPATH on AIX because ld doesn't support $ORIGIN. */ + return JNI_TRUE; +#endif + llp = getenv("LD_LIBRARY_PATH"); #ifdef __solaris__ dmllp = (CURRENT_DATA_MODEL == 32) @@ -597,7 +606,7 @@ * If not on Solaris, assume only a single LD_LIBRARY_PATH * variable. */ - runpath = getenv("LD_LIBRARY_PATH"); + runpath = getenv(LD_LIBRARY_PATH); #endif /* __solaris__ */ /* runpath contains current effective LD_LIBRARY_PATH setting */ @@ -605,9 +614,13 @@ jvmpath = JLI_StringDup(jvmpath); size_t new_runpath_size = ((runpath != NULL) ? JLI_StrLen(runpath) : 0) + 2 * JLI_StrLen(jrepath) + 2 * JLI_StrLen(arch) + +#ifdef AIX + /* On AIX we additionally need 'jli' in the path because ld doesn't support $ORIGIN. */ + JLI_StrLen(jrepath) + JLI_StrLen(arch) + JLI_StrLen("/lib//jli:") + +#endif JLI_StrLen(jvmpath) + 52; new_runpath = JLI_MemAlloc(new_runpath_size); - newpath = new_runpath + JLI_StrLen("LD_LIBRARY_PATH="); + newpath = new_runpath + JLI_StrLen(LD_LIBRARY_PATH "="); /* @@ -619,9 +632,12 @@ if (lastslash) *lastslash = '\0'; - sprintf(new_runpath, "LD_LIBRARY_PATH=" + sprintf(new_runpath, LD_LIBRARY_PATH "=" "%s:" "%s/lib/%s:" +#ifdef AIX + "%s/lib/%s/jli:" /* Needed on AIX because ld doesn't support $ORIGIN. */ +#endif "%s/../lib/%s", jvmpath, #ifdef DUAL_MODE @@ -629,6 +645,9 @@ jrepath, GetArchPath(wanted) #else /* !DUAL_MODE */ jrepath, arch, +#ifdef AIX + jrepath, arch, +#endif jrepath, arch #endif /* DUAL_MODE */ );
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/bin/ppc64/jvm.cfg Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,33 @@ +# 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. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# 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. +# +# List of JVMs that can be used as an option to java, javac, etc. +# Order is important -- first in this list is the default JVM. +# NOTE that this both this file and its format are UNSUPPORTED and +# WILL GO AWAY in a future release. +# +# You may also select a JVM in an arbitrary location with the +# "-XXaltjvm=<jvm_dir>" option, but that too is unsupported +# and may not be available in a future release. +# +-server KNOWN
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/classes/java/lang/UNIXProcess.java.aix Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,470 @@ +/* + * Copyright (c) 1995, 2013, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +package java.lang; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; +import java.io.FileDescriptor; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; +import java.util.concurrent.Executors; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadFactory; +import java.security.AccessController; +import static java.security.AccessController.doPrivileged; +import java.security.PrivilegedAction; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; + +/** + * java.lang.Process subclass in the UNIX environment. + * + * @author Mario Wolczko and Ross Knippel. + * @author Konstantin Kladko (ported to Linux) + * @author Martin Buchholz + * @author Volker Simonis (ported to AIX) + */ +final class UNIXProcess extends Process { + private static final sun.misc.JavaIOFileDescriptorAccess fdAccess + = sun.misc.SharedSecrets.getJavaIOFileDescriptorAccess(); + + private final int pid; + private int exitcode; + private boolean hasExited; + + private /* final */ OutputStream stdin; + private /* final */ InputStream stdout; + private /* final */ InputStream stderr; + + private static enum LaunchMechanism { + FORK(1), + POSIX_SPAWN(2); + + private int value; + LaunchMechanism(int x) {value = x;} + }; + + /* On AIX, the default is to spawn */ + private static final LaunchMechanism launchMechanism; + private static byte[] helperpath; + + private static byte[] toCString(String s) { + if (s == null) + return null; + byte[] bytes = s.getBytes(); + byte[] result = new byte[bytes.length + 1]; + System.arraycopy(bytes, 0, + result, 0, + bytes.length); + result[result.length-1] = (byte)0; + return result; + } + + static { + launchMechanism = AccessController.doPrivileged( + new PrivilegedAction<LaunchMechanism>() + { + public LaunchMechanism run() { + String javahome = System.getProperty("java.home"); + String osArch = System.getProperty("os.arch"); + + helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper"); + String s = System.getProperty( + "jdk.lang.Process.launchMechanism", "posix_spawn"); + + try { + return LaunchMechanism.valueOf(s.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new Error(s + " is not a supported " + + "process launch mechanism on this platform."); + } + } + }); + } + + /* this is for the reaping thread */ + private native int waitForProcessExit(int pid); + + /** + * Create a process. Depending on the mode flag, this is done by + * one of the following mechanisms. + * - fork(2) and exec(2) + * - clone(2) and exec(2) + * - vfork(2) and exec(2) + * + * @param fds an array of three file descriptors. + * Indexes 0, 1, and 2 correspond to standard input, + * standard output and standard error, respectively. On + * input, a value of -1 means to create a pipe to connect + * child and parent processes. On output, a value which + * is not -1 is the parent pipe fd corresponding to the + * pipe which has been created. An element of this array + * is -1 on input if and only if it is <em>not</em> -1 on + * output. + * @return the pid of the subprocess + */ + private native int forkAndExec(int mode, byte[] helperpath, + byte[] prog, + byte[] argBlock, int argc, + byte[] envBlock, int envc, + byte[] dir, + int[] fds, + boolean redirectErrorStream) + throws IOException; + + /** + * The thread factory used to create "process reaper" daemon threads. + */ + private static class ProcessReaperThreadFactory implements ThreadFactory { + private final static ThreadGroup group = getRootThreadGroup(); + + private static ThreadGroup getRootThreadGroup() { + return doPrivileged(new PrivilegedAction<ThreadGroup> () { + public ThreadGroup run() { + ThreadGroup root = Thread.currentThread().getThreadGroup(); + while (root.getParent() != null) + root = root.getParent(); + return root; + }}); + } + + public Thread newThread(Runnable grimReaper) { + // Our thread stack requirement is quite modest. + Thread t = new Thread(group, grimReaper, "process reaper", 32768); + t.setDaemon(true); + // A small attempt (probably futile) to avoid priority inversion + t.setPriority(Thread.MAX_PRIORITY); + return t; + } + } + + /** + * The thread pool of "process reaper" daemon threads. + */ + private static final Executor processReaperExecutor = + doPrivileged(new PrivilegedAction<Executor>() { + public Executor run() { + return Executors.newCachedThreadPool + (new ProcessReaperThreadFactory()); + }}); + + UNIXProcess(final byte[] prog, + final byte[] argBlock, final int argc, + final byte[] envBlock, final int envc, + final byte[] dir, + final int[] fds, + final boolean redirectErrorStream) + throws IOException { + + pid = forkAndExec(launchMechanism.value, + helperpath, + prog, + argBlock, argc, + envBlock, envc, + dir, + fds, + redirectErrorStream); + + try { + doPrivileged(new PrivilegedExceptionAction<Void>() { + public Void run() throws IOException { + initStreams(fds); + return null; + }}); + } catch (PrivilegedActionException ex) { + throw (IOException) ex.getException(); + } + } + + static FileDescriptor newFileDescriptor(int fd) { + FileDescriptor fileDescriptor = new FileDescriptor(); + fdAccess.set(fileDescriptor, fd); + return fileDescriptor; + } + + void initStreams(int[] fds) throws IOException { + stdin = (fds[0] == -1) ? + ProcessBuilder.NullOutputStream.INSTANCE : + new ProcessPipeOutputStream(fds[0]); + + stdout = (fds[1] == -1) ? + ProcessBuilder.NullInputStream.INSTANCE : + new ProcessPipeInputStream(fds[1]); + + stderr = (fds[2] == -1) ? + ProcessBuilder.NullInputStream.INSTANCE : + new ProcessPipeInputStream(fds[2]); + + processReaperExecutor.execute(new Runnable() { + public void run() { + int exitcode = waitForProcessExit(pid); + UNIXProcess.this.processExited(exitcode); + }}); + } + + void processExited(int exitcode) { + synchronized (this) { + this.exitcode = exitcode; + hasExited = true; + notifyAll(); + } + + if (stdout instanceof ProcessPipeInputStream) + ((ProcessPipeInputStream) stdout).processExited(); + + if (stderr instanceof ProcessPipeInputStream) + ((ProcessPipeInputStream) stderr).processExited(); + + if (stdin instanceof ProcessPipeOutputStream) + ((ProcessPipeOutputStream) stdin).processExited(); + } + + public OutputStream getOutputStream() { + return stdin; + } + + public InputStream getInputStream() { + return stdout; + } + + public InputStream getErrorStream() { + return stderr; + } + + public synchronized int waitFor() throws InterruptedException { + while (!hasExited) { + wait(); + } + return exitcode; + } + + public synchronized int exitValue() { + if (!hasExited) { + throw new IllegalThreadStateException("process hasn't exited"); + } + return exitcode; + } + + private static native void destroyProcess(int pid); + public void destroy() { + // There is a risk that pid will be recycled, causing us to + // kill the wrong process! So we only terminate processes + // that appear to still be running. Even with this check, + // there is an unavoidable race condition here, but the window + // is very small, and OSes try hard to not recycle pids too + // soon, so this is quite safe. + synchronized (this) { + if (!hasExited) + destroyProcess(pid); + } + try { stdin.close(); } catch (IOException ignored) {} + try { stdout.close(); } catch (IOException ignored) {} + try { stderr.close(); } catch (IOException ignored) {} + } + + private static native void init(); + + static { + init(); + } + + /** + * A buffered input stream for a subprocess pipe file descriptor + * that allows the underlying file descriptor to be reclaimed when + * the process exits, via the processExited hook. + * + * This is tricky because we do not want the user-level InputStream to be + * closed until the user invokes close(), and we need to continue to be + * able to read any buffered data lingering in the OS pipe buffer. + * + * On AIX this is especially tricky, because the 'close()' system call + * will block if another thread is at the same time blocked in a file + * operation (e.g. 'read()') on the same file descriptor. We therefore + * combine this 'ProcessPipeInputStream' with the DeferredCloseInputStream + * approach used on Solaris (see "UNIXProcess.java.solaris"). This means + * that every potentially blocking operation on the file descriptor + * increments a counter before it is executed and decrements it once it + * finishes. The 'close()' operation will only be executed if there are + * no pending operations. Otherwise it is deferred after the last pending + * operation has finished. + * + */ + static class ProcessPipeInputStream extends BufferedInputStream { + private final Object closeLock = new Object(); + private int useCount = 0; + private boolean closePending = false; + + ProcessPipeInputStream(int fd) { + super(new FileInputStream(newFileDescriptor(fd))); + } + + private InputStream drainInputStream(InputStream in) + throws IOException { + int n = 0; + int j; + byte[] a = null; + synchronized (closeLock) { + if (buf == null) // asynchronous close()? + return null; // discard + j = in.available(); + } + while (j > 0) { + a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); + synchronized (closeLock) { + if (buf == null) // asynchronous close()? + return null; // discard + n += in.read(a, n, j); + j = in.available(); + } + } + return (a == null) ? + ProcessBuilder.NullInputStream.INSTANCE : + new ByteArrayInputStream(n == a.length ? a : Arrays.copyOf(a, n)); + } + + /** Called by the process reaper thread when the process exits. */ + synchronized void processExited() { + try { + InputStream in = this.in; + if (in != null) { + InputStream stragglers = drainInputStream(in); + in.close(); + this.in = stragglers; + } + } catch (IOException ignored) { } + } + + private void raise() { + synchronized (closeLock) { + useCount++; + } + } + + private void lower() throws IOException { + synchronized (closeLock) { + useCount--; + if (useCount == 0 && closePending) { + closePending = false; + super.close(); + } + } + } + + @Override + public int read() throws IOException { + raise(); + try { + return super.read(); + } finally { + lower(); + } + } + + @Override + public int read(byte[] b) throws IOException { + raise(); + try { + return super.read(b); + } finally { + lower(); + } + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + raise(); + try { + return super.read(b, off, len); + } finally { + lower(); + } + } + + @Override + public long skip(long n) throws IOException { + raise(); + try { + return super.skip(n); + } finally { + lower(); + } + } + + @Override + public int available() throws IOException { + raise(); + try { + return super.available(); + } finally { + lower(); + } + } + + @Override + public void close() throws IOException { + // BufferedInputStream#close() is not synchronized unlike most other methods. + // Synchronizing helps avoid racing with drainInputStream(). + synchronized (closeLock) { + if (useCount == 0) { + super.close(); + } + else { + closePending = true; + } + } + } + } + + /** + * A buffered output stream for a subprocess pipe file descriptor + * that allows the underlying file descriptor to be reclaimed when + * the process exits, via the processExited hook. + */ + static class ProcessPipeOutputStream extends BufferedOutputStream { + ProcessPipeOutputStream(int fd) { + super(new FileOutputStream(newFileDescriptor(fd))); + } + + /** Called by the process reaper thread when the process exits. */ + synchronized void processExited() { + OutputStream out = this.out; + if (out != null) { + try { + out.close(); + } catch (IOException ignored) { + // We know of no reason to get an IOException, but if + // we do, there's nothing else to do but carry on. + } + this.out = ProcessBuilder.NullOutputStream.INSTANCE; + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/classes/sun/awt/fontconfigs/aix.fontconfig.properties Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,75 @@ +# +# +# Copyright 2012 SAP AG. 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. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# 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. +# + +# Minimal version for AIX using the standard Latin Type1 Fonts. + +# Version + +version=1 + +# Component Font Mappings + +dialog.plain.latin-1=-*-helvetica-medium-r-normal--*-%d-100-100-p-*-iso10646-1 +dialog.bold.latin-1=-*-helvetica-bold-r-normal--*-%d-100-100-p-*-iso10646-1 +dialog.italic.latin-1=-*-helvetica-medium-o-normal--*-%d-100-100-p-*-iso10646-1 +dialog.bolditalic.latin-1=-*-helvetica-bold-o-normal--*-%d-100-100-p-*-iso10646-1 + +dialoginput.plain.latin-1=-*-courier-medium-r-normal--*-%d-100-100-m-*-iso10646-1 +dialoginput.bold.latin-1=-*-courier-bold-r-normal--*-%d-100-100-m-*-iso10646-1 +dialoginput.italic.latin-1=-*-courier-medium-o-normal--*-%d-100-100-m-*-iso10646-1 +dialoginput.bolditalic.latin-1=-*-courier-bold-o-normal--*-%d-100-100-m-*-iso10646-1 + +sansserif.plain.latin-1=-*-helvetica-medium-r-normal--*-%d-100-100-p-*-iso10646-1 +sansserif.bold.latin-1=-*-helvetica-bold-r-normal--*-%d-100-100-p-*-iso10646-1 +sansserif.italic.latin-1=-*-helvetica-medium-o-normal--*-%d-100-100-p-*-iso10646-1 +sansserif.bolditalic.latin-1=-*-helvetica-bold-o-normal--*-%d-100-100-p-*-iso10646-1 + +serif.plain.latin-1=-*-times new roman-medium-r-normal--*-%d-100-100-p-*-iso10646-1 +serif.bold.latin-1=-*-times new roman-bold-r-normal--*-%d-100-100-p-*-iso10646-1 +serif.italic.latin-1=-*-times new roman-medium-i-normal--*-%d-100-100-p-*-iso10646-1 +serif.bolditalic.latin-1=-*-times new roman-bold-i-normal--*-%d-100-100-p-*-iso10646-1 + +monospaced.plain.latin-1=-*-courier-medium-r-normal--*-%d-100-100-m-*-iso10646-1 +monospaced.bold.latin-1=-*-courier-bold-r-normal--*-%d-100-100-m-*-iso10646-1 +monospaced.italic.latin-1=-*-courier-medium-o-normal--*-%d-100-100-m-*-iso10646-1 +monospaced.bolditalic.latin-1=-*-courier-bold-o-normal--*-%d-100-100-m-*-iso10646-1 + +# Search Sequences + +sequence.allfonts=latin-1 + +filename.-*-courier-medium-r-normal--*-%d-100-100-m-*-iso10646-1=/usr/lib/X11/fonts/Type1/cour.pfa +filename.-*-courier-bold-r-normal--*-%d-100-100-m-*-iso10646-1=/usr/lib/X11/fonts/Type1/courb.pfa +filename.-*-courier-medium-o-normal--*-%d-100-100-m-*-iso10646-1=/usr/lib/X11/fonts/Type1/couri.pfa +filename.-*-courier-bold-o-normal--*-%d-100-100-m-*-iso10646-1=/usr/lib/X11/fonts/Type1/courbi.pfa +filename.-*-helvetica-medium-r-normal--*-%d-100-100-p-*-iso10646-1=/usr/lib/X11/fonts/Type1/helv.pfa +filename.-*-helvetica-bold-r-normal--*-%d-100-100-p-*-iso10646-1=/usr/lib/X11/fonts/Type1/helvb.pfa +filename.-*-helvetica-medium-o-normal--*-%d-100-100-p-*-iso10646-1=/usr/lib/X11/fonts/Type1/helvi.pfa +filename.-*-helvetica-bold-o-normal--*-%d-100-100-p-*-iso10646-1=/usr/lib/X11/fonts/Type1/helvbi.pfa +filename.-*-times_new_roman-medium-r-normal--*-%d-100-100-p-*-iso10646-1=/usr/lib/X11/fonts/Type1/tnr.pfa +filename.-*-times_new_roman-bold-r-normal--*-%d-100-100-p-*-iso10646-1=/usr/lib/X11/fonts/Type1/tnrb.pfa +filename.-*-times_new_roman-medium-i-normal--*-%d-100-100-p-*-iso10646-1=/usr/lib/X11/fonts/Type1/tnri.pfa +filename.-*-times_new_roman-bold-i-normal--*-%d-100-100-p-*-iso10646-1=/usr/lib/X11/fonts/Type1/tnrbi.pfa
--- a/src/solaris/classes/sun/net/PortConfig.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/classes/sun/net/PortConfig.java Fri Oct 07 03:00:13 2016 +0100 @@ -52,6 +52,13 @@ } else if (os.startsWith("SunOS")) { defaultLower = 32768; defaultUpper = 65535; + // Ephemeral port ranges may vary by OS version on AIX, + // see http://publib.boulder.ibm.com/infocenter/aix/v7r1/index.jsp?topic=%2Fcom.ibm.aix.rsct315.admin%2Fbl503_ephport.htm . + // On tested AIX 5.3 / 6.1 / 7.1 machines we see always the settings below by + // /usr/sbin/no -a | fgrep ephemeral so it seems to be a pretty good default. + } else if (os.startsWith("AIX")) { + defaultLower = 32768; + defaultUpper = 65535; } else if (os.contains("OS X")) { defaultLower = 49152; defaultUpper = 65535;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/classes/sun/nio/ch/AixAsynchronousChannelProvider.java Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright 2012 SAP AG. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +package sun.nio.ch; + +import java.nio.channels.*; +import java.nio.channels.spi.AsynchronousChannelProvider; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ThreadFactory; +import java.io.IOException; + +public class AixAsynchronousChannelProvider + extends AsynchronousChannelProvider +{ + private static volatile AixPollPort defaultPort; + + private AixPollPort defaultEventPort() throws IOException { + if (defaultPort == null) { + synchronized (AixAsynchronousChannelProvider.class) { + if (defaultPort == null) { + defaultPort = new AixPollPort(this, ThreadPool.getDefault()).start(); + } + } + } + return defaultPort; + } + + public AixAsynchronousChannelProvider() { + } + + @Override + public AsynchronousChannelGroup openAsynchronousChannelGroup(int nThreads, ThreadFactory factory) + throws IOException + { + return new AixPollPort(this, ThreadPool.create(nThreads, factory)).start(); + } + + @Override + public AsynchronousChannelGroup openAsynchronousChannelGroup(ExecutorService executor, int initialSize) + throws IOException + { + return new AixPollPort(this, ThreadPool.wrap(executor, initialSize)).start(); + } + + private Port toPort(AsynchronousChannelGroup group) throws IOException { + if (group == null) { + return defaultEventPort(); + } else { + if (!(group instanceof AixPollPort)) + throw new IllegalChannelGroupException(); + return (Port)group; + } + } + + @Override + public AsynchronousServerSocketChannel openAsynchronousServerSocketChannel(AsynchronousChannelGroup group) + throws IOException + { + return new UnixAsynchronousServerSocketChannelImpl(toPort(group)); + } + + @Override + public AsynchronousSocketChannel openAsynchronousSocketChannel(AsynchronousChannelGroup group) + throws IOException + { + return new UnixAsynchronousSocketChannelImpl(toPort(group)); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/classes/sun/nio/ch/AixPollPort.java Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,536 @@ +/* + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright 2012 SAP AG. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +package sun.nio.ch; + +import java.nio.channels.spi.AsynchronousChannelProvider; +import java.io.IOException; +import java.util.HashSet; +import java.util.Iterator; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.ReentrantLock; +import sun.misc.Unsafe; + +/** + * AsynchronousChannelGroup implementation based on the AIX pollset framework. + */ +final class AixPollPort + extends Port +{ + private static final Unsafe unsafe = Unsafe.getUnsafe(); + + static { + IOUtil.load(); + init(); + } + + /** + * struct pollfd { + * int fd; + * short events; + * short revents; + * } + */ + private static final int SIZEOF_POLLFD = eventSize(); + private static final int OFFSETOF_EVENTS = eventsOffset(); + private static final int OFFSETOF_REVENTS = reventsOffset(); + private static final int OFFSETOF_FD = fdOffset(); + + // opcodes + private static final int PS_ADD = 0x0; + private static final int PS_MOD = 0x1; + private static final int PS_DELETE = 0x2; + + // maximum number of events to poll at a time + private static final int MAX_POLL_EVENTS = 512; + + // pollset ID + private final int pollset; + + // true if port is closed + private boolean closed; + + // socket pair used for wakeup + private final int sp[]; + + // socket pair used to indicate pending pollsetCtl calls + // Background info: pollsetCtl blocks when another thread is in a pollsetPoll call. + private final int ctlSp[]; + + // number of wakeups pending + private final AtomicInteger wakeupCount = new AtomicInteger(); + + // address of the poll array passed to pollset_poll + private final long address; + + // encapsulates an event for a channel + static class Event { + final PollableChannel channel; + final int events; + + Event(PollableChannel channel, int events) { + this.channel = channel; + this.events = events; + } + + PollableChannel channel() { return channel; } + int events() { return events; } + } + + // queue of events for cases that a polling thread dequeues more than one + // event + private final ArrayBlockingQueue<Event> queue; + private final Event NEED_TO_POLL = new Event(null, 0); + private final Event EXECUTE_TASK_OR_SHUTDOWN = new Event(null, 0); + + // encapsulates a pollset control event for a file descriptor + static class ControlEvent { + final int fd; + final int events; + final boolean removeOnly; + int error = 0; + + ControlEvent(int fd, int events, boolean removeOnly) { + this.fd = fd; + this.events = events; + this.removeOnly = removeOnly; + } + + int fd() { return fd; } + int events() { return events; } + boolean removeOnly() { return removeOnly; } + int error() { return error; } + void setError(int error) { this.error = error; } + } + + // queue of control events that need to be processed + // (this object is also used for synchronization) + private final HashSet<ControlEvent> controlQueue = new HashSet<ControlEvent>(); + + // lock used to check whether a poll operation is ongoing + private final ReentrantLock controlLock = new ReentrantLock(); + + AixPollPort(AsynchronousChannelProvider provider, ThreadPool pool) + throws IOException + { + super(provider, pool); + + // open pollset + this.pollset = pollsetCreate(); + + // create socket pair for wakeup mechanism + int[] sv = new int[2]; + try { + socketpair(sv); + // register one end with pollset + pollsetCtl(pollset, PS_ADD, sv[0], POLLIN); + } catch (IOException x) { + pollsetDestroy(pollset); + throw x; + } + this.sp = sv; + + // create socket pair for pollset control mechanism + sv = new int[2]; + try { + socketpair(sv); + // register one end with pollset + pollsetCtl(pollset, PS_ADD, sv[0], POLLIN); + } catch (IOException x) { + pollsetDestroy(pollset); + throw x; + } + this.ctlSp = sv; + + // allocate the poll array + this.address = allocatePollArray(MAX_POLL_EVENTS); + + // create the queue and offer the special event to ensure that the first + // threads polls + this.queue = new ArrayBlockingQueue<Event>(MAX_POLL_EVENTS); + this.queue.offer(NEED_TO_POLL); + } + + AixPollPort start() { + startThreads(new EventHandlerTask()); + return this; + } + + /** + * Release all resources + */ + private void implClose() { + synchronized (this) { + if (closed) + return; + closed = true; + } + freePollArray(address); + close0(sp[0]); + close0(sp[1]); + close0(ctlSp[0]); + close0(ctlSp[1]); + pollsetDestroy(pollset); + } + + private void wakeup() { + if (wakeupCount.incrementAndGet() == 1) { + // write byte to socketpair to force wakeup + try { + interrupt(sp[1]); + } catch (IOException x) { + throw new AssertionError(x); + } + } + } + + @Override + void executeOnHandlerTask(Runnable task) { + synchronized (this) { + if (closed) + throw new RejectedExecutionException(); + offerTask(task); + wakeup(); + } + } + + @Override + void shutdownHandlerTasks() { + /* + * If no tasks are running then just release resources; otherwise + * write to the one end of the socketpair to wakeup any polling threads. + */ + int nThreads = threadCount(); + if (nThreads == 0) { + implClose(); + } else { + // send interrupt to each thread + while (nThreads-- > 0) { + wakeup(); + } + } + } + + // invoke by clients to register a file descriptor + @Override + void startPoll(int fd, int events) { + queueControlEvent(new ControlEvent(fd, events, false)); + } + + // Callback method for implementations that need special handling when fd is removed + @Override + void unregisterImpl(int fd) { + queueControlEvent(new ControlEvent(fd, 0, true)); + } + + // Add control event into queue and wait for completion. + // In case the control lock is free, this method also tries to apply the control change directly. + private void queueControlEvent(ControlEvent ev) { + // pollsetCtl blocks when a poll call is ongoing. This is very probable. + // Therefore we let the polling thread do the pollsetCtl call. + synchronized (controlQueue) { + controlQueue.add(ev); + // write byte to socketpair to force wakeup + try { + interrupt(ctlSp[1]); + } catch (IOException x) { + throw new AssertionError(x); + } + do { + // Directly empty queue if no poll call is ongoing. + if (controlLock.tryLock()) { + try { + processControlQueue(); + } finally { + controlLock.unlock(); + } + } else { + try { + // Do not starve in case the polling thread returned before + // we could write to ctlSp[1] but the polling thread did not + // release the control lock until we checked. Therefore, use + // a timed wait for the time being. + controlQueue.wait(100); + } catch (InterruptedException e) { + // ignore exception and try again + } + } + } while (controlQueue.contains(ev)); + } + if (ev.error() != 0) { + throw new AssertionError(); + } + } + + // Process all events currently stored in the control queue. + private void processControlQueue() { + synchronized (controlQueue) { + // On Aix it is only possible to set the event + // bits on the first call of pollsetCtl. Later + // calls only add bits, but cannot remove them. + // Therefore, we always remove the file + // descriptor ignoring the error and then add it. + Iterator<ControlEvent> iter = controlQueue.iterator(); + while (iter.hasNext()) { + ControlEvent ev = iter.next(); + pollsetCtl(pollset, PS_DELETE, ev.fd(), 0); + if (!ev.removeOnly()) { + ev.setError(pollsetCtl(pollset, PS_MOD, ev.fd(), ev.events())); + } + iter.remove(); + } + controlQueue.notifyAll(); + } + } + + /* + * Task to process events from pollset and dispatch to the channel's + * onEvent handler. + * + * Events are retreived from pollset in batch and offered to a BlockingQueue + * where they are consumed by handler threads. A special "NEED_TO_POLL" + * event is used to signal one consumer to re-poll when all events have + * been consumed. + */ + private class EventHandlerTask implements Runnable { + private Event poll() throws IOException { + try { + for (;;) { + int n; + controlLock.lock(); + try { + n = pollsetPoll(pollset, address, MAX_POLL_EVENTS); + } finally { + controlLock.unlock(); + } + /* + * 'n' events have been read. Here we map them to their + * corresponding channel in batch and queue n-1 so that + * they can be handled by other handler threads. The last + * event is handled by this thread (and so is not queued). + */ + fdToChannelLock.readLock().lock(); + try { + while (n-- > 0) { + long eventAddress = getEvent(address, n); + int fd = getDescriptor(eventAddress); + + // To emulate one shot semantic we need to remove + // the file descriptor here. + pollsetCtl(pollset, PS_DELETE, fd, 0); + + // wakeup + if (fd == sp[0]) { + if (wakeupCount.decrementAndGet() == 0) { + // no more wakeups so drain pipe + drain1(sp[0]); + } + + // This is the only file descriptor without + // one shot semantic => register it again. + pollsetCtl(pollset, PS_ADD, sp[0], POLLIN); + + // queue special event if there are more events + // to handle. + if (n > 0) { + queue.offer(EXECUTE_TASK_OR_SHUTDOWN); + continue; + } + return EXECUTE_TASK_OR_SHUTDOWN; + } + + // wakeup to process control event + if (fd == ctlSp[0]) { + synchronized (controlQueue) { + drain1(ctlSp[0]); + // This file descriptor does not have + // one shot semantic => register it again. + pollsetCtl(pollset, PS_ADD, ctlSp[0], POLLIN); + processControlQueue(); + } + continue; + } + + PollableChannel channel = fdToChannel.get(fd); + if (channel != null) { + int events = getRevents(eventAddress); + Event ev = new Event(channel, events); + + // n-1 events are queued; This thread handles + // the last one except for the wakeup + if (n > 0) { + queue.offer(ev); + } else { + return ev; + } + } + } + } finally { + fdToChannelLock.readLock().unlock(); + } + } + } finally { + // to ensure that some thread will poll when all events have + // been consumed + queue.offer(NEED_TO_POLL); + } + } + + public void run() { + Invoker.GroupAndInvokeCount myGroupAndInvokeCount = + Invoker.getGroupAndInvokeCount(); + final boolean isPooledThread = (myGroupAndInvokeCount != null); + boolean replaceMe = false; + Event ev; + try { + for (;;) { + // reset invoke count + if (isPooledThread) + myGroupAndInvokeCount.resetInvokeCount(); + + try { + replaceMe = false; + ev = queue.take(); + + // no events and this thread has been "selected" to + // poll for more. + if (ev == NEED_TO_POLL) { + try { + ev = poll(); + } catch (IOException x) { + x.printStackTrace(); + return; + } + } + } catch (InterruptedException x) { + continue; + } + + // handle wakeup to execute task or shutdown + if (ev == EXECUTE_TASK_OR_SHUTDOWN) { + Runnable task = pollTask(); + if (task == null) { + // shutdown request + return; + } + // run task (may throw error/exception) + replaceMe = true; + task.run(); + continue; + } + + // process event + try { + ev.channel().onEvent(ev.events(), isPooledThread); + } catch (Error x) { + replaceMe = true; throw x; + } catch (RuntimeException x) { + replaceMe = true; throw x; + } + } + } finally { + // last handler to exit when shutdown releases resources + int remaining = threadExit(this, replaceMe); + if (remaining == 0 && isShutdown()) { + implClose(); + } + } + } + } + + /** + * Allocates a poll array to handle up to {@code count} events. + */ + private static long allocatePollArray(int count) { + return unsafe.allocateMemory(count * SIZEOF_POLLFD); + } + + /** + * Free a poll array + */ + private static void freePollArray(long address) { + unsafe.freeMemory(address); + } + + /** + * Returns event[i]; + */ + private static long getEvent(long address, int i) { + return address + (SIZEOF_POLLFD*i); + } + + /** + * Returns event->fd + */ + private static int getDescriptor(long eventAddress) { + return unsafe.getInt(eventAddress + OFFSETOF_FD); + } + + /** + * Returns event->events + */ + private static int getEvents(long eventAddress) { + return unsafe.getChar(eventAddress + OFFSETOF_EVENTS); + } + + /** + * Returns event->revents + */ + private static int getRevents(long eventAddress) { + return unsafe.getChar(eventAddress + OFFSETOF_REVENTS); + } + + // -- Native methods -- + + private static native void init(); + + private static native int eventSize(); + + private static native int eventsOffset(); + + private static native int reventsOffset(); + + private static native int fdOffset(); + + private static native int pollsetCreate() throws IOException; + + private static native int pollsetCtl(int pollset, int opcode, int fd, int events); + + private static native int pollsetPoll(int pollset, long pollAddress, int numfds) + throws IOException; + + private static native void pollsetDestroy(int pollset); + + private static native void socketpair(int[] sv) throws IOException; + + private static native void interrupt(int fd) throws IOException; + + private static native void drain1(int fd) throws IOException; + + private static native void close0(int fd); +}
--- a/src/solaris/classes/sun/nio/ch/DefaultAsynchronousChannelProvider.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/classes/sun/nio/ch/DefaultAsynchronousChannelProvider.java Fri Oct 07 03:00:13 2016 +0100 @@ -52,6 +52,8 @@ return new LinuxAsynchronousChannelProvider(); if (osname.contains("OS X")) return new BsdAsynchronousChannelProvider(); + if (osname.equals("AIX")) + return new AixAsynchronousChannelProvider(); throw new InternalError("platform not recognized"); }
--- a/src/solaris/classes/sun/nio/ch/FileDispatcherImpl.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/classes/sun/nio/ch/FileDispatcherImpl.java Fri Oct 07 03:00:13 2016 +0100 @@ -72,8 +72,9 @@ return writev0(fd, address, len); } - int force(FileDescriptor fd, boolean metaData) throws IOException { - return force0(fd, metaData); + // Added parameter writable for AIX platform port. + int force(FileDescriptor fd, boolean metaData, boolean writable) throws IOException { + return force0(fd, metaData, writable); } int truncate(FileDescriptor fd, long size) throws IOException { @@ -136,7 +137,8 @@ static native long writev0(FileDescriptor fd, long address, int len) throws IOException; - static native int force0(FileDescriptor fd, boolean metaData) + // Added parameter writable for AIX platform port. + static native int force0(FileDescriptor fd, boolean metaData, boolean writable) throws IOException; static native int truncate0(FileDescriptor fd, long size)
--- a/src/solaris/classes/sun/nio/ch/Port.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/classes/sun/nio/ch/Port.java Fri Oct 07 03:00:13 2016 +0100 @@ -76,12 +76,20 @@ } } + // Callback method for implementations that need special handling when fd is removed (AIX-Port) + void unregisterImpl(int fd) { + // Nothing to do in here. + } + /** * Unregister channel identified by its file descriptor */ final void unregister(int fd) { boolean checkForShutdown = false; + // Callback method for implementations that need special handling when fd is removed (AIX-Port) + unregisterImpl(fd); + fdToChannelLock.writeLock().lock(); try { fdToChannel.remove(Integer.valueOf(fd));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/classes/sun/nio/fs/AixFileStore.java Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright 2012 SAP AG. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +package sun.nio.fs; + +import java.nio.file.attribute.*; +import java.util.*; +import java.io.IOException; + +/** + * AIX implementation of FileStore + */ + +class AixFileStore + extends UnixFileStore +{ + + AixFileStore(UnixPath file) throws IOException { + super(file); + } + + AixFileStore(UnixFileSystem fs, UnixMountEntry entry) throws IOException { + super(fs, entry); + } + + /** + * Finds, and returns, the mount entry for the file system where the file + * resides. + */ + @Override + UnixMountEntry findMountEntry() throws IOException { + AixFileSystem fs = (AixFileSystem)file().getFileSystem(); + + // step 1: get realpath + UnixPath path = null; + try { + byte[] rp = UnixNativeDispatcher.realpath(file()); + path = new UnixPath(fs, rp); + } catch (UnixException x) { + x.rethrowAsIOException(file()); + } + + // step 2: find mount point + UnixPath parent = path.getParent(); + while (parent != null) { + UnixFileAttributes attrs = null; + try { + attrs = UnixFileAttributes.get(parent, true); + } catch (UnixException x) { + x.rethrowAsIOException(parent); + } + if (attrs.dev() != dev()) + break; + path = parent; + parent = parent.getParent(); + } + + // step 3: lookup mounted file systems + byte[] dir = path.asByteArray(); + for (UnixMountEntry entry: fs.getMountEntries()) { + if (Arrays.equals(dir, entry.dir())) + return entry; + } + + throw new IOException("Mount point not found"); + } + + // returns true if extended attributes enabled on file system where given + // file resides, returns false if disabled or unable to determine. + private boolean isExtendedAttributesEnabled(UnixPath path) { + return false; + } + + @Override + public boolean supportsFileAttributeView(Class<? extends FileAttributeView> type) { + return super.supportsFileAttributeView(type); + } + + @Override + public boolean supportsFileAttributeView(String name) { + return super.supportsFileAttributeView(name); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/classes/sun/nio/fs/AixFileSystem.java Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright 2012 SAP AG. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +package sun.nio.fs; + +import java.nio.file.*; +import java.nio.file.attribute.*; +import java.io.IOException; +import java.util.*; +import static sun.nio.fs.AixNativeDispatcher.*; + +/** + * AIX implementation of FileSystem + */ + +class AixFileSystem extends UnixFileSystem { + + AixFileSystem(UnixFileSystemProvider provider, String dir) { + super(provider, dir); + } + + @Override + public WatchService newWatchService() + throws IOException + { + return new PollingWatchService(); + } + + // lazy initialization of the list of supported attribute views + private static class SupportedFileFileAttributeViewsHolder { + static final Set<String> supportedFileAttributeViews = + supportedFileAttributeViews(); + private static Set<String> supportedFileAttributeViews() { + Set<String> result = new HashSet<String>(); + result.addAll(UnixFileSystem.standardFileAttributeViews()); + return Collections.unmodifiableSet(result); + } + } + + @Override + public Set<String> supportedFileAttributeViews() { + return SupportedFileFileAttributeViewsHolder.supportedFileAttributeViews; + } + + @Override + void copyNonPosixAttributes(int ofd, int nfd) { + // TODO: Implement if needed. + } + + /** + * Returns object to iterate over the mount entries returned by mntctl + */ + @Override + Iterable<UnixMountEntry> getMountEntries() { + UnixMountEntry[] entries = null; + try { + entries = getmntctl(); + } catch (UnixException x) { + // nothing we can do + } + if (entries == null) { + return Collections.emptyList(); + } + return Arrays.asList(entries); + } + + @Override + FileStore getFileStore(UnixMountEntry entry) throws IOException { + return new AixFileStore(this, entry); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/classes/sun/nio/fs/AixFileSystemProvider.java Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright 2012 SAP AG. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +package sun.nio.fs; + +import java.nio.file.spi.FileTypeDetector; +import java.io.IOException; + +/** + * AIX implementation of FileSystemProvider + */ + +public class AixFileSystemProvider extends UnixFileSystemProvider { + public AixFileSystemProvider() { + super(); + } + + @Override + AixFileSystem newFileSystem(String dir) { + return new AixFileSystem(this, dir); + } + + /** + * @see sun.nio.fs.UnixFileSystemProvider#getFileStore(sun.nio.fs.UnixPath) + */ + @Override + AixFileStore getFileStore(UnixPath path) throws IOException { + return new AixFileStore(path); + } + + @Override + FileTypeDetector getFileTypeDetector() { + return new GnomeFileTypeDetector(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/classes/sun/nio/fs/AixNativeDispatcher.java Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright 2012 SAP AG. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +package sun.nio.fs; + +import java.security.AccessController; +import java.security.PrivilegedAction; + +/** + * Solaris specific system calls. + */ + +class AixNativeDispatcher extends UnixNativeDispatcher { + private AixNativeDispatcher() { } + + /** + * Special implementation of 'getextmntent' (see SolarisNativeDispatcher) + * that returns all entries at once. + */ + static native UnixMountEntry[] getmntctl() throws UnixException; + + // initialize + private static native int init(); + + static { + AccessController.doPrivileged(new PrivilegedAction<Void>() { + public Void run() { + System.loadLibrary("nio"); + return null; + }}); + init(); + } +}
--- a/src/solaris/classes/sun/nio/fs/DefaultFileSystemProvider.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/classes/sun/nio/fs/DefaultFileSystemProvider.java Fri Oct 07 03:00:13 2016 +0100 @@ -70,6 +70,8 @@ return createProvider("sun.nio.fs.LinuxFileSystemProvider"); if (osname.equals("Darwin") || osname.contains("OS X")) return createProvider("sun.nio.fs.MacOSXFileSystemProvider"); + if (osname.equals("AIX") || osname.equals("OS400")) + return createProvider("sun.nio.fs.AixFileSystemProvider"); throw new AssertionError("Platform not recognized"); } }
--- a/src/solaris/classes/sun/nio/fs/UnixCopyFile.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/classes/sun/nio/fs/UnixCopyFile.java Fri Oct 07 03:00:13 2016 +0100 @@ -190,9 +190,11 @@ if (flags.copyBasicAttributes) { try { if (dfd >= 0) { + // Added path of file "dfd" for platform ports (only needed on AIX and HPUX) futimes(dfd, attrs.lastAccessTime().to(TimeUnit.MICROSECONDS), - attrs.lastModifiedTime().to(TimeUnit.MICROSECONDS)); + attrs.lastModifiedTime().to(TimeUnit.MICROSECONDS), + target); } else { utimes(target, attrs.lastAccessTime().to(TimeUnit.MICROSECONDS), @@ -269,9 +271,11 @@ // copy time attributes if (flags.copyBasicAttributes) { try { + // Added path of file "fo" for platform ports (only needed on AIX and HPUX) futimes(fo, attrs.lastAccessTime().to(TimeUnit.MICROSECONDS), - attrs.lastModifiedTime().to(TimeUnit.MICROSECONDS)); + attrs.lastModifiedTime().to(TimeUnit.MICROSECONDS), + target); } catch (UnixException x) { if (flags.failIfUnableToCopyBasic) x.rethrowAsIOException(target);
--- a/src/solaris/classes/sun/nio/fs/UnixFileAttributeViews.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/classes/sun/nio/fs/UnixFileAttributeViews.java Fri Oct 07 03:00:13 2016 +0100 @@ -92,7 +92,8 @@ boolean retry = false; try { - futimes(fd, accessValue, modValue); + // Added path of file "fd" for platform ports (only needed on AIX and HPUX) + futimes(fd, accessValue, modValue, file); } catch (UnixException x) { // if futimes fails with EINVAL and one/both of the times is // negative then we adjust the value to the epoch and retry. @@ -107,7 +108,8 @@ if (modValue < 0L) modValue = 0L; if (accessValue < 0L) accessValue= 0L; try { - futimes(fd, accessValue, modValue); + // Added path of file "fd" for platform ports (only needed on AIX and HPUX) + futimes(fd, accessValue, modValue, file); } catch (UnixException x) { x.rethrowAsIOException(file); }
--- a/src/solaris/classes/sun/nio/fs/UnixNativeDispatcher.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/classes/sun/nio/fs/UnixNativeDispatcher.java Fri Oct 07 03:00:13 2016 +0100 @@ -396,8 +396,10 @@ /** * futimes(int fildes,, const struct timeval times[2]) + * + * added path of file "fd" for platform ports (only needed on AIX and HPUX) */ - static native void futimes(int fd, long times0, long times1) throws UnixException; + static native void futimes(int fd, long times0, long times1, UnixPath path) throws UnixException; /** * DIR *opendir(const char* dirname)
--- a/src/solaris/classes/sun/nio/fs/UnixSecureDirectoryStream.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/classes/sun/nio/fs/UnixSecureDirectoryStream.java Fri Oct 07 03:00:13 2016 +0100 @@ -409,9 +409,11 @@ } // update times try { + // Added path of file "fd" for platform ports (only needed on AIX and HPUX) futimes(fd, lastAccessTime.to(TimeUnit.MICROSECONDS), - lastModifiedTime.to(TimeUnit.MICROSECONDS)); + lastModifiedTime.to(TimeUnit.MICROSECONDS), + (file == null) ? ds.directory() : file); } catch (UnixException x) { x.rethrowAsIOException(file); }
--- a/src/solaris/classes/sun/print/UnixPrintService.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/classes/sun/print/UnixPrintService.java Fri Oct 07 03:00:13 2016 +0100 @@ -67,6 +67,7 @@ import javax.print.attribute.standard.SheetCollate; import javax.print.attribute.standard.Sides; import javax.print.event.PrintServiceAttributeListener; +import java.util.ArrayList; // required for method filterPrinterNamesAIX(...) public class UnixPrintService implements PrintService, AttributeUpdater, @@ -202,6 +203,25 @@ isInvalid = false; } + // filter the list of possible AIX Printers + static String[] filterPrinterNamesAIX(String[] posPrinters) { + ArrayList printers = new ArrayList(); + String [] splitPart; + + for(int i = 0; i < posPrinters.length; i++) { + // check if there is a ":" in the end of the first colomn -> not a valid printer + splitPart = posPrinters[i].split(" "); + + if(splitPart.length >= 1) { + if(!splitPart[0].trim().endsWith(":")) { + printers.add(posPrinters[i]); + } + } + } + + return (String[])printers.toArray(new String[printers.size()]); + } + public void invalidateService() { isInvalid = true; } @@ -218,6 +238,28 @@ } private PrinterIsAcceptingJobs getPrinterIsAcceptingJobsSysV() { + // AIX command line arguments are special + // Also the output is in different format than on the other os's. + if (UnixPrintServiceLookup.isAIX()) { + // for AIX there should not be a blank after '-a' + String command = "/usr/bin/lpstat -a" + printer; + String results[]= UnixPrintServiceLookup.execCmd(command); + + // on AIX remote printers add additional lines to the result + // which should be removed + results = filterPrinterNamesAIX(results); + + if (results != null && results.length > 0) { + for (int i = 0; i < results.length; i++) { + if (results[i].contains(printer) && results[i].contains("READY")) { + return PrinterIsAcceptingJobs.ACCEPTING_JOBS; + } + } + } + + return PrinterIsAcceptingJobs.NOT_ACCEPTING_JOBS; + } + String command = "/usr/bin/lpstat -a " + printer; String results[]= UnixPrintServiceLookup.execCmd(command); @@ -302,11 +344,34 @@ } private QueuedJobCount getQueuedJobCountSysV() { - String command = "/usr/bin/lpstat -R " + printer; - String results[]= UnixPrintServiceLookup.execCmd(command); - int qlen = (results == null) ? 0 : results.length; + // AIX command line arguments are special + // Also the output is in different format than on the other os's. + if (UnixPrintServiceLookup.isAIX()){ + // on AIX there is not '-R' option + int qlen = 0; + String command = "/usr/bin/lpstat -a" + printer; + String results[]= UnixPrintServiceLookup.execCmd(command); + + // on AIX remote printers add additional lines to the result + // which should be removed + results = filterPrinterNamesAIX(results); - return new QueuedJobCount(qlen); + if (results != null && results.length > 0){ + for (int i = 0; i < results.length; i++) { + if (results[i].contains("QUEUED")){ + qlen ++; + } + } + } + return new QueuedJobCount(qlen); + } else { + // original Sun coding for non-AIX + String command = "/usr/bin/lpstat -R " + printer; + String results[]= UnixPrintServiceLookup.execCmd(command); + int qlen = (results == null) ? 0 : results.length; + + return new QueuedJobCount(qlen); + } } private QueuedJobCount getQueuedJobCountBSD() {
--- a/src/solaris/classes/sun/print/UnixPrintServiceLookup.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/classes/sun/print/UnixPrintServiceLookup.java Fri Oct 07 03:00:13 2016 +0100 @@ -77,6 +77,23 @@ static String osname; + // list of used aix commands to deal with the printer queues + String[] lpNameComAix = { + "/usr/bin/lsallq", + "/usr/bin/lpstat -W|/usr/bin/expand|/usr/bin/cut -f1 -d' '", + "/usr/bin/lpstat -d|/usr/bin/expand|/usr/bin/cut -f1 -d' '", + "/usr/bin/lpstat -v", + "/usr/bin/cat ./lpstatprinters.txt |/usr/bin/expand|/usr/bin/cut -f1 -d' '", + "/usr/bin/cat ./lsallqprinters.txt", + }; + private static final int aix_lsallq = 0; + private static final int aix_lpstat_W = 1; + private static final int aix_lpstat_d = 2; + private static final int aix_lpstat_v = 3; + private static final int aix_lpstat_test = 4; + private static final int aix_lsallq_test = 5; + private static int aix_defaultPrinterEnumeration = aix_lsallq; + static { /* The system property "sun.java2d.print.polling" * can be used to force the printing code to poll or not poll @@ -111,6 +128,25 @@ } } + /* The system property "com.sap.print.aix.enumeration" + * can be used to force the usage of lpstat to enumerate all + * printer queues. By default we use lsallq, because lpstat -W + * can take lots of time if thousands of printers are attached to a server. + */ + String aixPrinterEnumerator = + (String)java.security.AccessController.doPrivileged( + new sun.security.action.GetPropertyAction("com.sap.print.aix.enumeration")); + + if (aixPrinterEnumerator != null) { + if (aixPrinterEnumerator.equalsIgnoreCase("lpstat")) { + aix_defaultPrinterEnumeration = aix_lpstat_W; + } else if (aixPrinterEnumerator.equalsIgnoreCase("lpstat_test")) { + aix_defaultPrinterEnumeration = aix_lpstat_test; + } else if (aixPrinterEnumerator.equalsIgnoreCase("lsallq_test")) { + aix_defaultPrinterEnumeration = aix_lsallq_test; + } + } + osname = java.security.AccessController.doPrivileged( new sun.security.action.GetPropertyAction("os.name")); } @@ -120,7 +156,12 @@ } static boolean isSysV() { - return osname.equals("SunOS"); + // HPUX and AIX uses a SystemV based printing system as well + return "SunOS HP-UX AIX".contains(osname); + } + + static boolean isAIX( ) { + return "AIX".contains(osname); } static boolean isLinux() { @@ -221,7 +262,9 @@ } } } else { - if (isMac() || isSysV()) { + if (isAIX()) { + printers = getAllPrinterNamesAix(); + } else if (isMac() || isSysV()) { printers = getAllPrinterNamesSysV(); } else { //BSD printers = getAllPrinterNamesBSD(); @@ -393,7 +436,9 @@ } /* fallback if nothing not having a printer at this point */ PrintService printer = null; - if (isMac() || isSysV()) { + if (isAIX()) { + printer = getNamedPrinterNameAix(name); + } else if (isMac() || isSysV()) { printer = getNamedPrinterNameSysV(name); } else { printer = getNamedPrinterNameBSD(name); @@ -820,4 +865,50 @@ } } } + + private String getDefaultPrinterNameAix() { + String defaultPrinter = "lp"; + String[] names = execCmd(lpNameComAix[aix_lpstat_d]); + names = UnixPrintService.filterPrinterNamesAIX(names); + if (names == null || names.length == 0) { + return defaultPrinter; + } else { + if (names.length != 3) { + // No default printer found + return null; + } + return names[2]; + } + } + + private PrintService getNamedPrinterNameAix(String name) { + // for AIX the blank after -v should not be there + String[] result = execCmd(lpNameComAix[aix_lpstat_v] + name); + // on AIX remote printers add additional lines to + // the result which should be removed + result = UnixPrintService.filterPrinterNamesAIX(result); + if (result == null || result.length == 0) { + return null; + } else { + return new UnixPrintService(name); + } + } + + private String[] getAllPrinterNamesAix() { + // determine all printers of the system + String [] names = execCmd(lpNameComAix[aix_defaultPrinterEnumeration]); + + // on AIX remote printers add additional lines to the result + // which should be removed + names = UnixPrintService.filterPrinterNamesAIX(names); + + ArrayList<String> printerNames = new ArrayList<String>(); + for ( int i=0; i < names.length; i++) { + //remove empty lines and remove the heading + if(names[i] != null && !names[i].equals("") && !names[i].startsWith("---") && !names[i].contains("Queue") ) { + printerNames.add(names[i]); + } + } + return (String[])printerNames.toArray(new String[printerNames.size()]); + } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/classes/sun/tools/attach/AixAttachProvider.java Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright 2013 SAP AG. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ +package sun.tools.attach; + +import com.sun.tools.attach.VirtualMachine; +import com.sun.tools.attach.VirtualMachineDescriptor; +import com.sun.tools.attach.AttachNotSupportedException; +import com.sun.tools.attach.spi.AttachProvider; + +import java.io.IOException; + +// Based on 'LinuxAttachProvider.java'. All occurrences of the string +// "Linux" have been textually replaced by "Aix" to avoid confusion. + +/* + * An AttachProvider implementation for Aix that uses a UNIX domain + * socket. + */ +public class AixAttachProvider extends HotSpotAttachProvider { + + // perf counter for the JVM version + private static final String JVM_VERSION = "java.property.java.vm.version"; + + public AixAttachProvider() { + } + + public String name() { + return "sun"; + } + + public String type() { + return "socket"; + } + + public VirtualMachine attachVirtualMachine(String vmid) + throws AttachNotSupportedException, IOException + { + checkAttachPermission(); + + // AttachNotSupportedException will be thrown if the target VM can be determined + // to be not attachable. + testAttachable(vmid); + + return new AixVirtualMachine(this, vmid); + } + + public VirtualMachine attachVirtualMachine(VirtualMachineDescriptor vmd) + throws AttachNotSupportedException, IOException + { + if (vmd.provider() != this) { + throw new AttachNotSupportedException("provider mismatch"); + } + // To avoid re-checking if the VM if attachable, we check if the descriptor + // is for a hotspot VM - these descriptors are created by the listVirtualMachines + // implementation which only returns a list of attachable VMs. + if (vmd instanceof HotSpotVirtualMachineDescriptor) { + assert ((HotSpotVirtualMachineDescriptor)vmd).isAttachable(); + checkAttachPermission(); + return new AixVirtualMachine(this, vmd.id()); + } else { + return attachVirtualMachine(vmd.id()); + } + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/classes/sun/tools/attach/AixVirtualMachine.java Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,317 @@ +/* + * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright 2013 SAP AG. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ +package sun.tools.attach; + +import com.sun.tools.attach.VirtualMachine; +import com.sun.tools.attach.AgentLoadException; +import com.sun.tools.attach.AttachNotSupportedException; +import com.sun.tools.attach.spi.AttachProvider; +import java.io.InputStream; +import java.io.IOException; +import java.io.File; +import java.util.Properties; + +// Based on 'LinuxAttachProvider.java'. All occurrences of the string +// "Linux" have been textually replaced by "Aix" to avoid confusion. + +/* + * Aix implementation of HotSpotVirtualMachine + */ +public class AixVirtualMachine extends HotSpotVirtualMachine { + // "/tmp" is used as a global well-known location for the files + // .java_pid<pid>. and .attach_pid<pid>. It is important that this + // location is the same for all processes, otherwise the tools + // will not be able to find all Hotspot processes. + // Any changes to this needs to be synchronized with HotSpot. + private static final String tmpdir = "/tmp"; + + // The patch to the socket file created by the target VM + String path; + + /** + * Attaches to the target VM + */ + AixVirtualMachine(AttachProvider provider, String vmid) + throws AttachNotSupportedException, IOException + { + super(provider, vmid); + + // This provider only understands pids + int pid; + try { + pid = Integer.parseInt(vmid); + } catch (NumberFormatException x) { + throw new AttachNotSupportedException("Invalid process identifier"); + } + + // Find the socket file. If not found then we attempt to start the + // attach mechanism in the target VM by sending it a QUIT signal. + // Then we attempt to find the socket file again. + path = findSocketFile(pid); + if (path == null) { + File f = createAttachFile(pid); + try { + sendQuitTo(pid); + + // give the target VM time to start the attach mechanism + int i = 0; + long delay = 200; + int retries = (int)(attachTimeout() / delay); + do { + try { + Thread.sleep(delay); + } catch (InterruptedException x) { } + path = findSocketFile(pid); + i++; + } while (i <= retries && path == null); + if (path == null) { + throw new AttachNotSupportedException( + "Unable to open socket file: target process not responding " + + "or HotSpot VM not loaded"); + } + } finally { + f.delete(); + } + } + + // Check that the file owner/permission to avoid attaching to + // bogus process + checkPermissions(path); + + // Check that we can connect to the process + // - this ensures we throw the permission denied error now rather than + // later when we attempt to enqueue a command. + int s = socket(); + try { + connect(s, path); + } finally { + close(s); + } + } + + /** + * Detach from the target VM + */ + public void detach() throws IOException { + synchronized (this) { + if (this.path != null) { + this.path = null; + } + } + } + + // protocol version + private final static String PROTOCOL_VERSION = "1"; + + // known errors + private final static int ATTACH_ERROR_BADVERSION = 101; + + /** + * Execute the given command in the target VM. + */ + InputStream execute(String cmd, Object ... args) throws AgentLoadException, IOException { + assert args.length <= 3; // includes null + + // did we detach? + String p; + synchronized (this) { + if (this.path == null) { + throw new IOException("Detached from target VM"); + } + p = this.path; + } + + // create UNIX socket + int s = socket(); + + // connect to target VM + try { + connect(s, p); + } catch (IOException x) { + close(s); + throw x; + } + + IOException ioe = null; + + // connected - write request + // <ver> <cmd> <args...> + try { + writeString(s, PROTOCOL_VERSION); + writeString(s, cmd); + + for (int i=0; i<3; i++) { + if (i < args.length && args[i] != null) { + writeString(s, (String)args[i]); + } else { + writeString(s, ""); + } + } + } catch (IOException x) { + ioe = x; + } + + + // Create an input stream to read reply + SocketInputStream sis = new SocketInputStream(s); + + // Read the command completion status + int completionStatus; + try { + completionStatus = readInt(sis); + } catch (IOException x) { + sis.close(); + if (ioe != null) { + throw ioe; + } else { + throw x; + } + } + + if (completionStatus != 0) { + sis.close(); + + // In the event of a protocol mismatch then the target VM + // returns a known error so that we can throw a reasonable + // error. + if (completionStatus == ATTACH_ERROR_BADVERSION) { + throw new IOException("Protocol mismatch with target VM"); + } + + // Special-case the "load" command so that the right exception is + // thrown. + if (cmd.equals("load")) { + throw new AgentLoadException("Failed to load agent library"); + } else { + throw new IOException("Command failed in target VM"); + } + } + + // Return the input stream so that the command output can be read + return sis; + } + + /* + * InputStream for the socket connection to get target VM + */ + private class SocketInputStream extends InputStream { + int s; + + public SocketInputStream(int s) { + this.s = s; + } + + public synchronized int read() throws IOException { + byte b[] = new byte[1]; + int n = this.read(b, 0, 1); + if (n == 1) { + return b[0] & 0xff; + } else { + return -1; + } + } + + public synchronized int read(byte[] bs, int off, int len) throws IOException { + if ((off < 0) || (off > bs.length) || (len < 0) || + ((off + len) > bs.length) || ((off + len) < 0)) { + throw new IndexOutOfBoundsException(); + } else if (len == 0) + return 0; + + return AixVirtualMachine.read(s, bs, off, len); + } + + public void close() throws IOException { + AixVirtualMachine.close(s); + } + } + + // Return the socket file for the given process. + private String findSocketFile(int pid) { + File f = new File(tmpdir, ".java_pid" + pid); + if (!f.exists()) { + return null; + } + return f.getPath(); + } + + // On Solaris/Linux/Aix a simple handshake is used to start the attach mechanism + // if not already started. The client creates a .attach_pid<pid> file in the + // target VM's working directory (or temp directory), and the SIGQUIT handler + // checks for the file. + private File createAttachFile(int pid) throws IOException { + String fn = ".attach_pid" + pid; + String path = "/proc/" + pid + "/cwd/" + fn; + File f = new File(path); + try { + f.createNewFile(); + } catch (IOException x) { + f = new File(tmpdir, fn); + f.createNewFile(); + } + return f; + } + + /* + * Write/sends the given to the target VM. String is transmitted in + * UTF-8 encoding. + */ + private void writeString(int fd, String s) throws IOException { + if (s.length() > 0) { + byte b[]; + try { + b = s.getBytes("UTF-8"); + } catch (java.io.UnsupportedEncodingException x) { + throw new InternalError(); + } + AixVirtualMachine.write(fd, b, 0, b.length); + } + byte b[] = new byte[1]; + b[0] = 0; + write(fd, b, 0, 1); + } + + + //-- native methods + + static native void sendQuitTo(int pid) throws IOException; + + static native void checkPermissions(String path) throws IOException; + + static native int socket() throws IOException; + + static native void connect(int fd, String path) throws IOException; + + static native void close(int fd) throws IOException; + + static native int read(int fd, byte buf[], int off, int bufLen) throws IOException; + + static native void write(int fd, byte buf[], int off, int bufLen) throws IOException; + + static { + System.loadLibrary("attach"); + } +}
--- a/src/solaris/demo/jvmti/hprof/hprof_md.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/demo/jvmti/hprof/hprof_md.c Fri Oct 07 03:00:13 2016 +0100 @@ -42,7 +42,7 @@ #include <sys/stat.h> #include <fcntl.h> -#if !defined(LINUX) && !defined(_ALLBSD_SOURCE) +#if !defined(LINUX) && !defined(_ALLBSD_SOURCE) && !defined(AIX) #include <procfs.h> #endif @@ -65,6 +65,21 @@ #include "jvm_md.h" #include "hprof.h" + +#ifdef AIX +/* SAPJVM */ +#include <sys/ldr.h> +#include <errno.h> +typedef struct { + const char *dli_fname; + void *dli_fbase; + const char *dli_sname; + void *dli_saddr; +} Dl_info; + +static int dladdr(void *addr, Dl_info *info); +#endif /* AIX */ + int md_getpid(void) { @@ -86,7 +101,7 @@ void md_init(void) { -#if defined(LINUX) || defined(_ALLBSD_SOURCE) +#if defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(AIX) /* No Hi-Res timer option? */ #else if ( gdata->micro_state_accounting ) { @@ -248,7 +263,7 @@ jlong md_get_microsecs(void) { -#if defined(LINUX) || defined(_ALLBSD_SOURCE) +#if defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(AIX) return (jlong)(md_timeofday() * (jlong)1000); /* Milli to micro */ #else return (jlong)(gethrtime()/(hrtime_t)1000); /* Nano seconds to micro seconds */ @@ -266,7 +281,7 @@ jlong md_get_thread_cpu_timemillis(void) { -#if defined(LINUX) || defined(_ALLBSD_SOURCE) +#if defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(AIX) return md_timeofday(); #else return (jlong)(gethrvtime()/1000); /* Nano seconds to milli seconds */ @@ -281,7 +296,7 @@ Dl_info dlinfo; libdir[0] = 0; -#if defined(LINUX) || defined(_ALLBSD_SOURCE) +#if defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(AIX) addr = (void*)&Agent_OnLoad; #else /* Just using &Agent_OnLoad will get the first external symbol with @@ -452,3 +467,63 @@ sym = dlsym(handle, name); return sym; } + +#ifdef AIX + +/* SAPJVM: + * workaround for the missing dladdr */ +static unsigned char dladdr_buffer[0x4000]; + +static void fill_dll_info(void) { + int rc = loadquery(L_GETINFO,dladdr_buffer, sizeof(dladdr_buffer)); + if (rc == -1) { + fprintf(stderr, "loadquery failed (%d %s)", errno, strerror(errno)); + fflush(stderr); + } +} + +static int dladdr_dont_reload(void* addr, Dl_info* info) { + const struct ld_info* p = (struct ld_info*) dladdr_buffer; + info->dli_fbase = 0; info->dli_fname = 0; + info->dli_sname = 0; info->dli_saddr = 0; + for (;;) { + if (addr >= p->ldinfo_textorg && + addr < (((char*)p->ldinfo_textorg) + p->ldinfo_textsize)) { + info->dli_fname = p->ldinfo_filename; + info->dli_fbase = p->ldinfo_textorg; + return 1; /* [sic] */ + } + if (!p->ldinfo_next) { + break; + } + p = (struct ld_info*)(((char*)p) + p->ldinfo_next); + } + return 0; /* [sic] */ +} + +static int dladdr(void *addr, Dl_info *info) { + static int loaded = 0; + if (!loaded) { + fill_dll_info(); + loaded = 1; + } + if (!addr) { + return 0; /* [sic] */ + } + /* Address cuold be AIX function descriptor? */ + void* const addr0 = *( (void**) addr ); + int rc = dladdr_dont_reload(addr, info); + if (rc == 0) { + rc = dladdr_dont_reload(addr0, info); + if (rc == 0) { /* [sic] */ + fill_dll_info(); /* refill, maybe loadquery info is outdated */ + rc = dladdr_dont_reload(addr, info); + if (rc == 0) { + rc = dladdr_dont_reload(addr0, info); + } + } + } + return rc; +} + +#endif /* AIX */
--- a/src/solaris/native/com/sun/management/UnixOperatingSystem_md.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/com/sun/management/UnixOperatingSystem_md.c Fri Oct 07 03:00:13 2016 +0100 @@ -41,7 +41,7 @@ #include <sys/proc_info.h> #include <libproc.h> #endif -#else +#elif !defined(AIX) #include <sys/swap.h> #endif #include <sys/resource.h> @@ -57,9 +57,13 @@ #include <stdlib.h> #include <unistd.h> +#if defined(AIX) +#include <libperfstat.h> +#endif + static jlong page_size = 0; -#if defined(_ALLBSD_SOURCE) +#if defined(_ALLBSD_SOURCE) || defined(AIX) #define MB (1024UL * 1024UL) #else @@ -326,6 +330,12 @@ */ // throw_internal_error(env, "Unimplemented in FreeBSD"); return (128 * MB); +#elif defined(AIX) + perfstat_memory_total_t memory_info; + if (-1 != perfstat_memory_total(NULL, &memory_info, sizeof(perfstat_memory_total_t), 1)) { + return (jlong)(memory_info.real_free * 4L * 1024L); + } + return -1; #else // solaris / linux jlong num_avail_physical_pages = sysconf(_SC_AVPHYS_PAGES); return (num_avail_physical_pages * page_size); @@ -349,6 +359,12 @@ return -1; } return result; +#elif defined(AIX) + perfstat_memory_total_t memory_info; + if (-1 != perfstat_memory_total(NULL, &memory_info, sizeof(perfstat_memory_total_t), 1)) { + return (jlong)(memory_info.real_total * 4L * 1024L); + } + return -1; #else // solaris / linux jlong num_physical_pages = sysconf(_SC_PHYS_PAGES); return (num_physical_pages * page_size);
--- a/src/solaris/native/java/io/UnixFileSystem_md.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/java/io/UnixFileSystem_md.c Fri Oct 07 03:00:13 2016 +0100 @@ -42,7 +42,7 @@ #include "java_io_FileSystem.h" #include "java_io_UnixFileSystem.h" -#if defined(_ALLBSD_SOURCE) +#if defined(_ALLBSD_SOURCE) || defined(AIX) #define dirent64 dirent #define readdir64_r readdir_r #define stat64 stat
--- a/src/solaris/native/java/lang/UNIXProcess_md.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/java/lang/UNIXProcess_md.c Fri Oct 07 03:00:13 2016 +0100 @@ -40,7 +40,7 @@ #include <stdlib.h> #include <sys/types.h> #include <ctype.h> -#ifdef _ALLBSD_SOURCE +#if defined( _ALLBSD_SOURCE ) || defined(AIX) #include <sys/wait.h> #else #include <wait.h> @@ -48,7 +48,7 @@ #include <signal.h> #include <string.h> -#if defined(__solaris__) || defined(_ALLBSD_SOURCE) +#if defined(__solaris__) || defined(_ALLBSD_SOURCE) || defined(_AIX) #include <spawn.h> #endif @@ -459,7 +459,7 @@ return resultPid; } -#if defined(__solaris__) || defined(_ALLBSD_SOURCE) +#if defined(__solaris__) || defined(_ALLBSD_SOURCE) || defined(_AIX) static pid_t spawnChild(JNIEnv *env, jobject process, ChildStuff *c, const char *helperpath) { pid_t resultPid; @@ -555,7 +555,7 @@ return vforkChild(c); case MODE_FORK: return forkChild(c); -#if defined(__solaris__) || defined(_ALLBSD_SOURCE) +#if defined(__solaris__) || defined(_ALLBSD_SOURCE) || defined(_AIX) case MODE_POSIX_SPAWN: return spawnChild(env, process, c, helperpath); #endif
--- a/src/solaris/native/java/net/Inet4AddressImpl.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/java/net/Inet4AddressImpl.c Fri Oct 07 03:00:13 2016 +0100 @@ -379,9 +379,18 @@ // ensure null-terminated hostname[MAXHOSTNAMELEN] = '\0'; +#if defined(AIX) + struct hostent_data htdata; +#endif #ifdef HAS_GLIBC_GETHOSTBY_R gethostbyname_r(hostname, &res, (char*)buf, sizeof(buf), &hp, &h_error); +#elif defined(AIX) + if (gethostbyname_r(hostname, &res, &htdata) == 0) { + hp = &res; + } else { + hp = NULL; + } #else hp = gethostbyname_r(hostname, &res, (char*)buf, sizeof(buf), &h_error); #endif @@ -389,6 +398,13 @@ #ifdef HAS_GLIBC_GETHOSTBY_R gethostbyaddr_r(hp->h_addr, hp->h_length, AF_INET, &res2, (char*)buf2, sizeof(buf2), &hp, &h_error); +#elif defined(AIX) + if (gethostbyaddr_r(hp->h_addr, hp->h_length, AF_INET, + &res2, &htdata) == 0) { + hp = &res2; + } else { + hp = NULL; + } #else hp = gethostbyaddr_r(hp->h_addr, hp->h_length, AF_INET, &res2, (char*)buf2, sizeof(buf2), &h_error); @@ -430,6 +446,9 @@ // this buffer must be pointer-aligned so is declared // with pointer type char *buf[HENT_BUF_SIZE/(sizeof (char *))]; +#if defined(AIX) + struct hostent_data htdata; +#endif /* temporary buffer, on the off chance we need to expand */ char *tmp = NULL; @@ -461,6 +480,12 @@ /* Try once, with our static buffer. */ #ifdef HAS_GLIBC_GETHOSTBY_R gethostbyname_r(hostname, &res, (char*)buf, sizeof(buf), &hp, &h_error); +#elif defined(AIX) + if (gethostbyname_r(hostname, &res, &htdata) == 0) { + hp = &res; + } else { + hp = NULL; + } #else hp = gethostbyname_r(hostname, &res, (char*)buf, sizeof(buf), &h_error); #endif @@ -475,6 +500,12 @@ #ifdef HAS_GLIBC_GETHOSTBY_R gethostbyname_r(hostname, &res, tmp, BIG_HENT_BUF_SIZE, &hp, &h_error); +#elif defined(AIX) + if (gethostbyname_r(hostname, (struct hostent*)buf, &htdata) == 0) { + hp = (struct hostent*)buf; + } else { + hp = NULL; + } #else hp = gethostbyname_r(hostname, &res, tmp, BIG_HENT_BUF_SIZE, &h_error); @@ -539,6 +570,9 @@ char *buf[HENT_BUF_SIZE/(sizeof (char *))]; int h_error = 0; char *tmp = NULL; +#if defined(AIX) + struct hostent_data htdata; +#endif /* * We are careful here to use the reentrant version of @@ -559,6 +593,13 @@ #ifdef HAS_GLIBC_GETHOSTBY_R gethostbyaddr_r((char *)&addr, sizeof(addr), AF_INET, &hent, (char*)buf, sizeof(buf), &hp, &h_error); +#elif defined(AIX) + if (gethostbyaddr_r((char *)&addr, sizeof(addr), AF_INET, + &hent, &htdata) == 0) { + hp = &hent; + } else { + hp = NULL; + } #else hp = gethostbyaddr_r((char *)&addr, sizeof(addr), AF_INET, &hent, (char*)buf, sizeof(buf), &h_error); @@ -573,6 +614,13 @@ #ifdef HAS_GLIBC_GETHOSTBY_R gethostbyaddr_r((char *)&addr, sizeof(addr), AF_INET, &hent, tmp, BIG_HENT_BUF_SIZE, &hp, &h_error); +#elif defined(AIX) + if (gethostbyaddr_r((char *)&addr, sizeof(addr), AF_INET, + &hent, &htdata) == 0) { + hp = &hent; + } else { + hp = NULL; + } #else hp = gethostbyaddr_r((char *)&addr, sizeof(addr), AF_INET, &hent, tmp, BIG_HENT_BUF_SIZE, &h_error); @@ -833,6 +881,13 @@ case ENETUNREACH: /* Network Unreachable */ case EAFNOSUPPORT: /* Address Family not supported */ case EADDRNOTAVAIL: /* address is not available on the remote machine */ +#ifdef _AIX + case EHOSTUNREACH: /* No route to host */ + /* + * On AIX and AS400 the connect may also immediately return with + * EHOSTUNREACH which is not an error, but the answer to our question. + */ +#endif #ifdef __linux__ case EINVAL: case EHOSTUNREACH:
--- a/src/solaris/native/java/net/NetworkInterface.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/java/net/NetworkInterface.c Fri Oct 07 03:00:13 2016 +0100 @@ -52,6 +52,13 @@ #include <stdio.h> #endif +#if defined(AIX) +#include <sys/ioctl.h> +#include <netinet/in6_var.h> +#include <sys/ndd_var.h> +#include <sys/kinfo.h> +#endif + #ifdef __linux__ #define _PATH_PROCNET_IFINET6 "/proc/net/if_inet6" #endif @@ -90,6 +97,8 @@ struct _netif *next; } netif; +#define SIZE(p) MAX((p).sa_len, sizeof(p)) + /************************************************************************ * NetworkInterface */ @@ -1029,8 +1038,8 @@ } -/** Linux **/ -#ifdef __linux__ +/** Linux, AIX **/ +#if !defined(__solaris__) /* Open socket for further ioct calls, try v4 socket first and * if it falls return v6 socket */ @@ -1069,11 +1078,13 @@ static netif *enumIPv4Interfaces(JNIEnv *env, int sock, netif *ifs) { struct ifconf ifc; struct ifreq *ifreqP; - char *buf; + char *buf = NULL; int numifs; unsigned i; + unsigned bufsize; +#if defined(__linux__) /* need to do a dummy SIOCGIFCONF to determine the buffer size. * SIOCGIFCOUNT doesn't work */ @@ -1082,11 +1093,25 @@ NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGIFCONF failed"); return ifs; } + bufsize = ifc.ifc_len; +#elif defined(AIX) + ifc.ifc_buf = NULL; + if (ioctl(sock, SIOCGSIZIFCONF, &(ifc.ifc_len)) < 0) { + NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", + "ioctl SIOCGSIZIFCONF failed"); + return ifs; + } + bufsize = ifc.ifc_len; +#endif /* __linux__ */ - CHECKED_MALLOC3(buf,char *, ifc.ifc_len); + CHECKED_MALLOC3(buf,char *, bufsize); ifc.ifc_buf = buf; - if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0) { + int request = SIOCGIFCONF; +#if defined(AIX) + request = CSIOCGIFCONF; +#endif + if (ioctl(sock, request, (char *)&ifc) < 0) { NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGIFCONF failed"); (void) free(buf); return ifs; @@ -1097,6 +1122,10 @@ */ ifreqP = ifc.ifc_req; for (i=0; i<ifc.ifc_len/sizeof (struct ifreq); i++, ifreqP++) { +#if defined(AIX) + if (ifreqP->ifr_addr.sa_family != AF_INET) + continue; +#endif /* * Add to the list */ @@ -1124,7 +1153,7 @@ * Enumerates and returns all IPv6 interfaces on Linux */ -#ifdef AF_INET6 +#if defined(AF_INET6) && defined(__linux__) static netif *enumIPv6Interfaces(JNIEnv *env, int sock, netif *ifs) { FILE *f; char addr6[40], devname[21]; @@ -1168,11 +1197,102 @@ #endif +#if (defined(AIX) && defined(AF_INET6)) +/* + * Enumerates and returns all IPv6 interfaces on AIX + */ +static netif *enumIPv6Interfaces(JNIEnv *env, int sock, netif *ifs) { + struct ifconf ifc; + struct ifreq *ifreqP; + char *buf; + int numifs; + unsigned i; + unsigned bufsize; + char *cp, *cplimit; + + /* use SIOCGSIZIFCONF to get size for SIOCGIFCONF */ + + ifc.ifc_buf = NULL; + if (ioctl(sock, SIOCGSIZIFCONF, &(ifc.ifc_len)) < 0) { + NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", + "ioctl SIOCGSIZIFCONF failed"); + return ifs; + } + bufsize = ifc.ifc_len; + + buf = (char *)malloc(bufsize); + if (!buf) { + JNU_ThrowOutOfMemoryError(env, "Network interface native buffer allocation failed"); + return ifs; + } + ifc.ifc_len = bufsize; + ifc.ifc_buf = buf; + if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0) { + NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", + "ioctl CSIOCGIFCONF failed"); + free(buf); + return ifs; + } + + /* + * Iterate through each interface + */ + ifreqP = ifc.ifc_req; + cp = (char *)ifc.ifc_req; + cplimit = cp + ifc.ifc_len; + for ( ; cp < cplimit; cp += (sizeof(ifreqP->ifr_name) + SIZE(ifreqP->ifr_addr))) { + ifreqP = (struct ifreq *)cp; + struct ifreq if2; + + memset((char *)&if2, 0, sizeof(if2)); + strcpy(if2.ifr_name, ifreqP->ifr_name); + + /* + * Skip interface that aren't UP + */ + if (ioctl(sock, SIOCGIFFLAGS, (char *)&if2) >= 0) { + if (!(if2.ifr_flags & IFF_UP)) { + continue; + } + } + + if (ifreqP->ifr_addr.sa_family != AF_INET6) + continue; + + /* + * Add to the list + */ + ifs = addif(env, sock, ifreqP->ifr_name, ifs, + (struct sockaddr *)&(ifreqP->ifr_addr), + AF_INET6, 0); + + /* + * If an exception occurred then free the list + */ + if ((*env)->ExceptionOccurred(env)) { + free(buf); + freeif(ifs); + return NULL; + } + } + + /* + * Free socket and buffer + */ + free(buf); + return ifs; +} +#endif + + static int getIndex(int sock, const char *name){ /* * Try to get the interface index * (Not supported on Solaris 2.6 or 7) */ +#if defined(AIX) + return if_nametoindex(name); +#else struct ifreq if2; strcpy(if2.ifr_name, name); @@ -1181,6 +1301,7 @@ } return if2.ifr_ifindex; +#endif } /** @@ -1247,6 +1368,45 @@ * MAC address. Returns -1 if there is no hardware address on that interface. */ static int getMacAddress(JNIEnv *env, int sock, const char* ifname, const struct in_addr* addr, unsigned char *buf) { +#if defined (AIX) + int size; + struct kinfo_ndd *nddp; + void *end; + + size = getkerninfo(KINFO_NDD, 0, 0, 0); + if (size == 0) { + return -1; + } + + if (size < 0) { + perror("getkerninfo 1"); + return -1; + } + + nddp = (struct kinfo_ndd *)malloc(size); + + if (!nddp) { + return -1; + } + + if (getkerninfo(KINFO_NDD, nddp, &size, 0) < 0) { + exit(1); + } + + end = (void *)nddp + size; + while ((void *)nddp < end) { + if (!strcmp(nddp->ndd_alias, ifname) || + !strcmp(nddp->ndd_name, ifname)) { + bcopy(nddp->ndd_addr, buf, 6); + return 6; + } else { + nddp++; + } + } + + return -1; + +#elif defined(__linux__) static struct ifreq ifr; int i; @@ -1268,6 +1428,7 @@ } return -1; +#endif } static int getMTU(JNIEnv *env, int sock, const char *ifname) {
--- a/src/solaris/native/java/net/PlainSocketImpl.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/java/net/PlainSocketImpl.c Fri Oct 07 03:00:13 2016 +0100 @@ -964,7 +964,7 @@ } if (NET_SetSockOpt(fd, level, optname, (const void *)&optval, optlen) < 0) { -#ifdef __solaris__ +#if defined(__solaris__) || defined(_AIX) if (errno == EINVAL) { // On Solaris setsockopt will set errno to EINVAL if the socket // is closed. The default error message is then confusing
--- a/src/solaris/native/java/net/linux_close.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/java/net/linux_close.c Fri Oct 07 03:00:13 2016 +0100 @@ -23,6 +23,22 @@ * questions. */ +/* + * This file contains implementations of NET_... functions. The NET_.. functions are + * wrappers for common file- and socket functions plus provisions for non-blocking IO. + * + * (basically, the layers remember all file descriptors waiting for a particular fd; + * all threads waiting on a certain fd can be woken up by sending them a signal; this + * is done e.g. when the fd is closed.) + * + * This, originally, was just for linux - hence the name. But we also switched + * this implementation on for AIX when doing the first AIX jck tests in 2006. + * + * Side Note: This coding needs initialization. Under Linux this is done + * automatically via __attribute((constructor)), on AIX this is done manually + * (see linux_close_init). + * + */ #include <stdio.h> #include <stdlib.h> #include <signal.h> @@ -56,13 +72,17 @@ /* * Signal to unblock thread */ +#ifdef _AIX +static int sigWakeup = (SIGRTMAX - 1); +#else static int sigWakeup = (__SIGRTMAX - 2); +#endif /* * The fd table and the number of file descriptors */ -static fdEntry_t *fdTable; -static int fdCount; +static fdEntry_t *fdTable = NULL; +static int fdCount = 0; /* * Null signal handler @@ -74,17 +94,43 @@ * Initialization routine (executed when library is loaded) * Allocate fd tables and sets up signal handler. */ +#ifdef _AIX +/* + * On AIX we don't have __attribute((constructor)) so + * we need to initialize manually + */ +void linux_close_init() { +#else static void __attribute((constructor)) init() { +#endif struct rlimit nbr_files; sigset_t sigset; struct sigaction sa; + /* Check already initialized */ + if (fdCount > 0 && fdTable != NULL) { + return; + } + /* * Allocate table based on the maximum number of * file descriptors. */ - getrlimit(RLIMIT_NOFILE, &nbr_files); + if (-1 == getrlimit(RLIMIT_NOFILE, &nbr_files)) { + fprintf(stderr, "library initialization failed - " + "unable to get max # of allocated fds\n"); + abort(); + } fdCount = nbr_files.rlim_max; + /* + * We have a conceptual problem here, when the number of files is + * unlimited. As a kind of workaround, we ensure the table is big + * enough for handle even a large number of files. Since SAP itself + * recommends a limit of 32000 files, we just use 64000 as 'infinity'. + */ + if (nbr_files.rlim_max == RLIM_INFINITY) { + fdCount = 64000; + } fdTable = (fdEntry_t *)calloc(fdCount, sizeof(fdEntry_t)); if (fdTable == NULL) { fprintf(stderr, "library initialization failed - " @@ -92,6 +138,13 @@ abort(); } + { + int i; + for (i=0; i < fdCount; i++) { + pthread_mutex_init(&fdTable[i].lock, NULL); + } + } + /* * Setup the signal handler */
--- a/src/solaris/native/java/net/net_util_md.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/java/net/net_util_md.c Fri Oct 07 03:00:13 2016 +0100 @@ -1040,7 +1040,11 @@ { java_net_SocketOptions_SO_SNDBUF, SOL_SOCKET, SO_SNDBUF }, { java_net_SocketOptions_SO_RCVBUF, SOL_SOCKET, SO_RCVBUF }, { java_net_SocketOptions_SO_KEEPALIVE, SOL_SOCKET, SO_KEEPALIVE }, +#if defined(HPUX) || defined(AIX) + { java_net_SocketOptions_SO_REUSEADDR, SOL_SOCKET, SO_REUSEPORT }, +#else { java_net_SocketOptions_SO_REUSEADDR, SOL_SOCKET, SO_REUSEADDR }, +#endif { java_net_SocketOptions_SO_BROADCAST, SOL_SOCKET, SO_BROADCAST }, { java_net_SocketOptions_IP_TOS, IPPROTO_IP, IP_TOS }, { java_net_SocketOptions_IP_MULTICAST_IF, IPPROTO_IP, IP_MULTICAST_IF }, @@ -1442,6 +1446,29 @@ } #endif +#ifdef AIX + if (level == SOL_SOCKET) { + if (opt == SO_SNDBUF || opt == SO_RCVBUF) { + /* + * Just try to set the requested size. If it fails we will leave the + * socket option as is. Setting the buffer size means only a hint in + * the jse2/java software layer, see javadoc. In the previous + * solution the buffer has always been truncated to a length of + * 0x100000 Byte, even if the technical limit has not been reached. + * This kind of absolute truncation was unexpected in the jck tests. + */ + int ret = setsockopt(fd, level, opt, arg, len); + if ((ret == 0) || (ret == -1 && errno == ENOBUFS)) { + // Accept failure because of insufficient buffer memory resources. + return 0; + } else { + // Deliver all other kinds of errors. + return ret; + } + } + } +#endif + /* * On Linux the receive buffer is used for both socket * structures and the the packet payload. The implication
--- a/src/solaris/native/java/net/net_util_md.h Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/java/net/net_util_md.h Fri Oct 07 03:00:13 2016 +0100 @@ -36,8 +36,17 @@ #include <sys/poll.h> #endif - -#if defined(__linux__) || defined(MACOSX) +/* + AIX needs a workaround for I/O cancellation, see: + http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/close.htm + ... + The close subroutine is blocked until all subroutines which use the file + descriptor return to usr space. For example, when a thread is calling close + and another thread is calling select with the same file descriptor, the + close subroutine does not return until the select call returns. + ... +*/ +#if defined(__linux__) || defined(MACOSX) || defined (_AIX) extern int NET_Timeout(int s, long timeout); extern int NET_Read(int s, void* buf, size_t len); extern int NET_RecvFrom(int s, void *buf, int len, unsigned int flags,
--- a/src/solaris/native/java/util/TimeZone_md.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/java/util/TimeZone_md.c Fri Oct 07 03:00:13 2016 +0100 @@ -123,7 +123,7 @@ return NULL; } -#if defined(__linux__) || defined(MACOSX) || (defined(__solaris__) \ +#if defined(AIX) || defined(__linux__) || defined(MACOSX) || (defined(__solaris__) \ && (defined(_POSIX_PTHREAD_SEMANTICS) || defined(_LP64))) while (readdir_r(dirp, entry, &dp) == 0 && dp != NULL) { #else @@ -615,6 +615,14 @@ #endif /*__solaris__*/ #endif /*__linux__*/ +#ifdef AIX +static char * +getPlatformTimeZoneID() +{ + return NULL; +} +#endif + /* * findJavaTZ_md() maps platform time zone ID to Java time zone ID * using <java_home>/lib/tzmappings. If the TZ value is not found, it @@ -635,7 +643,7 @@ #if defined(__linux__) || defined(_ALLBSD_SOURCE) if (tz == NULL) { #else -#ifdef __solaris__ +#if defined (__solaris__) || defined(AIX) if (tz == NULL || *tz == '\0') { #endif #endif
--- a/src/solaris/native/sun/awt/awt_LoadLibrary.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/sun/awt/awt_LoadLibrary.c Fri Oct 07 03:00:13 2016 +0100 @@ -76,7 +76,13 @@ jint AWT_OnLoad(JavaVM *vm, void *reserved) { +#if defined(AIX) + jstring propname = NULL; + jstring bootlibpath = NULL; + const char* libpath; +#else Dl_info dlinfo; +#endif char buf[MAXPATHLEN]; int32_t len; char *p, *tk = 0; @@ -95,11 +101,64 @@ jvm = vm; +#if defined(AIX) + propname = (*env)->NewStringUTF(env, "sun.boot.library.path"); + bootlibpath = JNU_CallStaticMethodByName (env, + NULL, + "java/lang/System", + "getProperty", + "(Ljava/lang/String;)Ljava/lang/String;", + propname).l; + libpath = (*env)->GetStringUTFChars(env,bootlibpath,0); + + strncpy(buf,libpath,MAXPATHLEN-1); + (*env)->ReleaseStringUTFChars(env,bootlibpath,libpath); + + // IF condition is added to check if multiple paths are specified in the + // sun.boot.library.path as in the case of sidecar VM configurations. + // Just assume the presence of : as indicator of multiple paths + if(strchr(buf,':') != NULL) + { + + char *temp_buf = (char *)malloc(sizeof(buf)+1); + char *token = (char *)malloc(sizeof(buf)+1); + struct stat sb; + + temp_buf = strtok(buf, ":"); + strcpy(token,temp_buf); + strcat(token,"/xawt/libmawt.so"); + if(stat(token, &sb) == 0) + { + strcpy(buf,temp_buf); + } + else + { + while((temp_buf = strtok(NULL,":")) != NULL) + { + strcpy(token,temp_buf); + strcat(token,"/xawt/libmawt.so"); + if(stat(token, &sb) == 0) + { + strcpy(buf,temp_buf); + break; + } + } + } + } + + p = buf + strlen(buf); + len = strlen(buf); + (*env)->DeleteLocalRef(env,bootlibpath); + bootlibpath = NULL; + (*env)->DeleteLocalRef(env,propname); + propname = NULL; +#else /* Get address of this library and the directory containing it. */ dladdr((void *)AWT_OnLoad, &dlinfo); realpath((char *)dlinfo.dli_fname, buf); len = strlen(buf); p = strrchr(buf, '/'); +#endif /* * 1. Set the "sun.font.fontmanager" system property,
--- a/src/solaris/native/sun/awt/fontpath.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/sun/awt/fontpath.c Fri Oct 07 03:00:13 2016 +0100 @@ -79,7 +79,7 @@ #define MAXFDIRS 512 /* Max number of directories that contain fonts */ -#if !defined(__linux__) && !defined(MACOSX) +#if defined(__solaris__) /* * This can be set in the makefile to "/usr/X11" if so desired. */ @@ -129,7 +129,7 @@ NULL, /* terminates the list */ }; -#elif MACOSX +#elif defined(MACOSX) static char *full_MACOSX_X11FontPath[] = { X11_PATH "/lib/X11/fonts/TrueType", X11_PATH "/lib/X11/fonts/truetype", @@ -145,7 +145,7 @@ PACKAGE_PATH "/share/fonts/Type1", NULL, /* terminates the list */ }; -#else /* __linux */ +#elif defined( __linux__) /* All the known interesting locations we have discovered on * various flavors of Linux */ @@ -165,6 +165,14 @@ "/usr/share/fonts/default/Type1", /* RH 9.0 */ NULL, /* terminates the list */ }; +#elif defined(AIX) +/* Very basic start for AIX - feel free to complete .. + */ +static char *fullAixFontPath[] = { + "/usr/lib/X11/fonts/TrueType", /* */ + "/usr/lib/X11/fonts/Type1", /* */ + NULL, /* terminates the list */ +}; #endif static char **getFontConfigLocations(); @@ -530,8 +538,10 @@ knowndirs = fullLinuxFontPath; #elif defined(MACOSX) knowndirs = full_MACOSX_X11FontPath; -#else /* IF SOLARIS */ +#elif defined(__solaris__) knowndirs = fullSolarisFontPath; +#elif defined(AIX) + knowndirs = fullAixFontPath; #endif /* REMIND: this code requires to be executed when the GraphicsEnvironment @@ -625,6 +635,25 @@ } } #endif + +#if defined(AIX) + /* On AIX, fontconfig is not a standard package supported by IBM. + * insted it has to be installed from the "AIX Toolbox for Linux Applications" + * site http://www-03.ibm.com/systems/power/software/aix/linux/toolbox/alpha.html + * and will be installed under /opt/freeware/lib/libfontconfig.a. + * Notice that the archive contains the real 32- and 64-bit shared libraries. + * We first try to load 'libfontconfig.so' from the default library path in the + * case the user has installed a private version of the library and if that + * doesn't succeed, we try the version from /opt/freeware/lib/libfontconfig.a + */ + libfontconfig = dlopen("libfontconfig.so", RTLD_LOCAL|RTLD_LAZY); + if (libfontconfig == NULL) { + libfontconfig = dlopen("/opt/freeware/lib/libfontconfig.a(libfontconfig.so.1)", RTLD_MEMBER|RTLD_LOCAL|RTLD_LAZY); + if (libfontconfig == NULL) { + return NULL; + } + } +#else /* 64 bit sparc should pick up the right version from the lib path. * New features may be added to libfontconfig, this is expected to * be compatible with old features, but we may need to start @@ -639,6 +668,7 @@ return NULL; } } +#endif /* Version 1.0 of libfontconfig crashes if HOME isn't defined in * the environment. This should generally never happen, but we can't @@ -1234,7 +1264,7 @@ */ if (fontformat != NULL && (strcmp((char*)fontformat, "TrueType") != 0) -#ifdef __linux__ +#if defined(__linux__) || defined(AIX) && (strcmp((char*)fontformat, "Type 1") != 0) #endif ) {
--- a/src/solaris/native/sun/awt/splashscreen/splashscreen_sys.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/sun/awt/splashscreen/splashscreen_sys.c Fri Oct 07 03:00:13 2016 +0100 @@ -68,9 +68,16 @@ if ( codeset == NULL || codeset[0] == 0 ) { goto done; } +#ifdef AIX + /* (AIX<7.1)'s converter tables don't distunguish between */ + /* LE/BE (always BE). Specifying BE makes iconv_open return with an error => So */ + /* don't do it (I checked that there's no BOM in output). */ + codeset_out = "UCS-2"; +#else /* we don't need BOM in output so we choose native BE or LE encoding here */ codeset_out = (platformByteOrder()==BYTE_ORDER_MSBFIRST) ? "UCS-2BE" : "UCS-2LE"; +#endif cd = iconv_open(codeset_out, codeset); if (cd == (iconv_t)-1 ) {
--- a/src/solaris/native/sun/java2d/opengl/OGLFuncs_md.h Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/sun/java2d/opengl/OGLFuncs_md.h Fri Oct 07 03:00:13 2016 +0100 @@ -27,7 +27,7 @@ #define OGLFuncs_md_h_Included #include <stdlib.h> -#ifndef MACOSX +#if !(defined(MACOSX) || defined(AIX)) #include <dlfcn.h> #endif #include "jvm_md.h"
--- a/src/solaris/native/sun/java2d/x11/XRBackendNative.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/sun/java2d/x11/XRBackendNative.c Fri Oct 07 03:00:13 2016 +0100 @@ -68,8 +68,8 @@ #include <dlfcn.h> -#ifdef __solaris__ -/* Solaris 10 will not have these symbols at runtime */ +#if (defined(__solaris__) || defined(AIX)) +/* Solaris 10 and AIX will not have these symbols at runtime */ typedef Picture (*XRenderCreateLinearGradientFuncType) (Display *dpy, @@ -124,7 +124,7 @@ return JNI_FALSE; } -#ifdef __solaris__ +#if (defined(__solaris__) || defined(AIX)) xrenderlib = dlopen("libXrender.so",RTLD_GLOBAL|RTLD_LAZY); if (xrenderlib != NULL) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/native/sun/nio/ch/AixPollPort.c Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright 2012 SAP AG. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +#include "jni.h" +#include "jni_util.h" +#include "jvm.h" +#include "jlong.h" +#include "nio_util.h" + +#include "sun_nio_ch_AixPollPort.h" + +#include <unistd.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/poll.h> +/* pollset may not be available at build time */ +#if 0 +#include <sys/pollset.h> +#else +typedef int pollset_t; +struct poll_ctl { + short cmd; + short events; + int fd; +}; +typedef pollset_t pollset_create_func(int maxfd); +typedef int pollset_destroy_func(pollset_t ps); +typedef int pollset_ctl_func(pollset_t ps, struct poll_ctl *pollctl_array, int array_length); +typedef int pollset_poll_func(pollset_t ps, struct pollfd *polldata_array, int array_length, int timeout); +static pollset_create_func* _pollset_create = NULL; +static pollset_destroy_func* _pollset_destroy = NULL; +static pollset_ctl_func* _pollset_ctl = NULL; +static pollset_poll_func* _pollset_poll = NULL; +#include <dlfcn.h> +/* RTLD_DEFAULT is not available on AIX 5.2 */ +#ifndef RTLD_DEFAULT +#define RTLD_DEFAULT ((void *)(-1)) +#endif +#endif /* pollset */ +#include <fcntl.h> +#include <stddef.h> + +JNIEXPORT void JNICALL +Java_sun_nio_ch_AixPollPort_init(JNIEnv* env, jclass this) { + _pollset_create = (pollset_create_func*) dlsym(RTLD_DEFAULT, "pollset_create"); + _pollset_destroy = (pollset_destroy_func*) dlsym(RTLD_DEFAULT, "pollset_destroy"); + _pollset_ctl = (pollset_ctl_func*) dlsym(RTLD_DEFAULT, "pollset_ctl"); + _pollset_poll = (pollset_poll_func*) dlsym(RTLD_DEFAULT, "pollset_poll"); + if (_pollset_create == NULL || _pollset_destroy == NULL || + _pollset_ctl == NULL || _pollset_poll == NULL) { + JNU_ThrowInternalError(env, "unable to get address of pollset functions"); + } +} + +JNIEXPORT jint JNICALL +Java_sun_nio_ch_AixPollPort_eventSize(JNIEnv* env, jclass this) { + return sizeof(struct pollfd); +} + +JNIEXPORT jint JNICALL +Java_sun_nio_ch_AixPollPort_eventsOffset(JNIEnv* env, jclass this) { + return offsetof(struct pollfd, events); +} + +JNIEXPORT jint JNICALL +Java_sun_nio_ch_AixPollPort_reventsOffset(JNIEnv* env, jclass this) { + return offsetof(struct pollfd, revents); +} + +JNIEXPORT jint JNICALL +Java_sun_nio_ch_AixPollPort_fdOffset(JNIEnv* env, jclass this) { + return offsetof(struct pollfd, fd); +} + +JNIEXPORT jint JNICALL +Java_sun_nio_ch_AixPollPort_pollsetCreate(JNIEnv *env, jclass c) { + /* pollset_create can take the maximum number of fds, but we + * cannot predict this number so we leave it at OPEN_MAX. */ + pollset_t ps = _pollset_create(-1); + if (ps < 0) { + JNU_ThrowIOExceptionWithLastError(env, "pollset_create failed"); + } + return (int)ps; +} + +JNIEXPORT jint JNICALL +Java_sun_nio_ch_AixPollPort_pollsetCtl(JNIEnv *env, jclass c, jint ps, + jint opcode, jint fd, jint events) { + struct poll_ctl event; + int res; + + event.cmd = opcode; + event.events = events; + event.fd = fd; + + RESTARTABLE(_pollset_ctl((pollset_t)ps, &event, 1 /* length */), res); + + return (res == 0) ? 0 : errno; +} + +JNIEXPORT jint JNICALL +Java_sun_nio_ch_AixPollPort_pollsetPoll(JNIEnv *env, jclass c, + jint ps, jlong address, jint numfds) { + struct pollfd *events = jlong_to_ptr(address); + int res; + + RESTARTABLE(_pollset_poll(ps, events, numfds, -1), res); + if (res < 0) { + JNU_ThrowIOExceptionWithLastError(env, "pollset_poll failed"); + } + return res; +} + +JNIEXPORT void JNICALL +Java_sun_nio_ch_AixPollPort_pollsetDestroy(JNIEnv *env, jclass c, jint ps) { + int res; + RESTARTABLE(_pollset_destroy((pollset_t)ps), res); +} + +JNIEXPORT void JNICALL +Java_sun_nio_ch_AixPollPort_socketpair(JNIEnv* env, jclass clazz, jintArray sv) { + int sp[2]; + if (socketpair(PF_UNIX, SOCK_STREAM, 0, sp) == -1) { + JNU_ThrowIOExceptionWithLastError(env, "socketpair failed"); + } else { + jint res[2]; + res[0] = (jint)sp[0]; + res[1] = (jint)sp[1]; + (*env)->SetIntArrayRegion(env, sv, 0, 2, &res[0]); + } +} + +JNIEXPORT void JNICALL +Java_sun_nio_ch_AixPollPort_interrupt(JNIEnv *env, jclass c, jint fd) { + int res; + int buf[1]; + buf[0] = 1; + RESTARTABLE(write(fd, buf, 1), res); + if (res < 0) { + JNU_ThrowIOExceptionWithLastError(env, "write failed"); + } +} + +JNIEXPORT void JNICALL +Java_sun_nio_ch_AixPollPort_drain1(JNIEnv *env, jclass cl, jint fd) { + int res; + char buf[1]; + RESTARTABLE(read(fd, buf, 1), res); + if (res < 0) { + JNU_ThrowIOExceptionWithLastError(env, "drain1 failed"); + } +} + +JNIEXPORT void JNICALL +Java_sun_nio_ch_AixPollPort_close0(JNIEnv *env, jclass c, jint fd) { + int res; + RESTARTABLE(close(fd), res); +}
--- a/src/solaris/native/sun/nio/ch/DatagramChannelImpl.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/sun/nio/ch/DatagramChannelImpl.c Fri Oct 07 03:00:13 2016 +0100 @@ -81,7 +81,7 @@ rv = connect(fd, 0, 0); #endif -#if defined(__linux__) || defined(_ALLBSD_SOURCE) +#if defined(__linux__) || defined(_ALLBSD_SOURCE) || defined(_AIX) { int len; SOCKADDR sa;
--- a/src/solaris/native/sun/nio/ch/FileDispatcherImpl.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/sun/nio/ch/FileDispatcherImpl.c Fri Oct 07 03:00:13 2016 +0100 @@ -36,6 +36,9 @@ #include <unistd.h> #include "nio.h" #include "nio_util.h" +#if defined(_AIX) || defined(__solaris__) || defined(__hpux) +#include <sys/stat.h> +#endif #ifdef _ALLBSD_SOURCE #define stat64 stat @@ -75,6 +78,18 @@ jint fd = fdval(env, fdo); void *buf = (void *)jlong_to_ptr(address); + /* AIX supports reading from directory file descriptors just like files. */ + /* This causes JCK tests to fail so we manually handle the case here. */ + /* Solaris and HP-UX support reading from directory file descriptors too */ + /* (at least for local file systems) so we added them as well. */ +#if defined(_AIX) || defined(__solaris__) || defined(__hpux) + struct stat64 stat_buf; + if (fstat64((int)fd, &stat_buf) != -1 && (stat_buf.st_mode & S_IFMT) == S_IFDIR) { + errno = EISDIR; + return convertReturnVal(env, -1, JNI_TRUE); + } +#endif + return convertReturnVal(env, read(fd, buf, len), JNI_TRUE); } @@ -137,9 +152,10 @@ return IOS_THROWN; } +/* Added parameter writable for AIX platform port. */ JNIEXPORT jint JNICALL Java_sun_nio_ch_FileDispatcherImpl_force0(JNIEnv *env, jobject this, - jobject fdo, jboolean md) + jobject fdo, jboolean md, jboolean writable) { jint fd = fdval(env, fdo); int result = 0; @@ -147,6 +163,13 @@ if (md == JNI_FALSE) { result = fdatasync(fd); } else { +#ifdef _AIX + /* Call this for files opened for writing only + * (AIX: EBADF The FileDescriptor parameter is not a valid file descriptor open for writing.) + */ + if (writable != JNI_TRUE) + return 0; +#endif result = fsync(fd); } return handle(env, result, "Force failed"); @@ -181,6 +204,13 @@ int cmd = 0; struct flock64 fl; + /* fix JCK test api.java.nio.channels.FileChannel.LocksTests */ +#if defined(__hpux) || defined(_AIX) + if (size > 0x7fffffff) { + size = 0x7fffffff; + } +#endif + fl.l_whence = SEEK_SET; if (size == (jlong)java_lang_Long_MAX_VALUE) { fl.l_len = (off64_t)0; @@ -218,6 +248,13 @@ struct flock64 fl; int cmd = F_SETLK64; + /* fix JCK test api.java.nio.channels.FileLock.MethodsTests */ +#if defined(__hpux) || defined (_AIX) + if (size > 0x7fffffff) { + size = 0x7fffffff; + } +#endif + fl.l_whence = SEEK_SET; if (size == (jlong)java_lang_Long_MAX_VALUE) { fl.l_len = (off64_t)0; @@ -235,7 +272,17 @@ static void closeFileDescriptor(JNIEnv *env, int fd) { if (fd != -1) { +#ifdef _AIX + /* + * Use NET_SocketClose to provide non-blocking close (CSN 561561 2010) + * Note that this should also work for files, not only sockets. + * Due to time constraints I do this for AIX only. The whole + * "blocking close in nio" issue needs more investigation. + */ + int result = NET_SocketClose(fd); +#else int result = close(fd); +#endif if (result < 0) JNU_ThrowIOExceptionWithLastError(env, "Close failed"); } @@ -251,11 +298,16 @@ JNIEXPORT void JNICALL Java_sun_nio_ch_FileDispatcherImpl_preClose0(JNIEnv *env, jclass clazz, jobject fdo) { +#ifdef _AIX + /* AIX port: preclosing breaks JCK tests api.java.nio.channels.FileLock.MethodsTests */ + return; +#else jint fd = fdval(env, fdo); if (preCloseFD >= 0) { if (dup2(preCloseFD, fd) < 0) JNU_ThrowIOExceptionWithLastError(env, "dup2 failed"); } +#endif } JNIEXPORT void JNICALL
--- a/src/solaris/native/sun/nio/ch/Net.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/sun/nio/ch/Net.c Fri Oct 07 03:00:13 2016 +0100 @@ -39,24 +39,48 @@ #include "nio_util.h" #include "nio.h" -#ifdef _ALLBSD_SOURCE +#ifdef AIX +#include <sys/utsname.h> +#endif + +#if defined(_ALLBSD_SOURCE) || defined(AIX) #ifndef IP_BLOCK_SOURCE +#if defined(AIX) + +#define IP_BLOCK_SOURCE 58 /* Block data from a given source to a given group */ +#define IP_UNBLOCK_SOURCE 59 /* Unblock data from a given source to a given group */ +#define IP_ADD_SOURCE_MEMBERSHIP 60 /* Join a source-specific group */ +#define IP_DROP_SOURCE_MEMBERSHIP 61 /* Leave a source-specific group */ + +#else + #define IP_ADD_SOURCE_MEMBERSHIP 70 /* join a source-specific group */ #define IP_DROP_SOURCE_MEMBERSHIP 71 /* drop a single source */ #define IP_BLOCK_SOURCE 72 /* block a source */ #define IP_UNBLOCK_SOURCE 73 /* unblock a source */ +#endif /* AIX */ + #endif /* IP_BLOCK_SOURCE */ #ifndef MCAST_BLOCK_SOURCE +#if !defined(AIX) + #define MCAST_JOIN_SOURCE_GROUP 82 /* join a source-specific group */ #define MCAST_LEAVE_SOURCE_GROUP 83 /* leave a single source */ #define MCAST_BLOCK_SOURCE 84 /* block a source */ #define MCAST_UNBLOCK_SOURCE 85 /* unblock a source */ +#endif /* AIX */ + +#define MCAST_BLOCK_SOURCE 64 +#define MCAST_UNBLOCK_SOURCE 65 +#define MCAST_JOIN_SOURCE_GROUP 66 +#define MCAST_LEAVE_SOURCE_GROUP 67 + #endif /* MCAST_BLOCK_SOURCE */ #ifndef IPV6_ADD_MEMBERSHIP @@ -89,6 +113,7 @@ #define COPY_INET6_ADDRESS(env, source, target) \ (*env)->GetByteArrayRegion(env, source, 0, 16, target) + /* * Copy IPv6 group, interface index, and IPv6 source address * into group_source_req structure. @@ -111,6 +136,40 @@ } #endif +#ifdef _AIX + +/* + * Checks whether or not "socket extensions for multicast source filters" is supported. + * Returns JNI_TRUE if it is supported, JNI_FALSE otherwise + */ +static jboolean isSourceFilterSupported(){ + static jboolean alreadyChecked = JNI_FALSE; + static jboolean result = JNI_TRUE; + if (alreadyChecked != JNI_TRUE){ + struct utsname uts; + memset(&uts, 0, sizeof(uts)); + strcpy(uts.sysname, "?"); + const int utsRes = uname(&uts); + int major = -1; + int minor = -1; + major = atoi(uts.version); + minor = atoi(uts.release); + if (strcmp(uts.sysname, "OS400") == 0){// usupported on OS400 < 7.1 + if (major < 7 || (major == 7 && minor < 1)) { + result = JNI_FALSE; + } + } else if (strcmp(uts.sysname, "AIX") == 0) { + if (major < 6 || (major == 6 && minor < 1)) {// usupported on aix < 6.1 + result = JNI_FALSE; + } + } + alreadyChecked = JNI_TRUE; + } + return result; +} + +#endif /* AIX */ + JNIEXPORT void JNICALL Java_sun_nio_ch_Net_initIDs(JNIEnv *env, jclass clazz) { @@ -454,6 +513,15 @@ /* no IPv4 include-mode filtering for now */ return IOS_UNAVAILABLE; #else + +#ifdef _AIX + /* check AIX and OS400 for support of source filtering */ + if (isSourceFilterSupported() != JNI_TRUE){ + JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", ""); + return -1; + } +#endif + mreq_source.imr_multiaddr.s_addr = htonl(group); mreq_source.imr_sourceaddr.s_addr = htonl(source); mreq_source.imr_interface.s_addr = htonl(interf); @@ -465,9 +533,17 @@ n = setsockopt(fdval(env,fdo), IPPROTO_IP, opt, optval, optlen); if (n < 0) { - if (join && (errno == ENOPROTOOPT)) + /* catch genreric unsupported error for 'socket extension for multicast source filter' + * I did not put this inside function handleSocketError to prevent any changes in behaviour of other calls. + */ + int last_err = errno; + if (join && source && (last_err == EOPNOTSUPP)){ + JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", ""); + return -1; + } + if (join && (last_err == ENOPROTOOPT)) return IOS_UNAVAILABLE; - handleSocketError(env, errno); + handleSocketError(env, last_err); } return 0; } @@ -484,6 +560,14 @@ int n; int opt = (block) ? IP_BLOCK_SOURCE : IP_UNBLOCK_SOURCE; +#ifdef _AIX + /* check AIX and OS400 for support of source filtering */ + if (isSourceFilterSupported() != JNI_TRUE){ + JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", ""); + return -1; + } +#endif + mreq_source.imr_multiaddr.s_addr = htonl(group); mreq_source.imr_sourceaddr.s_addr = htonl(source); mreq_source.imr_interface.s_addr = htonl(interf); @@ -491,9 +575,17 @@ n = setsockopt(fdval(env,fdo), IPPROTO_IP, opt, (void*)&mreq_source, sizeof(mreq_source)); if (n < 0) { - if (block && (errno == ENOPROTOOPT)) + /* catch generic unsupported error for 'socket extension for multicast source filter' + * I did not put this inside function handleSocketError to prevent any changes in behaviour of other calls. + */ + int last_err = errno; + if (block && source && (last_err == EOPNOTSUPP)){ + JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", ""); + return -1; + } + if (block && (last_err == ENOPROTOOPT)) return IOS_UNAVAILABLE; - handleSocketError(env, errno); + handleSocketError(env, last_err); } return 0; #endif @@ -529,9 +621,17 @@ n = setsockopt(fdval(env,fdo), IPPROTO_IPV6, opt, optval, optlen); if (n < 0) { - if (join && (errno == ENOPROTOOPT)) + /* catch genreric unsupported error for 'socket extension for multicast source filter' + * I did not put this inside function handleSocketError to prevent any changes in behaviour of other calls. + */ + int last_err = errno; + if (join && source && (last_err == EOPNOTSUPP)) { + JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", ""); + return -1; + } + if (join && (last_err == ENOPROTOOPT)) return IOS_UNAVAILABLE; - handleSocketError(env, errno); + handleSocketError(env, last_err); } return 0; #else @@ -558,9 +658,17 @@ n = setsockopt(fdval(env,fdo), IPPROTO_IPV6, opt, (void*)&req, sizeof(req)); if (n < 0) { - if (block && (errno == ENOPROTOOPT)) + /* catch genreric unsupported error for 'socket extension for multicast source filter' + * I did not put this inside function handleSocketError to prevent any changes in behaviour of other calls. + */ + int last_err = errno; + if (block && source && (last_err == EOPNOTSUPP)) { + JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", ""); + return -1; + } + if (block && (last_err == ENOPROTOOPT)) return IOS_UNAVAILABLE; - handleSocketError(env, errno); + handleSocketError(env, last_err); } return 0; #endif
--- a/src/solaris/native/sun/nio/ch/PollArrayWrapper.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/sun/nio/ch/PollArrayWrapper.c Fri Oct 07 03:00:13 2016 +0100 @@ -32,6 +32,18 @@ #include <unistd.h> #include <sys/time.h> +#ifdef _AIX +/* hard coded values in java code do not match system header values */ +#include <string.h> +#include <stdlib.h> +#define JAVA_POLLIN 0x0001 +#define JAVA_POLLOUT 0x0004 +#define JAVA_POLLERR 0x0008 +#define JAVA_POLLHUP 0x0010 +#define JAVA_POLLNVAL 0x0020 +#define JAVA_POLLREMOVE 0x0800 /* not used yet in Java but ment to deregister fd */ +#endif + #define RESTARTABLE(_cmd, _result) do { \ do { \ _result = _cmd; \ @@ -78,11 +90,48 @@ a = (struct pollfd *) jlong_to_ptr(address); +#ifdef _AIX + /* hard coded values in java code do not match system header values */ + { + int i; + struct pollfd *aa = (struct pollfd*) malloc(numfds * sizeof(struct pollfd)); + if (aa == NULL) { + JNU_ThrowIOExceptionWithLastError(env, "Poll failed"); + return (jint)-1; + } + memcpy(aa, a, numfds * sizeof(struct pollfd)); + /* translate hardcoded java (SOLARIS) event flags to AIX event flags */ + for (i=0; i<numfds; i++) { + aa[i].events = 0; + if (a[i].events & JAVA_POLLIN) aa[i].events |= POLLIN; + if (a[i].events & JAVA_POLLOUT) aa[i].events |= POLLOUT; + if (a[i].events & JAVA_POLLERR) aa[i].events |= POLLERR; + if (a[i].events & JAVA_POLLHUP) aa[i].events |= POLLHUP; + if (a[i].events & JAVA_POLLNVAL) aa[i].events |= POLLNVAL; + /* For the time being we don't support JAVA_POLLREMOVE. */ + } + if (timeout <= 0) { /* Indefinite or no wait */ + RESTARTABLE (poll(aa, numfds, timeout), err); + } else { /* Bounded wait; bounded restarts */ + err = ipoll(aa, numfds, timeout); + } + /* transfer resulting event flags back to the hardcoded java event flags */ + for (i=0; i<numfds; i++) { + if (aa[i].revents & POLLIN) a[i].revents |= JAVA_POLLIN; + if (aa[i].revents & POLLOUT) a[i].revents |= JAVA_POLLOUT; + if (aa[i].revents & POLLERR) a[i].revents |= JAVA_POLLERR; + if (aa[i].revents & POLLHUP) a[i].revents |= JAVA_POLLHUP; + if (aa[i].revents & POLLNVAL) a[i].revents |= JAVA_POLLNVAL; + } + free(aa); + } +#else if (timeout <= 0) { /* Indefinite or no wait */ RESTARTABLE (poll(a, numfds, timeout), err); - } else { /* Bounded wait; bounded restarts */ + } else { /* Bounded wait; bounded restarts */ err = ipoll(a, numfds, timeout); } +#endif if (err < 0) { JNU_ThrowIOExceptionWithLastError(env, "Poll failed");
--- a/src/solaris/native/sun/nio/ch/ServerSocketChannelImpl.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/sun/nio/ch/ServerSocketChannelImpl.c Fri Oct 07 03:00:13 2016 +0100 @@ -87,7 +87,16 @@ */ for (;;) { socklen_t sa_len = alloc_len; +#ifdef _AIX + /* + * use NET_.. APIs to get interruptible IO (CSN 561561 2010) (see linux_close.c) + * Due to time constraints I do this for AIX only. The whole "blocking close in nio" + * issue needs more investigating. + */ + newfd = NET_Accept(ssfd, sa, &sa_len); +#else newfd = accept(ssfd, sa, &sa_len); +#endif if (newfd >= 0) { break; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/native/sun/nio/fs/AixNativeDispatcher.c Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright 2013 SAP AG. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +#include <stdlib.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/mntctl.h> + +#include "jni.h" +#include "jni_util.h" + +#include "sun_nio_fs_AixNativeDispatcher.h" + +static jfieldID entry_name; +static jfieldID entry_dir; +static jfieldID entry_fstype; +static jfieldID entry_options; + +static jclass entry_cls; + +/** + * Call this to throw an internal UnixException when a system/library + * call fails + */ +static void throwUnixException(JNIEnv* env, int errnum) { + jobject x = JNU_NewObjectByName(env, "sun/nio/fs/UnixException", + "(I)V", errnum); + if (x != NULL) { + (*env)->Throw(env, x); + } +} + +/** + * Initialization + */ +JNIEXPORT jint JNICALL +Java_sun_nio_fs_AixNativeDispatcher_init(JNIEnv* env, jclass this) +{ + jint flags = 0; + jclass clazz; + + clazz = (*env)->FindClass(env, "sun/nio/fs/UnixMountEntry"); + if (clazz == NULL) { + return 0; + } + entry_name = (*env)->GetFieldID(env, clazz, "name", "[B"); + entry_dir = (*env)->GetFieldID(env, clazz, "dir", "[B"); + entry_fstype = (*env)->GetFieldID(env, clazz, "fstype", "[B"); + entry_options = (*env)->GetFieldID(env, clazz, "opts", "[B"); + entry_cls = (*env)->NewGlobalRef(env, clazz); + + return 0; +} + +/* Special implementation of getextmntent (see UnixNativeDispatcher.c) that returns all entries at once */ +JNIEXPORT jobjectArray JNICALL +Java_sun_nio_fs_AixNativeDispatcher_getmntctl(JNIEnv* env, jclass this) +{ + int must_free_buf = 0; + char stack_buf[1024]; + char* buffer = stack_buf; + size_t buffer_size = 1024; + int num_entries; + int i; + jobjectArray ret; + struct vmount * vm; + + for (i = 0; i < 5; i++) { + num_entries = mntctl(MCTL_QUERY, buffer_size, buffer); + if (num_entries != 0) { + break; + } + if (must_free_buf) { + free(buffer); + } + buffer_size *= 8; + buffer = malloc(buffer_size); + must_free_buf = 1; + } + /* Treat zero entries like errors. */ + if (num_entries <= 0) { + if (must_free_buf) { + free(buffer); + } + throwUnixException(env, errno); + return NULL; + } + ret = (*env)->NewObjectArray(env, num_entries, entry_cls, NULL); + if (ret == NULL) { + if (must_free_buf) { + free(buffer); + } + return NULL; + } + vm = (struct vmount*)buffer; + for (i = 0; i < num_entries; i++) { + jsize len; + jbyteArray bytes; + const char* fstype; + /* We set all relevant attributes so there is no need to call constructor. */ + jobject entry = (*env)->AllocObject(env, entry_cls); + if (entry == NULL) { + if (must_free_buf) { + free(buffer); + } + return NULL; + } + (*env)->SetObjectArrayElement(env, ret, i, entry); + + /* vm->vmt_data[...].vmt_size is 32 bit aligned and also includes NULL byte. */ + /* Since we only need the characters, it is necessary to check string size manually. */ + len = strlen((char*)vm + vm->vmt_data[VMT_OBJECT].vmt_off); + bytes = (*env)->NewByteArray(env, len); + if (bytes == NULL) { + if (must_free_buf) { + free(buffer); + } + return NULL; + } + (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)((char *)vm + vm->vmt_data[VMT_OBJECT].vmt_off)); + (*env)->SetObjectField(env, entry, entry_name, bytes); + + len = strlen((char*)vm + vm->vmt_data[VMT_STUB].vmt_off); + bytes = (*env)->NewByteArray(env, len); + if (bytes == NULL) { + if (must_free_buf) { + free(buffer); + } + return NULL; + } + (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)((char *)vm + vm->vmt_data[VMT_STUB].vmt_off)); + (*env)->SetObjectField(env, entry, entry_dir, bytes); + + switch (vm->vmt_gfstype) { + case MNT_J2: + fstype = "jfs2"; + break; + case MNT_NAMEFS: + fstype = "namefs"; + break; + case MNT_NFS: + fstype = "nfs"; + break; + case MNT_JFS: + fstype = "jfs"; + break; + case MNT_CDROM: + fstype = "cdrom"; + break; + case MNT_PROCFS: + fstype = "procfs"; + break; + case MNT_NFS3: + fstype = "nfs3"; + break; + case MNT_AUTOFS: + fstype = "autofs"; + break; + case MNT_UDF: + fstype = "udfs"; + break; + case MNT_NFS4: + fstype = "nfs4"; + break; + case MNT_CIFS: + fstype = "smbfs"; + break; + default: + fstype = "unknown"; + } + len = strlen(fstype); + bytes = (*env)->NewByteArray(env, len); + if (bytes == NULL) { + if (must_free_buf) { + free(buffer); + } + return NULL; + } + (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)fstype); + (*env)->SetObjectField(env, entry, entry_fstype, bytes); + + len = strlen((char*)vm + vm->vmt_data[VMT_ARGS].vmt_off); + bytes = (*env)->NewByteArray(env, len); + if (bytes == NULL) { + if (must_free_buf) { + free(buffer); + } + return NULL; + } + (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)((char *)vm + vm->vmt_data[VMT_ARGS].vmt_off)); + (*env)->SetObjectField(env, entry, entry_options, bytes); + + /* goto the next vmount structure: */ + vm = (struct vmount *)((char *)vm + vm->vmt_length); + } + + if (must_free_buf) { + free(buffer); + } + return ret; +}
--- a/src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c Fri Oct 07 03:00:13 2016 +0100 @@ -59,6 +59,11 @@ #define readdir64_r readdir_r #endif +/* Needed for strerror */ +#if defined(_AIX) || defined (__hpux__) +#include <string.h> +#endif + #include "jni.h" #include "jni_util.h" #include "jlong.h" @@ -105,6 +110,13 @@ static jfieldID entry_options; static jfieldID entry_dev; +/* AIX and HP-UX need a couple more references for futimes emulation */ +#if defined(_AIX) || defined (__hpux__) +static jmethodID disp_copy2buf; +static jfieldID buffer_address; +static jmethodID buffer_release; +#endif + /** * System calls that may not be available at run time. */ @@ -206,6 +218,17 @@ entry_options = (*env)->GetFieldID(env, clazz, "opts", "[B"); entry_dev = (*env)->GetFieldID(env, clazz, "dev", "J"); + /* AIX and HP-UX need a couple more references for futimes emulation */ +#if defined(_AIX) || defined (__hpux__) + disp_copy2buf = (*env)->GetStaticMethodID(env, this, "copyToNativeBuffer", "(Lsun/nio/fs/UnixPath;)Lsun/nio/fs/NativeBuffer;"); + clazz = (*env)->FindClass(env, "sun/nio/fs/NativeBuffer"); + if (clazz == NULL) { + return 0; + } + buffer_address = (*env)->GetFieldID(env, clazz, "address", "J"); + buffer_release = (*env)->GetMethodID(env, clazz, "release", "()V"); +#endif + /* system calls that might not be available at run time */ #if (defined(__solaris__) && defined(_LP64)) || defined(_ALLBSD_SOURCE) @@ -263,7 +286,13 @@ jsize len; jbyteArray bytes; + /* strerror is not thread-safe on AIX */ +#ifdef _AIX + char buffer[256]; + msg = (strerror_r((int)error, buffer, 256) == 0) ? buffer : "Error while calling strerror_r"; +#else msg = strerror((int)error); +#endif len = strlen(msg); bytes = (*env)->NewByteArray(env, len); if (bytes != NULL) { @@ -550,9 +579,10 @@ } } +/* Added path of file "filedes" for platform ports (only needed on AIX and HPUX) */ JNIEXPORT void JNICALL Java_sun_nio_fs_UnixNativeDispatcher_futimes(JNIEnv* env, jclass this, jint filedes, - jlong accessTime, jlong modificationTime) + jlong accessTime, jlong modificationTime, jobject path) { struct timeval times[2]; int err = 0; @@ -565,16 +595,38 @@ #ifdef _ALLBSD_SOURCE RESTARTABLE(futimes(filedes, ×[0]), err); + + if (err == -1) { + throwUnixException(env, errno); + } #else - if (my_futimesat_func == NULL) { + if (my_futimesat_func != NULL) { + RESTARTABLE((*my_futimesat_func)(filedes, NULL, ×[0]), err); + + if (err == -1) { + throwUnixException(env, errno); + } + } + /* AIX and HP-UX does not provide futimes as system call => use utimes instead */ +#if defined(_AIX) || defined (__hpux__) + else { + jobject buffer = (*env)->CallStaticObjectMethod(env, this, disp_copy2buf, path); + jlong path_address = (*env)->GetLongField(env, buffer, buffer_address); + const char* path = (const char*)jlong_to_ptr(path_address); + RESTARTABLE(utimes(path, ×[0]), err); + if (err == -1) { + throwUnixException(env, errno); + } + (*env)->CallVoidMethod(env, buffer, buffer_release); + } +#else + else { JNU_ThrowInternalError(env, "my_ftimesat_func is NULL"); return; } - RESTARTABLE((*my_futimesat_func)(filedes, NULL, ×[0]), err); #endif - if (err == -1) { - throwUnixException(env, errno); - } + +#endif } JNIEXPORT jlong JNICALL @@ -626,12 +678,21 @@ char name_extra[PATH_MAX + 1 - sizeof result->d_name]; } entry; struct dirent64* ptr = &entry.buf; + int res; DIR* dirp = jlong_to_ptr(value); /* EINTR not listed as a possible error */ /* TDB: reentrant version probably not required here */ res = readdir64_r(dirp, ptr, &result); + + /* AIX returns EBADF for directory stream end which is no error. */ +#ifdef _AIX + if (res != 0) { + res = (result == NULL && res == EBADF) ? 0 : errno; + } +#endif + if (res != 0) { throwUnixException(env, res); return NULL; @@ -835,6 +896,17 @@ if (err == -1) { throwUnixException(env, errno); } else { + /* Number of blocks (f_blocks) may be too big for signed long on AIX for /proc. */ +#ifdef _AIX + if (buf.f_blocks == ULONG_MAX) { + buf.f_blocks = 0; + } + /* Number of free or available blocks can never exceed total number of blocks (seen on /QOpt as400) */ + if (buf.f_blocks == 0) { + buf.f_bfree = 0; + buf.f_bavail = 0; + } +#endif (*env)->SetLongField(env, attrs, attrs_f_frsize, long_to_jlong(buf.f_frsize)); (*env)->SetLongField(env, attrs, attrs_f_blocks, long_to_jlong(buf.f_blocks)); (*env)->SetLongField(env, attrs, attrs_f_bfree, long_to_jlong(buf.f_bfree)); @@ -911,7 +983,12 @@ if (res != 0 || p == NULL || p->pw_name == NULL || *(p->pw_name) == '\0') { /* not found or error */ if (errno == 0) + /* getpwuid_r returns ESRCH if user does not exist on AIX */ +#ifdef _AIX + errno = ESRCH; +#else errno = ENOENT; +#endif throwUnixException(env, errno); } else { jsize len = strlen(p->pw_name); @@ -966,7 +1043,12 @@ retry = 1; } else { if (errno == 0) + /* getgrgid_r returns ESRCH if group does not exist on AIX */ +#ifdef _AIX + errno = ESRCH; +#else errno = ENOENT; +#endif throwUnixException(env, errno); } } else {
--- a/src/solaris/native/sun/security/pkcs11/j2secmod_md.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/sun/security/pkcs11/j2secmod_md.c Fri Oct 07 03:00:13 2016 +0100 @@ -50,7 +50,11 @@ { const char *libName = (*env)->GetStringUTFChars(env, jLibName, NULL); // look up existing handle only, do not load +#if defined(AIX) + void *hModule = dlopen(libName, RTLD_LAZY); +#else void *hModule = dlopen(libName, RTLD_NOLOAD); +#endif dprintf2("-handle for %s: %u\n", libName, hModule); (*env)->ReleaseStringUTFChars(env, jLibName, libName); return ptr_to_jlong(hModule);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/native/sun/tools/attach/AixVirtualMachine.c Fri Oct 07 03:00:13 2016 +0100 @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright 2013 SAP AG. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +#include "jni.h" +#include "jni_util.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <signal.h> +#include <dirent.h> +#include <ctype.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <sys/un.h> + +/* + * Based on 'LinuxVirtualMachine.c'. Non-relevant code has been removed and all + * occurrences of the string "Linux" have been replaced by "Aix". + */ + +#include "sun_tools_attach_AixVirtualMachine.h" + +#define RESTARTABLE(_cmd, _result) do { \ + do { \ + _result = _cmd; \ + } while((_result == -1) && (errno == EINTR)); \ +} while(0) + + +/* + * Class: sun_tools_attach_AixVirtualMachine + * Method: socket + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_sun_tools_attach_AixVirtualMachine_socket + (JNIEnv *env, jclass cls) +{ + int fd = socket(PF_UNIX, SOCK_STREAM, 0); + if (fd == -1) { + JNU_ThrowIOExceptionWithLastError(env, "socket"); + } + /* added time out values */ + else { + struct timeval tv; + tv.tv_sec = 2 * 60; + tv.tv_usec = 0; + + setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv)); + setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(tv)); + } + return (jint)fd; +} + +/* + * Class: sun_tools_attach_AixVirtualMachine + * Method: connect + * Signature: (ILjava/lang/String;)I + */ +JNIEXPORT void JNICALL Java_sun_tools_attach_AixVirtualMachine_connect + (JNIEnv *env, jclass cls, jint fd, jstring path) +{ + jboolean isCopy; + const char* p = GetStringPlatformChars(env, path, &isCopy); + if (p != NULL) { + struct sockaddr_un addr; + int err = 0; + + /* added missing structure initialization */ + memset(&addr,0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strcpy(addr.sun_path, p); + /* We must call bind with the actual socketaddr length. This is obligatory for AS400. */ + if (connect(fd, (struct sockaddr*)&addr, SUN_LEN(&addr)) == -1) { + err = errno; + } + + if (isCopy) { + JNU_ReleaseStringPlatformChars(env, path, p); + } + + /* + * If the connect failed then we throw the appropriate exception + * here (can't throw it before releasing the string as can't call + * JNI with pending exception) + */ + if (err != 0) { + if (err == ENOENT) { + JNU_ThrowByName(env, "java/io/FileNotFoundException", NULL); + } else { + char* msg = strdup(strerror(err)); + JNU_ThrowIOException(env, msg); + if (msg != NULL) { + free(msg); + } + } + } + } +} + + +/* + * Structure and callback function used to send a QUIT signal to all + * children of a given process + */ +typedef struct { + pid_t ppid; +} SendQuitContext; + +static void SendQuitCallback(const pid_t pid, void* user_data) { + SendQuitContext* context = (SendQuitContext*)user_data; + pid_t parent = getParent(pid); + if (parent == context->ppid) { + kill(pid, SIGQUIT); + } +} + +/* + * Class: sun_tools_attach_AixVirtualMachine + * Method: sendQuitTo + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_sun_tools_attach_AixVirtualMachine_sendQuitTo + (JNIEnv *env, jclass cls, jint pid) +{ + if (kill((pid_t)pid, SIGQUIT)) { + JNU_ThrowIOExceptionWithLastError(env, "kill"); + } +} + +/* + * Class: sun_tools_attach_AixVirtualMachine + * Method: checkPermissions + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_sun_tools_attach_AixVirtualMachine_checkPermissions + (JNIEnv *env, jclass cls, jstring path) +{ + jboolean isCopy; + const char* p = GetStringPlatformChars(env, path, &isCopy); + if (p != NULL) { + struct stat64 sb; + uid_t uid, gid; + int res; + /* added missing initialization of the stat64 buffer */ + memset(&sb, 0, sizeof(struct stat64)); + + /* + * Check that the path is owned by the effective uid/gid of this + * process. Also check that group/other access is not allowed. + */ + uid = geteuid(); + gid = getegid(); + + res = stat64(p, &sb); + if (res != 0) { + /* save errno */ + res = errno; + } + + /* release p here before we throw an I/O exception */ + if (isCopy) { + JNU_ReleaseStringPlatformChars(env, path, p); + } + + if (res == 0) { + if ( (sb.st_uid != uid) || (sb.st_gid != gid) || + ((sb.st_mode & (S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) != 0) ) { + JNU_ThrowIOException(env, "well-known file is not secure"); + } + } else { + char* msg = strdup(strerror(res)); + JNU_ThrowIOException(env, msg); + if (msg != NULL) { + free(msg); + } + } + } +} + +/* + * Class: sun_tools_attach_AixVirtualMachine + * Method: close + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_sun_tools_attach_AixVirtualMachine_close + (JNIEnv *env, jclass cls, jint fd) +{ + int res; + /* Fixed deadlock when this call of close by the client is not seen by the attach server + * which has accepted the (very short) connection already and is waiting for the request. But read don't get a byte, + * because the close is lost without shutdown. + */ + shutdown(fd, 2); + RESTARTABLE(close(fd), res); +} + +/* + * Class: sun_tools_attach_AixVirtualMachine + * Method: read + * Signature: (I[BI)I + */ +JNIEXPORT jint JNICALL Java_sun_tools_attach_AixVirtualMachine_read + (JNIEnv *env, jclass cls, jint fd, jbyteArray ba, jint off, jint baLen) +{ + unsigned char buf[128]; + size_t len = sizeof(buf); + ssize_t n; + + size_t remaining = (size_t)(baLen - off); + if (len > remaining) { + len = remaining; + } + + RESTARTABLE(read(fd, buf+off, len), n); + if (n == -1) { + JNU_ThrowIOExceptionWithLastError(env, "read"); + } else { + if (n == 0) { + n = -1; // EOF + } else { + (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf+off)); + } + } + return n; +} + +/* + * Class: sun_tools_attach_AixVirtualMachine + * Method: write + * Signature: (I[B)V + */ +JNIEXPORT void JNICALL Java_sun_tools_attach_AixVirtualMachine_write + (JNIEnv *env, jclass cls, jint fd, jbyteArray ba, jint off, jint bufLen) +{ + size_t remaining = bufLen; + do { + unsigned char buf[128]; + size_t len = sizeof(buf); + int n; + + if (len > remaining) { + len = remaining; + } + (*env)->GetByteArrayRegion(env, ba, off, len, (jbyte *)buf); + + RESTARTABLE(write(fd, buf, len), n); + if (n > 0) { + off += n; + remaining -= n; + } else { + JNU_ThrowIOExceptionWithLastError(env, "write"); + return; + } + + } while (remaining > 0); +}
--- a/src/solaris/native/sun/tools/attach/BsdVirtualMachine.c Fri Jul 29 18:03:42 2016 +0100 +++ b/src/solaris/native/sun/tools/attach/BsdVirtualMachine.c Fri Oct 07 03:00:13 2016 +0100 @@ -37,7 +37,11 @@ #include <sys/types.h> #include <sys/socket.h> #include <sys/stat.h> +#if defined(AIX) +#include <sys/limits.h> +#else #include <sys/syslimits.h> +#endif #include <sys/un.h> #include <fcntl.h>
--- a/src/windows/classes/sun/nio/ch/FileDispatcherImpl.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/windows/classes/sun/nio/ch/FileDispatcherImpl.java Fri Oct 07 03:00:13 2016 +0100 @@ -85,7 +85,8 @@ return writev0(fd, address, len, append); } - int force(FileDescriptor fd, boolean metaData) throws IOException { + // Added parameter writable for AIX platform port (not used on Windows). + int force(FileDescriptor fd, boolean metaData, boolean writable) throws IOException { return force0(fd, metaData); }
--- a/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java Fri Jul 29 18:03:42 2016 +0100 +++ b/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java Fri Oct 07 03:00:13 2016 +0100 @@ -202,7 +202,8 @@ public void force(boolean metaData) throws IOException { try { begin(); - nd.force(fdObj, metaData); + // Added parameter writable for AIX platform port (not used on Windows). + nd.force(fdObj, metaData, writing); } finally { end(); }
--- a/test/com/sun/jdi/Solaris32AndSolaris64Test.sh Fri Jul 29 18:03:42 2016 +0100 +++ b/test/com/sun/jdi/Solaris32AndSolaris64Test.sh Fri Oct 07 03:00:13 2016 +0100 @@ -112,7 +112,7 @@ fi ;; - Linux | Darwin ) + Linux | Darwin | AIX ) pass "This test always passes on $OS" ;;
--- a/test/java/net/URL/runconstructor.sh Fri Jul 29 18:03:42 2016 +0100 +++ b/test/java/net/URL/runconstructor.sh Fri Oct 07 03:00:13 2016 +0100 @@ -27,7 +27,7 @@ # OS=`uname -s` case "$OS" in - SunOS | Linux | Darwin ) + SunOS | Linux | Darwin | AIX ) PS=":" FS="/" ;;
--- a/test/java/util/ResourceBundle/Control/ExpirationTest.sh Fri Jul 29 18:03:42 2016 +0100 +++ b/test/java/util/ResourceBundle/Control/ExpirationTest.sh Fri Oct 07 03:00:13 2016 +0100 @@ -75,7 +75,7 @@ SunOS | Darwin) DEL=":" ;; -Linux) +Linux | AIX) DEL=":" HAS_S=YES ;;