Merge
This commit is contained in:
commit
81a8e473dc
1
.hgtags
1
.hgtags
@ -524,3 +524,4 @@ e38473506688e0995e701fc7f77d5a91b438ef93 jdk-12+18
|
||||
dc1f9dec2018a37fedba47d8a2aedef99faaec64 jdk-12+19
|
||||
40098289d5804c3b5e7074bc75501a81e70d9b0d jdk-12+20
|
||||
f8fb0c86f2b3d24294d39c5685a628e1beb14ba7 jdk-12+21
|
||||
732bec44c89e8b93a38296bf690f97b7230c5b6d jdk-12+22
|
||||
|
@ -464,6 +464,10 @@ CC: Sun C++ 5.13 SunOS_i386 151846-10 2015/10/30</code></pre>
|
||||
<li><code>--with-jvm-features=<feature>[,<feature>...]</code> - Use the specified JVM features when building Hotspot. The list of features will be enabled on top of the default list. For the <code>custom</code> JVM variant, this default list is empty. A complete list of available JVM features can be found using <code>bash configure --help</code>.</li>
|
||||
<li><code>--with-target-bits=<bits></code> - Create a target binary suitable for running on a <code><bits></code> platform. Use this to create 32-bit output on a 64-bit build platform, instead of doing a full cross-compile. (This is known as a <em>reduced</em> build.)</li>
|
||||
</ul>
|
||||
<p>On Linux, BSD and AIX, it is possible to override where Java by default searches for runtime/JNI libraries. This can be useful in situations where there is a special shared directory for system JNI libraries. This setting can in turn be overriden at runtime by setting the <code>java.library.path</code> property.</p>
|
||||
<ul>
|
||||
<li><code>--with-jni-libpath=<path></code> - Use the specified path as a default when searching for runtime libraries.</li>
|
||||
</ul>
|
||||
<h4 id="configure-arguments-for-native-compilation">Configure Arguments for Native Compilation</h4>
|
||||
<ul>
|
||||
<li><code>--with-devkit=<path></code> - Use this devkit for compilers, tools and resources</li>
|
||||
|
@ -662,6 +662,14 @@ features, use `bash configure --help=short` instead.)
|
||||
platform, instead of doing a full cross-compile. (This is known as a
|
||||
*reduced* build.)
|
||||
|
||||
On Linux, BSD and AIX, it is possible to override where Java by default
|
||||
searches for runtime/JNI libraries. This can be useful in situations where
|
||||
there is a special shared directory for system JNI libraries. This setting
|
||||
can in turn be overriden at runtime by setting the `java.library.path` property.
|
||||
|
||||
* `--with-jni-libpath=<path>` - Use the specified path as a default
|
||||
when searching for runtime libraries.
|
||||
|
||||
#### Configure Arguments for Native Compilation
|
||||
|
||||
* `--with-devkit=<path>` - Use this devkit for compilers, tools and resources
|
||||
|
@ -29,6 +29,7 @@ include $(SPEC)
|
||||
include MakeBase.gmk
|
||||
include JavaCompilation.gmk
|
||||
include SetupJavaCompilers.gmk
|
||||
include TextFileProcessing.gmk
|
||||
|
||||
################################################################################
|
||||
|
||||
@ -87,4 +88,30 @@ TARGETS += $(COMPILE_DEPEND) $(DEPEND_SERVICE_PROVIDER)
|
||||
|
||||
################################################################################
|
||||
|
||||
# To be able to call the javascript filter when generating man pages using
|
||||
# pandoc, we need to create this executable wrapper script.
|
||||
ifneq ($(PANDOC), )
|
||||
# PANDOC_FILTER is duplicated for export in ToolsJdk.gmk.
|
||||
PANDOC_FILTER := $(BUILDTOOLS_OUTPUTDIR)/manpages/pandoc-manpage-filter
|
||||
PANDOC_FILTER_SETUP := $(BUILDTOOLS_OUTPUTDIR)/manpages/_pandoc_filter_setup.marker
|
||||
|
||||
# Create a usable instance of the wrapper script that calls the pandoc filter
|
||||
# (which is written in javascript).
|
||||
$(eval $(call SetupTextFileProcessing, CREATE_PANDOC_FILTER, \
|
||||
SOURCE_FILES := $(TOPDIR)/make/scripts/pandoc-manpage-filter.sh.template, \
|
||||
OUTPUT_FILE := $(PANDOC_FILTER), \
|
||||
REPLACEMENTS := \
|
||||
@@BOOT_JDK@@ => $(BOOT_JDK) ; \
|
||||
@@TOPDIR@@ => $(TOPDIR) ; \
|
||||
@@JJS_FLAGS@@ => $(addprefix -J, $(JAVA_FLAGS_SMALL)), \
|
||||
))
|
||||
|
||||
# Created script must be made executable
|
||||
$(PANDOC_FILTER_SETUP): $(CREATE_PANDOC_FILTER)
|
||||
$(CHMOD) a+rx $(PANDOC_FILTER)
|
||||
$(TOUCH) $@
|
||||
|
||||
TARGETS += $(PANDOC_FILTER_SETUP)
|
||||
endif
|
||||
|
||||
all: $(TARGETS)
|
||||
|
@ -332,7 +332,7 @@ define SetupApiDocsGenerationBody
|
||||
$1_JAVADOC_CMD := $$(JAVA) -Djava.awt.headless=true $$($1_JAVA_ARGS) \
|
||||
$$(NEW_JAVADOC)
|
||||
else
|
||||
$1_OPTIONS += $$(addprefix -J, $$($1_JAVA_ARGS))
|
||||
$1_OPTIONS += $$(addprefix -J, $$($1_JAVA_ARGS))
|
||||
endif
|
||||
|
||||
$1_VARDEPS := $$($1_JAVA_ARGS) $$($1_OPTIONS) $$(MODULES_SOURCE_PATH) \
|
||||
@ -466,7 +466,7 @@ $(eval $(call SetupApiDocsGeneration, JAVASE_API, \
|
||||
# Setup generation of the reference Java SE API documentation (javadoc + modulegraph)
|
||||
|
||||
# The reference javadoc is just the same as javase, but using the BootJDK javadoc
|
||||
# and a stable set of javadoc options. Typically it is used for generating
|
||||
# and a stable set of javadoc options. Typically it is used for generating
|
||||
# diffs between the reference javadoc and a javadoc bundle of a specific build
|
||||
# generated in the same way.
|
||||
|
||||
@ -542,7 +542,7 @@ ifeq ($(ENABLE_FULL_DOCS), true)
|
||||
$(eval SPECS_$m := $(call FindModuleSpecsDirs, $m)) \
|
||||
$(foreach d, $(SPECS_$m), \
|
||||
$(if $(filter %.md, $(call CacheFind, $d)), \
|
||||
$(eval $m_$d_NAME := CONVERT_MARKDOWN_$m_$(strip $(call RelativePath, $d, $(TOPDIR)))) \
|
||||
$(eval $m_$d_NAME := SPECS_TO_HTML_$m_$(strip $(call RelativePath, $d, $(TOPDIR)))) \
|
||||
$(eval $(call SetupProcessMarkdown, $($m_$d_NAME), \
|
||||
SRC := $d, \
|
||||
FILES := $(filter %.md, $(call CacheFind, $d)), \
|
||||
@ -553,6 +553,28 @@ ifeq ($(ENABLE_FULL_DOCS), true)
|
||||
) \
|
||||
) \
|
||||
)
|
||||
|
||||
# For all markdown files in $module/share/man directories, convert them to
|
||||
# html.
|
||||
$(foreach m, $(ALL_MODULES), \
|
||||
$(eval MAN_$m := $(call FindModuleManDirs, $m)) \
|
||||
$(foreach d, $(MAN_$m), \
|
||||
$(if $(filter %.md, $(call CacheFind, $d)), \
|
||||
$(eval $m_$d_NAME := MAN_TO_HTML_$m_$(strip $(call RelativePath, $d, $(TOPDIR)))) \
|
||||
$(eval $(call SetupProcessMarkdown, $($m_$d_NAME), \
|
||||
SRC := $d, \
|
||||
FILES := $(filter %.md, $(call CacheFind, $d)), \
|
||||
DEST := $(DOCS_OUTPUTDIR)/specs/man, \
|
||||
CSS := $(GLOBAL_SPECS_DEFAULT_CSS_FILE), \
|
||||
REPLACEMENTS := @@VERSION_SHORT@@ => $(VERSION_SHORT), \
|
||||
)) \
|
||||
$(eval JDK_SPECS_TARGETS += $($($m_$d_NAME))) \
|
||||
) \
|
||||
) \
|
||||
)
|
||||
|
||||
# The html generated from markdown also needs the css file
|
||||
JDK_SPECS_TARGETS += $(COPY_GLOBAL_RESOURCES)
|
||||
endif
|
||||
|
||||
# Special treatment for generated documentation
|
||||
|
121
make/Images.gmk
121
make/Images.gmk
@ -121,127 +121,6 @@ $(JRE_IMAGE_DIR)/$(JIMAGE_TARGET_FILE): $(JMODS) \
|
||||
TOOL_JRE_TARGETS := $(JRE_IMAGE_DIR)/$(JIMAGE_TARGET_FILE)
|
||||
TOOL_JDK_TARGETS := $(JDK_IMAGE_DIR)/$(JIMAGE_TARGET_FILE)
|
||||
|
||||
################################################################################
|
||||
# /man dir
|
||||
#
|
||||
# All variables in this section are assigned with simple =, without :, to enable
|
||||
# more selective overriding from the custom version of this file.
|
||||
#
|
||||
# Avoid evaluating this whole section on windows for speed and stability
|
||||
ifneq ($(OPENJDK_TARGET_OS), windows)
|
||||
ifeq ($(BUILD_MANPAGES), true)
|
||||
JRE_MAN_PAGES += \
|
||||
java.1 \
|
||||
jjs.1 \
|
||||
keytool.1 \
|
||||
orbd.1 \
|
||||
pack200.1 \
|
||||
rmid.1 \
|
||||
rmiregistry.1 \
|
||||
servertool.1 \
|
||||
unpack200.1
|
||||
|
||||
JDK_MAN_PAGES += \
|
||||
$(JRE_MAN_PAGES) \
|
||||
idlj.1 \
|
||||
jar.1 \
|
||||
jarsigner.1 \
|
||||
javac.1 \
|
||||
javadoc.1 \
|
||||
javap.1 \
|
||||
jconsole.1 \
|
||||
jcmd.1 \
|
||||
jdb.1 \
|
||||
jdeps.1 \
|
||||
jinfo.1 \
|
||||
jmap.1 \
|
||||
jps.1 \
|
||||
jrunscript.1 \
|
||||
jstack.1 \
|
||||
jstat.1 \
|
||||
jstatd.1 \
|
||||
rmic.1 \
|
||||
serialver.1
|
||||
|
||||
# This variable is potentially overridden in the closed makefile.
|
||||
MAN_SRC_BASEDIR ?= $(TOPDIR)/src
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), linux)
|
||||
MAN_SRC_DIR = $(MAN_SRC_BASEDIR)/linux/doc
|
||||
MAN1_SUBDIR = man
|
||||
endif
|
||||
ifeq ($(OPENJDK_TARGET_OS), solaris)
|
||||
MAN_SRC_DIR = $(MAN_SRC_BASEDIR)/solaris/doc
|
||||
MAN1_SUBDIR = sun/man/man1
|
||||
endif
|
||||
ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
MAN_SRC_DIR = $(MAN_SRC_BASEDIR)/bsd/doc
|
||||
MAN1_SUBDIR = man
|
||||
endif
|
||||
|
||||
$(JRE_IMAGE_DIR)/man/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/%
|
||||
$(call LogInfo, Copying $(patsubst $(OUTPUTDIR)/%,%,$@))
|
||||
$(install-file)
|
||||
|
||||
$(JDK_IMAGE_DIR)/man/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/%
|
||||
$(call LogInfo, Copying $(patsubst $(OUTPUTDIR)/%,%,$@))
|
||||
$(install-file)
|
||||
|
||||
$(JRE_IMAGE_DIR)/man/ja_JP.UTF-8/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/ja/%
|
||||
$(call LogInfo, Copying $(patsubst $(OUTPUTDIR)/%,%,$@))
|
||||
$(install-file)
|
||||
|
||||
$(JDK_IMAGE_DIR)/man/ja_JP.UTF-8/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/ja/%
|
||||
$(call LogInfo, Copying $(patsubst $(OUTPUTDIR)/%,%,$@))
|
||||
$(install-file)
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), solaris)
|
||||
$(JRE_IMAGE_DIR)/man/ja/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/ja/%
|
||||
$(call LogInfo, Converting $(patsubst $(OUTPUTDIR)/%,%,$@))
|
||||
$(install-file)
|
||||
|
||||
$(JDK_IMAGE_DIR)/man/ja/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/ja/%
|
||||
$(call LogInfo, Converting $(patsubst $(OUTPUTDIR)/%,%,$@))
|
||||
$(install-file)
|
||||
endif
|
||||
|
||||
ifneq ($(findstring $(OPENJDK_TARGET_OS), linux macosx), )
|
||||
$(JRE_IMAGE_DIR)/man/ja:
|
||||
$(call LogInfo, Creating $(patsubst $(OUTPUTDIR)/%,%,$@))
|
||||
$(CD) $(@D) && $(RM) ja && $(LN) -s ja_JP.UTF-8 ja
|
||||
|
||||
$(JDK_IMAGE_DIR)/man/ja:
|
||||
$(call LogInfo, Creating $(patsubst $(OUTPUTDIR)/%,%,$@))
|
||||
$(CD) $(@D) && $(RM) ja && $(LN) -s ja_JP.UTF-8 ja
|
||||
endif
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), solaris)
|
||||
JRE_MAN_PAGE_LIST = $(addprefix $(JRE_IMAGE_DIR)/man/man1/, $(JRE_MAN_PAGES)) \
|
||||
$(addprefix $(JRE_IMAGE_DIR)/man/ja/man1/, $(JRE_MAN_PAGES)) \
|
||||
$(addprefix $(JRE_IMAGE_DIR)/man/ja_JP.UTF-8/man1/, $(JRE_MAN_PAGES)) \
|
||||
$(addprefix $(JRE_IMAGE_DIR)/man/ja_JP.PCK/man1/, $(JRE_MAN_PAGES))
|
||||
|
||||
JDK_MAN_PAGE_LIST = $(addprefix $(JDK_IMAGE_DIR)/man/man1/, $(JDK_MAN_PAGES)) \
|
||||
$(addprefix $(JDK_IMAGE_DIR)/man/ja/man1/, $(JDK_MAN_PAGES)) \
|
||||
$(addprefix $(JDK_IMAGE_DIR)/man/ja_JP.UTF-8/man1/, $(JDK_MAN_PAGES)) \
|
||||
$(addprefix $(JDK_IMAGE_DIR)/man/ja_JP.PCK/man1/, $(JDK_MAN_PAGES))
|
||||
endif
|
||||
|
||||
ifneq ($(findstring $(OPENJDK_TARGET_OS), linux macosx), )
|
||||
JRE_MAN_PAGE_LIST = $(addprefix $(JRE_IMAGE_DIR)/man/man1/, $(JRE_MAN_PAGES)) \
|
||||
$(addprefix $(JRE_IMAGE_DIR)/man/ja_JP.UTF-8/man1/, $(JRE_MAN_PAGES)) \
|
||||
$(JRE_IMAGE_DIR)/man/ja
|
||||
|
||||
JDK_MAN_PAGE_LIST = $(addprefix $(JDK_IMAGE_DIR)/man/man1/, $(JDK_MAN_PAGES)) \
|
||||
$(addprefix $(JDK_IMAGE_DIR)/man/ja_JP.UTF-8/man1/, $(JDK_MAN_PAGES)) \
|
||||
$(JDK_IMAGE_DIR)/man/ja
|
||||
endif
|
||||
|
||||
JRE_TARGETS += $(JRE_MAN_PAGE_LIST)
|
||||
JDK_TARGETS += $(JDK_MAN_PAGE_LIST)
|
||||
endif # BUILD_MANPAGES
|
||||
endif # Windows
|
||||
|
||||
################################################################################
|
||||
# src.zip
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -93,6 +93,12 @@ $(eval $(call SetupCopyFiles, COPY_CMDS, \
|
||||
FILES := $(filter $(SUPPORT_OUTPUTDIR)/modules_cmds/$(MODULE)/%, $(TARGETS)), \
|
||||
))
|
||||
|
||||
$(eval $(call SetupCopyFiles, COPY_MAN, \
|
||||
SRC := $(SUPPORT_OUTPUTDIR)/modules_man/$(MODULE), \
|
||||
DEST := $(JDK_OUTPUTDIR)/man, \
|
||||
FILES := $(filter $(SUPPORT_OUTPUTDIR)/modules_man/$(MODULE)/%, $(TARGETS)), \
|
||||
))
|
||||
|
||||
$(eval $(call SetupCopyFiles, COPY_CONF, \
|
||||
SRC := $(SUPPORT_OUTPUTDIR)/modules_conf/$(MODULE), \
|
||||
DEST := $(JDK_OUTPUTDIR)/conf, \
|
||||
@ -104,5 +110,5 @@ ifeq ($(GENERATE_COMPILE_COMMANDS_ONLY), true)
|
||||
all: $(filter $(MAKESUPPORT_OUTPUTDIR)/compile-commands/%, $(TARGETS))
|
||||
else
|
||||
all: $(TARGETS) $(COPY_LIBS_TO_BIN) $(COPY_LIBS_TO_LIB) \
|
||||
$(COPY_INCLUDE) $(COPY_CMDS) $(COPY_CONF) $(LINK_LIBS_TO_LIB)
|
||||
$(COPY_INCLUDE) $(COPY_CMDS) $(COPY_MAN) $(COPY_CONF) $(LINK_LIBS_TO_LIB)
|
||||
endif
|
||||
|
@ -116,4 +116,10 @@ TOOL_PUBLICSUFFIXLIST = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_clas
|
||||
|
||||
##########################################################################################
|
||||
|
||||
# Executable javascript filter for man page generation using pandoc.
|
||||
|
||||
PANDOC_FILTER := $(BUILDTOOLS_OUTPUTDIR)/manpages/pandoc-manpage-filter
|
||||
|
||||
##########################################################################################
|
||||
|
||||
endif # _TOOLS_GMK
|
||||
|
@ -119,6 +119,12 @@ AC_DEFUN([FLAGS_SETUP_ASFLAGS_CPU_DEP],
|
||||
# Misuse EXTRA_CFLAGS to mimic old behavior
|
||||
$2JVM_ASFLAGS="$JVM_BASIC_ASFLAGS ${$2EXTRA_CFLAGS}"
|
||||
|
||||
if test "x$1" = "xTARGET" && \
|
||||
test "x$TOOLCHAIN_TYPE" = xgcc && \
|
||||
test "x$OPENJDK_TARGET_CPU" = xarm; then
|
||||
$2JVM_ASFLAGS="${$2JVM_ASFLAGS} $ARM_ARCH_TYPE_ASFLAGS $ARM_FLOAT_TYPE_ASFLAGS"
|
||||
fi
|
||||
|
||||
AC_SUBST($2JVM_ASFLAGS)
|
||||
])
|
||||
|
||||
|
@ -46,41 +46,59 @@ AC_DEFUN([FLAGS_SETUP_ABI_PROFILE],
|
||||
AC_MSG_CHECKING([for ABI profle])
|
||||
AC_MSG_RESULT([$OPENJDK_TARGET_ABI_PROFILE])
|
||||
|
||||
# --- Arm-sflt CFLAGS and ASFLAGS ---
|
||||
# Armv5te is required for assembler, because pld insn used in arm32 hotspot is only in v5E and above.
|
||||
# However, there is also a GCC bug which generates unaligned strd/ldrd instructions on armv5te:
|
||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82445, and it was fixed only quite recently.
|
||||
# The resulting compromise is to enable v5TE for assembler and let GCC generate code for v5T.
|
||||
if test "x$OPENJDK_TARGET_ABI_PROFILE" = xarm-vfp-sflt; then
|
||||
ARM_FLOAT_TYPE=vfp-sflt
|
||||
ARM_ARCH_TYPE_FLAGS='-march=armv7-a -mthumb'
|
||||
ARM_ARCH_TYPE_ASFLAGS='-march=armv7-a -mthumb'
|
||||
elif test "x$OPENJDK_TARGET_ABI_PROFILE" = xarm-vfp-hflt; then
|
||||
ARM_FLOAT_TYPE=vfp-hflt
|
||||
ARM_ARCH_TYPE_FLAGS='-march=armv7-a -mthumb'
|
||||
ARM_ARCH_TYPE_ASFLAGS='-march=armv7-a -mthumb'
|
||||
elif test "x$OPENJDK_TARGET_ABI_PROFILE" = xarm-sflt; then
|
||||
ARM_FLOAT_TYPE=sflt
|
||||
ARM_ARCH_TYPE_FLAGS='-march=armv5t -marm'
|
||||
ARM_ARCH_TYPE_ASFLAGS='-march=armv5te'
|
||||
elif test "x$OPENJDK_TARGET_ABI_PROFILE" = xarmv5-vfp-sflt; then
|
||||
ARM_FLOAT_TYPE=vfp-sflt
|
||||
ARM_ARCH_TYPE_FLAGS='-march=armv5t -marm'
|
||||
ARM_ARCH_TYPE_ASFLAGS='-march=armv5te'
|
||||
elif test "x$OPENJDK_TARGET_ABI_PROFILE" = xarmv6-vfp-hflt; then
|
||||
ARM_FLOAT_TYPE=vfp-hflt
|
||||
ARM_ARCH_TYPE_FLAGS='-march=armv6 -marm'
|
||||
ARM_ARCH_TYPE_ASFLAGS='-march=armv6'
|
||||
elif test "x$OPENJDK_TARGET_ABI_PROFILE" = xaarch64; then
|
||||
# No special flags, just need to trigger setting JDK_ARCH_ABI_PROP_NAME
|
||||
ARM_FLOAT_TYPE=
|
||||
ARM_ARCH_TYPE_FLAGS=
|
||||
ARM_ARCH_TYPE_ASFLAGS=
|
||||
else
|
||||
AC_MSG_ERROR([Invalid ABI profile: "$OPENJDK_TARGET_ABI_PROFILE"])
|
||||
fi
|
||||
|
||||
if test "x$ARM_FLOAT_TYPE" = xvfp-sflt; then
|
||||
ARM_FLOAT_TYPE_FLAGS='-mfloat-abi=softfp -mfpu=vfp -DFLOAT_ARCH=-vfp-sflt'
|
||||
ARM_FLOAT_TYPE_ASFLAGS="-mfloat-abi=softfp -mfpu=vfp"
|
||||
elif test "x$ARM_FLOAT_TYPE" = xvfp-hflt; then
|
||||
ARM_FLOAT_TYPE_FLAGS='-mfloat-abi=hard -mfpu=vfp -DFLOAT_ARCH=-vfp-hflt'
|
||||
ARM_FLOAT_TYPE_ASFLAGS="-mfloat-abi=hard -mfpu=vfp"
|
||||
elif test "x$ARM_FLOAT_TYPE" = xsflt; then
|
||||
ARM_FLOAT_TYPE_FLAGS='-msoft-float -mfpu=vfp'
|
||||
ARM_FLOAT_TYPE_ASFLAGS="-mfloat-abi=soft -mfpu=vfp"
|
||||
fi
|
||||
AC_MSG_CHECKING([for $ARM_FLOAT_TYPE floating point flags])
|
||||
AC_MSG_RESULT([$ARM_FLOAT_TYPE_FLAGS])
|
||||
AC_MSG_CHECKING([for $ARM_FLOAT_TYPE floating point flags for assembler])
|
||||
AC_MSG_RESULT([$ARM_FLOAT_TYPE_ASFLAGS])
|
||||
|
||||
AC_MSG_CHECKING([for arch type flags])
|
||||
AC_MSG_RESULT([$ARM_ARCH_TYPE_FLAGS])
|
||||
AC_MSG_CHECKING([for arch type flags for assembler])
|
||||
AC_MSG_RESULT([$ARM_ARCH_TYPE_ASFLAGS])
|
||||
|
||||
# Now set JDK_ARCH_ABI_PROP_NAME. This is equivalent to the last part of the
|
||||
# autoconf target triplet.
|
||||
|
@ -244,6 +244,28 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_JDK_OPTIONS],
|
||||
COPYRIGHT_YEAR=`$DATE +'%Y'`
|
||||
fi
|
||||
AC_SUBST(COPYRIGHT_YEAR)
|
||||
|
||||
# Override default library path
|
||||
AC_ARG_WITH([jni-libpath], [AS_HELP_STRING([--with-jni-libpath],
|
||||
[override default JNI library search path])])
|
||||
AC_MSG_CHECKING([for jni library path])
|
||||
if test "x${with_jni_libpath}" = "x" || test "x${with_jni_libpath}" = "xno"; then
|
||||
AC_MSG_RESULT([default])
|
||||
elif test "x${with_jni_libpath}" = "xyes"; then
|
||||
AC_MSG_RESULT([invalid])
|
||||
AC_MSG_ERROR([The --with-jni-libpath option requires an argument.])
|
||||
else
|
||||
HOTSPOT_OVERRIDE_LIBPATH=${with_jni_libpath}
|
||||
if test "x$OPENJDK_TARGET_OS" != "xlinux" &&
|
||||
test "x$OPENJDK_TARGET_OS" != "xbsd" &&
|
||||
test "x$OPENJDK_TARGET_OS" != "xaix"; then
|
||||
AC_MSG_RESULT([fail])
|
||||
AC_MSG_ERROR([Overriding JNI library path is supported only on Linux, BSD and AIX.])
|
||||
fi
|
||||
AC_MSG_RESULT(${HOTSPOT_OVERRIDE_LIBPATH})
|
||||
fi
|
||||
AC_SUBST(HOTSPOT_OVERRIDE_LIBPATH)
|
||||
|
||||
])
|
||||
|
||||
###############################################################################
|
||||
@ -587,10 +609,10 @@ AC_DEFUN([JDKOPT_EXCLUDE_TRANSLATIONS],
|
||||
AC_DEFUN([JDKOPT_ENABLE_DISABLE_MANPAGES],
|
||||
[
|
||||
AC_ARG_ENABLE([manpages], [AS_HELP_STRING([--disable-manpages],
|
||||
[Set to disable building of man pages @<:@enabled@:>@])])
|
||||
[Set to disable copy of static man pages @<:@enabled@:>@])])
|
||||
|
||||
BUILD_MANPAGES="true"
|
||||
AC_MSG_CHECKING([if man pages should be built])
|
||||
AC_MSG_CHECKING([if static man pages should be copied])
|
||||
if test "x$enable_manpages" = "x"; then
|
||||
AC_MSG_RESULT([yes])
|
||||
elif test "x$enable_manpages" = "xyes"; then
|
||||
|
@ -91,7 +91,9 @@ AC_DEFUN_ONCE([JDKVER_SETUP_JDK_VERSION_NUMBERS],
|
||||
AC_MSG_ERROR([--with-vendor-url must have a value])
|
||||
elif [ ! [[ $with_vendor_url =~ ^[[:print:]]*$ ]] ]; then
|
||||
AC_MSG_ERROR([--with-vendor-url contains non-printing characters: $with_vendor_url])
|
||||
else
|
||||
elif test "x$with_vendor_url" != x; then
|
||||
# Only set VENDOR_URL if '--with-vendor-url' was used and is not empty.
|
||||
# Otherwise we will use the value from "version-numbers" included above.
|
||||
VENDOR_URL="$with_vendor_url"
|
||||
fi
|
||||
AC_SUBST(VENDOR_URL)
|
||||
@ -103,7 +105,9 @@ AC_DEFUN_ONCE([JDKVER_SETUP_JDK_VERSION_NUMBERS],
|
||||
AC_MSG_ERROR([--with-vendor-bug-url must have a value])
|
||||
elif [ ! [[ $with_vendor_bug_url =~ ^[[:print:]]*$ ]] ]; then
|
||||
AC_MSG_ERROR([--with-vendor-bug-url contains non-printing characters: $with_vendor_bug_url])
|
||||
else
|
||||
elif test "x$with_vendor_bug_url" != x; then
|
||||
# Only set VENDOR_URL_BUG if '--with-vendor-bug-url' was used and is not empty.
|
||||
# Otherwise we will use the value from "version-numbers" included above.
|
||||
VENDOR_URL_BUG="$with_vendor_bug_url"
|
||||
fi
|
||||
AC_SUBST(VENDOR_URL_BUG)
|
||||
|
@ -101,7 +101,9 @@ AC_DEFUN_ONCE([LIB_SETUP_X11],
|
||||
|
||||
HEADERS_TO_CHECK="X11/extensions/shape.h X11/extensions/Xrender.h X11/extensions/XTest.h X11/Intrinsic.h"
|
||||
# There is no Xrandr extension on AIX
|
||||
if test "x$OPENJDK_TARGET_OS" != xaix; then
|
||||
if test "x$OPENJDK_TARGET_OS" = xaix; then
|
||||
X_CFLAGS="$X_CFLAGS -DNO_XRANDR"
|
||||
else
|
||||
HEADERS_TO_CHECK="$HEADERS_TO_CHECK X11/extensions/Xrandr.h"
|
||||
fi
|
||||
|
||||
|
@ -228,7 +228,8 @@ ifneq ($(COMPANY_NAME),)
|
||||
# Only export "VENDOR" to the build if COMPANY_NAME contains a real value.
|
||||
# Otherwise the default value for VENDOR, which is used to set the "java.vendor"
|
||||
# and "java.vm.vendor" properties is hard-coded into the source code (i.e. in
|
||||
# System.c in the jdk for "vm.vendor" and vm_version.cpp in the VM for "java.vm.vendor")
|
||||
# VersionProps.java.template in the jdk for "vm.vendor" and
|
||||
# vm_version.cpp in the VM for "java.vm.vendor")
|
||||
ifneq ($(COMPANY_NAME), N/A)
|
||||
VERSION_CFLAGS += -DVENDOR='"$(COMPANY_NAME)"'
|
||||
endif
|
||||
@ -274,6 +275,9 @@ VALID_JVM_VARIANTS := @VALID_JVM_VARIANTS@
|
||||
# Control wether Hotspot builds gtest tests
|
||||
BUILD_GTEST := @BUILD_GTEST@
|
||||
|
||||
# Allow overriding the default hotspot library path
|
||||
HOTSPOT_OVERRIDE_LIBPATH := @HOTSPOT_OVERRIDE_LIBPATH@
|
||||
|
||||
# Control use of precompiled header in hotspot libjvm build
|
||||
USE_PRECOMPILED_HEADER := @USE_PRECOMPILED_HEADER@
|
||||
|
||||
|
@ -43,6 +43,8 @@ PRODUCT_SUFFIX="Runtime Environment"
|
||||
JDK_RC_PLATFORM_NAME=Platform
|
||||
COMPANY_NAME=N/A
|
||||
HOTSPOT_VM_DISTRO="OpenJDK"
|
||||
VENDOR_URL=https://openjdk.java.net/
|
||||
VENDOR_URL_BUG=https://bugreport.java.com/bugreport/
|
||||
|
||||
# Might need better names for these
|
||||
MACOSX_BUNDLE_NAME_BASE="OpenJDK"
|
||||
|
@ -247,6 +247,8 @@ SRC_SUBDIRS += share/classes
|
||||
|
||||
SPEC_SUBDIRS += share/specs
|
||||
|
||||
MAN_SUBDIRS += share/man
|
||||
|
||||
# Find all module-info.java files for the current build target platform and
|
||||
# configuration.
|
||||
# Param 1 - Module to find for, set to * for finding all
|
||||
@ -305,6 +307,12 @@ FindModuleSpecsDirs = \
|
||||
$(strip $(wildcard \
|
||||
$(foreach sub, $(SPEC_SUBDIRS), $(addsuffix /$(strip $1)/$(sub), $(TOP_SRC_DIRS)))))
|
||||
|
||||
# Find all man dirs for a particular module
|
||||
# $1 - Module to find man dirs for
|
||||
FindModuleManDirs = \
|
||||
$(strip $(wildcard \
|
||||
$(foreach sub, $(MAN_SUBDIRS), $(addsuffix /$(strip $1)/$(sub), $(TOP_SRC_DIRS)))))
|
||||
|
||||
# Construct the complete module source path
|
||||
GetModuleSrcPath = \
|
||||
$(call PathList, \
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -26,12 +26,36 @@ ifeq (,$(_MAKEBASE_GMK))
|
||||
$(error You must include MakeBase.gmk prior to including ProcessMarkdown.gmk)
|
||||
endif
|
||||
|
||||
include TextFileProcessing.gmk
|
||||
|
||||
# Helper function for SetupProcessMarkdown
|
||||
# $1: The $1 from SetupProcessMarkdown
|
||||
# $2: The name of the current source file, relative to $1_SRC
|
||||
# $2: The name of the current source file, relative to the dir given in $3
|
||||
# $3: The directory of the current source file
|
||||
define ProcessMarkdown
|
||||
$1_$2_OUTPUT_FILE := $$($1_DEST)/$$(basename $2).html
|
||||
$1_$2_OUTPUT_FILE := $$($1_DEST)/$$(basename $2)$$($1_FILE_EXT)
|
||||
$1_$2_TARGET_DIR := $$(dir $$($1_$2_OUTPUT_FILE))
|
||||
$1_$2_INPUT_FILE := $3/$2
|
||||
$1_$2_MARKER := $$(subst /,_,$1_$2)
|
||||
|
||||
ifneq ($$($1_REPLACEMENTS), )
|
||||
$1_$2_PANDOC_INPUT := $$(SUPPORT_OUTPUTDIR)/markdown/$$($1_$2_MARKER)_pre.tmp
|
||||
|
||||
$$(eval $$(call SetupTextFileProcessing, $1_$2_PREPROCESSED, \
|
||||
SOURCE_FILES := $$($1_$2_INPUT_FILE), \
|
||||
OUTPUT_FILE := $$($1_$2_PANDOC_INPUT), \
|
||||
REPLACEMENTS := $$($1_REPLACEMENTS), \
|
||||
))
|
||||
else
|
||||
$1_$2_PANDOC_INPUT := $$($1_$2_INPUT_FILE)
|
||||
endif
|
||||
|
||||
ifneq ($$($1_POST_PROCESS), )
|
||||
$1_$2_PANDOC_OUTPUT := $$(SUPPORT_OUTPUTDIR)/markdown/$$($1_$2_MARKER)_post.tmp
|
||||
else
|
||||
$1_$2_PANDOC_OUTPUT := $$($1_$2_OUTPUT_FILE)
|
||||
endif
|
||||
|
||||
ifneq ($$($1_CSS), )
|
||||
ifneq ($$(findstring http:/, $$($1_CSS)), )
|
||||
$1_$2_CSS_OPTION := --css '$$($1_CSS)'
|
||||
@ -40,28 +64,44 @@ define ProcessMarkdown
|
||||
$1_$2_CSS_OPTION := --css '$$($1_$2_CSS)'
|
||||
endif
|
||||
endif
|
||||
$1_$2_OPTIONS = $$(shell $$(GREP) _pandoc-options_: $$($1_SRC)/$2 | $$(CUT) -d : -f 2-)
|
||||
$1_$2_MARKER := $$(subst /,_,$1_$2)
|
||||
|
||||
$1_$2_VARDEPS := $$($1_OPTIONS) $$($1_CSS)
|
||||
$1_$2_OPTIONS := $$(shell $$(GREP) _pandoc-options_: $3/$2 | $$(CUT) -d : -f 2-)
|
||||
|
||||
ifneq ($$($1_FILTER), )
|
||||
$1_$2_OPTIONS += --filter $$($1_FILTER)
|
||||
endif
|
||||
|
||||
$1_$2_VARDEPS := $$($1_OPTIONS) $$($1_$2_OPTIONS) $$($1_CSS) \
|
||||
$$($1_REPLACEMENTS) $$($1_POST_PROCESS)
|
||||
$1_$2_VARDEPS_FILE := $$(call DependOnVariable, $1_$2_VARDEPS, \
|
||||
$$(SUPPORT_OUTPUTDIR)/markdown/$$($1_$2_MARKER).vardeps)
|
||||
|
||||
$$($1_$2_OUTPUT_FILE): $$($1_SRC)/$2 $$($1_$2_VARDEPS_FILE)
|
||||
$$(call LogInfo, Converting $2 to html)
|
||||
$$(call MakeDir, $$($1_$2_TARGET_DIR) $$(SUPPORT_OUTPUTDIR)/markdown)
|
||||
$$($1_$2_PANDOC_OUTPUT): $$($1_$2_PANDOC_INPUT) $$($1_$2_VARDEPS_FILE) $$($1_EXTRA_DEPS)
|
||||
$$(call LogInfo, Converting $2 to $$($1_FORMAT))
|
||||
$$(call MakeDir, $$(SUPPORT_OUTPUTDIR)/markdown $$(dir $$($1_$2_PANDOC_OUTPUT)))
|
||||
$$(call ExecuteWithLog, $$(SUPPORT_OUTPUTDIR)/markdown/$$($1_$2_MARKER), \
|
||||
$$(PANDOC) $$($1_OPTIONS) -f markdown -t html5 --standalone \
|
||||
$$($1_$2_CSS_OPTION) $$($1_$2_OPTIONS) '$$<' -o '$$@')
|
||||
$$(PANDOC) $$($1_OPTIONS) -f markdown -t $$($1_FORMAT) --standalone \
|
||||
$$($1_$2_CSS_OPTION) $$($1_$2_OPTIONS) '$$($1_$2_PANDOC_INPUT)' \
|
||||
-o '$$($1_$2_PANDOC_OUTPUT)')
|
||||
ifneq ($$(findstring $$(LOG_LEVEL), debug trace),)
|
||||
TOO_LONG_LINES=`$$(GREP) -E -e '^.{80}.+$$$$' $$<` || true ; \
|
||||
if [ "x$$$$TOO_LONG_LINES" != x ]; then \
|
||||
$$(ECHO) "Warning: Unsuitable markdown in $$<:" ; \
|
||||
$$(ECHO) "The following lines are longer than 80 characters:" ; \
|
||||
$$(GREP) -E -n -e '^.{80}.+$$$$' $$< || true ; \
|
||||
fi
|
||||
TOO_LONG_LINES=`$$(GREP) -E -e '^.{80}.+$$$$' $$<` || true ; \
|
||||
if [ "x$$$$TOO_LONG_LINES" != x ]; then \
|
||||
$$(ECHO) "Warning: Unsuitable markdown in $$<:" ; \
|
||||
$$(ECHO) "The following lines are longer than 80 characters:" ; \
|
||||
$$(GREP) -E -n -e '^.{80}.+$$$$' $$< || true ; \
|
||||
fi
|
||||
endif
|
||||
|
||||
# If we have no post processing, PANDOC_OUTPUT is set to OUTPUT_FILE. Otherwise
|
||||
# PANDOC_OUTPUT is a temporary file, and we must now create the real OUTPUT_FILE.
|
||||
ifneq ($$($1_POST_PROCESS), )
|
||||
$$($1_$2_OUTPUT_FILE): $$($1_$2_PANDOC_OUTPUT)
|
||||
$$(call LogInfo, Post-processing markdown file $2)
|
||||
$$(call MakeDir, $$(SUPPORT_OUTPUTDIR)/markdown $$($1_$2_TARGET_DIR))
|
||||
$$(call ExecuteWithLog, $$(SUPPORT_OUTPUTDIR)/markdown/$$($1_$2_MARKER)_post, \
|
||||
$$($1_POST_PROCESS) < $$($1_$2_PANDOC_OUTPUT) > $$($1_$2_OUTPUT_FILE))
|
||||
endif
|
||||
|
||||
$1 += $$($1_$2_OUTPUT_FILE)
|
||||
endef
|
||||
|
||||
@ -72,11 +112,17 @@ endef
|
||||
# and the targets generated are listed in a variable by that name.
|
||||
#
|
||||
# Remaining parameters are named arguments. These include:
|
||||
# SRC : Source root dir (defaults to dir of first file)
|
||||
# DEST : Dest root dir
|
||||
# FILES : List of files to copy with absolute paths, or path relative to SRC.
|
||||
# Must be in SRC.
|
||||
# OPTIONS : Additional options to pandoc
|
||||
# DEST : Destination root dir
|
||||
# FILES : List of files to copy with absolute paths, or path relative to SRC.
|
||||
# SRC : Source root dir; if given keep input files hierarchy relative to
|
||||
# SRC in DEST, otherwise flatten structure into DEST.
|
||||
# FORMAT : The target format (defaults to html5)
|
||||
# FILE_EXT : The file extension to replace .md with (defaults to .html)
|
||||
# OPTIONS : Additional options to pandoc
|
||||
# EXTRA_DEPS : Additional dependencies to add to each pandoc call
|
||||
# FILTER : Optional pandoc filter command
|
||||
# POST_PROCESS : Optional command-line to post-process generated markdown
|
||||
# REPLACEMENTS : Text replacements to perform on input file before processing
|
||||
#
|
||||
SetupProcessMarkdown = $(NamedParamsMacroTemplate)
|
||||
define SetupProcessMarkdownBody
|
||||
@ -88,16 +134,40 @@ define SetupProcessMarkdownBody
|
||||
$$(error DEST is missing in SetupProcessMarkdown $1)
|
||||
endif
|
||||
|
||||
# Default SRC to the dir of the first file.
|
||||
ifeq ($$($1_SRC), )
|
||||
$1_SRC := $$(dir $$(firstword $$($1_FILES)))
|
||||
# If no target format is specified, default to html5.
|
||||
ifeq ($$($1_FORMAT), )
|
||||
$1_FORMAT := html5
|
||||
endif
|
||||
|
||||
# Remove any trailing slash from SRC and DEST
|
||||
$1_SRC := $$(patsubst %/,%,$$($1_SRC))
|
||||
ifeq ($$($1_FORMAT), man)
|
||||
# If no file extension is specified, default to '.1'.
|
||||
ifeq ($$($1_FILE_EXT), )
|
||||
$1_FILE_EXT := .1
|
||||
endif
|
||||
else ifeq ($$($1_FORMAT), html5)
|
||||
ifeq ($$($1_FILE_EXT), )
|
||||
$1_FILE_EXT := .html
|
||||
endif
|
||||
else ifeq ($$($1_FORMAT), html)
|
||||
ifeq ($$($1_FILE_EXT), )
|
||||
$1_FILE_EXT := .html
|
||||
endif
|
||||
endif
|
||||
|
||||
# Remove any trailing slash
|
||||
$1_DEST := $$(patsubst %/,%,$$($1_DEST))
|
||||
|
||||
$$(foreach f, $$(patsubst $$($1_SRC)/%,%,$$($1_FILES)), \
|
||||
$$(eval $$(call ProcessMarkdown,$1,$$f)) \
|
||||
)
|
||||
ifeq ($$($1_SRC), )
|
||||
# No SRC given, assume we're flattening all files into output dir.
|
||||
$$(foreach f, $$($1_FILES), \
|
||||
$$(eval $$(call ProcessMarkdown,$1,$$(notdir $$f),$$(patsubst %/,%,$$(dir $$f)))) \
|
||||
)
|
||||
else
|
||||
# Remove any trailing slash
|
||||
$1_SRC := $$(patsubst %/,%,$$($1_SRC))
|
||||
|
||||
$$(foreach f, $$(patsubst $$($1_SRC)/%,%,$$($1_FILES)), \
|
||||
$$(eval $$(call ProcessMarkdown,$1,$$f,$$($1_SRC))) \
|
||||
)
|
||||
endif
|
||||
endef
|
||||
|
@ -401,7 +401,7 @@ var getJibProfilesProfiles = function (input, common, data) {
|
||||
"macosx-x64": {
|
||||
target_os: "macosx",
|
||||
target_cpu: "x64",
|
||||
dependencies: ["devkit", "graalunit_lib"],
|
||||
dependencies: ["devkit", "pandoc", "graalunit_lib"],
|
||||
configure_args: concat(common.configure_args_64bit, "--with-zlib=system",
|
||||
"--with-macosx-version-max=10.9.0"),
|
||||
},
|
||||
@ -939,7 +939,7 @@ var getJibProfilesDependencies = function (input, common) {
|
||||
pandoc: {
|
||||
organization: common.organization,
|
||||
ext: "tar.gz",
|
||||
revision: "1.17.2+1.0",
|
||||
revision: "2.3.1+1.0",
|
||||
module: "pandoc-" + input.target_platform,
|
||||
configure_args: "PANDOC=" + input.get("pandoc", "install_path") + "/pandoc/pandoc",
|
||||
environment_path: input.get("pandoc", "install_path") + "/pandoc"
|
||||
|
@ -1,6 +1,6 @@
|
||||
#!/bin/bash -e
|
||||
#
|
||||
# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -31,43 +31,35 @@ trap "rm -rf \"$TMPDIR\"" EXIT
|
||||
|
||||
ORIG_DIR=`pwd`
|
||||
cd "$TMPDIR"
|
||||
PANDOC_VERSION=1.17.2
|
||||
FULL_PANDOC_VERSION=1.17.2-1
|
||||
PANDOC_VERSION=2.3.1
|
||||
PACKAGE_VERSION=1.0
|
||||
TARGET_PLATFORM=linux_x64
|
||||
|
||||
if [[ $TARGET_PLATFORM == linux_x64 ]] ; then
|
||||
PANDOC_PLATFORM=linux
|
||||
PANDOC_SUFFIX=tar.gz
|
||||
elif [[ $TARGET_PLATFORM == macosx_x64 ]] ; then
|
||||
PANDOC_PLATFORM=macOS
|
||||
PANDOC_SUFFIX=zip
|
||||
else
|
||||
echo "Unknown platform"
|
||||
exit 1
|
||||
fi
|
||||
BUNDLE_NAME=pandoc-$TARGET_PLATFORM-$PANDOC_VERSION+$PACKAGE_VERSION.tar.gz
|
||||
|
||||
wget https://github.com/jgm/pandoc/releases/download/$PANDOC_VERSION/pandoc-$FULL_PANDOC_VERSION-amd64.deb
|
||||
wget https://github.com/jgm/pandoc/releases/download/$PANDOC_VERSION/pandoc-$PANDOC_VERSION-$PANDOC_PLATFORM.$PANDOC_SUFFIX
|
||||
|
||||
mkdir pandoc
|
||||
cd pandoc
|
||||
ar p ../pandoc-$FULL_PANDOC_VERSION-amd64.deb data.tar.gz | tar xz
|
||||
mkdir tmp
|
||||
cd tmp
|
||||
if [[ $PANDOC_SUFFIX == zip ]]; then
|
||||
unzip ../pandoc-$PANDOC_VERSION-$PANDOC_PLATFORM.$PANDOC_SUFFIX
|
||||
else
|
||||
tar xzf ../pandoc-$PANDOC_VERSION-$PANDOC_PLATFORM.$PANDOC_SUFFIX
|
||||
fi
|
||||
cd ..
|
||||
|
||||
# Pandoc depends on libgmp.so.10, which in turn depends on libc. No readily
|
||||
# available precompiled binaries exists which match the requirement of
|
||||
# support for older linuxes (glibc 2.12), so we'll compile it ourselves.
|
||||
mkdir pandoc
|
||||
cp tmp/pandoc-$PANDOC_VERSION/bin/pandoc pandoc
|
||||
|
||||
LIBGMP_VERSION=6.1.2
|
||||
|
||||
wget https://gmplib.org/download/gmp/gmp-$LIBGMP_VERSION.tar.xz
|
||||
mkdir gmp
|
||||
cd gmp
|
||||
tar xf ../gmp-$LIBGMP_VERSION.tar.xz
|
||||
cd gmp-$LIBGMP_VERSION
|
||||
./configure --prefix=$TMPDIR/pandoc/usr
|
||||
make
|
||||
make install
|
||||
cd ../..
|
||||
|
||||
cat > pandoc/pandoc << EOF
|
||||
#!/bin/bash
|
||||
# Get an absolute path to this script
|
||||
this_script_dir=\`dirname \$0\`
|
||||
this_script_dir=\`cd \$this_script_dir > /dev/null && pwd\`
|
||||
export LD_LIBRARY_PATH="\$this_script_dir/usr/lib:\$LD_LIBRARY_PATH"
|
||||
exec \$this_script_dir/usr/bin/pandoc "\$@"
|
||||
EOF
|
||||
chmod +x pandoc/pandoc
|
||||
tar -cvzf ../$BUNDLE_NAME pandoc
|
||||
cp ../$BUNDLE_NAME "$ORIG_DIR"
|
||||
|
@ -40,7 +40,12 @@ $(eval $(call SetupTextFileProcessing, BUILD_VERSION_JAVA, \
|
||||
@@VERSION_BUILD@@ => $(VERSION_BUILD) ; \
|
||||
@@VERSION_OPT@@ => $(VERSION_OPT) ; \
|
||||
@@VERSION_DATE@@ => $(VERSION_DATE) ; \
|
||||
@@VENDOR_VERSION_STRING@@ => $(VENDOR_VERSION_STRING), \
|
||||
@@VERSION_CLASSFILE_MAJOR@@ => $(VERSION_CLASSFILE_MAJOR) ; \
|
||||
@@VERSION_CLASSFILE_MINOR@@ => $(VERSION_CLASSFILE_MINOR) ; \
|
||||
@@VENDOR_VERSION_STRING@@ => $(VENDOR_VERSION_STRING) ; \
|
||||
@@VENDOR@@ => $(COMPANY_NAME) ; \
|
||||
@@VENDOR_URL@@ => $(VENDOR_URL) ; \
|
||||
@@VENDOR_URL_BUG@@ => $(VENDOR_URL_BUG), \
|
||||
))
|
||||
|
||||
GENSRC_JAVA_BASE += $(BUILD_VERSION_JAVA)
|
||||
|
@ -95,3 +95,7 @@ JVM_CFLAGS += \
|
||||
ifeq ($(USE_PRECOMPILED_HEADER), false)
|
||||
JVM_CFLAGS += -DDONT_USE_PRECOMPILED_HEADER
|
||||
endif
|
||||
|
||||
ifneq ($(HOTSPOT_OVERRIDE_LIBPATH), )
|
||||
JVM_CFLAGS += -DOVERRIDE_LIBPATH='"$(HOTSPOT_OVERRIDE_LIBPATH)"'
|
||||
endif
|
||||
|
@ -121,6 +121,7 @@ JVM_GetNanoTimeAdjustment
|
||||
JVM_GetNestHost
|
||||
JVM_GetNestMembers
|
||||
JVM_GetPrimitiveArrayElement
|
||||
JVM_GetProperties
|
||||
JVM_GetProtectionDomain
|
||||
JVM_GetSimpleBinaryName
|
||||
JVM_GetStackAccessControlContext
|
||||
@ -132,7 +133,6 @@ JVM_Halt
|
||||
JVM_HasReferencePendingList
|
||||
JVM_HoldsLock
|
||||
JVM_IHashCode
|
||||
JVM_InitProperties
|
||||
JVM_InitStackTraceElement
|
||||
JVM_InitStackTraceElementArray
|
||||
JVM_InitializeFromArchive
|
||||
|
@ -24,6 +24,9 @@
|
||||
#
|
||||
|
||||
include JdkNativeCompilation.gmk
|
||||
include Modules.gmk
|
||||
include ProcessMarkdown.gmk
|
||||
include ToolsJdk.gmk
|
||||
|
||||
# Tell the compiler not to export any functions unless declared so in
|
||||
# the source code. On Windows, this is the default and cannot be changed.
|
||||
@ -189,3 +192,70 @@ define SetupBuildLauncherBody
|
||||
$$($1_WINDOWS_JLI_LIB)
|
||||
endif
|
||||
endef
|
||||
|
||||
################################################################################
|
||||
# Create man pages for jmod to pick up. There should be a one-to-one
|
||||
# relationship between executables and man pages (even if this is not always
|
||||
# the case), so piggyback man page generation on the launcher compilation.
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS_TYPE), unix)
|
||||
# Only build manpages on unix systems.
|
||||
# We assume all our man pages should reside in section 1.
|
||||
|
||||
MAN_FILES_MD := $(wildcard $(addsuffix /*.md, $(call FindModuleManDirs, $(MODULE))))
|
||||
MAN_FILES_TROFF := $(wildcard $(addsuffix /*.1, $(call FindModuleManDirs, $(MODULE))))
|
||||
|
||||
ifneq ($(MAN_FILES_MD), )
|
||||
# If we got markdown files, ignore the troff files
|
||||
ifeq ($(PANDOC), )
|
||||
$(info Warning: pandoc not found. Not generating man pages)
|
||||
else
|
||||
# Create dynamic man pages from markdown using pandoc. We need
|
||||
# PANDOC_FILTER, a wrapper around PANDOC_FILTER_JAVASCRIPT. This is
|
||||
# created by buildtools-jdk.
|
||||
|
||||
# We should also depend on the source javascript filter
|
||||
PANDOC_FILTER_JAVASCRIPT := $(TOPDIR)/make/scripts/pandoc-manpage-filter.js
|
||||
|
||||
# The norm in man pages is to display code literals as bold, but pandoc
|
||||
# "correctly" converts these constructs (encoded in markdown using `...`
|
||||
# or ```...```) to \f[C]. Ideally, we should use the filter to encapsulate
|
||||
# the Code/CodeBlock in Strong. While this works for Code, pandoc cannot
|
||||
# correctly render man page output for CodeBlock wrapped in Strong. So we
|
||||
# take the easy way out, and post-process the troff output, replacing
|
||||
# \f[C] with \f[CB]. This has the added benefit of working correctly on
|
||||
# pandoc prior to version 2.0, which cannot properly produced nested
|
||||
# formatting in man pages (see https://github.com/jgm/pandoc/issues/3568).
|
||||
#
|
||||
# As of pandoc 2.3, the termination of formatting is still broken
|
||||
# (see https://github.com/jgm/pandoc/issues/4973). We need to replace
|
||||
# \f[] with \f[R].
|
||||
MAN_POST_PROCESS := $(SED) -e 's/\\f\[C\]/\\f\[CB\]/g' \
|
||||
-e 's/\\f\[\]/\\f\[R\]/g'
|
||||
|
||||
# Now generate the man pages from markdown using pandoc
|
||||
$(eval $(call SetupProcessMarkdown, BUILD_MAN_PAGES, \
|
||||
DEST := $(SUPPORT_OUTPUTDIR)/modules_man/$(MODULE)/man1, \
|
||||
FILES := $(MAN_FILES_MD), \
|
||||
FORMAT := man, \
|
||||
FILTER := $(PANDOC_FILTER), \
|
||||
POST_PROCESS := $(MAN_POST_PROCESS), \
|
||||
REPLACEMENTS := @@VERSION_SHORT@@ => $(VERSION_SHORT), \
|
||||
EXTRA_DEPS := $(PANDOC_FILTER) $(PANDOC_FILTER_JAVASCRIPT), \
|
||||
))
|
||||
|
||||
TARGETS += $(BUILD_MAN_PAGES)
|
||||
endif
|
||||
else
|
||||
# No markdown man pages present
|
||||
ifeq ($(BUILD_MANPAGES), true)
|
||||
# BUILD_MANPAGES is a mis-nomer. It really means "copy the pre-generated man pages".
|
||||
$(eval $(call SetupCopyFiles, COPY_MAN_PAGES, \
|
||||
DEST := $(SUPPORT_OUTPUTDIR)/modules_man/$(MODULE)/man1, \
|
||||
FILES := $(MAN_FILES_TROFF), \
|
||||
))
|
||||
|
||||
TARGETS += $(COPY_MAN_PAGES)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
@ -102,7 +102,6 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBJAVA, \
|
||||
OPTIMIZATION := HIGH, \
|
||||
CFLAGS := $(CFLAGS_JDKLIB) \
|
||||
$(LIBJAVA_CFLAGS), \
|
||||
System.c_CFLAGS := $(VERSION_CFLAGS), \
|
||||
jdk_util.c_CFLAGS := $(VERSION_CFLAGS), \
|
||||
EXTRA_HEADER_DIRS := libfdlibm, \
|
||||
WARNINGS_AS_ERRORS_xlc := false, \
|
||||
|
142
make/scripts/pandoc-manpage-filter.js
Normal file
142
make/scripts/pandoc-manpage-filter.js
Normal file
@ -0,0 +1,142 @@
|
||||
//
|
||||
// Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
//
|
||||
// This code is free software; you can redistribute it and/or modify it
|
||||
// under the terms of the GNU General Public License version 2 only, as
|
||||
// published by the Free Software Foundation.
|
||||
//
|
||||
// This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
// version 2 for more details (a copy is included in the LICENSE file that
|
||||
// accompanied this code).
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version
|
||||
// 2 along with this work; if not, write to the Free Software Foundation,
|
||||
// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
//
|
||||
// Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
// or visit www.oracle.com if you need additional information or have any
|
||||
// questions.
|
||||
//
|
||||
|
||||
//
|
||||
// Traverse a tree of pandoc format objects, calling callback on each
|
||||
// element, and replacing it if callback returns a new object.
|
||||
//
|
||||
// Inspired by the walk method in
|
||||
// https://github.com/jgm/pandocfilters/blob/master/pandocfilters.py
|
||||
//
|
||||
function traverse(obj, callback) {
|
||||
if (Array.isArray(obj)) {
|
||||
var processed_array = [];
|
||||
obj.forEach(function(elem) {
|
||||
if (elem === Object(elem) && elem.t) {
|
||||
var replacement = callback(elem.t, elem.c || []);
|
||||
if (!replacement) {
|
||||
// no replacement object returned, use original
|
||||
processed_array.push(traverse(elem, callback));
|
||||
} else if (Array.isArray(replacement)) {
|
||||
// array of objects returned, splice all elements into array
|
||||
replacement.forEach(function(repl_elem) {
|
||||
processed_array.push(traverse(repl_elem, callback));
|
||||
})
|
||||
} else {
|
||||
// replacement object given, traverse it
|
||||
processed_array.push(traverse(replacement, callback));
|
||||
}
|
||||
} else {
|
||||
processed_array.push(traverse(elem, callback));
|
||||
}
|
||||
})
|
||||
return processed_array;
|
||||
} else if (obj === Object(obj)) {
|
||||
var processed_obj = {};
|
||||
Object.keys(obj).forEach(function(key) {
|
||||
processed_obj[key] = traverse(obj[key], callback);
|
||||
})
|
||||
return processed_obj;
|
||||
} else {
|
||||
return obj;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Helper constructors to create pandoc format objects
|
||||
//
|
||||
function Space() {
|
||||
return { 't': 'Space', 'c': [] };
|
||||
}
|
||||
|
||||
function Str(value) {
|
||||
return { 't': 'Str', 'c': value };
|
||||
}
|
||||
|
||||
function Strong(value) {
|
||||
return { 't': 'Strong', 'c': value };
|
||||
}
|
||||
|
||||
function Header(value) {
|
||||
return { 't': 'Header', 'c': value };
|
||||
}
|
||||
|
||||
//
|
||||
// Callback to change all Str texts to upper case
|
||||
//
|
||||
function uppercase(type, value) {
|
||||
if (type === 'Str') {
|
||||
return Str(value.toUpperCase());
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Main callback function that performs our man page AST rewrites
|
||||
//
|
||||
function manpage_filter(type, value) {
|
||||
// If it is a header, decrease the heading level by one, and
|
||||
// if it is a level 1 header, convert it to upper case.
|
||||
if (type === 'Header') {
|
||||
value[0] = Math.max(1, value[0] - 1);
|
||||
if (value[0] == 1) {
|
||||
return Header(traverse(value, uppercase));
|
||||
}
|
||||
}
|
||||
|
||||
// Man pages does not have superscript. We use it for footnotes, so
|
||||
// enclose in [...] for best representation.
|
||||
if (type === 'Superscript') {
|
||||
return [ Str('['), value[0], Str(']') ];
|
||||
}
|
||||
|
||||
// If it is a link, put the link name in bold. If it is an external
|
||||
// link, put it in brackets. Otherwise, it is either an internal link
|
||||
// (like "#next-heading"), or a relative link to another man page
|
||||
// (like "java.html"), so remove it for man pages.
|
||||
if (type === 'Link') {
|
||||
var target = value[2][0];
|
||||
if (target.match(/^http[s]?:/)) {
|
||||
return [ Strong(value[1]), Space(), Str('[' + target + ']') ];
|
||||
} else {
|
||||
return Strong(value[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Main function
|
||||
//
|
||||
function main() {
|
||||
var input = "";
|
||||
while (line = readLine()) {
|
||||
input = input.concat(line);
|
||||
}
|
||||
var json = JSON.parse(input);
|
||||
|
||||
var transformed_json = traverse(json, manpage_filter);
|
||||
|
||||
print(JSON.stringify(transformed_json));
|
||||
}
|
||||
|
||||
// ... and execute it
|
||||
main();
|
28
make/scripts/pandoc-manpage-filter.sh.template
Normal file
28
make/scripts/pandoc-manpage-filter.sh.template
Normal file
@ -0,0 +1,28 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
|
||||
# Simple wrapper script to call Nashorn with the javascript pandoc filter
|
||||
|
||||
@@BOOT_JDK@@/bin/jjs @@JJS_FLAGS@@ -scripting \
|
||||
"@@TOPDIR@@/make/scripts/pandoc-manpage-filter.js" 2> /dev/null
|
@ -1,2 +0,0 @@
|
||||
These files are generated from docs/technotes/tools pages in the
|
||||
jdk/pubs subspace of the jdk workspace (adjacent to jdk/j2se).
|
@ -1,153 +0,0 @@
|
||||
." Copyright (c) 2004, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH apt 1 "10 May 2011"
|
||||
|
||||
.LP
|
||||
.SH "NAME"
|
||||
.LP
|
||||
.LP
|
||||
\f2apt\fP \- annotation processing tool
|
||||
.LP
|
||||
.SH "SYNOPSIS"
|
||||
.LP
|
||||
.LP
|
||||
\f2apt [\-classpath \fP\f2classpath\fP] [\-sourcepath \f2sourcepath\fP] [\-d \f2directory\fP] [\-s \f2directory\fP] [\-factorypath \f2path\fP] [\-factory \f2class\fP] [\-print] [\-nocompile] [\-A\f2key\fP[\f2=val\fP] ...] [\f2javac option\fP] sourcefiles [@files]
|
||||
.LP
|
||||
.SH "PARAMETERS"
|
||||
.LP
|
||||
.LP
|
||||
Options may be in any order. For a discussion of parameters which apply to a specific option, see OPTIONS below.
|
||||
.LP
|
||||
.RS 3
|
||||
.TP 3
|
||||
sourcefiles
|
||||
Zero or more source files to be processed.
|
||||
.TP 3
|
||||
@files
|
||||
One or more files that list source files or other options
|
||||
.RE
|
||||
|
||||
.LP
|
||||
.SH "DESCRIPTION"
|
||||
.LP
|
||||
.LP
|
||||
\f3Note\fP: The \f2apt\fP tool and its associated API contained in the package \f2com.sun.mirror\fP have been deprecated since JDK 7 and are planned to be removed in the next major JDK release. Use the options available in the \f2javac(1)\fP tool and the APIs contained in the packages \f2javax.annotation.processing\fP and \f2javax.lang.model\fP to process annotations.
|
||||
.LP
|
||||
.LP
|
||||
The tool \f2apt\fP, annotation processing tool, includes reflective APIs and supporting infrastructure to process program annotations. The \f2apt\fP reflective APIs provide a build\-time, source\-based, read\-only view of program structure. These reflective APIs are designed to cleanly model the Java(TM) programming language's type system after the addition of generics. First, \f2apt\fP runs annotation processors that can produce new source code and other files. Next, \f2apt\fP can cause compilation of both original and generated source files, easing development. The reflective APIs and other APIs used to interact with the tool are subpackages of \f2com.sun.mirror\fP.
|
||||
.LP
|
||||
.LP
|
||||
A fuller discussion of how the tool operates as well as instructions for developing with \f2apt\fP are in
|
||||
.na
|
||||
\f4Getting Started with \fP\f4apt\fP. @
|
||||
.fi
|
||||
http://download.oracle.com/javase/7/docs/technotes/guides/apt/GettingStarted.html
|
||||
.LP
|
||||
.SH "OPTIONS"
|
||||
.LP
|
||||
.SS
|
||||
apt specific options
|
||||
.LP
|
||||
.RS 3
|
||||
.TP 3
|
||||
\-s dir
|
||||
Specify the directory root under which processor\-generated source files will be placed; files are placed in subdirectories based on package namespace.
|
||||
.TP 3
|
||||
\-nocompile
|
||||
Do not compile source files to class files.
|
||||
.TP 3
|
||||
\-print
|
||||
Print out textual representation of specified types; perform no annotation processing or compilation.
|
||||
.TP 3
|
||||
\-A[key[=val]]
|
||||
Options to pass to annotation processors \-\- these are not interpreted by \f2apt\fP directly, but are made available for use by individual processors
|
||||
.TP 3
|
||||
\-factorypath path
|
||||
Specify where to find annotation processor factories; if this option is used, the classpath is \f2not\fP searched for factories.
|
||||
.TP 3
|
||||
\-factory classname
|
||||
Name of annotation processor factory to use; bypasses default discovery process
|
||||
.TP 3
|
||||
\-version
|
||||
Print version information.
|
||||
.TP 3
|
||||
\-X
|
||||
Display information about non\-standard options.
|
||||
.RE
|
||||
|
||||
.LP
|
||||
.SS
|
||||
Options shared with javac
|
||||
.LP
|
||||
.RS 3
|
||||
.TP 3
|
||||
\-d dir
|
||||
Specify where to place processor and javac generated class files
|
||||
.TP 3
|
||||
\-cp path or \-classpath path
|
||||
Specify where to find user class files and annotation processor factories. If \f2\-factorypath\fP is given, the classpath is not searched for factories.
|
||||
.RE
|
||||
|
||||
.LP
|
||||
.LP
|
||||
Consult the javac(1) man page for information on \f2javac\fP options.
|
||||
.LP
|
||||
.SS
|
||||
Non\-Standard Options
|
||||
.LP
|
||||
.RS 3
|
||||
.TP 3
|
||||
\-XListAnnotationTypes
|
||||
List found annotation types.
|
||||
.TP 3
|
||||
\-XListDeclarations
|
||||
List specified and included declarations.
|
||||
.TP 3
|
||||
\-XPrintAptRounds
|
||||
Print information about initial and recursive \f2apt\fP rounds.
|
||||
.TP 3
|
||||
\-XPrintFactoryInfo
|
||||
Print information about which annotations a factory is asked to process.
|
||||
.TP 3
|
||||
\-XclassesAsDecls
|
||||
Treat both class and source files as declarations to process.
|
||||
.RE
|
||||
|
||||
.LP
|
||||
.LP
|
||||
\f3Note\fP: Because these options are non\-standard, they are subject to change without notice.
|
||||
.LP
|
||||
.SH "NOTES"
|
||||
.LP
|
||||
.LP
|
||||
The \f2apt\fP tool and its associated API contained in the package \f2com.sun.mirror\fP have been deprecated since JDK 7 and are planned to be removed in the next major JDK release. Use the options available in the \f2javac(1)\fP tool and the APIs contained in the packages \f2javax.annotation.processing\fP and \f2javax.lang.model\fP to process annotations.
|
||||
.LP
|
||||
.SH "SEE ALSO"
|
||||
.LP
|
||||
.RS 3
|
||||
.TP 2
|
||||
o
|
||||
javac(1), java(1)
|
||||
.RE
|
||||
|
||||
.LP
|
||||
|
@ -1,27 +0,0 @@
|
||||
." Copyright (c) 2004, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH apt 1 "07 May 2011"
|
||||
|
||||
.LP
|
||||
.SH "NAME"
|
||||
.LP
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 1997, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH jar 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 1998, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH jarsigner 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 1994, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH java 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 1994, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH javac 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,22 +0,0 @@
|
||||
." Copyright (c) 1994, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH javadoc 1 "07 May 2011"
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 1994, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH javap 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 2003, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH javaws 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
." DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
."
|
||||
." This code is free software; you can redistribute it and/or modify it
|
||||
." under the terms of the GNU General Public License version 2 only, as
|
||||
." published by the Free Software Foundation.
|
||||
."
|
||||
." This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
." ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
." FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
." version 2 for more details (a copy is included in the LICENSE file that
|
||||
." accompanied this code).
|
||||
."
|
||||
." You should have received a copy of the GNU General Public License version
|
||||
." 2 along with this work; if not, write to the Free Software Foundation,
|
||||
." Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
."
|
||||
." Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
." or visit www.oracle.com if you need additional information or have any
|
||||
." questions.
|
||||
."
|
||||
.TH jcmd 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 2004, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH jconsole 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH jdb 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
." DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
."
|
||||
." This code is free software; you can redistribute it and/or modify it
|
||||
." under the terms of the GNU General Public License version 2 only, as
|
||||
." published by the Free Software Foundation.
|
||||
."
|
||||
." This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
." ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
." FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
." version 2 for more details (a copy is included in the LICENSE file that
|
||||
." accompanied this code).
|
||||
."
|
||||
." You should have received a copy of the GNU General Public License version
|
||||
." 2 along with this work; if not, write to the Free Software Foundation,
|
||||
." Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
."
|
||||
." Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
." or visit www.oracle.com if you need additional information or have any
|
||||
." questions.
|
||||
."
|
||||
.TH jdeps 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 2006, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH jhat 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 2004, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH jinfo 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
." DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
."
|
||||
." This code is free software; you can redistribute it and/or modify it
|
||||
." under the terms of the GNU General Public License version 2 only, as
|
||||
." published by the Free Software Foundation.
|
||||
."
|
||||
." This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
." ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
." FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
." version 2 for more details (a copy is included in the LICENSE file that
|
||||
." accompanied this code).
|
||||
."
|
||||
." You should have received a copy of the GNU General Public License version
|
||||
." 2 along with this work; if not, write to the Free Software Foundation,
|
||||
." Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
."
|
||||
." Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
." or visit www.oracle.com if you need additional information or have any
|
||||
." questions.
|
||||
."
|
||||
.TH jjs 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 2004, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH jmap 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 2004, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH jps 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 2006, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH jrunscript 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 2004, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH jsadebugd 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 2004, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH jstack 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 2004, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH jstat 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 2004, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH jstatd 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 1998, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH keytool 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 2004, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH pack200 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 1997, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH rmic 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 1998, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH rmid 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 1997, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH rmiregistry 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 1997, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH serialver 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,24 +0,0 @@
|
||||
." Copyright (c) 2004, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH unpack200 1 "07 May 2011"
|
||||
|
||||
.LP
|
@ -1,222 +0,0 @@
|
||||
." Copyright (c) 2003, 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.
|
||||
."
|
||||
." 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.
|
||||
."
|
||||
.TH javaws 1 "10 May 2011"
|
||||
|
||||
.LP
|
||||
.SH "Name"
|
||||
\f2javaws\fP Command Line
|
||||
.LP
|
||||
.SH "NAME"
|
||||
.LP
|
||||
.LP
|
||||
\f2javaws\fP \- Java Web Start launcher command
|
||||
.LP
|
||||
.SH "SYNOPSIS"
|
||||
.LP
|
||||
.LP
|
||||
\f2javaws [run\-options] <jnlp>\fP
|
||||
.LP
|
||||
.LP
|
||||
\f2javaws [control\-options]\fP
|
||||
.LP
|
||||
.SH "PARAMETERS"
|
||||
.LP
|
||||
.LP
|
||||
\f2[run\-options]\fP
|
||||
.LP
|
||||
.LP
|
||||
Command\-line run\-options. run\-options may be in any order. For a discussion of the various run\-options, see RUN\-OPTIONS below.
|
||||
.LP
|
||||
.LP
|
||||
\f2<jnlp>\fP
|
||||
.LP
|
||||
.LP
|
||||
This can be either the path of, or the Uniform Resource Locater (URL) of the JNLP (Java Network Launching Protocol) file.
|
||||
.LP
|
||||
.LP
|
||||
\f2[control\-options]\fP
|
||||
.LP
|
||||
.LP
|
||||
Command\-line control\-options. control\-options may be in any order. For a discussion of the various control\-options, see CONTROL\-OPTIONS below.
|
||||
.LP
|
||||
.SH "DESCRIPTION"
|
||||
.LP
|
||||
.LP
|
||||
The \f2javaws\fP command launches Java Web Start, which is the reference implementation of the Java Network Launching Protocol (JNLP). Java Web Start launches Java applications/applets hosted on a network.
|
||||
.LP
|
||||
.LP
|
||||
If a JNLP file is specified, \f2javaws\fP will launch the Java application/applet specified in the JNLP file.
|
||||
.LP
|
||||
.LP
|
||||
The \f2javaws\fP launcher has a set of options that are supported in the current release. However, the options may be removed in a future release.
|
||||
.LP
|
||||
.SH "RUN\-OPTIONS"
|
||||
.LP
|
||||
.LP
|
||||
\f2\-offline\fP
|
||||
.LP
|
||||
.LP
|
||||
Run Java Web Start in offline mode.
|
||||
.LP
|
||||
.LP
|
||||
\f2\-Xnosplash\fP
|
||||
.LP
|
||||
.LP
|
||||
Do not display the initial splash screen.
|
||||
.LP
|
||||
.LP
|
||||
\f2\-open <arguments>\fP
|
||||
.LP
|
||||
.LP
|
||||
If specified, replaces the arguments in the jnlp file with \f2\-open <arguments>\fP.
|
||||
.LP
|
||||
.LP
|
||||
\f2\-print <arguments>\fP
|
||||
.LP
|
||||
.LP
|
||||
If specified, replaces the arguments in the jnlp file with \f2\-print <arguments>\fP.
|
||||
.LP
|
||||
.LP
|
||||
\f2\-online\fP
|
||||
.LP
|
||||
.LP
|
||||
Use online mode (default behavior).
|
||||
.LP
|
||||
.LP
|
||||
\f2\-wait\fP
|
||||
.LP
|
||||
.LP
|
||||
If specified, the \f2javaws\fP process will not exit until the application exits. This option does not function as described on Windows platforms.
|
||||
.LP
|
||||
.LP
|
||||
\f2\-verbose\fP
|
||||
.LP
|
||||
.LP
|
||||
Display additional output.
|
||||
.LP
|
||||
.LP
|
||||
\f2\-J<option>\fP
|
||||
.LP
|
||||
.LP
|
||||
Supply options to the VM.
|
||||
.LP
|
||||
.LP
|
||||
\f2\-system\fP
|
||||
.LP
|
||||
.LP
|
||||
Run the application from the system cache only.
|
||||
.LP
|
||||
.SH "CONTROL\-OPTIONS"
|
||||
.LP
|
||||
.LP
|
||||
\f2\-viewer\fP
|
||||
.LP
|
||||
.LP
|
||||
Show the Cache Viewer in the Java Control Panel.
|
||||
.LP
|
||||
.LP
|
||||
\f2\-clearcache\fP
|
||||
.LP
|
||||
.LP
|
||||
Remove all non\-installed applications from the cache.
|
||||
.LP
|
||||
.LP
|
||||
\f2\-userConfig <property name>\fP
|
||||
.LP
|
||||
.LP
|
||||
Clear the specified deployment property.
|
||||
.LP
|
||||
.LP
|
||||
\f2\-userConfig <property name> <property value>\fP
|
||||
.LP
|
||||
.LP
|
||||
Set the specified deployment property to the specified value.
|
||||
.LP
|
||||
.LP
|
||||
\f2\-uninstall\fP
|
||||
.LP
|
||||
.LP
|
||||
Remove all applications from the cache.
|
||||
.LP
|
||||
.LP
|
||||
\f2\-uninstall <jnlp>\fP
|
||||
.LP
|
||||
.LP
|
||||
Remove the application from the cache.
|
||||
.LP
|
||||
.LP
|
||||
\f2\-import [import\-options] <jnlp>\fP
|
||||
.LP
|
||||
.LP
|
||||
Import the application to the cache.
|
||||
.LP
|
||||
.SH "IMPORT\-OPTIONS"
|
||||
.LP
|
||||
.LP
|
||||
\f2\-silent\fP
|
||||
.LP
|
||||
.LP
|
||||
Import silently (with no user interface).
|
||||
.LP
|
||||
.LP
|
||||
\f2\-system\fP
|
||||
.LP
|
||||
.LP
|
||||
Import application to the system cache.
|
||||
.LP
|
||||
.LP
|
||||
\f2\-codebase <url>\fP
|
||||
.LP
|
||||
.LP
|
||||
Retrieve resources from the given codebase.
|
||||
.LP
|
||||
.LP
|
||||
\f2\-shortcut\fP
|
||||
.LP
|
||||
.LP
|
||||
Install shortcuts as if user allowed prompt. This option has no effect unless \f2\-silent\fP option is also used.
|
||||
.LP
|
||||
.LP
|
||||
\f2\-association\fP
|
||||
.LP
|
||||
.LP
|
||||
Install associations as if user allowed prompt. This option has no effect unless \f2\-silent\fP option is also used.
|
||||
.LP
|
||||
.SH "FILES"
|
||||
.LP
|
||||
.LP
|
||||
For information about the user and system cache and deployment.properties files, see
|
||||
.na
|
||||
\f2System\- and User\-Level Properties\fP @
|
||||
.fi
|
||||
http://download.oracle.com/javase/7/docs/technotes/guides/deployment/deployment\-guide/properties.html.
|
||||
.LP
|
||||
.SH "MORE INFORMATION"
|
||||
.LP
|
||||
.LP
|
||||
For more information about Java Web Start, see
|
||||
.na
|
||||
\f2Java Web Start\fP @
|
||||
.fi
|
||||
http://download.oracle.com/javase/7/docs/technotes/guides/javaws/index.html.
|
||||
.LP
|
||||
|
@ -1,136 +0,0 @@
|
||||
'\" t
|
||||
.\" Copyright (c) 2006, 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.
|
||||
.\"
|
||||
.\" 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.
|
||||
.\"
|
||||
.\" Arch: generic
|
||||
.\" Software: JDK 8
|
||||
.\" Date: 21 November 2013
|
||||
.\" SectDesc: Troubleshooting Tools
|
||||
.\" Title: jhat.1
|
||||
.\"
|
||||
.if n .pl 99999
|
||||
.TH jhat 1 "21 November 2013" "JDK 8" "Troubleshooting Tools"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.\" http://bugs.debian.org/507673
|
||||
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
|
||||
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.ie \n(.g .ds Aq \(aq
|
||||
.el .ds Aq '
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * set default formatting
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" disable hyphenation
|
||||
.nh
|
||||
.\" disable justification (adjust text to left margin only)
|
||||
.ad l
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * MAIN CONTENT STARTS HERE *
|
||||
.\" -----------------------------------------------------------------
|
||||
|
||||
.SH NAME
|
||||
jhat \- Analyzes the Java heap\&. This command is experimental and unsupported\&.
|
||||
.SH SYNOPSIS
|
||||
.sp
|
||||
.nf
|
||||
|
||||
\fBjhat\fR [ \fIoptions\fR ] \fIheap\-dump\-file\fR
|
||||
.fi
|
||||
.sp
|
||||
.TP
|
||||
\fIoptions\fR
|
||||
The command-line options\&. See Options\&.
|
||||
.TP
|
||||
\fIheap-dump-file\fR
|
||||
Java binary heap dump file to be browsed\&. For a dump file that contains multiple heap dumps, you can specify which dump in the file by appending \f3#<number>\fR to the file name, for example, \f3myfile\&.hprof#3\fR\&.
|
||||
.SH DESCRIPTION
|
||||
The \f3jhat\fR command parses a Java heap dump file and starts a web server\&. The \f3jhat\fR command lets you to browse heap dumps with your favorite web browser\&. The \f3jhat\fR command supports predesigned queries such as show all instances of a known class \f3MyClass\fR, and Object Query Language (OQL)\&. OQL is similar to SQL, except for querying heap dumps\&. Help on OQL is available from the OQL help page shown by the \f3jhat\fR command\&. With the default port, OQL help is available at http://localhost:7000/oqlhelp/
|
||||
.PP
|
||||
There are several ways to generate a Java heap dump:
|
||||
.TP 0.2i
|
||||
\(bu
|
||||
Use the \f3jmap -dump\fR option to obtain a heap dump at runtime\&. See jmap(1)\&.
|
||||
.TP 0.2i
|
||||
\(bu
|
||||
Use the \f3jconsole\fR option to obtain a heap dump through \f3HotSpotDiagnosticMXBean\fR at runtime\&. See jconsole(1) and the \f3HotSpotDiagnosticMXBean\fR interface description at http://docs\&.oracle\&.com/javase/8/docs/jre/api/management/extension/com/sun/management/HotSpotDiagnosticMXBean\&.html
|
||||
.TP 0.2i
|
||||
\(bu
|
||||
Heap dump is generated when an \f3OutOfMemoryError\fR is thrown by specifying the \f3-XX:+HeapDumpOnOutOfMemoryError\fR Java Virtual Machine (JVM) option\&.
|
||||
.TP 0.2i
|
||||
\(bu
|
||||
Use the \f3hprof\fR command\&. See the HPROF: A Heap/CPU Profiling Tool at http://docs\&.oracle\&.com/javase/8/docs/technotes/samples/hprof\&.html
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
-stack false|true
|
||||
.br
|
||||
Turns off tracking object allocation call stack\&. If allocation site information is not available in the heap dump, then you have to set this flag to \f3false\fR\&. The default is \f3true\fR\&.
|
||||
.TP
|
||||
-refs false|true
|
||||
.br
|
||||
Turns off tracking of references to objects\&. Default is \f3true\fR\&. By default, back pointers, which are objects that point to a specified object such as referrers or incoming references, are calculated for all objects in the heap\&.
|
||||
.TP
|
||||
-port \fIport-number\fR
|
||||
.br
|
||||
Sets the port for the \f3jhat\fR HTTP server\&. Default is 7000\&.
|
||||
.TP
|
||||
-exclude \fIexclude-file\fR
|
||||
.br
|
||||
Specifies a file that lists data members that should be excluded from the reachable objects query\&. For example, if the file lists \f3java\&.lang\&.String\&.value\fR, then, then whenever the list of objects that are reachable from a specific object \f3o\fR are calculated, reference paths that involve \f3java\&.lang\&.String\&.value\fR field are not considered\&.
|
||||
.TP
|
||||
-baseline \fIexclude-file\fR
|
||||
.br
|
||||
Specifies a baseline heap dump\&. Objects in both heap dumps with the same object ID are marked as not being new\&. Other objects are marked as new\&. This is useful for comparing two different heap dumps\&.
|
||||
.TP
|
||||
-debug \fIint\fR
|
||||
.br
|
||||
Sets the debug level for this tool\&. A level of 0 means no debug output\&. Set higher values for more verbose modes\&.
|
||||
.TP
|
||||
-version
|
||||
.br
|
||||
Reports the release number and exits
|
||||
.TP
|
||||
-h
|
||||
.br
|
||||
Dsiplays a help message and exits\&.
|
||||
.TP
|
||||
-help
|
||||
.br
|
||||
Displays a help message and exits\&.
|
||||
.TP
|
||||
-J\fIflag\fR
|
||||
.br
|
||||
Passes \f3flag\fR to the Java Virtual Machine on which the \f3jhat\fR command is running\&. For example, \f3-J-Xmx512m\fR to use a maximum heap size of 512 MB\&.
|
||||
.SH SEE\ ALSO
|
||||
.TP 0.2i
|
||||
\(bu
|
||||
jmap(1)
|
||||
.TP 0.2i
|
||||
\(bu
|
||||
jconsole(1)
|
||||
.TP 0.2i
|
||||
\(bu
|
||||
HPROF: A Heap/CPU Profiling Tool at http://docs\&.oracle\&.com/javase/8/docs/technotes/samples/hprof\&.html
|
||||
.RE
|
||||
.br
|
||||
'pl 8.5i
|
||||
'bp
|
@ -1,108 +0,0 @@
|
||||
'\" t
|
||||
.\" Copyright (c) 2004, 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.
|
||||
.\"
|
||||
.\" 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.
|
||||
.\"
|
||||
.\" Arch: generic
|
||||
.\" Software: JDK 8
|
||||
.\" Date: 21 November 2013
|
||||
.\" SectDesc: Troubleshooting Tools
|
||||
.\" Title: jsadebugd.1
|
||||
.\"
|
||||
.if n .pl 99999
|
||||
.TH jsadebugd 1 "21 November 2013" "JDK 8" "Troubleshooting Tools"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.\" http://bugs.debian.org/507673
|
||||
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
|
||||
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.ie \n(.g .ds Aq \(aq
|
||||
.el .ds Aq '
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * set default formatting
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" disable hyphenation
|
||||
.nh
|
||||
.\" disable justification (adjust text to left margin only)
|
||||
.ad l
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * MAIN CONTENT STARTS HERE *
|
||||
.\" -----------------------------------------------------------------
|
||||
|
||||
.SH NAME
|
||||
jsadebugd \- Attaches to a Java process or core file and acts as a debug server\&. This command is experimental and unsupported\&.
|
||||
.SH SYNOPSIS
|
||||
.sp
|
||||
.nf
|
||||
|
||||
\fBjsadebugd\fR \fIpid\fR [ \fIserver\-id\fR ]
|
||||
.fi
|
||||
.nf
|
||||
|
||||
\fBjsadebugd\fR \fIexecutable\fR \fIcore\fR [ \fIserver\-id\fR ]
|
||||
.fi
|
||||
.sp
|
||||
.TP
|
||||
\fIpid\fR
|
||||
The process ID of the process to which the debug server attaches\&. The process must be a Java process\&. To get a list of Java processes running on a machine, use the jps(1) command\&. At most one instance of the debug server can be attached to a single process\&.
|
||||
.TP
|
||||
\fIexecutable\fR
|
||||
The Java executable from which the core dump was produced\&.
|
||||
.TP
|
||||
\fIcore\fR
|
||||
The core file to which the debug server should attach\&.
|
||||
.TP
|
||||
\fIserver-id\fR
|
||||
An optional unique ID that is needed when multiple debug servers are started on the same machine\&. This ID must be used by remote clients to identify the particular debug server to which to attach\&. Within a single machine, this ID must be unique\&.
|
||||
.SH DESCRIPTION
|
||||
The \f3jsadebugd\fR command attaches to a Java process or core file and acts as a debug server\&. Remote clients such as \f3jstack\fR, \f3jmap\fR, and \f3jinfo\fR can attach to the server through Java Remote Method Invocation (RMI)\&. Before you start the \f3jsadebugd\fR command, start the RMI registry with the \f3rmiregistry\fR command as follows where \fI$JAVA_HOME\fR is the JDK installation directory:
|
||||
.sp
|
||||
.nf
|
||||
\f3rmiregistry \-J\-Xbootclasspath/p:$JAVA_HOME/lib/sajdi\&.jar\fP
|
||||
.fi
|
||||
.nf
|
||||
\f3\fP
|
||||
.fi
|
||||
.sp
|
||||
If the RMI registry was not started, then the \f3jsadebugd\fR command starts an RMI registry in a standard (1099) port internally\&. The debug server can be stopped by sending a \f3SIGINT\fR to it\&. To send a SIGINT press \fICtrl+C\fR\&.
|
||||
.PP
|
||||
\fINote:\fR This utility is unsupported and may or may not be available in future releases of the JDK\&. In Windows Systems where \f3dbgeng\&.dll\fR is not present, Debugging Tools For Windows must be installed to have these tools working\&. The \f3PATH\fR environment variable should contain the location of jvm\&.dll used by the target process or the location from which the crash dump file was produced\&. For example, \f3s\fR\f3et PATH=%JDK_HOME%\ejre\ebin\eclient;%PATH%\fR\&.
|
||||
.SH SEE\ ALSO
|
||||
.TP 0.2i
|
||||
\(bu
|
||||
jinfo(1)
|
||||
.TP 0.2i
|
||||
\(bu
|
||||
jmap(1)
|
||||
.TP 0.2i
|
||||
\(bu
|
||||
jps(1)
|
||||
.TP 0.2i
|
||||
\(bu
|
||||
jstack(1)
|
||||
.TP 0.2i
|
||||
\(bu
|
||||
rmiregistry(1)
|
||||
.RE
|
||||
.br
|
||||
'pl 8.5i
|
||||
'bp
|
@ -541,7 +541,11 @@ query_multipage_support_end:
|
||||
|
||||
void os::init_system_properties_values() {
|
||||
|
||||
#define DEFAULT_LIBPATH "/lib:/usr/lib"
|
||||
#ifndef OVERRIDE_LIBPATH
|
||||
#define DEFAULT_LIBPATH "/lib:/usr/lib"
|
||||
#else
|
||||
#define DEFAULT_LIBPATH OVERRIDE_LIBPATH
|
||||
#endif
|
||||
#define EXTENSIONS_DIR "/lib/ext"
|
||||
|
||||
// Buffer that fits several sprintfs.
|
||||
|
@ -316,7 +316,11 @@ void os::init_system_properties_values() {
|
||||
// ...
|
||||
// 7: The default directories, normally /lib and /usr/lib.
|
||||
#ifndef DEFAULT_LIBPATH
|
||||
#define DEFAULT_LIBPATH "/lib:/usr/lib"
|
||||
#ifndef OVERRIDE_LIBPATH
|
||||
#define DEFAULT_LIBPATH "/lib:/usr/lib"
|
||||
#else
|
||||
#define DEFAULT_LIBPATH OVERRIDE_LIBPATH
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Base path of extensions installed on the system.
|
||||
|
@ -323,10 +323,14 @@ void os::init_system_properties_values() {
|
||||
// 1: ...
|
||||
// ...
|
||||
// 7: The default directories, normally /lib and /usr/lib.
|
||||
#if defined(AMD64) || (defined(_LP64) && defined(SPARC)) || defined(PPC64) || defined(S390)
|
||||
#define DEFAULT_LIBPATH "/usr/lib64:/lib64:/lib:/usr/lib"
|
||||
#ifndef OVERRIDE_LIBPATH
|
||||
#if defined(AMD64) || (defined(_LP64) && defined(SPARC)) || defined(PPC64) || defined(S390)
|
||||
#define DEFAULT_LIBPATH "/usr/lib64:/lib64:/lib:/usr/lib"
|
||||
#else
|
||||
#define DEFAULT_LIBPATH "/lib:/usr/lib"
|
||||
#endif
|
||||
#else
|
||||
#define DEFAULT_LIBPATH "/lib:/usr/lib"
|
||||
#define DEFAULT_LIBPATH OVERRIDE_LIBPATH
|
||||
#endif
|
||||
|
||||
// Base path of extensions installed on the system.
|
||||
|
@ -5521,10 +5521,16 @@ InstanceKlass* ClassFileParser::create_instance_klass(bool changed_by_loadhook,
|
||||
|
||||
assert(_klass == ik, "invariant");
|
||||
|
||||
|
||||
if (ik->should_store_fingerprint()) {
|
||||
ik->store_fingerprint(_stream->compute_fingerprint());
|
||||
}
|
||||
|
||||
ik->set_has_passed_fingerprint_check(false);
|
||||
if (UseAOT && ik->supers_have_passed_fingerprint_checks()) {
|
||||
uint64_t aot_fp = AOTLoader::get_saved_fingerprint(ik);
|
||||
if (aot_fp != 0 && aot_fp == _stream->compute_fingerprint()) {
|
||||
uint64_t fp = ik->has_stored_fingerprint() ? ik->get_stored_fingerprint() : _stream->compute_fingerprint();
|
||||
if (aot_fp != 0 && aot_fp == fp) {
|
||||
// This class matches with a class saved in an AOT library
|
||||
ik->set_has_passed_fingerprint_check(true);
|
||||
} else {
|
||||
|
@ -231,10 +231,6 @@ InstanceKlass* KlassFactory::create_from_stream(ClassFileStream* stream,
|
||||
result->set_cached_class_file(cached_class_file);
|
||||
}
|
||||
|
||||
if (result->should_store_fingerprint()) {
|
||||
result->store_fingerprint(stream->compute_fingerprint());
|
||||
}
|
||||
|
||||
JFR_ONLY(ON_KLASS_CREATION(result, parser, THREAD);)
|
||||
|
||||
#if INCLUDE_CDS
|
||||
|
@ -206,6 +206,12 @@ StringTable::StringTable() : _local_table(NULL), _current_size(0), _has_work(0),
|
||||
_local_table = new StringTableHash(start_size_log_2, END_SIZE, REHASH_LEN);
|
||||
}
|
||||
|
||||
void StringTable::update_needs_rehash(bool rehash) {
|
||||
if (rehash) {
|
||||
_needs_rehashing = true;
|
||||
}
|
||||
}
|
||||
|
||||
size_t StringTable::item_added() {
|
||||
return Atomic::add((size_t)1, &(the_table()->_items_count));
|
||||
}
|
||||
@ -281,9 +287,7 @@ oop StringTable::do_lookup(const jchar* name, int len, uintx hash) {
|
||||
StringTableGet stg(thread);
|
||||
bool rehash_warning;
|
||||
_local_table->get(thread, lookup, stg, &rehash_warning);
|
||||
if (rehash_warning) {
|
||||
_needs_rehashing = true;
|
||||
}
|
||||
update_needs_rehash(rehash_warning);
|
||||
return stg.get_res_oop();
|
||||
}
|
||||
|
||||
@ -334,30 +338,6 @@ oop StringTable::intern(Handle string_or_null_h, const jchar* name, int len, TRA
|
||||
hash, CHECK_NULL);
|
||||
}
|
||||
|
||||
class StringTableCreateEntry : public StackObj {
|
||||
private:
|
||||
Thread* _thread;
|
||||
Handle _return;
|
||||
Handle _store;
|
||||
public:
|
||||
StringTableCreateEntry(Thread* thread, Handle store)
|
||||
: _thread(thread), _store(store) {}
|
||||
|
||||
WeakHandle<vm_string_table_data> operator()() { // No dups found
|
||||
WeakHandle<vm_string_table_data> wh =
|
||||
WeakHandle<vm_string_table_data>::create(_store);
|
||||
return wh;
|
||||
}
|
||||
void operator()(bool inserted, WeakHandle<vm_string_table_data>* val) {
|
||||
oop result = val->resolve();
|
||||
assert(result != NULL, "Result should be reachable");
|
||||
_return = Handle(_thread, result);
|
||||
}
|
||||
oop get_return() const {
|
||||
return _return();
|
||||
}
|
||||
};
|
||||
|
||||
oop StringTable::do_intern(Handle string_or_null_h, const jchar* name,
|
||||
int len, uintx hash, TRAPS) {
|
||||
HandleMark hm(THREAD); // cleanup strings created
|
||||
@ -377,15 +357,23 @@ oop StringTable::do_intern(Handle string_or_null_h, const jchar* name,
|
||||
assert(java_lang_String::equals(string_h(), name, len),
|
||||
"string must be properly initialized");
|
||||
assert(len == java_lang_String::length(string_h()), "Must be same length");
|
||||
|
||||
StringTableLookupOop lookup(THREAD, hash, string_h);
|
||||
StringTableCreateEntry stc(THREAD, string_h);
|
||||
StringTableGet stg(THREAD);
|
||||
|
||||
bool rehash_warning;
|
||||
_local_table->get_insert_lazy(THREAD, lookup, stc, stc, &rehash_warning);
|
||||
if (rehash_warning) {
|
||||
_needs_rehashing = true;
|
||||
}
|
||||
return stc.get_return();
|
||||
do {
|
||||
if (_local_table->get(THREAD, lookup, stg, &rehash_warning)) {
|
||||
update_needs_rehash(rehash_warning);
|
||||
return stg.get_res_oop();
|
||||
}
|
||||
WeakHandle<vm_string_table_data> wh = WeakHandle<vm_string_table_data>::create(string_h);
|
||||
// The hash table takes ownership of the WeakHandle, even if it's not inserted.
|
||||
if (_local_table->insert(THREAD, lookup, wh, &rehash_warning)) {
|
||||
update_needs_rehash(rehash_warning);
|
||||
return wh.resolve();
|
||||
}
|
||||
} while(true);
|
||||
}
|
||||
|
||||
// GC support
|
||||
|
@ -93,6 +93,7 @@ private:
|
||||
|
||||
void try_rehash_table();
|
||||
bool do_rehash();
|
||||
inline void update_needs_rehash(bool rehash);
|
||||
|
||||
public:
|
||||
// The string table
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "gc/shared/suspendibleThreadSet.hpp"
|
||||
#include "gc/shared/workgroup.hpp"
|
||||
#include "runtime/atomic.hpp"
|
||||
#include "runtime/flags/flagSetting.hpp"
|
||||
#include "runtime/mutexLocker.hpp"
|
||||
#include "runtime/safepoint.hpp"
|
||||
#include "runtime/thread.inline.hpp"
|
||||
@ -148,14 +149,9 @@ uint DirtyCardQueueSet::num_par_ids() {
|
||||
|
||||
void DirtyCardQueueSet::initialize(Monitor* cbl_mon,
|
||||
BufferNode::Allocator* allocator,
|
||||
int process_completed_threshold,
|
||||
int max_completed_queue,
|
||||
Mutex* lock,
|
||||
bool init_free_ids) {
|
||||
PtrQueueSet::initialize(cbl_mon,
|
||||
allocator,
|
||||
process_completed_threshold,
|
||||
max_completed_queue);
|
||||
PtrQueueSet::initialize(cbl_mon, allocator);
|
||||
_shared_dirty_card_queue.set_lock(lock);
|
||||
if (init_free_ids) {
|
||||
_free_ids = new FreeIdSet(num_par_ids(), _cbl_mon);
|
||||
@ -334,13 +330,11 @@ void DirtyCardQueueSet::concatenate_logs() {
|
||||
// Iterate over all the threads, if we find a partial log add it to
|
||||
// the global list of logs. Temporarily turn off the limit on the number
|
||||
// of outstanding buffers.
|
||||
int save_max_completed_queue = _max_completed_queue;
|
||||
_max_completed_queue = max_jint;
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint.");
|
||||
SizeTFlagSetting local_max(_max_completed_buffers,
|
||||
MaxCompletedBuffersUnlimited);
|
||||
for (JavaThreadIteratorWithHandle jtiwh; JavaThread *t = jtiwh.next(); ) {
|
||||
concatenate_log(G1ThreadLocalData::dirty_card_queue(t));
|
||||
}
|
||||
concatenate_log(_shared_dirty_card_queue);
|
||||
// Restore the completed buffer queue limit.
|
||||
_max_completed_queue = save_max_completed_queue;
|
||||
}
|
||||
|
@ -119,8 +119,6 @@ public:
|
||||
|
||||
void initialize(Monitor* cbl_mon,
|
||||
BufferNode::Allocator* allocator,
|
||||
int process_completed_threshold,
|
||||
int max_completed_queue,
|
||||
Mutex* lock,
|
||||
bool init_free_ids = false);
|
||||
|
||||
|
@ -1016,7 +1016,6 @@ void G1CollectedHeap::prepare_heap_for_full_collection() {
|
||||
// Make sure we'll choose a new allocation region afterwards.
|
||||
_allocator->release_mutator_alloc_region();
|
||||
_allocator->abandon_gc_alloc_regions();
|
||||
g1_rem_set()->cleanupHRRS();
|
||||
|
||||
// We may have added regions to the current incremental collection
|
||||
// set between the last GC or pause and now. We need to clear the
|
||||
@ -1660,19 +1659,15 @@ jint G1CollectedHeap::initialize() {
|
||||
G1SATBBufferEnqueueingThresholdPercent,
|
||||
Shared_SATB_Q_lock);
|
||||
|
||||
// process_completed_threshold and max_completed_queue are updated
|
||||
// process_completed_buffers_threshold and max_completed_buffers are updated
|
||||
// later, based on the concurrent refinement object.
|
||||
G1BarrierSet::dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
|
||||
&bs->dirty_card_queue_buffer_allocator(),
|
||||
-1, // temp. never trigger
|
||||
-1, // temp. no limit
|
||||
Shared_DirtyCardQ_lock,
|
||||
true); // init_free_ids
|
||||
|
||||
dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
|
||||
&bs->dirty_card_queue_buffer_allocator(),
|
||||
-1, // never trigger processing
|
||||
-1, // no limit on length
|
||||
Shared_DirtyCardQ_lock);
|
||||
|
||||
// Create the hot card cache.
|
||||
@ -1783,8 +1778,8 @@ jint G1CollectedHeap::initialize() {
|
||||
|
||||
{
|
||||
DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set();
|
||||
dcqs.set_process_completed_threshold((int)concurrent_refine()->yellow_zone());
|
||||
dcqs.set_max_completed_queue((int)concurrent_refine()->red_zone());
|
||||
dcqs.set_process_completed_buffers_threshold(concurrent_refine()->yellow_zone());
|
||||
dcqs.set_max_completed_buffers(concurrent_refine()->red_zone());
|
||||
}
|
||||
|
||||
// Here we allocate the dummy HeapRegion that is required by the
|
||||
@ -2974,13 +2969,6 @@ G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) {
|
||||
|
||||
evacuation_info.set_collectionset_regions(collection_set()->region_length());
|
||||
|
||||
// Make sure the remembered sets are up to date. This needs to be
|
||||
// done before register_humongous_regions_with_cset(), because the
|
||||
// remembered sets are used there to choose eager reclaim candidates.
|
||||
// If the remembered sets are not up to date we might miss some
|
||||
// entries that need to be handled.
|
||||
g1_rem_set()->cleanupHRRS();
|
||||
|
||||
register_humongous_regions_with_cset();
|
||||
|
||||
assert(_verifier->check_cset_fast_test(), "Inconsistency in the InCSetState table.");
|
||||
|
@ -60,7 +60,6 @@
|
||||
|
||||
// Forward declarations
|
||||
class HeapRegion;
|
||||
class HRRSCleanupTask;
|
||||
class GenerationSpec;
|
||||
class G1ParScanThreadState;
|
||||
class G1ParScanThreadStateSet;
|
||||
|
@ -1217,18 +1217,15 @@ class G1ReclaimEmptyRegionsTask : public AbstractGangTask {
|
||||
FreeRegionList* _local_cleanup_list;
|
||||
uint _old_regions_removed;
|
||||
uint _humongous_regions_removed;
|
||||
HRRSCleanupTask* _hrrs_cleanup_task;
|
||||
|
||||
public:
|
||||
G1ReclaimEmptyRegionsClosure(G1CollectedHeap* g1h,
|
||||
FreeRegionList* local_cleanup_list,
|
||||
HRRSCleanupTask* hrrs_cleanup_task) :
|
||||
FreeRegionList* local_cleanup_list) :
|
||||
_g1h(g1h),
|
||||
_freed_bytes(0),
|
||||
_local_cleanup_list(local_cleanup_list),
|
||||
_old_regions_removed(0),
|
||||
_humongous_regions_removed(0),
|
||||
_hrrs_cleanup_task(hrrs_cleanup_task) { }
|
||||
_humongous_regions_removed(0) { }
|
||||
|
||||
size_t freed_bytes() { return _freed_bytes; }
|
||||
const uint old_regions_removed() { return _old_regions_removed; }
|
||||
@ -1248,8 +1245,6 @@ class G1ReclaimEmptyRegionsTask : public AbstractGangTask {
|
||||
hr->clear_cardtable();
|
||||
_g1h->concurrent_mark()->clear_statistics_in_region(hr->hrm_index());
|
||||
log_trace(gc)("Reclaimed empty region %u (%s) bot " PTR_FORMAT, hr->hrm_index(), hr->get_short_type_str(), p2i(hr->bottom()));
|
||||
} else {
|
||||
hr->rem_set()->do_cleanup_work(_hrrs_cleanup_task);
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -1266,16 +1261,11 @@ public:
|
||||
_g1h(g1h),
|
||||
_cleanup_list(cleanup_list),
|
||||
_hrclaimer(n_workers) {
|
||||
|
||||
HeapRegionRemSet::reset_for_cleanup_tasks();
|
||||
}
|
||||
|
||||
void work(uint worker_id) {
|
||||
FreeRegionList local_cleanup_list("Local Cleanup List");
|
||||
HRRSCleanupTask hrrs_cleanup_task;
|
||||
G1ReclaimEmptyRegionsClosure cl(_g1h,
|
||||
&local_cleanup_list,
|
||||
&hrrs_cleanup_task);
|
||||
G1ReclaimEmptyRegionsClosure cl(_g1h, &local_cleanup_list);
|
||||
_g1h->heap_region_par_iterate_from_worker_offset(&cl, &_hrclaimer, worker_id);
|
||||
assert(cl.is_complete(), "Shouldn't have aborted!");
|
||||
|
||||
@ -1287,8 +1277,6 @@ public:
|
||||
|
||||
_cleanup_list->add_ordered(&local_cleanup_list);
|
||||
assert(local_cleanup_list.is_empty(), "post-condition");
|
||||
|
||||
HeapRegionRemSet::finish_cleanup_task(&hrrs_cleanup_task);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -144,7 +144,7 @@ void G1ConcurrentRefineThreadControl::stop() {
|
||||
STATIC_ASSERT(sizeof(LP64_ONLY(jint) NOT_LP64(jshort)) <= (sizeof(size_t)/2));
|
||||
const size_t max_yellow_zone = LP64_ONLY(max_jint) NOT_LP64(max_jshort);
|
||||
const size_t max_green_zone = max_yellow_zone / 2;
|
||||
const size_t max_red_zone = INT_MAX; // For dcqs.set_max_completed_queue.
|
||||
const size_t max_red_zone = INT_MAX; // For dcqs.set_max_completed_buffers.
|
||||
STATIC_ASSERT(max_yellow_zone <= max_red_zone);
|
||||
|
||||
// Range check assertions for green zone values.
|
||||
@ -386,21 +386,22 @@ void G1ConcurrentRefine::adjust(double update_rs_time,
|
||||
// Change the barrier params
|
||||
if (max_num_threads() == 0) {
|
||||
// Disable dcqs notification when there are no threads to notify.
|
||||
dcqs.set_process_completed_threshold(INT_MAX);
|
||||
dcqs.set_process_completed_buffers_threshold(DirtyCardQueueSet::ProcessCompletedBuffersThresholdNever);
|
||||
} else {
|
||||
// Worker 0 is the primary; wakeup is via dcqs notification.
|
||||
STATIC_ASSERT(max_yellow_zone <= INT_MAX);
|
||||
size_t activate = activation_threshold(0);
|
||||
dcqs.set_process_completed_threshold((int)activate);
|
||||
dcqs.set_process_completed_buffers_threshold(activate);
|
||||
}
|
||||
dcqs.set_max_completed_queue((int)red_zone());
|
||||
dcqs.set_max_completed_buffers(red_zone());
|
||||
}
|
||||
|
||||
size_t curr_queue_size = dcqs.completed_buffers_num();
|
||||
if (curr_queue_size >= yellow_zone()) {
|
||||
dcqs.set_completed_queue_padding(curr_queue_size);
|
||||
if ((dcqs.max_completed_buffers() > 0) &&
|
||||
(curr_queue_size >= yellow_zone())) {
|
||||
dcqs.set_completed_buffers_padding(curr_queue_size);
|
||||
} else {
|
||||
dcqs.set_completed_queue_padding(0);
|
||||
dcqs.set_completed_buffers_padding(0);
|
||||
}
|
||||
dcqs.notify_if_necessary();
|
||||
}
|
||||
@ -433,8 +434,8 @@ bool G1ConcurrentRefine::do_refinement_step(uint worker_id) {
|
||||
// that means that the transition period after the evacuation pause has ended.
|
||||
// Since the value written to the DCQS is the same for all threads, there is no
|
||||
// need to synchronize.
|
||||
if (dcqs.completed_queue_padding() > 0 && curr_buffer_num <= yellow_zone()) {
|
||||
dcqs.set_completed_queue_padding(0);
|
||||
if (dcqs.completed_buffers_padding() > 0 && curr_buffer_num <= yellow_zone()) {
|
||||
dcqs.set_completed_buffers_padding(0);
|
||||
}
|
||||
|
||||
maybe_activate_more_threads(worker_id, curr_buffer_num);
|
||||
|
@ -512,10 +512,6 @@ void G1RemSet::update_rem_set(G1ParScanThreadState* pss, uint worker_i) {
|
||||
}
|
||||
}
|
||||
|
||||
void G1RemSet::cleanupHRRS() {
|
||||
HeapRegionRemSet::cleanup();
|
||||
}
|
||||
|
||||
void G1RemSet::oops_into_collection_set_do(G1ParScanThreadState* pss, uint worker_i) {
|
||||
update_rem_set(pss, worker_i);
|
||||
scan_rem_set(pss, worker_i);;
|
||||
|
@ -86,11 +86,6 @@ public:
|
||||
// Initialize data that depends on the heap size being known.
|
||||
void initialize(size_t capacity, uint max_regions);
|
||||
|
||||
// This is called to reset dual hash tables after the gc pause
|
||||
// is finished and the initial hash table is no longer being
|
||||
// scanned.
|
||||
void cleanupHRRS();
|
||||
|
||||
G1RemSet(G1CollectedHeap* g1h,
|
||||
G1CardTable* ct,
|
||||
G1HotCardCache* hot_card_cache);
|
||||
|
@ -37,12 +37,12 @@ G1SATBMarkQueueSet::G1SATBMarkQueueSet() : _g1h(NULL) {}
|
||||
void G1SATBMarkQueueSet::initialize(G1CollectedHeap* g1h,
|
||||
Monitor* cbl_mon,
|
||||
BufferNode::Allocator* allocator,
|
||||
int process_completed_threshold,
|
||||
size_t process_completed_buffers_threshold,
|
||||
uint buffer_enqueue_threshold_percentage,
|
||||
Mutex* lock) {
|
||||
SATBMarkQueueSet::initialize(cbl_mon,
|
||||
allocator,
|
||||
process_completed_threshold,
|
||||
process_completed_buffers_threshold,
|
||||
buffer_enqueue_threshold_percentage,
|
||||
lock);
|
||||
_g1h = g1h;
|
||||
|
@ -39,7 +39,7 @@ public:
|
||||
void initialize(G1CollectedHeap* g1h,
|
||||
Monitor* cbl_mon,
|
||||
BufferNode::Allocator* allocator,
|
||||
int process_completed_threshold,
|
||||
size_t process_completed_buffers_threshold,
|
||||
uint buffer_enqueue_threshold_percentage,
|
||||
Mutex* lock);
|
||||
|
||||
|
@ -598,11 +598,6 @@ bool OtherRegionsTable::contains_reference_locked(OopOrNarrowOopStar from) const
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
OtherRegionsTable::do_cleanup_work(HRRSCleanupTask* hrrs_cleanup_task) {
|
||||
_sparse_table.do_cleanup_work(hrrs_cleanup_task);
|
||||
}
|
||||
|
||||
HeapRegionRemSet::HeapRegionRemSet(G1BlockOffsetTable* bot,
|
||||
HeapRegion* hr)
|
||||
: _bot(bot),
|
||||
@ -632,10 +627,6 @@ void HeapRegionRemSet::setup_remset_size() {
|
||||
guarantee(G1RSetSparseRegionEntries > 0 && G1RSetRegionEntries > 0 , "Sanity");
|
||||
}
|
||||
|
||||
void HeapRegionRemSet::cleanup() {
|
||||
SparsePRT::cleanup_all();
|
||||
}
|
||||
|
||||
void HeapRegionRemSet::clear(bool only_cardset) {
|
||||
MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag);
|
||||
clear_locked(only_cardset);
|
||||
@ -819,18 +810,6 @@ bool HeapRegionRemSetIterator::has_next(size_t& card_index) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void HeapRegionRemSet::reset_for_cleanup_tasks() {
|
||||
SparsePRT::reset_for_cleanup_tasks();
|
||||
}
|
||||
|
||||
void HeapRegionRemSet::do_cleanup_work(HRRSCleanupTask* hrrs_cleanup_task) {
|
||||
_other_regions.do_cleanup_work(hrrs_cleanup_task);
|
||||
}
|
||||
|
||||
void HeapRegionRemSet::finish_cleanup_task(HRRSCleanupTask* hrrs_cleanup_task) {
|
||||
SparsePRT::finish_cleanup_task(hrrs_cleanup_task);
|
||||
}
|
||||
|
||||
#ifndef PRODUCT
|
||||
void HeapRegionRemSet::test() {
|
||||
os::sleep(Thread::current(), (jlong)5000, false);
|
||||
|
@ -42,11 +42,6 @@ class PerRegionTable;
|
||||
class SparsePRT;
|
||||
class nmethod;
|
||||
|
||||
// Essentially a wrapper around SparsePRTCleanupTask. See
|
||||
// sparsePRT.hpp for more details.
|
||||
class HRRSCleanupTask : public SparsePRTCleanupTask {
|
||||
};
|
||||
|
||||
// The "_coarse_map" is a bitmap with one bit for each region, where set
|
||||
// bits indicate that the corresponding region may contain some pointer
|
||||
// into the owning region.
|
||||
@ -122,6 +117,10 @@ class OtherRegionsTable {
|
||||
|
||||
bool contains_reference_locked(OopOrNarrowOopStar from) const;
|
||||
|
||||
size_t occ_fine() const;
|
||||
size_t occ_coarse() const;
|
||||
size_t occ_sparse() const;
|
||||
|
||||
public:
|
||||
// Create a new remembered set. The given mutex is used to ensure consistency.
|
||||
OtherRegionsTable(Mutex* m);
|
||||
@ -144,9 +143,6 @@ public:
|
||||
|
||||
// Returns the number of cards contained in this remembered set.
|
||||
size_t occupied() const;
|
||||
size_t occ_fine() const;
|
||||
size_t occ_coarse() const;
|
||||
size_t occ_sparse() const;
|
||||
|
||||
static jint n_coarsenings() { return _n_coarsenings; }
|
||||
|
||||
@ -159,8 +155,6 @@ public:
|
||||
|
||||
// Clear the entire contents of this remembered set.
|
||||
void clear();
|
||||
|
||||
void do_cleanup_work(HRRSCleanupTask* hrrs_cleanup_task);
|
||||
};
|
||||
|
||||
class HeapRegionRemSet : public CHeapObj<mtGC> {
|
||||
@ -206,15 +200,6 @@ public:
|
||||
size_t occupied_locked() {
|
||||
return _other_regions.occupied();
|
||||
}
|
||||
size_t occ_fine() const {
|
||||
return _other_regions.occ_fine();
|
||||
}
|
||||
size_t occ_coarse() const {
|
||||
return _other_regions.occ_coarse();
|
||||
}
|
||||
size_t occ_sparse() const {
|
||||
return _other_regions.occ_sparse();
|
||||
}
|
||||
|
||||
static jint n_coarsenings() { return OtherRegionsTable::n_coarsenings(); }
|
||||
|
||||
@ -340,9 +325,6 @@ public:
|
||||
// consumed by the strong code roots.
|
||||
size_t strong_code_roots_mem_size();
|
||||
|
||||
// Called during a stop-world phase to perform any deferred cleanups.
|
||||
static void cleanup();
|
||||
|
||||
static void invalidate_from_card_cache(uint start_idx, size_t num_regions) {
|
||||
G1FromCardCache::invalidate(start_idx, num_regions);
|
||||
}
|
||||
@ -351,16 +333,7 @@ public:
|
||||
static void print_from_card_cache() {
|
||||
G1FromCardCache::print();
|
||||
}
|
||||
#endif
|
||||
|
||||
// These are wrappers for the similarly-named methods on
|
||||
// SparsePRT. Look at sparsePRT.hpp for more details.
|
||||
static void reset_for_cleanup_tasks();
|
||||
void do_cleanup_work(HRRSCleanupTask* hrrs_cleanup_task);
|
||||
static void finish_cleanup_task(HRRSCleanupTask* hrrs_cleanup_task);
|
||||
|
||||
// Run unit tests.
|
||||
#ifndef PRODUCT
|
||||
static void test();
|
||||
#endif
|
||||
};
|
||||
|
@ -287,165 +287,55 @@ size_t RSHashTable::mem_size() const {
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
SparsePRT* volatile SparsePRT::_head_expanded_list = NULL;
|
||||
|
||||
void SparsePRT::add_to_expanded_list(SparsePRT* sprt) {
|
||||
// We could expand multiple times in a pause -- only put on list once.
|
||||
if (sprt->expanded()) return;
|
||||
sprt->set_expanded(true);
|
||||
SparsePRT* hd = _head_expanded_list;
|
||||
while (true) {
|
||||
sprt->_next_expanded = hd;
|
||||
SparsePRT* res = Atomic::cmpxchg(sprt, &_head_expanded_list, hd);
|
||||
if (res == hd) return;
|
||||
else hd = res;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SparsePRT* SparsePRT::get_from_expanded_list() {
|
||||
SparsePRT* hd = _head_expanded_list;
|
||||
while (hd != NULL) {
|
||||
SparsePRT* next = hd->next_expanded();
|
||||
SparsePRT* res = Atomic::cmpxchg(next, &_head_expanded_list, hd);
|
||||
if (res == hd) {
|
||||
hd->set_next_expanded(NULL);
|
||||
return hd;
|
||||
} else {
|
||||
hd = res;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void SparsePRT::reset_for_cleanup_tasks() {
|
||||
_head_expanded_list = NULL;
|
||||
}
|
||||
|
||||
void SparsePRT::do_cleanup_work(SparsePRTCleanupTask* sprt_cleanup_task) {
|
||||
if (should_be_on_expanded_list()) {
|
||||
sprt_cleanup_task->add(this);
|
||||
}
|
||||
}
|
||||
|
||||
void SparsePRT::finish_cleanup_task(SparsePRTCleanupTask* sprt_cleanup_task) {
|
||||
assert(ParGCRareEvent_lock->owned_by_self(), "pre-condition");
|
||||
SparsePRT* head = sprt_cleanup_task->head();
|
||||
SparsePRT* tail = sprt_cleanup_task->tail();
|
||||
if (head != NULL) {
|
||||
assert(tail != NULL, "if head is not NULL, so should tail");
|
||||
|
||||
tail->set_next_expanded(_head_expanded_list);
|
||||
_head_expanded_list = head;
|
||||
} else {
|
||||
assert(tail == NULL, "if head is NULL, so should tail");
|
||||
}
|
||||
}
|
||||
|
||||
bool SparsePRT::should_be_on_expanded_list() {
|
||||
if (_expanded) {
|
||||
assert(_cur != _next, "if _expanded is true, cur should be != _next");
|
||||
} else {
|
||||
assert(_cur == _next, "if _expanded is false, cur should be == _next");
|
||||
}
|
||||
return expanded();
|
||||
}
|
||||
|
||||
void SparsePRT::cleanup_all() {
|
||||
// First clean up all expanded tables so they agree on next and cur.
|
||||
SparsePRT* sprt = get_from_expanded_list();
|
||||
while (sprt != NULL) {
|
||||
sprt->cleanup();
|
||||
sprt = get_from_expanded_list();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SparsePRT::SparsePRT() :
|
||||
_expanded(false), _next_expanded(NULL)
|
||||
{
|
||||
_cur = new RSHashTable(InitialCapacity);
|
||||
_next = _cur;
|
||||
_table(new RSHashTable(InitialCapacity)) {
|
||||
}
|
||||
|
||||
|
||||
SparsePRT::~SparsePRT() {
|
||||
assert(_next != NULL && _cur != NULL, "Inv");
|
||||
if (_cur != _next) { delete _cur; }
|
||||
delete _next;
|
||||
delete _table;
|
||||
}
|
||||
|
||||
|
||||
size_t SparsePRT::mem_size() const {
|
||||
// We ignore "_cur" here, because it either = _next, or else it is
|
||||
// on the deleted list.
|
||||
return sizeof(SparsePRT) + _next->mem_size();
|
||||
return sizeof(SparsePRT) + _table->mem_size();
|
||||
}
|
||||
|
||||
bool SparsePRT::add_card(RegionIdx_t region_id, CardIdx_t card_index) {
|
||||
if (_next->should_expand()) {
|
||||
if (_table->should_expand()) {
|
||||
expand();
|
||||
}
|
||||
return _next->add_card(region_id, card_index);
|
||||
return _table->add_card(region_id, card_index);
|
||||
}
|
||||
|
||||
SparsePRTEntry* SparsePRT::get_entry(RegionIdx_t region_id) {
|
||||
return _next->get_entry(region_id);
|
||||
return _table->get_entry(region_id);
|
||||
}
|
||||
|
||||
bool SparsePRT::delete_entry(RegionIdx_t region_id) {
|
||||
return _next->delete_entry(region_id);
|
||||
return _table->delete_entry(region_id);
|
||||
}
|
||||
|
||||
void SparsePRT::clear() {
|
||||
// If they differ, _next is bigger then cur, so next has no chance of
|
||||
// being the initial size.
|
||||
if (_next != _cur) {
|
||||
delete _next;
|
||||
}
|
||||
|
||||
if (_cur->capacity() != InitialCapacity) {
|
||||
delete _cur;
|
||||
_cur = new RSHashTable(InitialCapacity);
|
||||
// If the entry table is not at initial capacity, just create a new one.
|
||||
if (_table->capacity() != InitialCapacity) {
|
||||
delete _table;
|
||||
_table = new RSHashTable(InitialCapacity);
|
||||
} else {
|
||||
_cur->clear();
|
||||
_table->clear();
|
||||
}
|
||||
_next = _cur;
|
||||
_expanded = false;
|
||||
}
|
||||
|
||||
void SparsePRT::cleanup() {
|
||||
// Make sure that the current and next tables agree.
|
||||
if (_cur != _next) {
|
||||
delete _cur;
|
||||
}
|
||||
_cur = _next;
|
||||
set_expanded(false);
|
||||
}
|
||||
|
||||
void SparsePRT::expand() {
|
||||
RSHashTable* last = _next;
|
||||
_next = new RSHashTable(last->capacity() * 2);
|
||||
RSHashTable* last = _table;
|
||||
_table = new RSHashTable(last->capacity() * 2);
|
||||
for (size_t i = 0; i < last->num_entries(); i++) {
|
||||
SparsePRTEntry* e = last->entry((int)i);
|
||||
if (e->valid_entry()) {
|
||||
_next->add_entry(e);
|
||||
_table->add_entry(e);
|
||||
}
|
||||
}
|
||||
if (last != _cur) {
|
||||
delete last;
|
||||
}
|
||||
add_to_expanded_list(this);
|
||||
}
|
||||
|
||||
void SparsePRTCleanupTask::add(SparsePRT* sprt) {
|
||||
assert(sprt->should_be_on_expanded_list(), "pre-condition");
|
||||
|
||||
sprt->set_next_expanded(NULL);
|
||||
if (_tail != NULL) {
|
||||
_tail->set_next_expanded(sprt);
|
||||
} else {
|
||||
_head = sprt;
|
||||
}
|
||||
_tail = sprt;
|
||||
delete last;
|
||||
}
|
||||
|
@ -37,12 +37,6 @@
|
||||
// indices of other regions to short sequences of cards in the other region
|
||||
// that might contain pointers into the owner region.
|
||||
|
||||
// These tables only expand while they are accessed in parallel --
|
||||
// deletions may be done in single-threaded code. This allows us to allow
|
||||
// unsynchronized reads/iterations, as long as expansions caused by
|
||||
// insertions only enqueue old versions for deletions, but do not delete
|
||||
// old versions synchronously.
|
||||
|
||||
class SparsePRTEntry: public CHeapObj<mtGC> {
|
||||
private:
|
||||
// The type of a card entry.
|
||||
@ -158,8 +152,6 @@ public:
|
||||
// entries to a larger-capacity representation.
|
||||
bool add_card(RegionIdx_t region_id, CardIdx_t card_index);
|
||||
|
||||
bool get_cards(RegionIdx_t region_id, CardIdx_t* cards);
|
||||
|
||||
bool delete_entry(RegionIdx_t region_id);
|
||||
|
||||
bool contains_card(RegionIdx_t region_id, CardIdx_t card_index) const;
|
||||
@ -220,16 +212,11 @@ public:
|
||||
// Concurrent access to a SparsePRT must be serialized by some external mutex.
|
||||
|
||||
class SparsePRTIter;
|
||||
class SparsePRTCleanupTask;
|
||||
|
||||
class SparsePRT {
|
||||
friend class SparsePRTCleanupTask;
|
||||
friend class SparsePRTIter;
|
||||
|
||||
// Iterations are done on the _cur hash table, since they only need to
|
||||
// see entries visible at the start of a collection pause.
|
||||
// All other operations are done using the _next hash table.
|
||||
RSHashTable* _cur;
|
||||
RSHashTable* _next;
|
||||
RSHashTable* _table;
|
||||
|
||||
enum SomeAdditionalPrivateConstants {
|
||||
InitialCapacity = 16
|
||||
@ -237,26 +224,11 @@ class SparsePRT {
|
||||
|
||||
void expand();
|
||||
|
||||
bool _expanded;
|
||||
|
||||
bool expanded() { return _expanded; }
|
||||
void set_expanded(bool b) { _expanded = b; }
|
||||
|
||||
SparsePRT* _next_expanded;
|
||||
|
||||
SparsePRT* next_expanded() { return _next_expanded; }
|
||||
void set_next_expanded(SparsePRT* nxt) { _next_expanded = nxt; }
|
||||
|
||||
bool should_be_on_expanded_list();
|
||||
|
||||
static SparsePRT* volatile _head_expanded_list;
|
||||
|
||||
public:
|
||||
SparsePRT();
|
||||
|
||||
~SparsePRT();
|
||||
|
||||
size_t occupied() const { return _next->occupied_cards(); }
|
||||
size_t occupied() const { return _table->occupied_cards(); }
|
||||
size_t mem_size() const;
|
||||
|
||||
// Attempts to ensure that the given card_index in the given region is in
|
||||
@ -277,72 +249,19 @@ public:
|
||||
// Clear the table, and reinitialize to initial capacity.
|
||||
void clear();
|
||||
|
||||
// Ensure that "_cur" and "_next" point to the same table.
|
||||
void cleanup();
|
||||
|
||||
// Clean up all tables on the expanded list. Called single threaded.
|
||||
static void cleanup_all();
|
||||
RSHashTable* cur() const { return _cur; }
|
||||
|
||||
static void add_to_expanded_list(SparsePRT* sprt);
|
||||
static SparsePRT* get_from_expanded_list();
|
||||
|
||||
// The purpose of these three methods is to help the GC workers
|
||||
// during the cleanup pause to recreate the expanded list, purging
|
||||
// any tables from it that belong to regions that are freed during
|
||||
// cleanup (if we don't purge those tables, there is a race that
|
||||
// causes various crashes; see CR 7014261).
|
||||
//
|
||||
// We chose to recreate the expanded list, instead of purging
|
||||
// entries from it by iterating over it, to avoid this serial phase
|
||||
// at the end of the cleanup pause.
|
||||
//
|
||||
// The three methods below work as follows:
|
||||
// * reset_for_cleanup_tasks() : Nulls the expanded list head at the
|
||||
// start of the cleanup pause.
|
||||
// * do_cleanup_work() : Called by the cleanup workers for every
|
||||
// region that is not free / is being freed by the cleanup
|
||||
// pause. It creates a list of expanded tables whose head / tail
|
||||
// are on the thread-local SparsePRTCleanupTask object.
|
||||
// * finish_cleanup_task() : Called by the cleanup workers after
|
||||
// they complete their cleanup task. It adds the local list into
|
||||
// the global expanded list. It assumes that the
|
||||
// ParGCRareEvent_lock is being held to ensure MT-safety.
|
||||
static void reset_for_cleanup_tasks();
|
||||
void do_cleanup_work(SparsePRTCleanupTask* sprt_cleanup_task);
|
||||
static void finish_cleanup_task(SparsePRTCleanupTask* sprt_cleanup_task);
|
||||
|
||||
bool contains_card(RegionIdx_t region_id, CardIdx_t card_index) const {
|
||||
return _next->contains_card(region_id, card_index);
|
||||
return _table->contains_card(region_id, card_index);
|
||||
}
|
||||
};
|
||||
|
||||
class SparsePRTIter: public RSHashTableIter {
|
||||
public:
|
||||
SparsePRTIter(const SparsePRT* sprt) :
|
||||
RSHashTableIter(sprt->cur()) {}
|
||||
RSHashTableIter(sprt->_table) { }
|
||||
|
||||
bool has_next(size_t& card_index) {
|
||||
return RSHashTableIter::has_next(card_index);
|
||||
}
|
||||
};
|
||||
|
||||
// This allows each worker during a cleanup pause to create a
|
||||
// thread-local list of sparse tables that have been expanded and need
|
||||
// to be processed at the beginning of the next GC pause. This lists
|
||||
// are concatenated into the single expanded list at the end of the
|
||||
// cleanup pause.
|
||||
class SparsePRTCleanupTask {
|
||||
private:
|
||||
SparsePRT* _head;
|
||||
SparsePRT* _tail;
|
||||
|
||||
public:
|
||||
SparsePRTCleanupTask() : _head(NULL), _tail(NULL) { }
|
||||
|
||||
void add(SparsePRT* sprt);
|
||||
SparsePRT* head() { return _head; }
|
||||
SparsePRT* tail() { return _tail; }
|
||||
};
|
||||
|
||||
#endif // SHARE_VM_GC_G1_SPARSEPRT_HPP
|
||||
|
@ -61,6 +61,7 @@ class GraphKit;
|
||||
class IdealKit;
|
||||
class Node;
|
||||
class PhaseGVN;
|
||||
class PhaseIdealLoop;
|
||||
class PhaseMacroExpand;
|
||||
class Type;
|
||||
class TypePtr;
|
||||
@ -277,9 +278,12 @@ public:
|
||||
// Allow barrier sets to have shared state that is preserved across a compilation unit.
|
||||
// This could for example comprise macro nodes to be expanded during macro expansion.
|
||||
virtual void* create_barrier_state(Arena* comp_arena) const { return NULL; }
|
||||
// If the BarrierSetC2 state has kept macro nodes in its compilation unit state to be
|
||||
// expanded later, then now is the time to do so.
|
||||
virtual bool expand_macro_nodes(PhaseMacroExpand* macro) const { return false; }
|
||||
// If the BarrierSetC2 state has barrier nodes in its compilation
|
||||
// unit state to be expanded later, then now is the time to do so.
|
||||
virtual bool expand_barriers(Compile* C, PhaseIterGVN& igvn) const { return false; }
|
||||
virtual bool optimize_loops(PhaseIdealLoop* phase, LoopOptsMode mode, VectorSet& visited, Node_Stack& nstack, Node_List& worklist) const { return false; }
|
||||
virtual bool strip_mined_loops_expanded(LoopOptsMode mode) const { return false; }
|
||||
virtual bool is_gc_specific_loop_opts_pass(LoopOptsMode mode) const { return false; }
|
||||
|
||||
virtual bool has_special_unique_user(const Node* node) const { return false; }
|
||||
|
||||
@ -309,6 +313,7 @@ public:
|
||||
virtual void igvn_add_users_to_worklist(PhaseIterGVN* igvn, Node* use) const {}
|
||||
virtual void ccp_analyze(PhaseCCP* ccp, Unique_Node_List& worklist, Node* use) const {}
|
||||
|
||||
virtual Node* split_if_pre(PhaseIdealLoop* phase, Node* n) const { return NULL; }
|
||||
};
|
||||
|
||||
#endif // SHARE_GC_SHARED_C2_BARRIERSETC2_HPP
|
||||
|
@ -164,12 +164,12 @@ PtrQueueSet::PtrQueueSet(bool notify_when_complete) :
|
||||
_completed_buffers_head(NULL),
|
||||
_completed_buffers_tail(NULL),
|
||||
_n_completed_buffers(0),
|
||||
_process_completed_threshold(0),
|
||||
_process_completed_buffers_threshold(ProcessCompletedBuffersThresholdNever),
|
||||
_process_completed(false),
|
||||
_all_active(false),
|
||||
_notify_when_complete(notify_when_complete),
|
||||
_max_completed_queue(0),
|
||||
_completed_queue_padding(0)
|
||||
_max_completed_buffers(MaxCompletedBuffersUnlimited),
|
||||
_completed_buffers_padding(0)
|
||||
{}
|
||||
|
||||
PtrQueueSet::~PtrQueueSet() {
|
||||
@ -179,12 +179,7 @@ PtrQueueSet::~PtrQueueSet() {
|
||||
}
|
||||
|
||||
void PtrQueueSet::initialize(Monitor* cbl_mon,
|
||||
BufferNode::Allocator* allocator,
|
||||
int process_completed_threshold,
|
||||
int max_completed_queue) {
|
||||
_max_completed_queue = max_completed_queue;
|
||||
_process_completed_threshold = process_completed_threshold;
|
||||
_completed_queue_padding = 0;
|
||||
BufferNode::Allocator* allocator) {
|
||||
assert(cbl_mon != NULL && allocator != NULL, "Init order issue?");
|
||||
_cbl_mon = cbl_mon;
|
||||
_allocator = allocator;
|
||||
@ -238,13 +233,14 @@ void PtrQueue::handle_zero_index() {
|
||||
|
||||
bool PtrQueueSet::process_or_enqueue_complete_buffer(BufferNode* node) {
|
||||
if (Thread::current()->is_Java_thread()) {
|
||||
// We don't lock. It is fine to be epsilon-precise here.
|
||||
if (_max_completed_queue == 0 ||
|
||||
(_max_completed_queue > 0 &&
|
||||
_n_completed_buffers >= _max_completed_queue + _completed_queue_padding)) {
|
||||
bool b = mut_process_buffer(node);
|
||||
if (b) {
|
||||
// True here means that the buffer hasn't been deallocated and the caller may reuse it.
|
||||
// If the number of buffers exceeds the limit, make this Java
|
||||
// thread do the processing itself. We don't lock to access
|
||||
// buffer count or padding; it is fine to be imprecise here. The
|
||||
// add of padding could overflow, which is treated as unlimited.
|
||||
size_t limit = _max_completed_buffers + _completed_buffers_padding;
|
||||
if ((_n_completed_buffers > limit) && (limit >= _max_completed_buffers)) {
|
||||
if (mut_process_buffer(node)) {
|
||||
// Successfully processed; return true to allow buffer reuse.
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -267,8 +263,8 @@ void PtrQueueSet::enqueue_complete_buffer(BufferNode* cbn) {
|
||||
}
|
||||
_n_completed_buffers++;
|
||||
|
||||
if (!_process_completed && _process_completed_threshold >= 0 &&
|
||||
_n_completed_buffers >= (size_t)_process_completed_threshold) {
|
||||
if (!_process_completed &&
|
||||
(_n_completed_buffers > _process_completed_buffers_threshold)) {
|
||||
_process_completed = true;
|
||||
if (_notify_when_complete) {
|
||||
_cbl_mon->notify();
|
||||
@ -327,8 +323,7 @@ void PtrQueueSet::merge_bufferlists(PtrQueueSet *src) {
|
||||
|
||||
void PtrQueueSet::notify_if_necessary() {
|
||||
MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag);
|
||||
assert(_process_completed_threshold >= 0, "_process_completed_threshold is negative");
|
||||
if (_n_completed_buffers >= (size_t)_process_completed_threshold || _max_completed_queue == 0) {
|
||||
if (_n_completed_buffers > _process_completed_buffers_threshold) {
|
||||
_process_completed = true;
|
||||
if (_notify_when_complete)
|
||||
_cbl_mon->notify();
|
||||
|
@ -284,7 +284,7 @@ protected:
|
||||
BufferNode* _completed_buffers_head;
|
||||
BufferNode* _completed_buffers_tail;
|
||||
size_t _n_completed_buffers;
|
||||
int _process_completed_threshold;
|
||||
size_t _process_completed_buffers_threshold;
|
||||
volatile bool _process_completed;
|
||||
|
||||
bool _all_active;
|
||||
@ -293,9 +293,9 @@ protected:
|
||||
bool _notify_when_complete;
|
||||
|
||||
// Maximum number of elements allowed on completed queue: after that,
|
||||
// enqueuer does the work itself. Zero indicates no maximum.
|
||||
int _max_completed_queue;
|
||||
size_t _completed_queue_padding;
|
||||
// enqueuer does the work itself.
|
||||
size_t _max_completed_buffers;
|
||||
size_t _completed_buffers_padding;
|
||||
|
||||
size_t completed_buffers_list_length();
|
||||
void assert_completed_buffer_list_len_correct_locked();
|
||||
@ -316,10 +316,7 @@ protected:
|
||||
|
||||
// Because of init-order concerns, we can't pass these as constructor
|
||||
// arguments.
|
||||
void initialize(Monitor* cbl_mon,
|
||||
BufferNode::Allocator* allocator,
|
||||
int process_completed_threshold,
|
||||
int max_completed_queue);
|
||||
void initialize(Monitor* cbl_mon, BufferNode::Allocator* allocator);
|
||||
|
||||
public:
|
||||
|
||||
@ -350,18 +347,34 @@ public:
|
||||
}
|
||||
|
||||
// Get/Set the number of completed buffers that triggers log processing.
|
||||
void set_process_completed_threshold(int sz) { _process_completed_threshold = sz; }
|
||||
int process_completed_threshold() const { return _process_completed_threshold; }
|
||||
// Log processing should be done when the number of buffers exceeds the
|
||||
// threshold.
|
||||
void set_process_completed_buffers_threshold(size_t sz) {
|
||||
_process_completed_buffers_threshold = sz;
|
||||
}
|
||||
size_t process_completed_buffers_threshold() const {
|
||||
return _process_completed_buffers_threshold;
|
||||
}
|
||||
static const size_t ProcessCompletedBuffersThresholdNever = ~size_t(0);
|
||||
|
||||
size_t completed_buffers_num() { return _n_completed_buffers; }
|
||||
size_t completed_buffers_num() const { return _n_completed_buffers; }
|
||||
|
||||
void merge_bufferlists(PtrQueueSet* src);
|
||||
|
||||
void set_max_completed_queue(int m) { _max_completed_queue = m; }
|
||||
int max_completed_queue() { return _max_completed_queue; }
|
||||
void set_max_completed_buffers(size_t m) {
|
||||
_max_completed_buffers = m;
|
||||
}
|
||||
size_t max_completed_buffers() const {
|
||||
return _max_completed_buffers;
|
||||
}
|
||||
static const size_t MaxCompletedBuffersUnlimited = ~size_t(0);
|
||||
|
||||
void set_completed_queue_padding(size_t padding) { _completed_queue_padding = padding; }
|
||||
size_t completed_queue_padding() { return _completed_queue_padding; }
|
||||
void set_completed_buffers_padding(size_t padding) {
|
||||
_completed_buffers_padding = padding;
|
||||
}
|
||||
size_t completed_buffers_padding() const {
|
||||
return _completed_buffers_padding;
|
||||
}
|
||||
|
||||
// Notify the consumer if the number of buffers crossed the threshold
|
||||
void notify_if_necessary();
|
||||
|
@ -113,10 +113,11 @@ SATBMarkQueueSet::SATBMarkQueueSet() :
|
||||
|
||||
void SATBMarkQueueSet::initialize(Monitor* cbl_mon,
|
||||
BufferNode::Allocator* allocator,
|
||||
int process_completed_threshold,
|
||||
size_t process_completed_buffers_threshold,
|
||||
uint buffer_enqueue_threshold_percentage,
|
||||
Mutex* lock) {
|
||||
PtrQueueSet::initialize(cbl_mon, allocator, process_completed_threshold, -1);
|
||||
PtrQueueSet::initialize(cbl_mon, allocator);
|
||||
set_process_completed_buffers_threshold(process_completed_buffers_threshold);
|
||||
_shared_satb_queue.set_lock(lock);
|
||||
assert(buffer_size() != 0, "buffer size not initialized");
|
||||
// Minimum threshold of 1 ensures enqueuing of completely full buffers.
|
||||
|
@ -110,7 +110,7 @@ protected:
|
||||
|
||||
void initialize(Monitor* cbl_mon,
|
||||
BufferNode::Allocator* allocator,
|
||||
int process_completed_threshold,
|
||||
size_t process_completed_buffers_threshold,
|
||||
uint buffer_enqueue_threshold_percentage,
|
||||
Mutex* lock);
|
||||
|
||||
|
@ -996,9 +996,8 @@ void ZBarrierSetC2::expand_loadbarrier_optimized(PhaseMacroExpand* phase, LoadBa
|
||||
return;
|
||||
}
|
||||
|
||||
bool ZBarrierSetC2::expand_macro_nodes(PhaseMacroExpand* macro) const {
|
||||
Compile* C = Compile::current();
|
||||
PhaseIterGVN &igvn = macro->igvn();
|
||||
bool ZBarrierSetC2::expand_barriers(Compile* C, PhaseIterGVN& igvn) const {
|
||||
PhaseMacroExpand macro(igvn);
|
||||
ZBarrierSetC2State* s = state();
|
||||
if (s->load_barrier_count() > 0) {
|
||||
#ifdef ASSERT
|
||||
@ -1018,7 +1017,7 @@ bool ZBarrierSetC2::expand_macro_nodes(PhaseMacroExpand* macro) const {
|
||||
skipped++;
|
||||
continue;
|
||||
}
|
||||
expand_loadbarrier_node(macro, n);
|
||||
expand_loadbarrier_node(¯o, n);
|
||||
assert(s->load_barrier_count() < load_barrier_count, "must have deleted a node from load barrier list");
|
||||
if (C->failing()) return true;
|
||||
}
|
||||
@ -1027,7 +1026,7 @@ bool ZBarrierSetC2::expand_macro_nodes(PhaseMacroExpand* macro) const {
|
||||
LoadBarrierNode* n = s->load_barrier_node(load_barrier_count - 1);
|
||||
assert(!(igvn.type(n) == Type::TOP || (n->in(0) != NULL && n->in(0)->is_top())), "should have been processed already");
|
||||
assert(!n->can_be_eliminated(), "should have been processed already");
|
||||
expand_loadbarrier_node(macro, n);
|
||||
expand_loadbarrier_node(¯o, n);
|
||||
assert(s->load_barrier_count() < load_barrier_count, "must have deleted a node from load barrier list");
|
||||
if (C->failing()) return true;
|
||||
}
|
||||
@ -1623,4 +1622,4 @@ bool ZBarrierSetC2::escape_add_final_edges(ConnectionGraph* conn_graph, PhaseGVN
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -200,9 +200,9 @@ public:
|
||||
virtual void unregister_potential_barrier_node(Node* node) const;
|
||||
virtual bool array_copy_requires_gc_barriers(bool tightly_coupled_alloc, BasicType type, bool is_clone, ArrayCopyPhase phase) const;
|
||||
virtual Node* step_over_gc_barrier(Node* c) const;
|
||||
// If the BarrierSetC2 state has kept macro nodes in its compilation unit state to be
|
||||
// If the BarrierSetC2 state has kept barrier nodes in its compilation unit state to be
|
||||
// expanded later, then now is the time to do so.
|
||||
virtual bool expand_macro_nodes(PhaseMacroExpand* macro) const;
|
||||
virtual bool expand_barriers(Compile* C, PhaseIterGVN& igvn) const;
|
||||
|
||||
static void find_dominating_barriers(PhaseIterGVN& igvn);
|
||||
static void loop_optimize_gc_barrier(PhaseIdealLoop* phase, Node* node, bool last_round);
|
||||
|
@ -111,9 +111,11 @@ JNIEXPORT void JNICALL
|
||||
JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos,
|
||||
jobject dst, jint dst_pos, jint length);
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
JVM_InitProperties(JNIEnv *env, jobject p);
|
||||
|
||||
/*
|
||||
* Return an array of all properties as alternating name and value pairs.
|
||||
*/
|
||||
JNIEXPORT jobjectArray JNICALL
|
||||
JVM_GetProperties(JNIEnv *env);
|
||||
|
||||
/*
|
||||
* java.lang.Runtime
|
||||
|
@ -683,7 +683,10 @@ size_t FileMapInfo::write_archive_heap_regions(GrowableArray<MemRegion> *heap_me
|
||||
int arr_len = heap_mem == NULL ? 0 : heap_mem->length();
|
||||
if(arr_len > max_num_regions) {
|
||||
fail_stop("Unable to write archive heap memory regions: "
|
||||
"number of memory regions exceeds maximum due to fragmentation");
|
||||
"number of memory regions exceeds maximum due to fragmentation."
|
||||
"Please increase java heap size "
|
||||
"(current MaxHeapSize is " SIZE_FORMAT ", InitialHeapSize is " SIZE_FORMAT ").",
|
||||
MaxHeapSize, InitialHeapSize);
|
||||
}
|
||||
|
||||
size_t total_size = 0;
|
||||
|
@ -284,19 +284,25 @@ InstanceKlass* InstanceKlass::nest_host(Symbol* validationException, TRAPS) {
|
||||
|
||||
if (log_is_enabled(Trace, class, nestmates)) {
|
||||
ResourceMark rm(THREAD);
|
||||
log_trace(class, nestmates)("Type %s is not a nest member of resolved type %s: %s",
|
||||
this->external_name(),
|
||||
k->external_name(),
|
||||
error);
|
||||
log_trace(class, nestmates)
|
||||
("Type %s (loader: %s) is not a nest member of "
|
||||
"resolved type %s (loader: %s): %s",
|
||||
this->external_name(),
|
||||
this->class_loader_data()->loader_name_and_id(),
|
||||
k->external_name(),
|
||||
k->class_loader_data()->loader_name_and_id(),
|
||||
error);
|
||||
}
|
||||
|
||||
if (validationException != NULL) {
|
||||
ResourceMark rm(THREAD);
|
||||
Exceptions::fthrow(THREAD_AND_LOCATION,
|
||||
validationException,
|
||||
"Type %s is not a nest member of %s: %s",
|
||||
"Type %s (loader: %s) is not a nest member of %s (loader: %s): %s",
|
||||
this->external_name(),
|
||||
this->class_loader_data()->loader_name_and_id(),
|
||||
k->external_name(),
|
||||
k->class_loader_data()->loader_name_and_id(),
|
||||
error
|
||||
);
|
||||
}
|
||||
|
@ -1122,7 +1122,7 @@ void Compile::Init(int aliaslevel) {
|
||||
set_decompile_count(0);
|
||||
|
||||
set_do_freq_based_layout(_directive->BlockLayoutByFrequencyOption);
|
||||
set_num_loop_opts(LoopOptsCount);
|
||||
_loop_opts_cnt = LoopOptsCount;
|
||||
set_do_inlining(Inline);
|
||||
set_max_inline_size(MaxInlineSize);
|
||||
set_freq_inline_size(FreqInlineSize);
|
||||
@ -2169,14 +2169,14 @@ void Compile::inline_incrementally(PhaseIterGVN& igvn) {
|
||||
}
|
||||
|
||||
|
||||
bool Compile::optimize_loops(int& loop_opts_cnt, PhaseIterGVN& igvn, LoopOptsMode mode) {
|
||||
if(loop_opts_cnt > 0) {
|
||||
bool Compile::optimize_loops(PhaseIterGVN& igvn, LoopOptsMode mode) {
|
||||
if(_loop_opts_cnt > 0) {
|
||||
debug_only( int cnt = 0; );
|
||||
while(major_progress() && (loop_opts_cnt > 0)) {
|
||||
while(major_progress() && (_loop_opts_cnt > 0)) {
|
||||
TracePhase tp("idealLoop", &timers[_t_idealLoop]);
|
||||
assert( cnt++ < 40, "infinite cycle in loop optimization" );
|
||||
PhaseIdealLoop ideal_loop(igvn, mode);
|
||||
loop_opts_cnt--;
|
||||
_loop_opts_cnt--;
|
||||
if (failing()) return false;
|
||||
if (major_progress()) print_method(PHASE_PHASEIDEALLOOP_ITERATIONS, 2);
|
||||
}
|
||||
@ -2202,7 +2202,6 @@ void Compile::Optimize() {
|
||||
#endif
|
||||
|
||||
ResourceMark rm;
|
||||
int loop_opts_cnt;
|
||||
|
||||
print_inlining_reinit();
|
||||
|
||||
@ -2305,28 +2304,27 @@ void Compile::Optimize() {
|
||||
// peeling, unrolling, etc.
|
||||
|
||||
// Set loop opts counter
|
||||
loop_opts_cnt = num_loop_opts();
|
||||
if((loop_opts_cnt > 0) && (has_loops() || has_split_ifs())) {
|
||||
if((_loop_opts_cnt > 0) && (has_loops() || has_split_ifs())) {
|
||||
{
|
||||
TracePhase tp("idealLoop", &timers[_t_idealLoop]);
|
||||
PhaseIdealLoop ideal_loop(igvn, LoopOptsDefault);
|
||||
loop_opts_cnt--;
|
||||
_loop_opts_cnt--;
|
||||
if (major_progress()) print_method(PHASE_PHASEIDEALLOOP1, 2);
|
||||
if (failing()) return;
|
||||
}
|
||||
// Loop opts pass if partial peeling occurred in previous pass
|
||||
if(PartialPeelLoop && major_progress() && (loop_opts_cnt > 0)) {
|
||||
if(PartialPeelLoop && major_progress() && (_loop_opts_cnt > 0)) {
|
||||
TracePhase tp("idealLoop", &timers[_t_idealLoop]);
|
||||
PhaseIdealLoop ideal_loop(igvn, LoopOptsSkipSplitIf);
|
||||
loop_opts_cnt--;
|
||||
_loop_opts_cnt--;
|
||||
if (major_progress()) print_method(PHASE_PHASEIDEALLOOP2, 2);
|
||||
if (failing()) return;
|
||||
}
|
||||
// Loop opts pass for loop-unrolling before CCP
|
||||
if(major_progress() && (loop_opts_cnt > 0)) {
|
||||
if(major_progress() && (_loop_opts_cnt > 0)) {
|
||||
TracePhase tp("idealLoop", &timers[_t_idealLoop]);
|
||||
PhaseIdealLoop ideal_loop(igvn, LoopOptsSkipSplitIf);
|
||||
loop_opts_cnt--;
|
||||
_loop_opts_cnt--;
|
||||
if (major_progress()) print_method(PHASE_PHASEIDEALLOOP3, 2);
|
||||
}
|
||||
if (!failing()) {
|
||||
@ -2361,7 +2359,7 @@ void Compile::Optimize() {
|
||||
|
||||
// Loop transforms on the ideal graph. Range Check Elimination,
|
||||
// peeling, unrolling, etc.
|
||||
if (!optimize_loops(loop_opts_cnt, igvn, LoopOptsDefault)) {
|
||||
if (!optimize_loops(igvn, LoopOptsDefault)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2404,6 +2402,16 @@ void Compile::Optimize() {
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
TracePhase tp("barrierExpand", &timers[_t_barrierExpand]);
|
||||
print_method(PHASE_BEFORE_BARRIER_EXPAND, 2);
|
||||
BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
|
||||
if (bs->expand_barriers(this, igvn)) {
|
||||
assert(failing(), "must bail out w/ explicit message");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (opaque4_count() > 0) {
|
||||
C->remove_opaque4_nodes(igvn);
|
||||
igvn.optimize();
|
||||
|
@ -369,7 +369,6 @@ class Compile : public Phase {
|
||||
address _stub_entry_point; // Compile code entry for generated stub, or NULL
|
||||
|
||||
// Control of this compilation.
|
||||
int _num_loop_opts; // Number of iterations for doing loop optimiztions
|
||||
int _max_inline_size; // Max inline size for this compilation
|
||||
int _freq_inline_size; // Max hot method inline size for this compilation
|
||||
int _fixed_slots; // count of frame slots not allocated by the register
|
||||
@ -413,6 +412,7 @@ class Compile : public Phase {
|
||||
// JSR 292
|
||||
bool _has_method_handle_invokes; // True if this method has MethodHandle invokes.
|
||||
RTMState _rtm_state; // State of Restricted Transactional Memory usage
|
||||
int _loop_opts_cnt; // loop opts round
|
||||
|
||||
// Compilation environment.
|
||||
Arena _comp_arena; // Arena with lifetime equivalent to Compile
|
||||
@ -653,8 +653,6 @@ class Compile : public Phase {
|
||||
int inlining_incrementally() const { return _inlining_incrementally; }
|
||||
void set_major_progress() { _major_progress++; }
|
||||
void clear_major_progress() { _major_progress = 0; }
|
||||
int num_loop_opts() const { return _num_loop_opts; }
|
||||
void set_num_loop_opts(int n) { _num_loop_opts = n; }
|
||||
int max_inline_size() const { return _max_inline_size; }
|
||||
void set_freq_inline_size(int n) { _freq_inline_size = n; }
|
||||
int freq_inline_size() const { return _freq_inline_size; }
|
||||
@ -1087,7 +1085,7 @@ class Compile : public Phase {
|
||||
void inline_incrementally(PhaseIterGVN& igvn);
|
||||
void inline_string_calls(bool parse_time);
|
||||
void inline_boxing_calls(PhaseIterGVN& igvn);
|
||||
bool optimize_loops(int& loop_opts_cnt, PhaseIterGVN& igvn, LoopOptsMode mode);
|
||||
bool optimize_loops(PhaseIterGVN& igvn, LoopOptsMode mode);
|
||||
|
||||
// Matching, CFG layout, allocation, code generation
|
||||
PhaseCFG* cfg() { return _cfg; }
|
||||
|
@ -2774,9 +2774,12 @@ void PhaseIdealLoop::build_and_optimize(LoopOptsMode mode) {
|
||||
return;
|
||||
}
|
||||
|
||||
BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
|
||||
// Nothing to do, so get out
|
||||
bool stop_early = !C->has_loops() && !skip_loop_opts && !do_split_ifs && !_verify_me && !_verify_only;
|
||||
bool stop_early = !C->has_loops() && !skip_loop_opts && !do_split_ifs && !_verify_me && !_verify_only &&
|
||||
!bs->is_gc_specific_loop_opts_pass(mode);
|
||||
bool do_expensive_nodes = C->should_optimize_expensive_nodes(_igvn);
|
||||
bool strip_mined_loops_expanded = bs->strip_mined_loops_expanded(mode);
|
||||
if (stop_early && !do_expensive_nodes) {
|
||||
_igvn.optimize(); // Cleanup NeverBranches
|
||||
return;
|
||||
@ -2854,8 +2857,9 @@ void PhaseIdealLoop::build_and_optimize(LoopOptsMode mode) {
|
||||
|
||||
// Given early legal placement, try finding counted loops. This placement
|
||||
// is good enough to discover most loop invariants.
|
||||
if( !_verify_me && !_verify_only )
|
||||
if (!_verify_me && !_verify_only && !strip_mined_loops_expanded) {
|
||||
_ltree_root->counted_loop( this );
|
||||
}
|
||||
|
||||
// Find latest loop placement. Find ideal loop placement.
|
||||
visited.Clear();
|
||||
@ -2926,6 +2930,14 @@ void PhaseIdealLoop::build_and_optimize(LoopOptsMode mode) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (bs->optimize_loops(this, mode, visited, nstack, worklist)) {
|
||||
_igvn.optimize();
|
||||
if (C->log() != NULL) {
|
||||
log_loop_tree(_ltree_root, _ltree_root, C->log());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (ReassociateInvariants) {
|
||||
// Reassociate invariants and prep for split_thru_phi
|
||||
for (LoopTreeIterator iter(_ltree_root); !iter.done(); iter.next()) {
|
||||
@ -4136,7 +4148,7 @@ void PhaseIdealLoop::build_loop_late( VectorSet &visited, Node_List &worklist, N
|
||||
}
|
||||
}
|
||||
|
||||
// Verify that no data node is schedules in the outer loop of a strip
|
||||
// Verify that no data node is scheduled in the outer loop of a strip
|
||||
// mined loop.
|
||||
void PhaseIdealLoop::verify_strip_mined_scheduling(Node *n, Node* least) {
|
||||
#ifdef ASSERT
|
||||
@ -4145,7 +4157,9 @@ void PhaseIdealLoop::verify_strip_mined_scheduling(Node *n, Node* least) {
|
||||
}
|
||||
IdealLoopTree* loop = get_loop(least);
|
||||
Node* head = loop->_head;
|
||||
if (head->is_OuterStripMinedLoop()) {
|
||||
if (head->is_OuterStripMinedLoop() &&
|
||||
// Verification can't be applied to fully built strip mined loops
|
||||
head->as_Loop()->outer_loop_end()->in(1)->find_int_con(-1) == 0) {
|
||||
Node* sfpt = head->as_Loop()->outer_safepoint();
|
||||
ResourceMark rm;
|
||||
Unique_Node_List wq;
|
||||
|
@ -887,6 +887,11 @@ void PhaseIdealLoop::try_move_store_after_loop(Node* n) {
|
||||
// Do the real work in a non-recursive function. Data nodes want to be
|
||||
// cloned in the pre-order so they can feed each other nicely.
|
||||
Node *PhaseIdealLoop::split_if_with_blocks_pre( Node *n ) {
|
||||
BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
|
||||
Node* bs_res = bs->split_if_pre(this, n);
|
||||
if (bs_res != NULL) {
|
||||
return bs_res;
|
||||
}
|
||||
// Cloning these guys is unlikely to win
|
||||
int n_op = n->Opcode();
|
||||
if( n_op == Op_MergeMem ) return n;
|
||||
|
@ -2600,6 +2600,5 @@ bool PhaseMacroExpand::expand_macro_nodes() {
|
||||
_igvn.set_delay_transform(false);
|
||||
_igvn.optimize();
|
||||
if (C->failing()) return true;
|
||||
BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
|
||||
return bs->expand_macro_nodes(this);
|
||||
return false;
|
||||
}
|
||||
|
@ -1208,9 +1208,7 @@ MachNode *Matcher::match_sfpt( SafePointNode *sfpt ) {
|
||||
// Allocate a private array of RegMasks. These RegMasks are not shared.
|
||||
msfpt->_in_rms = NEW_RESOURCE_ARRAY( RegMask, cnt );
|
||||
// Empty them all.
|
||||
for (uint i = 0; i < cnt; i++) {
|
||||
msfpt->_in_rms[i] = RegMask();
|
||||
}
|
||||
for (uint i = 0; i < cnt; i++) ::new (&(msfpt->_in_rms[i])) RegMask();
|
||||
|
||||
// Do all the pre-defined non-Empty register masks
|
||||
msfpt->_in_rms[TypeFunc::ReturnAdr] = _return_addr_mask;
|
||||
|
@ -286,20 +286,20 @@ Node *MulLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
||||
|
||||
// Check for negative constant; if so negate the final result
|
||||
bool sign_flip = false;
|
||||
unsigned long abs_con = uabs(con);
|
||||
if (abs_con != (unsigned long)con) {
|
||||
julong abs_con = uabs(con);
|
||||
if (abs_con != (julong)con) {
|
||||
sign_flip = true;
|
||||
}
|
||||
|
||||
// Get low bit; check for being the only bit
|
||||
Node *res = NULL;
|
||||
unsigned long bit1 = abs_con & (0-abs_con); // Extract low bit
|
||||
julong bit1 = abs_con & (0-abs_con); // Extract low bit
|
||||
if (bit1 == abs_con) { // Found a power of 2?
|
||||
res = new LShiftLNode(in(1), phase->intcon(log2_long(bit1)));
|
||||
} else {
|
||||
|
||||
// Check for constant with 2 bits set
|
||||
unsigned long bit2 = abs_con-bit1;
|
||||
julong bit2 = abs_con-bit1;
|
||||
bit2 = bit2 & (0-bit2); // Extract 2nd bit
|
||||
if (bit2 + bit1 == abs_con) { // Found all bits in con?
|
||||
Node *n1 = phase->transform(new LShiftLNode(in(1), phase->intcon(log2_long(bit1))));
|
||||
@ -308,7 +308,7 @@ Node *MulLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
||||
|
||||
} else if (is_power_of_2_long(abs_con+1)) {
|
||||
// Sleezy: power-of-2 -1. Next time be generic.
|
||||
unsigned long temp = abs_con + 1;
|
||||
julong temp = abs_con + 1;
|
||||
Node *n1 = phase->transform( new LShiftLNode(in(1), phase->intcon(log2_long(temp))));
|
||||
res = new SubLNode(n1, in(1));
|
||||
} else {
|
||||
|
@ -83,6 +83,7 @@ void Phase::print_timers() {
|
||||
tty->print_cr (" Cond Const Prop: %7.3f s", timers[_t_ccp].seconds());
|
||||
tty->print_cr (" GVN 2: %7.3f s", timers[_t_iterGVN2].seconds());
|
||||
tty->print_cr (" Macro Expand: %7.3f s", timers[_t_macroExpand].seconds());
|
||||
tty->print_cr (" Barrier Expand: %7.3f s", timers[_t_barrierExpand].seconds());
|
||||
tty->print_cr (" Graph Reshape: %7.3f s", timers[_t_graphReshaping].seconds());
|
||||
|
||||
double other = timers[_t_optimizer].seconds() -
|
||||
@ -95,6 +96,7 @@ void Phase::print_timers() {
|
||||
timers[_t_ccp].seconds() +
|
||||
timers[_t_iterGVN2].seconds() +
|
||||
timers[_t_macroExpand].seconds() +
|
||||
timers[_t_barrierExpand].seconds() +
|
||||
timers[_t_graphReshaping].seconds());
|
||||
if (other > 0) {
|
||||
tty->print_cr(" Other: %7.3f s", other);
|
||||
|
@ -80,6 +80,7 @@ public:
|
||||
_t_ccp,
|
||||
_t_iterGVN2,
|
||||
_t_macroExpand,
|
||||
_t_barrierExpand,
|
||||
_t_graphReshaping,
|
||||
_t_matcher,
|
||||
_t_scheduler,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user