OpenJDK / jdk / jdk12
changeset 3883:94ee7c22fab7
Merge
author | duke |
---|---|
date | Wed, 05 Jul 2017 17:01:05 +0200 |
parents | 35b6f37d3023 f201e07c0963 |
children | 37dcc8290671 |
files | jdk/src/share/classes/sun/net/www/protocol/http/InMemoryCookieStore.java jdk/src/share/native/sun/security/ec/ec.c |
diffstat | 280 files changed, 25666 insertions(+), 3897 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgtags-top-repo Mon Sep 28 19:39:40 2009 -0700 +++ b/.hgtags-top-repo Wed Jul 05 17:01:05 2017 +0200 @@ -46,3 +46,4 @@ 82e6c820c51ac27882b77755d42efefdbf1dcda0 jdk7-b69 175cb3fe615998d1004c6d3fd96e6d2e86b6772d jdk7-b70 4c36e9853dda27bdac5ef4839a610509fbe31d34 jdk7-b71 +0d7e03b426df27c21dcc44ffb9178eacd1b04f10 jdk7-b72
--- a/README-builds.html Mon Sep 28 19:39:40 2009 -0700 +++ b/README-builds.html Wed Jul 05 17:01:05 2017 +0200 @@ -38,12 +38,17 @@ <ul> <li><a href="#introduction">Introduction</a></li> <li><a href="#MBE">Minimum Build Environments</a></li> - <li><a href="#SDBE">Specific Developer Build Environments</a></li> + <li><a href="#SDBE">Specific Developer Build Environments</a> <ul> <li><a href="#fedora">Fedora Linux</a> </li> <li><a href="#centos">CentOS Linux</a> </li> - <li><a href="#ubuntu">Ubuntu Linux</a> </li> + <li><a href="#debian">Debian GNU/Linux</a></li> + <li><a href="#ubuntu">Ubuntu Linux</a> </li> + <li><a href="#opensuse">OpenSUSE</a></li> + <li><a href="#mandriva">Mandriva</a></li> + <li><a href="#opensolaris">OpenSolaris</a></li> </ul> + </li> <li><a href="#directories">Source Directory Structure</a> </li> <li><a href="#building">Build Information</a> <ul> @@ -209,24 +214,59 @@ we will try to provide what information we have available to us. </blockquote> <!-- ------------------------------------------------------ --> - <h3><a name="fedora">Fedora 9</a></h3> + <h3><a name="fedora">Fedora</a></h3> <blockquote> - After installing - <a href="http://www.fedoraproject.org/">Fedora 9</a> - you need to make sure you have - the "Software Development" bundle installed, plus the - following packages: - <blockquote> - <ul> - <li>cups devel: Cups Development Package</li> - <li>freetype 2.3+ devel: Freetype 2.3 Development Package</li> - <li>hg: Mercurial, if you need to clone or manage source repositories</li> - <li>ksh: May be needed when using <tt>webrev</tt></li> - </ul> + <h4>Fedora 9</h4> + <p> + <blockquote> + After installing <a href="http://fedoraproject.org">Fedora</a> 9 + you need to install several build dependencies. The simplest + way to do it is to execute the following commands as user + <tt>root</tt>: + <p/> + <code>yum-builddep java-openjdk</code> + <p/> + <code>yum install gcc gcc-c++</code> + <p/> + In addition, it's necessary to set a few environment variables for the build: + + <p/> + <code>export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-openjdk</code> </blockquote> - <p> - Always a good idea to do a complete Software Update/Refresh - after you get all the packages installed. + <h4>Fedora 10</h4> + <p> + <blockquote> + After installing <a href="http://fedoraproject.org">Fedora</a> 10 + you need to install several build dependencies. The simplest + way to do it is to execute the following commands as user + <tt>root</tt>: + <p/> + <code>yum-builddep java-1.6.0-openjdk</code> + <p/> + <code>yum install gcc gcc-c++</code> + <p/> + In addition, it's necessary to set a few environment variables for the build: + + <p/> + <code>export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-openjdk</code> + </blockquote> + <h4>Fedora 11</h4> + <p> + <blockquote> + After installing <a href="http://fedoraproject.org">Fedora</a> 11 + you need to install several build dependencies. The simplest + way to do it is to execute the following commands as user + <tt>root</tt>: + <p/> + <code>yum-builddep java-1.6.0-openjdk</code> + <p/> + <code>yum install gcc gcc-c++</code> + <p/> + In addition, it's necessary to set a few environment variables for the build: + + <p/> + <code>export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-openjdk</code> + </blockquote> </blockquote> <!-- ------------------------------------------------------ --> <h3><a name="centos">CentOS 5.2</a></h3> @@ -269,145 +309,146 @@ it's needed. </blockquote> <!-- ------------------------------------------------------ --> - <h3><a name="ubuntu">Ubuntu</a></h3> + <h3><a name="debian">Debian</a></h3> <blockquote> - In addition to needing the Bootstrap JDK and the Binary Plugs, - when building on Ubuntu you will need to - make sure certain packages are installed. - In particular, certain X11 packages, make, m4, gawk, gcc 4, - binutils, cups, freetype - and alsa. - <!-- ------------------------------------------------------ --> - <h4>Ubuntu 6.06</h4> + <h4>Debian 5.0 (Lenny)</h4> <p> - The following list of packages for Ubuntu 6.06 is a working set that - does appear to work. + <blockquote> + After installing <a href="http://debian.org">Debian</a> 5 + you need to install several build dependencies. + The simplest way to install the build dependencies is to + execute the following commands as user <tt>root</tt>: + <p/> + <code>aptitude build-dep openjdk-6</code> + <p/> + <code>aptitude install openjdk-6-jdk libmotif-dev</code> + <p/> + In addition, it's necessary to set a few environment variables for the build: + <p/> + <code>export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk</code> + </blockquote> + </blockquote> + <!-- ====================================================== --> + <h3><a name="ubuntu">Ubuntu</a></h3> + <blockquote> + <h4>Ubuntu 8.04</h4> <p> - <b>Note that it's quite possible that some of these - packages are not required, so anyone discovering that some of the - packages listed below are NOT required, - please let the - OpenJDK - team know.</b> + <blockquote> + After installing <a href="http://ubuntu.org">Ubuntu</a> 8.04 + you need to install several build dependencies. + <p/> + First, you need to enable the universe repository in the + Software Sources application and reload the repository + information. The Software Sources application is available + under the System/Administration menu. + <p/> + The simplest way to install the build dependencies is to + execute the following commands: + <p/> + <code>sudo aptitude build-dep openjdk-6</code> + <p/> + <code>sudo aptitude install openjdk-6-jdk</code> + <p/> + In addition, it's necessary to set a few environment variables for the build: + <p/> + <code>export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk</code> + </blockquote> + <h4>Ubuntu 8.10</h4> <p> - All the packages below can be installed with the - Synaptic Package manager provided with the base Ubuntu 6.06 release. - <blockquote> - <ul> - <li>binutils (2.16.1cvs20060117-1ubuntu2.1)</li> - <li>cpp (4:4.0.3-1)</li> - <li>cpp-4.0 (4.0.3-1ubuntu5)</li> - <li>libfreetype6-dev</li> - <li>g++ (4:4.0.3-1)</li> - <li>g++-4.0 (4.0.3-1ubuntu5)</li> - <li>gawk (1:3.1.5-2build1)</li> - <li>gcc (4:4.0.3-1)</li> - <li>gcc-4.0 (4.0.3-1ubuntu5)</li> - <li>libasound2-dev (1.0.10-2ubuntu4)</li> - <li>libc6 (2.3.6-0ubuntu20) to 2.3.6-0ubuntu20.4</li> - <li>libc6-dev (2.3.6-0ubuntu20.4)</li> - <li>libc6-i686 (2.3.6-0ubuntu20) to 2.3.6-0ubuntu20.4</li> - <li>libcupsys2-dev (1.2.2-0ubuntu0.6.06)</li> - <li>libgcrypt11-dev (1.2.2-1)</li> - <li>libgnutls-dev (1.2.9-2ubuntu1.1)</li> - <li>libgnutls12 (1.2.9-2ubuntu1) to 1.2.9-2ubuntu1.1</li> - <li>libgpg-error-dev (1.1-4)</li> - <li>libice-dev (2:1.0.0-0ubuntu2)</li> - <li>liblockfile1 (1.06.1)</li> - <li>libopencdk8-dev (0.5.7-2)</li> - <li>libpopt-dev (1.7-5)</li> - <li>libsm-dev (2:1.0.0-0ubuntu2)</li> - <li>libstdc++6-4.0-dev (4.0.3-1ubuntu5)</li> - <li>libtasn1-2-dev (0.2.17-1ubuntu1)</li> - <li>libx11-dev (2:1.0.0-0ubuntu9)</li> - <li>libxau-dev (1:1.0.0-0ubuntu4)</li> - <li>libxaw-headers (2:1.0.1-0ubuntu3)</li> - <li>libxaw7-dev (2:1.0.1-0ubuntu3)</li> - <li>libxdmcp-dev (1:1.0.0-0ubuntu2)</li> - <li>libxext-dev (2:1.0.0-0ubuntu4)</li> - <li>libxi-dev (2:1.0.0-0ubuntu3) </li> - <li>libxmu-dev (2:1.0.0-0ubuntu3)</li> - <li>libxmu-headers (2:1.0.0-0ubuntu3)</li> - <li>libxmuu-dev (2:1.0.0-0ubuntu3)</li> - <li>libxp-dev (6.8.2-11ubuntu2)</li> - <li>libxpm-dev (1:3.5.4.2-0ubuntu3)</li> - <li>libxrandr-dev (1:1.1.0.2-0ubuntu4)</li> - <li>libxt-dev (1:1.0.0-0ubuntu3)</li> - <li>libxtrap-dev (2:1.0.0-0ubuntu2)</li> - <li>libxtst-dev (2:1.0.1-0ubuntu2)</li> - <li>libxv-dev (2:1.0.1-0ubuntu3)</li> - <li>linux-kernel-headers (2.6.11.2-0ubuntu18)</li> - <li>m4 (1.4.4-1)</li> - <li>make (3.80+3.81.b4-1)</li> - <li>ssl-cert (1.0.13)</li> - <li>x-dev (7.0.4-0ubuntu2)</li> - <li>x11proto-core-dev (7.0.4-0ubuntu2)</li> - <li>x11proto-input-dev (1.3.2-0ubuntu2)</li> - <li>x11proto-kb-dev (1.0.2-0ubuntu2)</li> - <li>x11proto-randr-dev (1.1.2-0ubuntu2)</li> - <li>x11proto-record-dev (1.13.2-0ubuntu2)</li> - <li>x11proto-trap-dev (3.4.3-0ubuntu2)</li> - <li>x11proto-video-dev (2.2.2-0ubuntu2)</li> - <li>x11proto-xext-dev (7.0.2-0ubuntu2)</li> - <li>xlibs-dev (7.0.0-0ubuntu45)</li> - <li>zlib1g-dev (1:1.2.3-6ubuntu4)</li> - </ul> - </blockquote> - <!-- ------------------------------------------------------ --> - <h4>Ubuntu 7.04</h4> + <blockquote> + After installing <a href="http://ubuntu.org">Ubuntu</a> 8.10 + you need to install several build dependencies. The simplest + way to do it is to execute the following commands: + <p/> + <code>sudo aptitude build-dep openjdk-6</code> + <p/> + <code>sudo aptitude install openjdk-6-jdk</code> + <p/> + In addition, it's necessary to set a few environment variables for the build: + <p/> + <code>export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk</code> + </blockquote> + <h4>Ubuntu 9.04</h4> <p> - Using the Synaptic Package Manager, download the following - packages (double indented packages are automatically aquired - due to package dependencies): - <blockquote> - <ul> - <li>build-essential</li> - <ul> - <li>dpkg-dev</li> - <li>g++</li> - <li>g++-4.1</li> - <li>libc6-dev</li> - <li>libstdc++6.4.1-dev</li> - <li>linux-libc-dev</li> - </ul> - <li>gawk</li> - <li>m4</li> - <li>libasound2-dev</li> - <li>libcupsys2-dev</li> - <ul> - <li>libgcrypt11-dev</li> - <li>lgnutls-dev</li> - <li>libgpg-error-dev</li> - <li>liblzo-dev</li> - <li>libopencdk8-dev</li> - <li>libpopt-dev</li> - <li>libtasn1-3-dev</li> - <li>zlib1g-dev</li> - </ul> - <li>sun-java6-jdk</li> - <ul> - <li>java-common</li> - <li>libltdl3</li> - <li>odbcinst1debian1</li> - <li>sun-java6-bin</li> - <li>sun-java6-jre</li> - <li>unixodbc</li> - </ul> - <li>xlibs-dev</li> - <ul> - <li>(many)</li> - </ul> - <li>x11proto-print-dev</li> - <li>libxaw7-dev</li> - <ul> - <li>libxaw-headers</li> - </ul> - <li>libxp-dev</li> - <li>libfreetype6-dev</li> - </ul> - </blockquote> + <blockquote> + After installing <a href="http://ubuntu.org">Ubuntu</a> 9.04 + you need to install several build dependencies. The simplest + way to do it is to execute the following commands: + <p/> + <code>sudo aptitude build-dep openjdk-6</code> + <p/> + <code>sudo aptitude install openjdk-6-jdk</code> + <p/> + In addition, it's necessary to set a few environment variables for the build: + <p/> + <code>export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk</code> + </blockquote> </blockquote> - <!-- ------------------------------------------------------ --> + <!-- ====================================================== --> + <h3><a name="opensuse">OpenSUSE</a></h3> + <blockquote> + <h4>OpenSUSE 11.1</h4> + <p> + <blockquote> + After installing <a href="http://opensuse.org">OpenSUSE</a> 11.1 + you need to install several build dependencies. + The simplest way to install the build dependencies is to + execute the following commands: + <p/> + <code>sudo zypper source-install -d java-1_6_0-openjdk</code> + <p/> + <code>sudo zypper install make</code> + <p/> + In addition, it is necessary to set a few environment variables for the build: + <p/> + <code>export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-1.6.0-openjdk</code> + <p/> + Finally, you need to unset the <code>JAVA_HOME</code> environment variable: + <p/> + <code>export -n JAVA_HOME</code> + </blockquote> + </blockquote> + <!-- ====================================================== --> + <h3><a name="mandriva">Mandriva</a></h3> + <blockquote> + <h4>Mandriva Linux One 2009 Spring</h4> + <p> + <blockquote> + After installing <a href="http://mandriva.org">Mandriva</a> Linux One 2009 Spring + you need to install several build dependencies. + The simplest way to install the build dependencies is to + execute the following commands as user <tt>root</tt>: + <p/> + <code>urpmi java-1.6.0-openjdk-devel ant make gcc gcc-c++ freetype-devel zip unzip libcups2-devel libxrender1-devel libalsa2-devel libstc++-static-devel libxtst6-devel libxi-devel</code> + <p/> + In addition, it is necessary to set a few environment variables for the build: + <p/> + <code>export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-1.6.0-openjdk</code> + </blockquote> + </blockquote> + <!-- ====================================================== --> + <h3><a name="opensolaris">OpenSolaris</a></h3> + <blockquote> + <h4>OpenSolaris 2009.06</h4> + <p> + <blockquote> + After installing <a href="http://opensolaris.org">OpenSolaris</a> 2009.06 + you need to install several build dependencies. + The simplest way to install the build dependencies is to + execute the following commands: + <p/> + <code>pfexec pkg install SUNWgmake SUNWj6dev SUNWant sunstudioexpress SUNWcups SUNWzip SUNWunzip SUNWxwhl SUNWxorg-headers SUNWaudh SUNWfreetype2</code> + <p/> + In addition, it is necessary to set a few environment variables for the build: + <p/> + <code>export LANG=C ALT_COMPILER_PATH=/opt/SunStudioExpress/bin/ ALT_CUPS_HEADERS_PATH=/usr/include/</code> + <p/> + Finally, you need to make sure that the build process can find the Sun Studio compilers: + <p/> + <code>export PATH=$PATH:/opt/SunStudioExpress/bin/</code> + </blockquote> + </blockquote> + <!-- ------------------------------------------------------ --> <hr> <h2><a name="directories">Source Directory Structure</a></h2> <blockquote>
--- a/corba/.hgtags Mon Sep 28 19:39:40 2009 -0700 +++ b/corba/.hgtags Wed Jul 05 17:01:05 2017 +0200 @@ -46,3 +46,4 @@ 8120d308ec4e805c5588b8d9372844d781c4112d jdk7-b69 175bd68779546078dbdb6dacd7f0aced79ed22b1 jdk7-b70 3f1ef7f899ea2aec189c4fb67e5c8fa374437c50 jdk7-b71 +c793a31209263fbb867c23c752599d85c21abb73 jdk7-b72
--- a/corba/make/Makefile Mon Sep 28 19:39:40 2009 -0700 +++ b/corba/make/Makefile Wed Jul 05 17:01:05 2017 +0200 @@ -141,12 +141,12 @@ #----- src.zip -SRC_ZIP_FILES = $(shell $(FIND) $(SRC_CLASSES_DIR) \( -name SCCS -o -name \*-template \) -prune -o -type f -print ) +SRC_ZIP_FILES = $(shell $(FIND) $(SRC_CLASSES_DIR) \( -name \*-template \) -prune -o -type f -print ) SRC_ZIP = $(LIB_DIR)/src.zip $(SRC_ZIP): $(SRC_ZIP_FILES) abs_src_zip=`cd $(@D) ; pwd`/$(@F) ; \ - ( cd $(SRC_CLASSES_DIR) ; $(FIND) . \( -name SCCS -o -name \*-template \) -prune -o -type f -print | $(ZIP) -q $$abs_src_zip -@ ) ; \ + ( cd $(SRC_CLASSES_DIR) ; $(FIND) . \( -name \*-template \) -prune -o -type f -print | $(ZIP) -q $$abs_src_zip -@ ) ; \ ( cd $(GENSRC_DIR) ; $(FIND) . -type f -print | $(ZIP) -q $$abs_src_zip -@ ) ; #----- bin.zip
--- a/corba/make/common/BuildToolJar.gmk Mon Sep 28 19:39:40 2009 -0700 +++ b/corba/make/common/BuildToolJar.gmk Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2009 Sun Microsystems, Inc. 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 @@ -24,22 +24,29 @@ # # Input: BUILDDIR PACKAGE PKGDIR PROGRAM BUILDTOOL_SOURCE_ROOT BUILDTOOL_MAIN - + +# All subdirectories under the package root for the tool (max depth 4) +_WC_DIRS = * */* */*/* */*/*/* + BUILDTOOL_MAIN_SOURCE_FILE = $(BUILDTOOL_SOURCE_ROOT)/$(BUILDTOOL_MAIN) BUILDTOOL_MANIFEST_FILE = $(BUILDTOOLCLASSDIR)/$(PROGRAM)_manifest.mf BUILDTOOL_JAR_FILE = $(BUILDTOOLJARDIR)/$(PROGRAM).jar -BUILDTOOL_ALL_FILES := $(shell $(CD) $(BUILDTOOL_SOURCE_ROOT) \ - && $(FIND) $(PKGDIR) $(SCM_DIRS_prune) -o -type f -print) -BUILTTOOL_MAINCLASS = $(subst /,.,$(BUILDTOOL_MAIN:%.java=%)) +BUILTTOOL_MAINCLASS = $(subst /,.,$(BUILDTOOL_MAIN:%.java=%)) -all build: $(BUILDTOOL_JAR_FILE) tool_info +# Wildcard patterns that find all the sources for this build tool +BUILDTOOL_WC_PATTERNS = $(BUILDTOOL_SOURCE_ROOT)/$(PKGDIR)/*.java \ + $(patsubst %, $(BUILDTOOL_SOURCE_ROOT)/$(PKGDIR)/%/*.java, $(_WC_DIRS)) + +# Wildcard expansion that finds all the files +BUILDTOOL_SRC_FILES := $(wildcard $(BUILDTOOL_WC_PATTERNS)) + +all build: $(BUILDTOOL_JAR_FILE) $(BUILDTOOL_MANIFEST_FILE): $(BUILDTOOL_MAIN_SOURCE_FILE) @$(prep-target) $(ECHO) "Main-Class: $(BUILTTOOL_MAINCLASS)" > $@ -$(BUILDTOOL_JAR_FILE): $(BUILDTOOL_MANIFEST_FILE) \ - $(BUILDTOOL_ALL_FILES:%=$(BUILDTOOL_SOURCE_ROOT)/%) +$(BUILDTOOL_JAR_FILE): $(BUILDTOOL_MANIFEST_FILE) $(BUILDTOOL_SRC_FILES) @$(prep-target) @$(MKDIR) -p $(BUILDTOOLCLASSDIR) $(BOOT_JAVAC_CMD) -d $(BUILDTOOLCLASSDIR) \ @@ -49,23 +56,8 @@ $(JAR_JFLAGS) || $(RM) $@ @$(java-vm-cleanup) -# Printing out a build tool information line -define printBuildToolSetting -if [ "$2" != "" ] ; then $(PRINTF) "%-25s %s\n" "$1:" "$2"; fi -endef +clean clobber:: + $(RM) -r $(BUILDTOOLCLASSDIR)/$(PKGDIR) \ + $(BUILDTOOL_MANIFEST_FILE) \ + $(BUILDTOOL_JAR_FILE) -# Print out the build tool information -tool_info: - @$(ECHO) "=========================================================" - @$(call printBuildToolSetting,BUILDTOOL,$(PROGRAM)) - @$(call printBuildToolSetting,PACKAGE,$(PACKAGE)) - @$(call printBuildToolSetting,BUILDTOOL_SOURCE_ROOT,$(BUILDTOOL_SOURCE_ROOT)) - @$(call printBuildToolSetting,BUILTTOOL_MAINCLASS,$(BUILTTOOL_MAINCLASS)) - @$(call printBuildToolSetting,BUILDTOOL_JAR_FILE,$(BUILDTOOL_JAR_FILE)) - @$(ECHO) "=========================================================" - -clean clobber:: - $(RM) -r $(BUILDTOOLCLASSDIR)/$(PKGDIR) - $(RM) $(BUILDTOOL_MANIFEST_FILE) - $(RM) $(BUILDTOOL_JAR_FILE) -
--- a/corba/make/common/CancelImplicits.gmk Mon Sep 28 19:39:40 2009 -0700 +++ b/corba/make/common/CancelImplicits.gmk Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1998-2009 Sun Microsystems, Inc. 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 @@ -56,11 +56,3 @@ %: %.sh endif -# -# If you are using RCS, you must set the variable USE_RCS at the make -# command line. Otherwise we disable RCS. -# -ifndef USE_RCS -%:: %,v -%:: RCS/%,v -endif
--- a/corba/make/common/Defs.gmk Mon Sep 28 19:39:40 2009 -0700 +++ b/corba/make/common/Defs.gmk Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1995-2009 Sun Microsystems, Inc. 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 @@ -310,125 +310,32 @@ SUBDIRS_MAKEFLAGS-clobber = INCREMENTAL_BUILD=false SUBDIRS_MAKEFLAGS-clean = INCREMENTAL_BUILD=false -# Current directory -CURRENT_DIRECTORY := $(shell $(PWD)) - -# If no timing wanted, we need to define these as empty -ifdef NO_TIMING - -TIMING_ID:=NA - -define TIMING_start -t=0:0:0:0 -endef - -define TIMING_end -time_used=0 -endef - -else # NO_TIMING - -# Default timing id -TIMING_ID:=$(shell $(BASENAME) $(CURRENT_DIRECTORY)) - -# Timing start (must be used in same shell, e.g. same command line) -# Defines the shell variable $1 to have the start time. -define TIMING_start -$1=`$(DATE) +%j:%H:%M:%S` -endef - -# Timing end (must be used in same shell, e.g. same command line) -# Expects shell variable $1 to have been defined as the start time. -# Expects shell variable $2 to have timing id string -# Sets total_seconds shell variable as the total seconds used. -# Sets time_used shell variable to contain format "%dh%dm%ds" -define TIMING_end -begTime="$${$1}"; \ -timing_id="$${$2}"; \ -endTime=`$(DATE) +%j:%H:%M:%S`; \ -d1=`$(ECHO) $${begTime} | $(CUT) -d':' -f1 | $(SED) -e 's@^0*@@'`; \ -if [ "$${d1}" = "" ] ; then d1=0; fi; \ -h1=`$(ECHO) $${begTime} | $(CUT) -d':' -f2 | $(SED) -e 's@^0*@@'`; \ -if [ "$${h1}" = "" ] ; then h1=0; fi; \ -m1=`$(ECHO) $${begTime} | $(CUT) -d':' -f3 | $(SED) -e 's@^0*@@'`; \ -if [ "$${m1}" = "" ] ; then m1=0; fi; \ -s1=`$(ECHO) $${begTime} | $(CUT) -d':' -f4 | $(SED) -e 's@^0*@@'`; \ -if [ "$${s1}" = "" ] ; then s1=0; fi; \ -d2=`$(ECHO) $${endTime} | $(CUT) -d':' -f1 | $(SED) -e 's@^0*@@'`; \ -if [ "$${d2}" = "" ] ; then d2=0; fi; \ -h2=`$(ECHO) $${endTime} | $(CUT) -d':' -f2 | $(SED) -e 's@^0*@@'`; \ -if [ "$${h2}" = "" ] ; then h2=0; fi; \ -m2=`$(ECHO) $${endTime} | $(CUT) -d':' -f3 | $(SED) -e 's@^0*@@'`; \ -if [ "$${m2}" = "" ] ; then m2=0; fi; \ -s2=`$(ECHO) $${endTime} | $(CUT) -d':' -f4 | $(SED) -e 's@^0*@@'`; \ -if [ "$${s2}" = "" ] ; then s2=0; fi; \ -t1_secs=`$(EXPR) $${d1} '*' 60 '*' 60 '*' 24 '+' $${h1} '*' 60 '*' 60 \ - '+' $${m1} '*' 60 '+' $${s1}`; \ -t2_secs=`$(EXPR) $${d2} '*' 60 '*' 60 '*' 24 '+' $${h2} '*' 60 '*' 60 \ - '+' $${m2} '*' 60 '+' $${s2}`; \ -total_seconds=`$(EXPR) $${t2_secs} '-' $${t1_secs}`; \ -if [ "$${total_seconds}" -lt 0 ] ; then total_seconds=0; fi; \ -t_hour=`$(EXPR) $${total_seconds} '/' '(' 60 '*' 60 ')'`h; \ -t_min=`$(EXPR) '(' $${total_seconds} '%' '(' 60 '*' 60 ')' ')' '/' 60`m; \ -t_sec=`$(EXPR) $${total_seconds} '%' 60`s; \ -time_used=$${t_sec}; \ -if [ "$${t_hour}" != "0h" ] ; then \ -time_used=$${t_hour}$${t_min}$${t_sec}; \ -elif [ "$${t_min}" != "0m" ] ; then \ -time_used=$${t_min}$${t_sec}; \ -else \ -time_used=$${t_sec}; \ -fi; \ -$(PRINTF) " Timing: %05d seconds or %s for %s\n" \ - $${total_seconds} $${time_used} $${timing_id} -endef - -endif # NO_TIMING - # Given a SUBDIRS list, cd into them and make them # SUBDIRS_MAKEFLAGS Make settings for a subdir make # SUBDIRS_MAKEFLAGS-$@ Make settings specific to this target define SUBDIRS-loop -@$(ECHO) "Begin Processing SUBDIRS: $(SUBDIRS)" @for i in DUMMY $(SUBDIRS) ; do \ if [ "$$i" != "DUMMY" ] ; then \ - $(ECHO) ">>>Recursively making "$$i" "$@" @ `$(DATE)` ..."; \ - timing_id="$(TIMING_ID)-`$(BASENAME) $${i}`"; \ - $(call TIMING_start,startTime); \ - curDir=$(CURRENT_DIRECTORY); \ - $(CD) $$i; $(MAKE) $@ TIMING_ID=$${timing_id} \ - $(SUBDIRS_MAKEFLAGS) \ - $(SUBDIRS_MAKEFLAGS-$@) \ - FULL_VERSION=$(FULL_VERSION) \ - RELEASE=$(RELEASE) || exit 1; \ - $(CD) $${curDir}; \ - $(call TIMING_end,startTime,timing_id); \ - $(ECHO) "<<<Finished Recursively making "$$i" "$@" @ `$(DATE)`." ; \ + $(MAKE) -C $${i} $@ \ + $(SUBDIRS_MAKEFLAGS) \ + $(SUBDIRS_MAKEFLAGS-$@) \ + FULL_VERSION=$(FULL_VERSION) \ + RELEASE=$(RELEASE) || exit 1; \ fi ; \ done -@$(ECHO) "Done Processing SUBDIRS: $(SUBDIRS)" endef # Given a OTHERSUBDIRS list, cd into them and make them (extra loop define) # OTHERSUBDIRS_MAKEFLAGS Make settings for a subdir make define OTHERSUBDIRS-loop -@$(ECHO) "Begin Processing OTHERSUBDIRS: $(OTHERSUBDIRS)" @for i in DUMMY $(OTHERSUBDIRS) ; do \ if [ "$$i" != "DUMMY" ] ; then \ - $(ECHO) ">>>Recursively making "$$i" "$@" @ `$(DATE)` ..."; \ - timing_id="$(TIMING_ID)-`$(BASENAME) $${i}`"; \ - $(call TIMING_start,startTime); \ - curDir=$(CURRENT_DIRECTORY); \ - $(CD) $$i; $(MAKE) $@ TIMING_ID=$${timing_id} \ - $(OTHERSUBDIRS_MAKEFLAGS) \ - FULL_VERSION=$(FULL_VERSION) \ - RELEASE=$(RELEASE) || exit 1; \ - $(CD) $${curDir}; \ - $(call TIMING_end,startTime,timing_id); \ - $(ECHO) "<<<Finished Recursively making "$$i" "$@" @ `$(DATE)`." ; \ + $(MAKE) -C $${i} $@ \ + $(OTHERSUBDIRS_MAKEFLAGS) \ + FULL_VERSION=$(FULL_VERSION) \ + RELEASE=$(RELEASE) || exit 1; \ fi ; \ done -@$(ECHO) "Done Processing OTHERSUBDIRS: $(OTHERSUBDIRS)" endef # @@ -460,46 +367,23 @@ VERSION_DEFINES = -DRELEASE='"$(RELEASE)"' endif -# Note: As a rule, GNU Make rules should not appear in any of the -# Defs*.gmk files. These were added for Kestrel-Solaris and do address -# a TeamWare bug. They should be moved elsewhere for Merlin. -# -# Override gnumake built-in rules which do sccs get operations badly. -# (They put the checked out code in the current directory, not in the -# directory of the original file.) -# Since this is a symptom of a teamware failure, complain and die on the spot. +# Prevent the use of many default suffix rules we do not need +.SUFFIXES: +.SUFFIXES: .c .o .h .obj .cpp .hpp .java .class -# This message immediately goes to stdout and the build terminates. -define SCCS-trouble -$(error \ -"ERROR: File $@ referenced while building in $(CURRENT_DIRECTORY) \ - is out of date with respect to its SCCS file $<. \ - This can happen from an unresolved Teamware conflict, a file movement, or \ - a failure in which SCCS files are updated but the 'sccs get' was not done. \ - You should double check for other out of date files in your workspace. \ - Or run: cd $(TOPDIR) && $(MAKE) sccs_get") -endef - -%:: s.% - @$(SCCS-trouble) -%:: SCCS/s.% - @$(SCCS-trouble) - @$(ECHO) " is out of date with respect to its SCCS file." >> $(WARNING_FILE) - @$(ECHO) " This file may be from an unresolved Teamware conflict." >> $(WARNING_FILE) - @$(ECHO) " This is also a symptom of a Teamware bringover/putback failure" >> $(WARNING_FILE) - @$(ECHO) " in which SCCS files are updated but not checked out." >> $(WARNING_FILE) - @$(ECHO) " Check for other out of date files in your workspace." >> $(WARNING_FILE) - @$(ECHO) "" >> $(WARNING_FILE) - @#exit 666 - +# Make sure we are all insane ifdef INSANE export INSANE endif -ifdef ALT_COPYRIGHT_YEAR - COPYRIGHT_YEAR = $(ALT_COPYRIGHT_YEAR) -else - COPYRIGHT_YEAR = $(shell $(DATE) '+%Y') +# Make sure we have the current year +ifndef COPYRIGHT_YEAR + ifdef ALT_COPYRIGHT_YEAR + COPYRIGHT_YEAR := $(ALT_COPYRIGHT_YEAR) + else + COPYRIGHT_YEAR := $(shell $(DATE) '+%Y') + endif + export COPYRIGHT_YEAR endif # Install of imported file (JDK_IMPORT_PATH, or some other external location)
--- a/corba/make/common/Rules.gmk Mon Sep 28 19:39:40 2009 -0700 +++ b/corba/make/common/Rules.gmk Wed Jul 05 17:01:05 2017 +0200 @@ -27,17 +27,6 @@ # # Rules shared by all Java makefiles. # -# Used to apply to source file $<, checks code conventions, issues warnings. -define check-conventions - if [ "$(CONVENTION_WATCH)" = "true" ] ; then \ - if [ "`$(CAT) -n -v -t $< | $(EGREP) -v '\@\(\#\)' | $(EGREP) '\^[MLI]'`" != "" ] ; then \ - $(ECHO) "WARNING: File contains tabs, ^M, or ^L characters: $<"; \ - if [ "$(CONVENTION_DETAILS)" = "true" ] ; then \ - $(CAT) -n -v -t $< | $(EGREP) -v '\@\(\#\)' | $(EGREP) '\^[MLI]' ; \ - fi; \ - fi; \ - fi -endef # Make sure the default rule is all rules_default_rule: all @@ -162,7 +151,6 @@ # Add a java source to the list define add-java-file $(ECHO) "$?" >> $(JAVA_SOURCE_LIST) -$(check-conventions) endef $(CLASSDESTDIR)/%.class: $(GENSRCDIR)/%.java @@ -197,11 +185,8 @@ .compile.classlist : $(JAVA_SOURCE_LIST) @$(MKDIR) -p $(CLASSDESTDIR) - @if [ `$(CAT) $(JAVA_SOURCE_LIST) | $(WC) -l` -ge 1 ] ; then \ - $(ECHO) "# Java sources to be compiled: (listed in file $(JAVA_SOURCE_LIST))"; \ + if [ -s $(JAVA_SOURCE_LIST) ] ; then \ $(CAT) $(JAVA_SOURCE_LIST); \ - $(ECHO) "# Running javac:"; \ - $(ECHO) $(JAVAC_CMD) $(JAVAC_PREFER_SOURCE) -sourcepath "$(SOURCEPATH)" -d $(CLASSDESTDIR) @$(JAVA_SOURCE_LIST); \ $(JAVAC_CMD) $(JAVAC_PREFER_SOURCE) -sourcepath "$(SOURCEPATH)" -d $(CLASSDESTDIR) @$(JAVA_SOURCE_LIST); \ fi @$(java-vm-cleanup) @@ -220,10 +205,7 @@ packages.clean: ifeq ($(DONT_CLOBBER_CLASSES),false) ifdef AUTO_FILES_JAVA_DIRS - @for sdir in $(AUTO_FILES_JAVA_DIRS); do \ - $(ECHO) "$(RM) -r $(CLASSDESTDIR)/$$sdir"; \ - $(RM) -r $(CLASSDESTDIR)/$$sdir; \ - done + $(RM) -r $(patsubst %, $(CLASSDESTDIR)/%, $(AUTO_FILES_JAVA_DIRS)) else $(RM) -r $(CLASSDESTDIR)/$(PKGDIR) endif @@ -259,15 +241,13 @@ $(CLASSHDR_DOTFILE): $(CLASSES_export) $(prep-target) - @$(ECHO) "# Running javah:" $(JAVAH_CMD) -d $(CLASSHDRDIR)/ \ $(CLASSES.export) $(subst $$,\$$,$(EXPORTED_inner)) @$(java-vm-cleanup) @$(TOUCH) $@ classheaders.clean: - $(RM) $(CLASSHDR_DOTFILE) - $(RM) -r $(CLASSHDRDIR) + $(RM) -r $(CLASSHDRDIR) $(CLASSHDR_DOTFILE) else # FILES_export
--- a/corba/make/common/shared/Compiler-msvc.gmk Mon Sep 28 19:39:40 2009 -0700 +++ b/corba/make/common/shared/Compiler-msvc.gmk Wed Jul 05 17:01:05 2017 +0200 @@ -48,11 +48,17 @@ NMAKE = MFLAGS= MAKEFLAGS= $(COMPILER_PATH)nmake -nologo # Compiler version and type (Always get word after "Version") - CC_VER := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(SED) 's/.*\(Version.*\)/\1/' | $(NAWK) '{print $$2}') - + ifndef CC_VER + CC_VER := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(SED) 's/.*\(Version.*\)/\1/' | $(NAWK) '{print $$2}') + export CC_VER + endif + # SDK-64 and MSVC6 put REBASE.EXE in a different places - go figure... ifeq ($(ARCH_DATA_MODEL), 32) - LINK_VER := $(shell $(LINK) | $(HEAD) -n 1 | $(NAWK) '{print $$6}') + ifndef LINK_VER + LINK_VER := $(shell $(LINK) | $(HEAD) -n 1 | $(NAWK) '{print $$6}') + export LINK_VER + endif CC_MAJORVER :=$(call MajorVersion,$(CC_VER)) ifeq ($(CC_MAJORVER), 13) # This should be: CC_VER=13.10.3077 LINK_VER=7.10.3077 @@ -93,7 +99,10 @@ endif else # else ARCH_DATA_MODEL is 64 - LINK_VER := $(shell $(LINK) | $(HEAD) -n 1 | $(NAWK) '{print $$6}') + ifndef LINK_VER + LINK_VER := $(shell $(LINK) | $(HEAD) -n 1 | $(NAWK) '{print $$6}') + export LINK_VER + endif CC_MAJORVER :=$(call MajorVersion,$(CC_VER)) CC_MINORVER :=$(call MinorVersion,$(CC_VER)) CC_MICROVER :=$(call MicroVersion,$(CC_VER))
--- a/corba/make/common/shared/Defs-utils.gmk Mon Sep 28 19:39:40 2009 -0700 +++ b/corba/make/common/shared/Defs-utils.gmk Wed Jul 05 17:01:05 2017 +0200 @@ -116,7 +116,6 @@ RMDIR = $(UTILS_COMMAND_PATH)rmdir RPM = $(UTILS_COMMAND_PATH)rpm RPMBUILD = $(UTILS_COMMAND_PATH)rpmbuild -SCCS = $(UTILS_CCS_BIN_PATH)sccs SED = $(UTILS_COMMAND_PATH)sed SH = $(UTILS_COMMAND_PATH)sh SHOWREV = $(UTILS_USR_BIN_PATH)showrev
--- a/corba/make/common/shared/Defs-windows.gmk Mon Sep 28 19:39:40 2009 -0700 +++ b/corba/make/common/shared/Defs-windows.gmk Wed Jul 05 17:01:05 2017 +0200 @@ -113,32 +113,38 @@ # UNIXCOMMAND_PATH: path to where the most common Unix commands are. # NOTE: Must end with / so that it could be empty, allowing PATH usage. -ifdef ALT_UNIXCOMMAND_PATH - xALT_UNIXCOMMAND_PATH :="$(subst \,/,$(ALT_UNIXCOMMAND_PATH))" - fxALT_UNIXCOMMAND_PATH :=$(call FullPath,$(xALT_UNIXCOMMAND_PATH)) - UNIXCOMMAND_PATH :=$(call PrefixPath,$(fxALT_UNIXCOMMAND_PATH)) -else - ifdef USING_CYGWIN - UNIXCOMMAND_PATH :=$(call PrefixPath,/usr/bin) +ifndef UNIXCOMMAND_PATH + ifdef ALT_UNIXCOMMAND_PATH + xALT_UNIXCOMMAND_PATH :="$(subst \,/,$(ALT_UNIXCOMMAND_PATH))" + fxALT_UNIXCOMMAND_PATH :=$(call FullPath,$(xALT_UNIXCOMMAND_PATH)) + UNIXCOMMAND_PATH :=$(call PrefixPath,$(fxALT_UNIXCOMMAND_PATH)) else - ifdef ROOTDIR - xROOTDIR :="$(subst \,/,$(ROOTDIR))" - _rootdir :=$(call FullPath,$(xROOTDIR)) + ifdef USING_CYGWIN + UNIXCOMMAND_PATH :=$(call PrefixPath,/usr/bin) else - xROOTDIR :="$(_system_drive)/mksnt" - _rootdir :=$(call FullPath,$(xROOTDIR)) - endif - ifneq ($(_rootdir),) - UNIXCOMMAND_PATH :=$(call PrefixPath,$(_rootdir)/mksnt) + ifdef ROOTDIR + xROOTDIR :="$(subst \,/,$(ROOTDIR))" + _rootdir :=$(call FullPath,$(xROOTDIR)) + else + xROOTDIR :="$(_system_drive)/mksnt" + _rootdir :=$(call FullPath,$(xROOTDIR)) + endif + ifneq ($(_rootdir),) + UNIXCOMMAND_PATH :=$(call PrefixPath,$(_rootdir)/mksnt) + endif endif endif + UNIXCOMMAND_PATH:=$(call AltCheckSpaces,UNIXCOMMAND_PATH) + export UNIXCOMMAND_PATH endif -UNIXCOMMAND_PATH:=$(call AltCheckSpaces,UNIXCOMMAND_PATH) # Get version of MKS or CYGWIN ifdef USING_CYGWIN -_CYGWIN_VER :=$(shell $(UNAME)) -CYGWIN_VER :=$(call GetVersion,$(_CYGWIN_VER)) + ifndef CYGWIN_VER + _CYGWIN_VER :=$(shell $(UNAME)) + CYGWIN_VER :=$(call GetVersion,$(_CYGWIN_VER)) + export CYGWIN_VER + endif else # MKS _MKS_VER :=$(shell $(MKSINFO) 2>&1 | $(GREP) Release | $(TAIL) -1 | $(SED) -e 's@.*\(Release.*\)@\1@') MKS_VER :=$(call GetVersion,$(_MKS_VER)) @@ -168,235 +174,234 @@ # Process Windows values into FullPath values, these paths may have \ chars -# System root -ifdef SYSTEMROOT - xSYSTEMROOT :="$(subst \,/,$(SYSTEMROOT))" - _system_root :=$(call FullPath,$(xSYSTEMROOT)) -else - ifdef SystemRoot - xSYSTEMROOT :="$(subst \,/,$(SystemRoot))" - _system_root :=$(call FullPath,$(xSYSTEMROOT)) +# Program Files directory +ifndef SHORTPROGRAMFILES + ifdef PROGRAMFILES + xPROGRAMFILES :="$(subst \,/,$(PROGRAMFILES))" else - ifdef WINDIR - xWINDIR :="$(subst \,/,$(WINDIR))" - _system_root :=$(call FullPath,$(xWINDIR)) + ifeq ($(ARCH_DATA_MODEL), 32) + xPROGRAMFILES :="$(_system_drive)/Program Files" else - ifdef windir - xWINDIR :="$(subst \,/,$(windir))" - _system_root :=$(call FullPath,$(xWINDIR)) - endif + xPROGRAMFILES :="$(_system_drive)/Program Files (x86)" endif endif -endif -_system_root:=$(call CheckValue,_system_root,$(_system_drive)/WINNT) - -# Program Files directory -ifdef PROGRAMFILES - xPROGRAMFILES :="$(subst \,/,$(PROGRAMFILES))" -else ifeq ($(ARCH_DATA_MODEL), 32) - xPROGRAMFILES :="$(_system_drive)/Program Files" + SHORTPROGRAMFILES :=$(call FullPath,$(xPROGRAMFILES)) else - xPROGRAMFILES :="$(_system_drive)/Program Files (x86)" + ifdef PROGRAMW6432 + xPROGRAMW6432 :="$(subst \,/,$(PROGRAMW6432))" + else + xPROGRAMW6432 :="$(_system_drive)/Program Files" + endif + SHORTPROGRAMFILES :=$(call FullPath,$(xPROGRAMW6432)) endif -endif -ifeq ($(ARCH_DATA_MODEL), 32) - _program_files :=$(call FullPath,$(xPROGRAMFILES)) -else - ifdef PROGRAMW6432 - xPROGRAMW6432 :="$(subst \,/,$(PROGRAMW6432))" - else - xPROGRAMW6432 :="$(_system_drive)/Program Files" + ifneq ($(word 1,$(SHORTPROGRAMFILES)),$(SHORTPROGRAMFILES)) + SHORTPROGRAMFILES := endif - _program_files :=$(call FullPath,$(xPROGRAMW6432)) - _program_files32 :=$(call FullPath,$(xPROGRAMFILES)) - ifneq ($(word 1,$(_program_files32)),$(_program_files32)) - _program_files32:= - endif -endif -ifneq ($(word 1,$(_program_files)),$(_program_files)) - _program_files:= + export SHORTPROGRAMFILES endif # Compilers, SDK, and Visual Studio (MSDEV) [32bit is different from 64bit] ifeq ($(ARCH_DATA_MODEL), 32) - # Try looking in MSVCDIR or MSVCDir area first (set by vcvars32.bat) - ifdef MSVCDIR - xMSVCDIR :="$(subst \,/,$(MSVCDIR))" - _msvc_dir :=$(call FullPath,$(xMSVCDIR)) - else - ifdef MSVCDir - xMSVCDIR :="$(subst \,/,$(MSVCDir))" - _msvc_dir :=$(call FullPath,$(xMSVCDIR)) + ifndef SHORTMSVCDIR + # Try looking in MSVCDIR or MSVCDir area first (set by vcvars32.bat) + ifdef MSVCDIR + xMSVCDIR :="$(subst \,/,$(MSVCDIR))" + SHORTMSVCDIR :=$(call FullPath,$(xMSVCDIR)) else - ifneq ($(_program_files),) - xMSVCDIR :="$(_program_files)/Microsoft Visual Studio .NET 2003/Vc7" - _msvc_dir :=$(call FullPath,$(xMSVCDIR)) + ifdef MSVCDir + xMSVCDIR :="$(subst \,/,$(MSVCDir))" + SHORTMSVCDIR :=$(call FullPath,$(xMSVCDIR)) + else + ifneq ($(SHORTPROGRAMFILES),) + xMSVCDIR :="$(SHORTPROGRAMFILES)/Microsoft Visual Studio .NET 2003/Vc7" + SHORTMSVCDIR :=$(call FullPath,$(xMSVCDIR)) + endif endif endif + ifneq ($(subst MSDev98,OLDOLDOLD,$(SHORTMSVCDIR)),$(SHORTMSVCDIR)) + SHORTMSVCDIR := + endif + # If we still don't have it, look for VS71COMNTOOLS, setup by installer? + ifeq ($(SHORTMSVCDIR),) + ifdef VS71COMNTOOLS # /Common/Tools directory, use ../../Vc7 + xVS71COMNTOOLS :="$(subst \,/,$(VS71COMNTOOLS))" + _vs71tools :=$(call FullPath,$(xVS71COMNTOOLS)) + endif + ifneq ($(_vs71tools),) + SHORTMSVCDIR :=$(_vs71tools)/../../Vc7 + endif + endif + export SHORTMSVCDIR endif - ifneq ($(subst MSDev98,OLDOLDOLD,$(_msvc_dir)),$(_msvc_dir)) - _msvc_dir := - endif - # If we still don't have it, look for VS71COMNTOOLS, setup by installer? - ifeq ($(_msvc_dir),) - ifdef VS71COMNTOOLS # /Common/Tools directory, use ../../Vc7 - xVS71COMNTOOLS :="$(subst \,/,$(VS71COMNTOOLS))" - _vs71tools :=$(call FullPath,$(xVS71COMNTOOLS)) - endif - ifneq ($(_vs71tools),) - _msvc_dir :=$(_vs71tools)/../../Vc7 - endif - endif - ifneq ($(_msvc_dir),) - _compiler_bin :=$(_msvc_dir)/Bin - _redist_sdk :=$(_msvc_dir)/../SDK/v1.1/Bin - _ms_sdk :=$(_msvc_dir)/PlatformSDK + ifneq ($(SHORTMSVCDIR),) + SHORTCOMPILERBIN :=$(SHORTMSVCDIR)/Bin + SHORTPSDK :=$(SHORTMSVCDIR)/PlatformSDK + export SHORTCOMPILERBIN + export SHORTPSDK endif endif # The Microsoft Platform SDK installed by itself -ifneq ($(_program_files),) - xPSDK :="$(_program_files)/Microsoft Platform SDK" - _psdk :=$(call FullPath,$(xPSDK)) - ifeq ($(_psdk),) - xPSDK :="$(_program_files)/Microsoft SDK" - _psdk :=$(call FullPath,$(xMSSDK)) +ifneq ($(SHORTPROGRAMFILES),) + ifndef SHORTPSDK + xPSDK :="$(SHORTPROGRAMFILES)/Microsoft Platform SDK" + SHORTPSDK :=$(call FullPath,$(xPSDK)) + ifeq ($(SHORTPSDK),) + xPSDK :="$(SHORTPROGRAMFILES)/Microsoft SDK" + SHORTPSDK :=$(call FullPath,$(xMSSDK)) + endif + export SHORTPSDK endif endif # If no SDK found yet, look in other places -ifeq ($(_ms_sdk),) +ifndef SHORTPSDK ifdef MSSDK - xMSSDK :="$(subst \,/,$(MSSDK))" - _ms_sdk :=$(call FullPath,$(xMSSDK)) + xMSSDK :="$(subst \,/,$(MSSDK))" + SHORTPSDK :=$(call FullPath,$(xMSSDK)) else ifdef MSSdk - xMSSDK :="$(subst \,/,$(MSSdk))" - _ms_sdk :=$(call FullPath,$(xMSSDK)) - else - _ms_sdk :=$(_psdk) + xMSSDK :="$(subst \,/,$(MSSdk))" + SHORTPSDK :=$(call FullPath,$(xMSSDK)) endif endif + export SHORTPSDK endif # Compilers for 64bit are from SDK ifeq ($(ARCH_DATA_MODEL), 64) - xMSSDK61 :="C:/Program Files/Microsoft SDKs/Windows/v6.1/" - MSSDK61 :=$(call FullPath,$(xMSSDK61)) - xVS2008 :="C:/Program Files (x86)/Microsoft Visual Studio 9.0/" - _vs2008 :=$(call FullPath,$(xVS2008)) - ifneq ($(_vs2008),) - ifeq ($(ARCH), ia64) - _compiler_bin :=$(_vs2008)/VC/Bin/x86_ia64 - endif - ifeq ($(ARCH), amd64) - _compiler_bin :=$(_vs2008)/VC/Bin/$(ARCH) - _redist_sdk :=$(MSSDK61)/VC/redist - endif - else - ifneq ($(_ms_sdk),) + ifndef SHORTCOMPILERBIN + xMSSDK61 :="C:/Program Files/Microsoft SDKs/Windows/v6.1/" + MSSDK61 :=$(call FullPath,$(xMSSDK61)) + xVS2008 :="C:/Program Files (x86)/Microsoft Visual Studio 9.0/" + _vs2008 :=$(call FullPath,$(xVS2008)) + ifneq ($(_vs2008),) ifeq ($(ARCH), ia64) - _compiler_bin :=$(_ms_sdk)/Bin/Win64 + SHORTCOMPILERBIN :=$(_vs2008)/VC/Bin/x86_ia64 endif ifeq ($(ARCH), amd64) - _compiler_bin :=$(_ms_sdk)/Bin/Win64/x86/$(ARCH) - _redist_sdk :=$(_ms_sdk)/redist/win64/AMD64 + SHORTCOMPILERBIN :=$(_vs2008)/VC/Bin/$(ARCH) + endif + else + ifneq ($(SHORTPSDK),) + ifeq ($(ARCH), ia64) + SHORTCOMPILERBIN :=$(SHORTPSDK)/Bin/Win64 + endif + ifeq ($(ARCH), amd64) + SHORTCOMPILERBIN :=$(SHORTPSDK)/Bin/Win64/x86/$(ARCH) + endif endif endif + export SHORTCOMPILERBIN endif endif # Location on system where jdk installs might be -ifneq ($(_program_files),) - USRJDKINSTANCES_PATH =$(_program_files)/Java +ifneq ($(SHORTPROGRAMFILES),) + USRJDKINSTANCES_PATH =$(SHORTPROGRAMFILES)/Java else USRJDKINSTANCES_PATH =$(_system_drive)/ endif # SLASH_JAVA: location of all network accessable files -ifdef ALT_SLASH_JAVA - xALT_SLASH_JAVA :="$(subst \,/,$(ALT_SLASH_JAVA))" - SLASH_JAVA :=$(call FullPath,$(xALT_SLASH_JAVA)) -else - ifdef ALT_JDK_JAVA_DRIVE - SLASH_JAVA =$(JDK_JAVA_DRIVE) +ifndef SLASH_JAVA + ifdef ALT_SLASH_JAVA + xALT_SLASH_JAVA :="$(subst \,/,$(ALT_SLASH_JAVA))" + SLASH_JAVA :=$(call FullPath,$(xALT_SLASH_JAVA)) else - SLASH_JAVA =J: + ifdef ALT_JDK_JAVA_DRIVE + SLASH_JAVA =$(JDK_JAVA_DRIVE) + else + SLASH_JAVA =J: + endif endif + SLASH_JAVA:=$(call AltCheckSpaces,SLASH_JAVA) + SLASH_JAVA:=$(call AltCheckValue,SLASH_JAVA) + export SLASH_JAVA endif -SLASH_JAVA:=$(call AltCheckSpaces,SLASH_JAVA) -SLASH_JAVA:=$(call AltCheckValue,SLASH_JAVA) # JDK_DEVTOOLS_DIR: common path for all the java devtools -ifdef ALT_JDK_DEVTOOLS_DIR - xALT_JDK_DEVTOOLS_DIR :="$(subst \,/,$(ALT_JDK_DEVTOOLS_DIR))" - JDK_DEVTOOLS_DIR :=$(call FullPath,$(xALT_JDK_DEVTOOLS_DIR)) -else - JDK_DEVTOOLS_DIR =$(SLASH_JAVA)/devtools +ifndef JDK_DEVTOOLS_DIR + ifdef ALT_JDK_DEVTOOLS_DIR + xALT_JDK_DEVTOOLS_DIR :="$(subst \,/,$(ALT_JDK_DEVTOOLS_DIR))" + JDK_DEVTOOLS_DIR :=$(call FullPath,$(xALT_JDK_DEVTOOLS_DIR)) + else + JDK_DEVTOOLS_DIR =$(SLASH_JAVA)/devtools + endif + JDK_DEVTOOLS_DIR:=$(call AltCheckSpaces,JDK_DEVTOOLS_DIR) + JDK_DEVTOOLS_DIR:=$(call AltCheckValue,JDK_DEVTOOLS_DIR) + export JDK_DEVTOOLS_DIR endif -JDK_DEVTOOLS_DIR:=$(call AltCheckSpaces,JDK_DEVTOOLS_DIR) -JDK_DEVTOOLS_DIR:=$(call AltCheckValue,JDK_DEVTOOLS_DIR) # COMPILER_PATH: path to where the compiler and tools are installed. # NOTE: Must end with / so that it could be empty, allowing PATH usage. -ifdef ALT_COMPILER_PATH - xALT_COMPILER_PATH :="$(subst \,/,$(ALT_COMPILER_PATH))" - fxALT_COMPILER_PATH :=$(call FullPath,$(xALT_COMPILER_PATH)) - COMPILER_PATH :=$(call PrefixPath,$(fxALT_COMPILER_PATH)) -else - COMPILER_PATH :=$(call PrefixPath,$(_compiler_bin)) +ifndef COMPILER_PATH + ifdef ALT_COMPILER_PATH + xALT_COMPILER_PATH :="$(subst \,/,$(ALT_COMPILER_PATH))" + fxALT_COMPILER_PATH :=$(call FullPath,$(xALT_COMPILER_PATH)) + COMPILER_PATH :=$(call PrefixPath,$(fxALT_COMPILER_PATH)) + else + COMPILER_PATH :=$(call PrefixPath,$(SHORTCOMPILERBIN)) + endif + COMPILER_PATH :=$(call AltCheckSpaces,COMPILER_PATH) + export COMPILER_PATH endif -COMPILER_PATH :=$(call AltCheckSpaces,COMPILER_PATH) # MSDEVTOOLS_PATH: path to where the additional MS Compiler tools are. # NOTE: Must end with / so that it could be empty, allowing PATH usage. -ifdef ALT_MSDEVTOOLS_PATH - xALT_MSDEVTOOLS_PATH :="$(subst \,/,$(ALT_MSDEVTOOLS_PATH))" - fxALT_MSDEVTOOLS_PATH :=$(call FullPath,$(xALT_MSDEVTOOLS_PATH)) - MSDEVTOOLS_PATH :=$(call PrefixPath,$(fxALT_MSDEVTOOLS_PATH)) -else - ifeq ($(ARCH_DATA_MODEL), 64) - ifdef MSTOOLS - xMSTOOLS :="$(subst \,/,$(MSTOOLS))" - _ms_tools :=$(call FullPath,$(xMSTOOLS)) - else - ifdef Mstools - xMSTOOLS :="$(subst \,/,$(Mstools))" +ifndef MSDEVTOOLS_PATH + ifdef ALT_MSDEVTOOLS_PATH + xALT_MSDEVTOOLS_PATH :="$(subst \,/,$(ALT_MSDEVTOOLS_PATH))" + fxALT_MSDEVTOOLS_PATH :=$(call FullPath,$(xALT_MSDEVTOOLS_PATH)) + MSDEVTOOLS_PATH :=$(call PrefixPath,$(fxALT_MSDEVTOOLS_PATH)) + else + ifeq ($(ARCH_DATA_MODEL), 64) + ifdef MSTOOLS + xMSTOOLS :="$(subst \,/,$(MSTOOLS))" _ms_tools :=$(call FullPath,$(xMSTOOLS)) else - _ms_tools := + ifdef Mstools + xMSTOOLS :="$(subst \,/,$(Mstools))" + _ms_tools :=$(call FullPath,$(xMSTOOLS)) + else + _ms_tools := + endif endif + ifneq ($(_ms_tools),) + _ms_tools_bin :=$(_ms_tools)/Bin + else + # Assumes compiler bin is .../Bin/win64/x86/AMD64, rc.exe is 3 levels up + _ms_tools_bin :=$(SHORTCOMPILERBIN)/../../.. + endif + else + _ms_tools_bin :=$(SHORTCOMPILERBIN) endif - ifneq ($(_ms_tools),) - _ms_tools_bin :=$(_ms_tools)/Bin - else - # Assumes compiler bin is .../Bin/win64/x86/AMD64, rc.exe is 3 levels up - _ms_tools_bin :=$(_compiler_bin)/../../.. - endif - else - _ms_tools_bin :=$(_compiler_bin) + MSDEVTOOLS_PATH :=$(call PrefixPath,$(_ms_tools_bin)) endif - MSDEVTOOLS_PATH :=$(call PrefixPath,$(_ms_tools_bin)) + MSDEVTOOLS_PATH:=$(call AltCheckSpaces,MSDEVTOOLS_PATH) + export MSDEVTOOLS_PATH endif -MSDEVTOOLS_PATH:=$(call AltCheckSpaces,MSDEVTOOLS_PATH) # DEVTOOLS_PATH: for other tools required for building (such as zip, etc.) # NOTE: Must end with / so that it could be empty, allowing PATH usage. -ifdef ALT_DEVTOOLS_PATH - xALT_DEVTOOLS_PATH :="$(subst \,/,$(ALT_DEVTOOLS_PATH))" - fxALT_DEVTOOLS_PATH :=$(call FullPath,$(xALT_DEVTOOLS_PATH)) - DEVTOOLS_PATH :=$(call PrefixPath,$(fxALT_DEVTOOLS_PATH)) -else - ifdef USING_CYGWIN - DEVTOOLS_PATH :=$(UNIXCOMMAND_PATH) +ifndef DEVTOOLS_PATH + ifdef ALT_DEVTOOLS_PATH + xALT_DEVTOOLS_PATH :="$(subst \,/,$(ALT_DEVTOOLS_PATH))" + fxALT_DEVTOOLS_PATH :=$(call FullPath,$(xALT_DEVTOOLS_PATH)) + DEVTOOLS_PATH :=$(call PrefixPath,$(fxALT_DEVTOOLS_PATH)) else - xDEVTOOLS_PATH :="$(_system_drive)/utils" - fxDEVTOOLS_PATH :=$(call FullPath,$(xDEVTOOLS_PATH)) - DEVTOOLS_PATH :=$(call PrefixPath,$(fxDEVTOOLS_PATH)) + ifdef USING_CYGWIN + DEVTOOLS_PATH :=$(UNIXCOMMAND_PATH) + else + xDEVTOOLS_PATH :="$(_system_drive)/utils" + fxDEVTOOLS_PATH :=$(call FullPath,$(xDEVTOOLS_PATH)) + DEVTOOLS_PATH :=$(call PrefixPath,$(fxDEVTOOLS_PATH)) + endif endif + DEVTOOLS_PATH:=$(call AltCheckSpaces,DEVTOOLS_PATH) + export DEVTOOLS_PATH endif -DEVTOOLS_PATH:=$(call AltCheckSpaces,DEVTOOLS_PATH) # _BOOTDIR1: First choice for a Bootstrap JDK, previous released JDK. # _BOOTDIR2: Second choice @@ -410,20 +415,26 @@ # BUILD_JDK_IMPORT_PATH: location of JDK install trees to import for # multiple platforms, e.g. windows-i586, solaris-sparc, linux-586, etc. -ifdef ALT_BUILD_JDK_IMPORT_PATH - BUILD_JDK_IMPORT_PATH :=$(call FullPath,$(ALT_BUILD_JDK_IMPORT_PATH)) -else - BUILD_JDK_IMPORT_PATH = $(PROMOTED_BUILD_BINARIES) +ifndef BUILD_JDK_IMPORT_PATH + ifdef ALT_BUILD_JDK_IMPORT_PATH + BUILD_JDK_IMPORT_PATH :=$(call FullPath,$(ALT_BUILD_JDK_IMPORT_PATH)) + else + BUILD_JDK_IMPORT_PATH = $(PROMOTED_BUILD_BINARIES) + endif + BUILD_JDK_IMPORT_PATH:=$(call AltCheckSpaces,BUILD_JDK_IMPORT_PATH) + BUILD_JDK_IMPORT_PATH:=$(call AltCheckValue,BUILD_JDK_IMPORT_PATH) + export BUILD_JDK_IMPORT_PATH endif -BUILD_JDK_IMPORT_PATH:=$(call AltCheckSpaces,BUILD_JDK_IMPORT_PATH) -BUILD_JDK_IMPORT_PATH:=$(call AltCheckValue,BUILD_JDK_IMPORT_PATH) # JDK_IMPORT_PATH: location of previously built JDK (this version) to import -ifdef ALT_JDK_IMPORT_PATH - JDK_IMPORT_PATH :=$(call FullPath,$(ALT_JDK_IMPORT_PATH)) -else - JDK_IMPORT_PATH = $(BUILD_JDK_IMPORT_PATH)/$(PLATFORM)-$(ARCH)$(_JDK_IMPORT_VARIANT) +ifndef JDK_IMPORT_PATH + ifdef ALT_JDK_IMPORT_PATH + JDK_IMPORT_PATH :=$(call FullPath,$(ALT_JDK_IMPORT_PATH)) + else + JDK_IMPORT_PATH = $(BUILD_JDK_IMPORT_PATH)/$(PLATFORM)-$(ARCH)$(_JDK_IMPORT_VARIANT) + endif + JDK_IMPORT_PATH:=$(call AltCheckSpaces,JDK_IMPORT_PATH) + JDK_IMPORT_PATH:=$(call AltCheckValue,JDK_IMPORT_PATH) + export JDK_IMPORT_PATH endif -JDK_IMPORT_PATH:=$(call AltCheckSpaces,JDK_IMPORT_PATH) -JDK_IMPORT_PATH:=$(call AltCheckValue,JDK_IMPORT_PATH)
--- a/corba/make/common/shared/Defs.gmk Mon Sep 28 19:39:40 2009 -0700 +++ b/corba/make/common/shared/Defs.gmk Wed Jul 05 17:01:05 2017 +0200 @@ -228,12 +228,15 @@ endif # FULL_VERSION is RELEASE and -BUILD_NUMBER if BUILD_NUMBER is set -ifdef BUILD_NUMBER - FULL_VERSION = $(RELEASE)-$(BUILD_NUMBER) -else - BUILD_NUMBER = b00 - USER_RELEASE_SUFFIX := $(shell echo $(USER)_`date '+%d_%b_%Y_%H_%M' | tr "A-Z" "a-z"`) - FULL_VERSION = $(RELEASE)-$(USER_RELEASE_SUFFIX)-$(BUILD_NUMBER) +ifndef FULL_VERSION + ifdef BUILD_NUMBER + FULL_VERSION = $(RELEASE)-$(BUILD_NUMBER) + else + BUILD_NUMBER = b00 + USER_RELEASE_SUFFIX := $(shell echo $(USER)_`date '+%d_%b_%Y_%H_%M' | tr "A-Z" "a-z"`) + FULL_VERSION = $(RELEASE)-$(USER_RELEASE_SUFFIX)-$(BUILD_NUMBER) + endif + export FULL_VERSION endif # Promoted build location
--- a/corba/make/common/shared/Platform.gmk Mon Sep 28 19:39:40 2009 -0700 +++ b/corba/make/common/shared/Platform.gmk Wed Jul 05 17:01:05 2017 +0200 @@ -84,21 +84,14 @@ # REQUIRED_LINUX_VER linux only: required version of linux # REQUIRED_LINUX_FULLVER linux only: required full version of linux -SYSTEM_UNAME := $(shell uname) +ifndef SYSTEM_UNAME + SYSTEM_UNAME := $(shell uname) + export SYSTEM_UNAME +endif # Normal boot jdk is previous release, but a hard requirement is a 1.5 boot REQUIRED_BOOT_VER = 1.5 -# -# Prune out all known SCM (Source Code Management) directories -# so they will not be included when copying directory trees -# or packaging up .jar files, etc. This applies to all workspaces. -# -SCM_DIRs = .hg .svn CVS RCS SCCS Codemgr_wsdata deleted_files -# When changing SCM_DIRs also change SCM_DIRS_rexp and SCM_DIRS_prune: -SCM_DIRS_rexp = ".hg|.svn|CVS|RCS|SCCS|Codemgr_wsdata|deleted_files" -SCM_DIRS_prune = \( -name .hg -o -name .svn -o -name CVS -o -name RCS -o -name SCCS -o -name Codemgr_wsdata -o -name deleted_files \) -prune - # Don't define this unless it's not defined ifndef VARIANT VARIANT=OPT @@ -372,14 +365,17 @@ REQUIRED_FREE_SPACE=500000 OS_VENDOR = Microsoft # How much RAM does this machine have: - MB_OF_MEMORY := $(shell \ - if [ -f "C:/cygwin/bin/free.exe" ] ; then \ - ( C:/cygwin/bin/bash.exe -c "C:/cygwin/bin/free.exe -m" ) | \ - grep Mem: | \ - sed -e 's@\ \ *@ @g' | cut -d' ' -f2 ; \ - else \ - echo "512"; \ - fi) + ifndef MB_OF_MEMORY + MB_OF_MEMORY := $(shell \ + if [ -f "C:/cygwin/bin/free.exe" ] ; then \ + ( C:/cygwin/bin/bash.exe -c "C:/cygwin/bin/free.exe -m" ) | \ + grep Mem: | \ + sed -e 's@\ \ *@ @g' | cut -d' ' -f2 ; \ + else \ + echo "512"; \ + fi) + export MB_OF_MEMORY + endif endif # Machines with 512Mb or less of real memory are considered low memory @@ -387,30 +383,36 @@ # system swapping during the build. # If we don't know, assume 512. Subtract 128 from MB for VM MAX. # Don't set VM max over 1024-128=896. -ifneq ($(MB_OF_MEMORY),) - LOW_MEMORY_MACHINE := $(shell \ - if [ $(MB_OF_MEMORY) -le 512 ] ; then \ - echo "true"; \ - else \ - echo "false"; \ - fi) - MAX_VM_MEMORY := $(shell \ - if [ $(MB_OF_MEMORY) -le 1024 ] ; then \ - expr $(MB_OF_MEMORY) '-' 128 ; \ - else \ - echo "896"; \ - fi) - MIN_VM_MEMORY := $(shell \ - if [ $(MAX_VM_MEMORY) -le 128 ] ; then \ - expr $(MAX_VM_MEMORY) '-' 8 ; \ - else \ - echo "128"; \ - fi) -else - MB_OF_MEMORY := unknown - LOW_MEMORY_MACHINE := true - MAX_VM_MEMORY := 384 - MIN_VM_MEMORY := 128 +ifndef MAX_VM_MEMORY + ifneq ($(MB_OF_MEMORY),) + LOW_MEMORY_MACHINE := $(shell \ + if [ $(MB_OF_MEMORY) -le 512 ] ; then \ + echo "true"; \ + else \ + echo "false"; \ + fi) + MAX_VM_MEMORY := $(shell \ + if [ $(MB_OF_MEMORY) -le 1024 ] ; then \ + expr $(MB_OF_MEMORY) '-' 128 ; \ + else \ + echo "896"; \ + fi) + MIN_VM_MEMORY := $(shell \ + if [ $(MAX_VM_MEMORY) -le 128 ] ; then \ + expr $(MAX_VM_MEMORY) '-' 8 ; \ + else \ + echo "128"; \ + fi) + else + MB_OF_MEMORY := unknown + LOW_MEMORY_MACHINE := true + MAX_VM_MEMORY := 384 + MIN_VM_MEMORY := 128 + endif + export MAX_VM_MEMORY + export MIN_VM_MEMORY + export LOW_MEMORY_MACHINE + export MAX_VM_MEMORY endif REQUIRED_ZIP_VER = 2.2
--- a/corba/make/jprt.properties Mon Sep 28 19:39:40 2009 -0700 +++ b/corba/make/jprt.properties Wed Jul 05 17:01:05 2017 +0200 @@ -34,8 +34,8 @@ solaris_x64_5.10,\ linux_i586_2.6,\ linux_x64_2.6,\ -windows_i586,\ -windows_x64 +windows_i586_5.0,\ +windows_x64_5.2 # The different build flavors we want jprt.build.flavors=product,fastdebug
--- a/hotspot/.hgtags Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/.hgtags Wed Jul 05 17:01:05 2017 +0200 @@ -46,3 +46,4 @@ 54fd4d9232969ea6cd3d236e5ad276183bb0d423 jdk7-b69 0632c3e615a315ff11e2ab1d64f4d82ff9853461 jdk7-b70 50a95aa4a247f0cbbf66df285a8b1d78ffb153d9 jdk7-b71 +a94714c550658fd6741793ef036cb9625dc2ab1a jdk7-b72
--- a/hotspot/agent/make/saenv.sh Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/agent/make/saenv.sh Wed Jul 05 17:01:05 2017 +0200 @@ -1,6 +1,6 @@ #!/bin/sh # -# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2009 Sun Microsystems, Inc. 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
--- a/hotspot/agent/make/saenv64.sh Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/agent/make/saenv64.sh Wed Jul 05 17:01:05 2017 +0200 @@ -1,6 +1,6 @@ #!/bin/sh # -# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2009 Sun Microsystems, Inc. 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
--- a/hotspot/agent/src/os/solaris/proc/Makefile Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/agent/src/os/solaris/proc/Makefile Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2002-2009 Sun Microsystems, Inc. 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
--- a/hotspot/agent/src/os/solaris/proc/mapfile Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/agent/src/os/solaris/proc/mapfile Wed Jul 05 17:01:05 2017 +0200 @@ -1,7 +1,7 @@ # # -# Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2003-2009 Sun Microsystems, Inc. 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
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/CompactibleFreeListSpace.java Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/CompactibleFreeListSpace.java Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2009 Sun Microsystems, Inc. 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
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/FreeChunk.java Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/FreeChunk.java Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2009 Sun Microsystems, Inc. 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
--- a/hotspot/make/hotspot_version Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/hotspot_version Wed Jul 05 17:01:05 2017 +0200 @@ -35,7 +35,7 @@ HS_MAJOR_VER=17 HS_MINOR_VER=0 -HS_BUILD_NUMBER=01 +HS_BUILD_NUMBER=02 JDK_MAJOR_VER=1 JDK_MINOR_VER=7
--- a/hotspot/make/linux/makefiles/jvmti.make Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/linux/makefiles/jvmti.make Wed Jul 05 17:01:05 2017 +0200 @@ -70,10 +70,10 @@ both = $(JvmtiGenClass) $(JvmtiSrcDir)/jvmti.xml $(JvmtiSrcDir)/jvmtiLib.xsl $(JvmtiGenClass): $(JvmtiGenSource) - $(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) -g -d $(JvmtiOutDir) $(JvmtiGenSource) + $(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) -d $(JvmtiOutDir) $(JvmtiGenSource) $(JvmtiEnvFillClass): $(JvmtiEnvFillSource) - $(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) -g -d $(JvmtiOutDir) $(JvmtiEnvFillSource) + $(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) -d $(JvmtiOutDir) $(JvmtiEnvFillSource) $(JvmtiOutDir)/jvmtiEnter.cpp: $(both) $(JvmtiSrcDir)/jvmtiEnter.xsl @echo Generating $@
--- a/hotspot/make/linux/makefiles/mapfile-vers-debug Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/linux/makefiles/mapfile-vers-debug Wed Jul 05 17:01:05 2017 +0200 @@ -74,6 +74,7 @@ JVM_CurrentTimeMillis; JVM_DefineClass; JVM_DefineClassWithSource; + JVM_DefineClassWithSourceCond; JVM_DesiredAssertionStatus; JVM_DisableCompiler; JVM_DoPrivileged;
--- a/hotspot/make/linux/makefiles/mapfile-vers-product Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/linux/makefiles/mapfile-vers-product Wed Jul 05 17:01:05 2017 +0200 @@ -74,6 +74,7 @@ JVM_CurrentTimeMillis; JVM_DefineClass; JVM_DefineClassWithSource; + JVM_DefineClassWithSourceCond; JVM_DesiredAssertionStatus; JVM_DisableCompiler; JVM_DoPrivileged;
--- a/hotspot/make/linux/makefiles/rules.make Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/linux/makefiles/rules.make Wed Jul 05 17:01:05 2017 +0200 @@ -122,12 +122,20 @@ endif endif +COMPILE.JAVAC += $(BOOTSTRAP_JAVAC_FLAGS) + SUM = /usr/bin/sum # 'gmake MAKE_VERBOSE=y' gives all the gory details. QUIETLY$(MAKE_VERBOSE) = @ RUN.JAR$(MAKE_VERBOSE) += >/dev/null +# Settings for javac +BOOT_SOURCE_LANGUAGE_VERSION = 6 +BOOT_TARGET_CLASS_VERSION = 6 +JAVAC_FLAGS = -g -encoding ascii +BOOTSTRAP_JAVAC_FLAGS = $(JAVAC_FLAGS) -source $(BOOT_SOURCE_LANGUAGE_VERSION) -target $(BOOT_TARGET_CLASS_VERSION) + # With parallel makes, print a message at the end of compilation. ifeq ($(findstring j,$(MFLAGS)),j) COMPILE_DONE = && { echo Done with $<; }
--- a/hotspot/make/linux/makefiles/sa.make Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/linux/makefiles/sa.make Wed Jul 05 17:01:05 2017 +0200 @@ -74,8 +74,8 @@ mkdir -p $(SA_CLASSDIR); \ fi - $(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) -source 1.4 -classpath $(SA_CLASSPATH) -sourcepath $(AGENT_SRC_DIR) -g -d $(SA_CLASSDIR) $(AGENT_FILES1) - $(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) -source 1.4 -classpath $(SA_CLASSPATH) -sourcepath $(AGENT_SRC_DIR) -g -d $(SA_CLASSDIR) $(AGENT_FILES2) + $(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) -source 1.4 -target 1.4 -classpath $(SA_CLASSPATH) -sourcepath $(AGENT_SRC_DIR) -d $(SA_CLASSDIR) $(AGENT_FILES1) + $(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) -source 1.4 -target 1.4 -classpath $(SA_CLASSPATH) -sourcepath $(AGENT_SRC_DIR) -d $(SA_CLASSDIR) $(AGENT_FILES2) $(QUIETLY) $(REMOTE) $(COMPILE.RMIC) -classpath $(SA_CLASSDIR) -d $(SA_CLASSDIR) sun.jvm.hotspot.debugger.remote.RemoteDebuggerServer $(QUIETLY) echo "$(SA_BUILD_VERSION_PROP)" > $(SA_PROPERTIES)
--- a/hotspot/make/linux/makefiles/top.make Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/linux/makefiles/top.make Wed Jul 05 17:01:05 2017 +0200 @@ -24,7 +24,7 @@ # top.make is included in the Makefile in the build directories. # It DOES NOT include the vm dependency info in order to be faster. -# It's main job is to implement the incremental form of make lists. +# Its main job is to implement the incremental form of make lists. # It also: # -builds and runs adlc via adlc.make # -generates JVMTI source and docs via jvmti.make (JSR-163) @@ -114,7 +114,7 @@ # make makeDeps: (and zap the cached db files to force a nonincremental run) $(GENERATED)/$(MakeDepsClass): $(MakeDepsSources) - @$(REMOTE) $(COMPILE.JAVAC) -classpath $(GAMMADIR)/src/share/tools/MakeDeps -g -d $(GENERATED) $(MakeDepsSources) + @$(REMOTE) $(COMPILE.JAVAC) -classpath $(GAMMADIR)/src/share/tools/MakeDeps -d $(GENERATED) $(MakeDepsSources) @echo Removing $(Incremental_Lists) to force regeneration. @rm -f $(Incremental_Lists) @$(CDG) echo >$(Cached_plat)
--- a/hotspot/make/solaris/makefiles/jvmti.make Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/solaris/makefiles/jvmti.make Wed Jul 05 17:01:05 2017 +0200 @@ -69,10 +69,10 @@ both = $(JvmtiGenClass) $(JvmtiSrcDir)/jvmti.xml $(JvmtiSrcDir)/jvmtiLib.xsl $(JvmtiGenClass): $(JvmtiGenSource) - $(QUIETLY) $(COMPILE.JAVAC) -g -d $(JvmtiOutDir) $(JvmtiGenSource) + $(QUIETLY) $(COMPILE.JAVAC) -d $(JvmtiOutDir) $(JvmtiGenSource) $(JvmtiEnvFillClass): $(JvmtiEnvFillSource) - $(QUIETLY) $(COMPILE.JAVAC) -g -d $(JvmtiOutDir) $(JvmtiEnvFillSource) + $(QUIETLY) $(COMPILE.JAVAC) -d $(JvmtiOutDir) $(JvmtiEnvFillSource) $(JvmtiOutDir)/jvmtiEnter.cpp: $(both) $(JvmtiSrcDir)/jvmtiEnter.xsl @echo Generating $@
--- a/hotspot/make/solaris/makefiles/mapfile-vers Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/solaris/makefiles/mapfile-vers Wed Jul 05 17:01:05 2017 +0200 @@ -74,6 +74,7 @@ JVM_CurrentTimeMillis; JVM_DefineClass; JVM_DefineClassWithSource; + JVM_DefineClassWithSourceCond; JVM_DesiredAssertionStatus; JVM_DisableCompiler; JVM_DoPrivileged;
--- a/hotspot/make/solaris/makefiles/rules.make Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/solaris/makefiles/rules.make Wed Jul 05 17:01:05 2017 +0200 @@ -122,12 +122,20 @@ endif endif +COMPILE.JAVAC += $(BOOTSTRAP_JAVAC_FLAGS) + SUM = /usr/bin/sum # 'gmake MAKE_VERBOSE=y' gives all the gory details. QUIETLY$(MAKE_VERBOSE) = @ RUN.JAR$(MAKE_VERBOSE) += >/dev/null +# Settings for javac +BOOT_SOURCE_LANGUAGE_VERSION = 6 +BOOT_TARGET_CLASS_VERSION = 6 +JAVAC_FLAGS = -g -encoding ascii +BOOTSTRAP_JAVAC_FLAGS = $(JAVAC_FLAGS) -source $(BOOT_SOURCE_LANGUAGE_VERSION) -target $(BOOT_TARGET_CLASS_VERSION) + # With parallel makes, print a message at the end of compilation. ifeq ($(findstring j,$(MFLAGS)),j) COMPILE_DONE = && { echo Done with $<; }
--- a/hotspot/make/solaris/makefiles/sa.make Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/solaris/makefiles/sa.make Wed Jul 05 17:01:05 2017 +0200 @@ -67,8 +67,8 @@ $(QUIETLY) if [ ! -d $(SA_CLASSDIR) ] ; then \ mkdir -p $(SA_CLASSDIR); \ fi - $(QUIETLY) $(COMPILE.JAVAC) -source 1.4 -classpath $(SA_CLASSPATH) -sourcepath $(AGENT_SRC_DIR) -g -d $(SA_CLASSDIR) $(AGENT_FILES1) - $(QUIETLY) $(COMPILE.JAVAC) -source 1.4 -classpath $(SA_CLASSPATH) -sourcepath $(AGENT_SRC_DIR) -g -d $(SA_CLASSDIR) $(AGENT_FILES2) + $(QUIETLY) $(COMPILE.JAVAC) -source 1.4 -target 1.4 -classpath $(SA_CLASSPATH) -sourcepath $(AGENT_SRC_DIR) -d $(SA_CLASSDIR) $(AGENT_FILES1) + $(QUIETLY) $(COMPILE.JAVAC) -source 1.4 -target 1.4 -classpath $(SA_CLASSPATH) -sourcepath $(AGENT_SRC_DIR) -d $(SA_CLASSDIR) $(AGENT_FILES2) $(QUIETLY) $(COMPILE.RMIC) -classpath $(SA_CLASSDIR) -d $(SA_CLASSDIR) sun.jvm.hotspot.debugger.remote.RemoteDebuggerServer $(QUIETLY) echo "$(SA_BUILD_VERSION_PROP)" > $(SA_PROPERTIES)
--- a/hotspot/make/solaris/makefiles/top.make Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/solaris/makefiles/top.make Wed Jul 05 17:01:05 2017 +0200 @@ -24,7 +24,7 @@ # top.make is included in the Makefile in the build directories. # It DOES NOT include the vm dependency info in order to be faster. -# It's main job is to implement the incremental form of make lists. +# Its main job is to implement the incremental form of make lists. # It also: # -builds and runs adlc via adlc.make # -generates JVMTI source and docs via jvmti.make (JSR-163) @@ -112,7 +112,7 @@ # make makeDeps: (and zap the cached db files to force a nonincremental run) $(GENERATED)/$(MakeDepsClass): $(MakeDepsSources) - @$(COMPILE.JAVAC) -classpath $(GAMMADIR)/src/share/tools/MakeDeps -g -d $(GENERATED) $(MakeDepsSources) + @$(COMPILE.JAVAC) -classpath $(GAMMADIR)/src/share/tools/MakeDeps -d $(GENERATED) $(MakeDepsSources) @echo Removing $(Incremental_Lists) to force regeneration. @rm -f $(Incremental_Lists) @$(CDG) echo >$(Cached_plat)
--- a/hotspot/make/windows/makefiles/generated.make Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/windows/makefiles/generated.make Wed Jul 05 17:01:05 2017 +0200 @@ -91,7 +91,7 @@ classes/MakeDeps.class: $(MakeDepsSources) if exist classes rmdir /s /q classes mkdir classes - $(COMPILE_JAVAC) -classpath $(WorkSpace)\src\share\tools\MakeDeps -g -d classes $(MakeDepsSources) + $(COMPILE_JAVAC) -classpath $(WorkSpace)\src\share\tools\MakeDeps -d classes $(MakeDepsSources) !if ("$(Variant)" == "compiler2") || ("$(Variant)" == "tiered")
--- a/hotspot/make/windows/makefiles/jvmti.make Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/windows/makefiles/jvmti.make Wed Jul 05 17:01:05 2017 +0200 @@ -68,10 +68,10 @@ @if not exist $(JvmtiOutDir) mkdir $(JvmtiOutDir) $(JvmtiGenClass): $(JvmtiGenSource) - $(COMPILE_JAVAC) -g -d $(JvmtiOutDir) $(JvmtiGenSource) + $(COMPILE_JAVAC) -d $(JvmtiOutDir) $(JvmtiGenSource) $(JvmtiEnvFillClass): $(JvmtiEnvFillSource) - @$(COMPILE_JAVAC) -g -d $(JvmtiOutDir) $(JvmtiEnvFillSource) + @$(COMPILE_JAVAC) -d $(JvmtiOutDir) $(JvmtiEnvFillSource) $(JvmtiOutDir)/jvmtiEnter.cpp: $(both) $(JvmtiSrcDir)/jvmtiEnter.xsl @echo Generating $@
--- a/hotspot/make/windows/makefiles/rules.make Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/windows/makefiles/rules.make Wed Jul 05 17:01:05 2017 +0200 @@ -29,7 +29,7 @@ RUN_JAVAP=$(BootStrapDir)\bin\javap RUN_JAVAH=$(BootStrapDir)\bin\javah RUN_JAR=$(BootStrapDir)\bin\jar -COMPILE_JAVAC=$(BootStrapDir)\bin\javac +COMPILE_JAVAC=$(BootStrapDir)\bin\javac $(BOOTSTRAP_JAVAC_FLAGS) COMPILE_RMIC=$(BootStrapDir)\bin\rmic BOOT_JAVA_HOME=$(BootStrapDir) !else @@ -37,11 +37,17 @@ RUN_JAVAP=javap RUN_JAVAH=javah RUN_JAR=jar -COMPILE_JAVAC=javac +COMPILE_JAVAC=javac $(BOOTSTRAP_JAVAC_FLAGS) COMPILE_RMIC=rmic BOOT_JAVA_HOME= !endif +# Settings for javac +BOOT_SOURCE_LANGUAGE_VERSION=6 +BOOT_TARGET_CLASS_VERSION=6 +JAVAC_FLAGS=-g -encoding ascii +BOOTSTRAP_JAVAC_FLAGS=$(JAVAC_FLAGS) -source $(BOOT_SOURCE_LANGUAGE_VERSION) -target $(BOOT_TARGET_CLASS_VERSION) + ProjectFile=vm.vcproj !if "$(MSC_VER)" == "1200"
--- a/hotspot/make/windows/makefiles/sa.make Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/windows/makefiles/sa.make Wed Jul 05 17:01:05 2017 +0200 @@ -55,9 +55,9 @@ $(GENERATED)\sa-jdi.jar: $(AGENT_FILES1:/=\) $(AGENT_FILES2:/=\) @if not exist $(SA_CLASSDIR) mkdir $(SA_CLASSDIR) @echo ...Building sa-jdi.jar - @echo ...$(COMPILE_JAVAC) -source 1.4 -classpath $(SA_CLASSPATH) -g -d $(SA_CLASSDIR) .... - @$(COMPILE_JAVAC) -source 1.4 -classpath $(SA_CLASSPATH) -sourcepath $(AGENT_SRC_DIR) -g -d $(SA_CLASSDIR) $(AGENT_FILES1:/=\) - @$(COMPILE_JAVAC) -source 1.4 -classpath $(SA_CLASSPATH) -sourcepath $(AGENT_SRC_DIR) -g -d $(SA_CLASSDIR) $(AGENT_FILES2:/=\) + @echo ...$(COMPILE_JAVAC) -source 1.4 -target 1.4 -classpath $(SA_CLASSPATH) -d $(SA_CLASSDIR) .... + @$(COMPILE_JAVAC) -source 1.4 -target 1.4 -classpath $(SA_CLASSPATH) -sourcepath $(AGENT_SRC_DIR) -d $(SA_CLASSDIR) $(AGENT_FILES1:/=\) + @$(COMPILE_JAVAC) -source 1.4 -target 1.4 -classpath $(SA_CLASSPATH) -sourcepath $(AGENT_SRC_DIR) -d $(SA_CLASSDIR) $(AGENT_FILES2:/=\) $(COMPILE_RMIC) -classpath $(SA_CLASSDIR) -d $(SA_CLASSDIR) sun.jvm.hotspot.debugger.remote.RemoteDebuggerServer $(QUIETLY) echo $(SA_BUILD_VERSION_PROP)> $(SA_PROPERTIES) $(QUIETLY) rm -f $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql/sa.js
--- a/hotspot/make/windows/projectfiles/common/Makefile Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/make/windows/projectfiles/common/Makefile Wed Jul 05 17:01:05 2017 +0200 @@ -179,6 +179,6 @@ $(HOTSPOTBUILDSPACE)/classes/MakeDeps.class: $(MakeDepsSources) @if exist $(HOTSPOTBUILDSPACE)\classes rmdir /s /q $(HOTSPOTBUILDSPACE)\classes @mkdir $(HOTSPOTBUILDSPACE)\classes - @$(COMPILE_JAVAC) -classpath $(HOTSPOTWORKSPACE)\src\share\tools\MakeDeps -g -d $(HOTSPOTBUILDSPACE)/classes $(MakeDepsSources) + @$(COMPILE_JAVAC) -classpath $(HOTSPOTWORKSPACE)\src\share\tools\MakeDeps -d $(HOTSPOTBUILDSPACE)/classes $(MakeDepsSources) FORCE:
--- a/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1696,6 +1696,9 @@ void InterpreterMacroAssembler::record_klass_in_profile_helper( Register receiver, Register scratch, int start_row, Label& done) { + if (TypeProfileWidth == 0) + return; + int last_row = VirtualCallData::row_limit() - 1; assert(start_row <= last_row, "must be work left to do"); // Test this row for both the receiver and for null.
--- a/hotspot/src/cpu/sparc/vm/sparc.ad Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/cpu/sparc/vm/sparc.ad Wed Jul 05 17:01:05 2017 +0200 @@ -5707,7 +5707,7 @@ effect(TEMP dst, TEMP tmp); ins_cost(MEMORY_REF_COST + 2*DEFAULT_COST); - size(3*4); + size((3+1)*4); // set may use two instructions. format %{ "LDUH $mem,$dst\t! ushort/char & 16-bit mask -> long\n\t" "SET $mask,$tmp\n\t" "AND $dst,$tmp,$dst" %} @@ -5851,7 +5851,7 @@ effect(TEMP dst, TEMP tmp); ins_cost(MEMORY_REF_COST + 2*DEFAULT_COST); - size(3*4); + size((3+1)*4); // set may use two instructions. format %{ "LDUW $mem,$dst\t! int & 32-bit mask -> long\n\t" "SET $mask,$tmp\n\t" "AND $dst,$tmp,$dst" %}
--- a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2009 Sun Microsystems, Inc. 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 @@ -827,8 +827,8 @@ case vmIntrinsics::_dsin: __ sin (calc_input, calc_result, tmp1, tmp2); break; case vmIntrinsics::_dcos: __ cos (calc_input, calc_result, tmp1, tmp2); break; case vmIntrinsics::_dtan: __ tan (calc_input, calc_result, tmp1, tmp2); break; - case vmIntrinsics::_dlog: __ log (calc_input, calc_result, LIR_OprFact::illegalOpr); break; - case vmIntrinsics::_dlog10: __ log10(calc_input, calc_result, LIR_OprFact::illegalOpr); break; + case vmIntrinsics::_dlog: __ log (calc_input, calc_result, tmp1); break; + case vmIntrinsics::_dlog10: __ log10(calc_input, calc_result, tmp1); break; default: ShouldNotReachHere(); }
--- a/hotspot/src/cpu/x86/vm/c1_LinearScan_x86.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/cpu/x86/vm/c1_LinearScan_x86.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -764,8 +764,6 @@ break; } - case lir_log: - case lir_log10: case lir_abs: case lir_sqrt: { // Right argument appears to be unused @@ -785,6 +783,30 @@ break; } + case lir_log: + case lir_log10: { + // log and log10 needs one temporary fpu stack slot, so there is ontemporary + // registers stored in temp of the operation. + // the stack allocator must guarantee that the stack slots are really free, + // otherwise there might be a stack overflow. + assert(right->is_illegal(), "must be"); + assert(left->is_fpu_register(), "must be"); + assert(res->is_fpu_register(), "must be"); + assert(op2->tmp_opr()->is_fpu_register(), "must be"); + + insert_free_if_dead(op2->tmp_opr()); + insert_free_if_dead(res, left); + insert_exchange(left); + do_rename(left, res); + + new_left = to_fpu_stack_top(res); + new_res = new_left; + + op2->set_fpu_stack_size(sim()->stack_size()); + assert(sim()->stack_size() <= 7, "at least one stack slot must be free"); + break; + } + case lir_tan: case lir_sin:
--- a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1262,6 +1262,9 @@ Register receiver, Register mdp, Register reg2, int start_row, Label& done) { + if (TypeProfileWidth == 0) + return; + int last_row = VirtualCallData::row_limit() - 1; assert(start_row <= last_row, "must be work left to do"); // Test this row for both the receiver and for null.
--- a/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1272,6 +1272,9 @@ Register receiver, Register mdp, Register reg2, int start_row, Label& done) { + if (TypeProfileWidth == 0) + return; + int last_row = VirtualCallData::row_limit() - 1; assert(start_row <= last_row, "must be work left to do"); // Test this row for both the receiver and for null.
--- a/hotspot/src/os/windows/vm/os_windows.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/os/windows/vm/os_windows.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1526,7 +1526,8 @@ case 5000: st->print(" Windows 2000"); break; case 5001: st->print(" Windows XP"); break; case 5002: - case 6000: { + case 6000: + case 6001: { // Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could // find out whether we are running on 64 bit processor or not. SYSTEM_INFO si; @@ -1549,13 +1550,27 @@ st->print(" Windows XP x64 Edition"); else st->print(" Windows Server 2003 family"); - } else { // os_vers == 6000 + } else if (os_vers == 6000) { if (osvi.wProductType == VER_NT_WORKSTATION) st->print(" Windows Vista"); else st->print(" Windows Server 2008"); if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) st->print(" , 64 bit"); + } else if (os_vers == 6001) { + if (osvi.wProductType == VER_NT_WORKSTATION) { + st->print(" Windows 7"); + } else { + // Unrecognized windows, print out its major and minor versions + st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion); + } + if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) + st->print(" , 64 bit"); + } else { // future os + // Unrecognized windows, print out its major and minor versions + st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion); + if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) + st->print(" , 64 bit"); } break; }
--- a/hotspot/src/os_cpu/solaris_sparc/vm/atomic_solaris_sparc.inline.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/os_cpu/solaris_sparc/vm/atomic_solaris_sparc.inline.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/os_cpu/solaris_x86/vm/atomic_solaris_x86.inline.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/os_cpu/solaris_x86/vm/atomic_solaris_x86.inline.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/adlc/archDesc.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/adlc/archDesc.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1031,7 +1031,8 @@ //---------------------------addSUNcopyright------------------------------- // output SUN copyright info void ArchDesc::addSunCopyright(char* legal, int size, FILE *fp) { - fwrite(legal, size, 1, fp); + size_t count = fwrite(legal, 1, size, fp); + assert(count == (size_t) size, "copyright info truncated"); fprintf(fp,"\n"); fprintf(fp,"// Machine Generated File. Do Not Edit!\n"); fprintf(fp,"\n");
--- a/hotspot/src/share/vm/c1/c1_IR.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/c1/c1_IR.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/c1/c1_IR.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/c1/c1_IR.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/c1/c1_LIR.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/c1/c1_LIR.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -567,8 +567,6 @@ case lir_rem: case lir_sqrt: case lir_abs: - case lir_log: - case lir_log10: case lir_logic_and: case lir_logic_or: case lir_logic_xor: @@ -644,13 +642,16 @@ case lir_tan: case lir_sin: - case lir_cos: { + case lir_cos: + case lir_log: + case lir_log10: { assert(op->as_Op2() != NULL, "must be"); LIR_Op2* op2 = (LIR_Op2*)op; - // sin and cos need two temporary fpu stack slots, so register - // two temp operands. Register input operand as temp to - // guarantee that they do not overlap + // On x86 tan/sin/cos need two temporary fpu stack slots and + // log/log10 need one so handle opr2 and tmp as temp inputs. + // Register input operand as temp to guarantee that it doesn't + // overlap with the input. assert(op2->_info == NULL, "not used"); assert(op2->_opr1->is_valid(), "used"); do_input(op2->_opr1); do_temp(op2->_opr1);
--- a/hotspot/src/share/vm/c1/c1_LIR.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/c1/c1_LIR.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1840,8 +1840,8 @@ void abs (LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_abs , from, tmp, to)); } void sqrt(LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_sqrt, from, tmp, to)); } - void log (LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_log, from, tmp, to)); } - void log10 (LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_log10, from, tmp, to)); } + void log (LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_log, from, LIR_OprFact::illegalOpr, to, tmp)); } + void log10 (LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_log10, from, LIR_OprFact::illegalOpr, to, tmp)); } void sin (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_Op2(lir_sin , from, tmp1, to, tmp2)); } void cos (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_Op2(lir_cos , from, tmp1, to, tmp2)); } void tan (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_Op2(lir_tan , from, tmp1, to, tmp2)); }
--- a/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/ci/ciObjectFactory.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/ci/ciObjectFactory.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/classfile/classFileParser.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -2547,6 +2547,7 @@ KlassHandle host_klass, GrowableArray<Handle>* cp_patches, symbolHandle& parsed_name, + bool verify, TRAPS) { // So that JVMTI can cache class file in the state before retransformable agents // have modified it @@ -2591,7 +2592,7 @@ instanceKlassHandle nullHandle; // Figure out whether we can skip format checking (matching classic VM behavior) - _need_verify = Verifier::should_verify_for(class_loader()); + _need_verify = Verifier::should_verify_for(class_loader(), verify); // Set the verify flag in stream cfs->set_verify(_need_verify); @@ -3210,6 +3211,7 @@ // Fill in information already parsed this_klass->set_access_flags(access_flags); + this_klass->set_should_verify_class(verify); jint lh = Klass::instance_layout_helper(instance_size, false); this_klass->set_layout_helper(lh); assert(this_klass->oop_is_instance(), "layout is correct"); @@ -3229,6 +3231,12 @@ this_klass->set_has_final_method(); } this_klass->set_method_ordering(method_ordering()); + // The instanceKlass::_methods_jmethod_ids cache and the + // instanceKlass::_methods_cached_itable_indices cache are + // both managed on the assumption that the initial cache + // size is equal to the number of methods in the class. If + // that changes, then instanceKlass::idnum_can_increment() + // has to be changed accordingly. this_klass->set_initial_method_idnum(methods->length()); this_klass->set_name(cp->klass_name_at(this_class_index)); if (LinkWellKnownClasses || is_anonymous()) // I am well known to myself
--- a/hotspot/src/share/vm/classfile/classFileParser.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/classfile/classFileParser.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -260,9 +260,10 @@ Handle class_loader, Handle protection_domain, symbolHandle& parsed_name, + bool verify, TRAPS) { KlassHandle no_host_klass; - return parseClassFile(name, class_loader, protection_domain, no_host_klass, NULL, parsed_name, THREAD); + return parseClassFile(name, class_loader, protection_domain, no_host_klass, NULL, parsed_name, verify, THREAD); } instanceKlassHandle parseClassFile(symbolHandle name, Handle class_loader, @@ -270,6 +271,7 @@ KlassHandle host_klass, GrowableArray<Handle>* cp_patches, symbolHandle& parsed_name, + bool verify, TRAPS); // Verifier checks
--- a/hotspot/src/share/vm/classfile/classLoader.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/classfile/classLoader.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -874,6 +874,7 @@ class_loader, protection_domain, parsed_name, + false, CHECK_(h)); // add to package table
--- a/hotspot/src/share/vm/classfile/classLoader.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/classfile/classLoader.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/classfile/javaClasses.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/classfile/javaClasses.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -252,7 +252,7 @@ typeArrayOop value = java_lang_String::value(obj); int offset = java_lang_String::offset(obj); int length = java_lang_String::length(obj); - jchar* base = value->char_at_addr(offset); + jchar* base = (length == 0) ? NULL : value->char_at_addr(offset); symbolOop sym = SymbolTable::lookup_unicode(base, length, THREAD); return symbolHandle(THREAD, sym); } @@ -261,7 +261,7 @@ typeArrayOop value = java_lang_String::value(java_string); int offset = java_lang_String::offset(java_string); int length = java_lang_String::length(java_string); - jchar* base = value->char_at_addr(offset); + jchar* base = (length == 0) ? NULL : value->char_at_addr(offset); return SymbolTable::probe_unicode(base, length); }
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -970,6 +970,7 @@ host_klass, cp_patches, parsed_name, + true, THREAD); @@ -1025,6 +1026,7 @@ Handle class_loader, Handle protection_domain, ClassFileStream* st, + bool verify, TRAPS) { // Classloaders that support parallelism, e.g. bootstrap classloader, @@ -1055,6 +1057,7 @@ class_loader, protection_domain, parsed_name, + verify, THREAD); const char* pkg = "java/";
--- a/hotspot/src/share/vm/classfile/systemDictionary.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -259,7 +259,9 @@ TRAPS); // Resolve from stream (called by jni_DefineClass and JVM_DefineClass) - static klassOop resolve_from_stream(symbolHandle class_name, Handle class_loader, Handle protection_domain, ClassFileStream* st, TRAPS); + static klassOop resolve_from_stream(symbolHandle class_name, Handle class_loader, + Handle protection_domain, + ClassFileStream* st, bool verify, TRAPS); // Lookup an already loaded class. If not found NULL is returned. static klassOop find(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS);
--- a/hotspot/src/share/vm/classfile/verifier.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/classfile/verifier.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -53,8 +53,8 @@ // Methods in Verifier -bool Verifier::should_verify_for(oop class_loader) { - return class_loader == NULL ? +bool Verifier::should_verify_for(oop class_loader, bool should_verify_class) { + return (class_loader == NULL || !should_verify_class) ? BytecodeVerificationLocal : BytecodeVerificationRemote; } @@ -68,7 +68,7 @@ return !need_verify; } -bool Verifier::verify(instanceKlassHandle klass, Verifier::Mode mode, TRAPS) { +bool Verifier::verify(instanceKlassHandle klass, Verifier::Mode mode, bool should_verify_class, TRAPS) { ResourceMark rm(THREAD); HandleMark hm; @@ -81,7 +81,7 @@ // If the class should be verified, first see if we can use the split // verifier. If not, or if verification fails and FailOverToOldVerifier // is set, then call the inference verifier. - if (is_eligible_for_verification(klass)) { + if (is_eligible_for_verification(klass, should_verify_class)) { if (TraceClassInitialization) { tty->print_cr("Start class verification for: %s", klassName); } @@ -141,12 +141,13 @@ } } -bool Verifier::is_eligible_for_verification(instanceKlassHandle klass) { +bool Verifier::is_eligible_for_verification(instanceKlassHandle klass, bool should_verify_class) { symbolOop name = klass->name(); klassOop refl_magic_klass = SystemDictionary::reflect_magic_klass(); - return (should_verify_for(klass->class_loader()) && + return (should_verify_for(klass->class_loader(), should_verify_class) && // return if the class is a bootstrapping class + // or defineClass specified not to verify by default (flags override passed arg) // We need to skip the following four for bootstraping name != vmSymbols::java_lang_Object() && name != vmSymbols::java_lang_Class() &&
--- a/hotspot/src/share/vm/classfile/verifier.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/classfile/verifier.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -34,16 +34,18 @@ * Otherwise, no exception is thrown and the return indicates the * error. */ - static bool verify(instanceKlassHandle klass, Mode mode, TRAPS); + static bool verify(instanceKlassHandle klass, Mode mode, bool should_verify_class, TRAPS); - // Return false if the class is loaded by the bootstrap loader. - static bool should_verify_for(oop class_loader); + // Return false if the class is loaded by the bootstrap loader, + // or if defineClass was called requesting skipping verification + // -Xverify:all/none override this value + static bool should_verify_for(oop class_loader, bool should_verify_class); // Relax certain verifier checks to enable some broken 1.1 apps to run on 1.2. static bool relax_verify_for(oop class_loader); private: - static bool is_eligible_for_verification(instanceKlassHandle klass); + static bool is_eligible_for_verification(instanceKlassHandle klass, bool should_verify_class); static symbolHandle inference_verify( instanceKlassHandle klass, char* msg, size_t msg_len, TRAPS); };
--- a/hotspot/src/share/vm/code/debugInfoRec.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/code/debugInfoRec.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/code/nmethod.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/code/nmethod.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/compiler/oopMap.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/compiler/oopMap.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/compiler/oopMap.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/compiler/oopMap.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentZFThread.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentZFThread.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/gc_implementation/g1/g1MMUTracker.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/gc_implementation/g1/g1MMUTracker.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -302,9 +302,9 @@ if (cur->isHumongous()) { return MemRegion(last_start, end); } - cur->reset_zero_fill(); assert(cur == _regions.top(), "Should be top"); if (!cur->is_empty()) break; + cur->reset_zero_fill(); shrink_bytes -= cur->capacity(); num_regions_deleted++; _regions.pop();
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -2752,7 +2752,6 @@ cm->revisit_klass_stack()->push(k); } -#if ( defined(COMPILER1) || defined(COMPILER2) ) void PSParallelCompact::revisit_mdo(ParCompactionManager* cm, DataLayout* p) { cm->revisit_mdo_stack()->push(p); } @@ -2778,7 +2777,6 @@ follow_stack(cm); } } -#endif // ( COMPILER1 || COMPILER2 ) #ifdef VALIDATE_MARK_SWEEP
--- a/hotspot/src/share/vm/gc_implementation/shared/markSweep.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/gc_implementation/shared/markSweep.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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 @@ -73,7 +73,6 @@ follow_stack(); } -#if ( defined(COMPILER1) || defined(COMPILER2) ) void MarkSweep::revisit_mdo(DataLayout* p) { _revisit_mdo_stack->push(p); } @@ -92,7 +91,6 @@ } follow_stack(); } -#endif // ( COMPILER1 || COMPILER2 ) MarkSweep::FollowRootClosure MarkSweep::follow_root_closure;
--- a/hotspot/src/share/vm/gc_implementation/shared/markSweep.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/gc_implementation/shared/markSweep.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/memory/genMarkSweep.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/memory/genMarkSweep.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/memory/iterator.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/memory/iterator.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/memory/iterator.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/memory/iterator.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/memory/serialize.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/memory/serialize.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/oops/arrayKlass.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/oops/arrayKlass.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -110,7 +110,7 @@ // 1) Verify the bytecodes Verifier::Mode mode = throw_verifyerror ? Verifier::ThrowException : Verifier::NoException; - return Verifier::verify(this_oop, mode, CHECK_false); + return Verifier::verify(this_oop, mode, this_oop->should_verify_class(), CHECK_false); } @@ -967,33 +967,78 @@ // Lookup or create a jmethodID. -// This code can be called by the VM thread. For this reason it is critical that -// there are no blocking operations (safepoints) while the lock is held -- or a -// deadlock can occur. -jmethodID instanceKlass::jmethod_id_for_impl(instanceKlassHandle ik_h, methodHandle method_h) { +// This code is called by the VMThread and JavaThreads so the +// locking has to be done very carefully to avoid deadlocks +// and/or other cache consistency problems. +// +jmethodID instanceKlass::get_jmethod_id(instanceKlassHandle ik_h, methodHandle method_h) { size_t idnum = (size_t)method_h->method_idnum(); jmethodID* jmeths = ik_h->methods_jmethod_ids_acquire(); size_t length = 0; jmethodID id = NULL; - // array length stored in first element, other elements offset by one - if (jmeths == NULL || // If there is no jmethodID array, - (length = (size_t)jmeths[0]) <= idnum || // or if it is too short, - (id = jmeths[idnum+1]) == NULL) { // or if this jmethodID isn't allocated - // Do all the safepointing things (allocations) before grabbing the lock. - // These allocations will have to be freed if they are unused. + // We use a double-check locking idiom here because this cache is + // performance sensitive. In the normal system, this cache only + // transitions from NULL to non-NULL which is safe because we use + // release_set_methods_jmethod_ids() to advertise the new cache. + // A partially constructed cache should never be seen by a racing + // thread. We also use release_store_ptr() to save a new jmethodID + // in the cache so a partially constructed jmethodID should never be + // seen either. Cache reads of existing jmethodIDs proceed without a + // lock, but cache writes of a new jmethodID requires uniqueness and + // creation of the cache itself requires no leaks so a lock is + // generally acquired in those two cases. + // + // If the RedefineClasses() API has been used, then this cache can + // grow and we'll have transitions from non-NULL to bigger non-NULL. + // Cache creation requires no leaks and we require safety between all + // cache accesses and freeing of the old cache so a lock is generally + // acquired when the RedefineClasses() API has been used. - // Allocate a new array of methods. + if (jmeths != NULL) { + // the cache already exists + if (!ik_h->idnum_can_increment()) { + // the cache can't grow so we can just get the current values + get_jmethod_id_length_value(jmeths, idnum, &length, &id); + } else { + // cache can grow so we have to be more careful + if (Threads::number_of_threads() == 0 || + SafepointSynchronize::is_at_safepoint()) { + // we're single threaded or at a safepoint - no locking needed + get_jmethod_id_length_value(jmeths, idnum, &length, &id); + } else { + MutexLocker ml(JmethodIdCreation_lock); + get_jmethod_id_length_value(jmeths, idnum, &length, &id); + } + } + } + // implied else: + // we need to allocate a cache so default length and id values are good + + if (jmeths == NULL || // no cache yet + length <= idnum || // cache is too short + id == NULL) { // cache doesn't contain entry + + // This function can be called by the VMThread so we have to do all + // things that might block on a safepoint before grabbing the lock. + // Otherwise, we can deadlock with the VMThread or have a cache + // consistency issue. These vars keep track of what we might have + // to free after the lock is dropped. + jmethodID to_dealloc_id = NULL; + jmethodID* to_dealloc_jmeths = NULL; + + // may not allocate new_jmeths or use it if we allocate it jmethodID* new_jmeths = NULL; if (length <= idnum) { - // A new array will be needed (unless some other thread beats us to it) + // allocate a new cache that might be used size_t size = MAX2(idnum+1, (size_t)ik_h->idnum_allocated_count()); new_jmeths = NEW_C_HEAP_ARRAY(jmethodID, size+1); memset(new_jmeths, 0, (size+1)*sizeof(jmethodID)); - new_jmeths[0] =(jmethodID)size; // array size held in the first element + // cache size is stored in element[0], other elements offset by one + new_jmeths[0] = (jmethodID)size; } - // Allocate a new method ID. + // allocate a new jmethodID that might be used jmethodID new_id = NULL; if (method_h->is_old() && !method_h->is_obsolete()) { // The method passed in is old (but not obsolete), we need to use the current version @@ -1007,63 +1052,111 @@ new_id = JNIHandles::make_jmethod_id(method_h); } - if (Threads::number_of_threads() == 0 || SafepointSynchronize::is_at_safepoint()) { - // No need and unsafe to lock the JmethodIdCreation_lock at safepoint. - id = get_jmethod_id(ik_h, idnum, new_id, new_jmeths); + if (Threads::number_of_threads() == 0 || + SafepointSynchronize::is_at_safepoint()) { + // we're single threaded or at a safepoint - no locking needed + id = get_jmethod_id_fetch_or_update(ik_h, idnum, new_id, new_jmeths, + &to_dealloc_id, &to_dealloc_jmeths); } else { MutexLocker ml(JmethodIdCreation_lock); - id = get_jmethod_id(ik_h, idnum, new_id, new_jmeths); + id = get_jmethod_id_fetch_or_update(ik_h, idnum, new_id, new_jmeths, + &to_dealloc_id, &to_dealloc_jmeths); + } + + // The lock has been dropped so we can free resources. + // Free up either the old cache or the new cache if we allocated one. + if (to_dealloc_jmeths != NULL) { + FreeHeap(to_dealloc_jmeths); + } + // free up the new ID since it wasn't needed + if (to_dealloc_id != NULL) { + JNIHandles::destroy_jmethod_id(to_dealloc_id); } } return id; } -jmethodID instanceKlass::get_jmethod_id(instanceKlassHandle ik_h, size_t idnum, - jmethodID new_id, jmethodID* new_jmeths) { - // Retry lookup after we got the lock or ensured we are at safepoint +// Common code to fetch the jmethodID from the cache or update the +// cache with the new jmethodID. This function should never do anything +// that causes the caller to go to a safepoint or we can deadlock with +// the VMThread or have cache consistency issues. +// +jmethodID instanceKlass::get_jmethod_id_fetch_or_update( + instanceKlassHandle ik_h, size_t idnum, jmethodID new_id, + jmethodID* new_jmeths, jmethodID* to_dealloc_id_p, + jmethodID** to_dealloc_jmeths_p) { + assert(new_id != NULL, "sanity check"); + assert(to_dealloc_id_p != NULL, "sanity check"); + assert(to_dealloc_jmeths_p != NULL, "sanity check"); + assert(Threads::number_of_threads() == 0 || + SafepointSynchronize::is_at_safepoint() || + JmethodIdCreation_lock->owned_by_self(), "sanity check"); + + // reacquire the cache - we are locked, single threaded or at a safepoint jmethodID* jmeths = ik_h->methods_jmethod_ids_acquire(); - jmethodID id = NULL; - jmethodID to_dealloc_id = NULL; - jmethodID* to_dealloc_jmeths = NULL; - size_t length; + jmethodID id = NULL; + size_t length = 0; - if (jmeths == NULL || (length = (size_t)jmeths[0]) <= idnum) { + if (jmeths == NULL || // no cache yet + (length = (size_t)jmeths[0]) <= idnum) { // cache is too short if (jmeths != NULL) { - // We have grown the array: copy the existing entries, and delete the old array + // copy any existing entries from the old cache for (size_t index = 0; index < length; index++) { new_jmeths[index+1] = jmeths[index+1]; } - to_dealloc_jmeths = jmeths; // using the new jmeths, deallocate the old one + *to_dealloc_jmeths_p = jmeths; // save old cache for later delete } ik_h->release_set_methods_jmethod_ids(jmeths = new_jmeths); } else { + // fetch jmethodID (if any) from the existing cache id = jmeths[idnum+1]; - to_dealloc_jmeths = new_jmeths; // using the old jmeths, deallocate the new one + *to_dealloc_jmeths_p = new_jmeths; // save new cache for later delete } if (id == NULL) { + // No matching jmethodID in the existing cache or we have a new + // cache or we just grew the cache. This cache write is done here + // by the first thread to win the foot race because a jmethodID + // needs to be unique once it is generally available. id = new_id; - jmeths[idnum+1] = id; // install the new method ID + + // The jmethodID cache can be read while unlocked so we have to + // make sure the new jmethodID is complete before installing it + // in the cache. + OrderAccess::release_store_ptr(&jmeths[idnum+1], id); } else { - to_dealloc_id = new_id; // the new id wasn't used, mark it for deallocation - } - - // Free up unneeded or no longer needed resources - FreeHeap(to_dealloc_jmeths); - if (to_dealloc_id != NULL) { - JNIHandles::destroy_jmethod_id(to_dealloc_id); + *to_dealloc_id_p = new_id; // save new id for later delete } return id; } +// Common code to get the jmethodID cache length and the jmethodID +// value at index idnum if there is one. +// +void instanceKlass::get_jmethod_id_length_value(jmethodID* cache, + size_t idnum, size_t *length_p, jmethodID* id_p) { + assert(cache != NULL, "sanity check"); + assert(length_p != NULL, "sanity check"); + assert(id_p != NULL, "sanity check"); + + // cache size is stored in element[0], other elements offset by one + *length_p = (size_t)cache[0]; + if (*length_p <= idnum) { // cache is too short + *id_p = NULL; + } else { + *id_p = cache[idnum+1]; // fetch jmethodID (if any) + } +} + + // Lookup a jmethodID, NULL if not found. Do no blocking, no allocations, no handles jmethodID instanceKlass::jmethod_id_or_null(methodOop method) { size_t idnum = (size_t)method->method_idnum(); jmethodID* jmeths = methods_jmethod_ids_acquire(); size_t length; // length assigned as debugging crumb jmethodID id = NULL; - if (jmeths != NULL && // If there is a jmethodID array, + if (jmeths != NULL && // If there is a cache (length = (size_t)jmeths[0]) > idnum) { // and if it is long enough, id = jmeths[idnum+1]; // Look up the id (may be NULL) } @@ -1074,18 +1167,35 @@ // Cache an itable index void instanceKlass::set_cached_itable_index(size_t idnum, int index) { int* indices = methods_cached_itable_indices_acquire(); - if (indices == NULL || // If there is no index array, - ((size_t)indices[0]) <= idnum) { // or if it is too short - // Lock before we allocate the array so we don't leak + int* to_dealloc_indices = NULL; + + // We use a double-check locking idiom here because this cache is + // performance sensitive. In the normal system, this cache only + // transitions from NULL to non-NULL which is safe because we use + // release_set_methods_cached_itable_indices() to advertise the + // new cache. A partially constructed cache should never be seen + // by a racing thread. Cache reads and writes proceed without a + // lock, but creation of the cache itself requires no leaks so a + // lock is generally acquired in that case. + // + // If the RedefineClasses() API has been used, then this cache can + // grow and we'll have transitions from non-NULL to bigger non-NULL. + // Cache creation requires no leaks and we require safety between all + // cache accesses and freeing of the old cache so a lock is generally + // acquired when the RedefineClasses() API has been used. + + if (indices == NULL || idnum_can_increment()) { + // we need a cache or the cache can grow MutexLocker ml(JNICachedItableIndex_lock); - // Retry lookup after we got the lock + // reacquire the cache to see if another thread already did the work indices = methods_cached_itable_indices_acquire(); size_t length = 0; - // array length stored in first element, other elements offset by one + // cache size is stored in element[0], other elements offset by one if (indices == NULL || (length = (size_t)indices[0]) <= idnum) { size_t size = MAX2(idnum+1, (size_t)idnum_allocated_count()); int* new_indices = NEW_C_HEAP_ARRAY(int, size+1); - // Copy the existing entries, if any + new_indices[0] = (int)size; + // copy any existing entries size_t i; for (i = 0; i < length; i++) { new_indices[i+1] = indices[i+1]; @@ -1095,15 +1205,32 @@ new_indices[i+1] = -1; } if (indices != NULL) { - FreeHeap(indices); // delete any old indices + // We have an old cache to delete so save it for after we + // drop the lock. + to_dealloc_indices = indices; } release_set_methods_cached_itable_indices(indices = new_indices); } + + if (idnum_can_increment()) { + // this cache can grow so we have to write to it safely + indices[idnum+1] = index; + } } else { CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops()); } - // This is a cache, if there is a race to set it, it doesn't matter - indices[idnum+1] = index; + + if (!idnum_can_increment()) { + // The cache cannot grow and this JNI itable index value does not + // have to be unique like a jmethodID. If there is a race to set it, + // it doesn't matter. + indices[idnum+1] = index; + } + + if (to_dealloc_indices != NULL) { + // we allocated a new cache so free the old one + FreeHeap(to_dealloc_indices); + } } @@ -2299,6 +2426,11 @@ // Add an information node that contains weak references to the // interesting parts of the previous version of the_class. +// This is also where we clean out any unused weak references. +// Note that while we delete nodes from the _previous_versions +// array, we never delete the array itself until the klass is +// unloaded. The has_been_redefined() query depends on that fact. +// void instanceKlass::add_previous_version(instanceKlassHandle ikh, BitMap* emcp_methods, int emcp_method_count) { assert(Thread::current()->is_VM_thread(),
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/oops/instanceKlass.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -217,6 +217,7 @@ bool _is_marked_dependent; // used for marking during flushing and deoptimization bool _rewritten; // methods rewritten. bool _has_nonstatic_fields; // for sizing with UseCompressedOops + bool _should_verify_class; // allow caching of preverification u2 _minor_version; // minor version number of class file u2 _major_version; // major version number of class file ClassState _init_state; // state of class @@ -362,6 +363,10 @@ int get_init_state() { return _init_state; } // Useful for debugging bool is_rewritten() const { return _rewritten; } + // defineClass specified verification + bool should_verify_class() const { return _should_verify_class; } + void set_should_verify_class(bool value) { _should_verify_class = value; } + // marking bool is_marked_dependent() const { return _is_marked_dependent; } void set_is_marked_dependent(bool value) { _is_marked_dependent = value; } @@ -460,6 +465,10 @@ // RedefineClasses() support for previous versions: void add_previous_version(instanceKlassHandle ikh, BitMap *emcp_methods, int emcp_method_count); + // If the _previous_versions array is non-NULL, then this klass + // has been redefined at least once even if we aren't currently + // tracking a previous version. + bool has_been_redefined() const { return _previous_versions != NULL; } bool has_previous_version() const; void init_previous_versions() { _previous_versions = NULL; @@ -501,9 +510,14 @@ void set_bootstrap_method(oop mh) { oop_store(&_bootstrap_method, mh); } // jmethodID support - static jmethodID get_jmethod_id(instanceKlassHandle ik_h, size_t idnum, - jmethodID new_id, jmethodID* new_jmeths); - static jmethodID jmethod_id_for_impl(instanceKlassHandle ik_h, methodHandle method_h); + static jmethodID get_jmethod_id(instanceKlassHandle ik_h, + methodHandle method_h); + static jmethodID get_jmethod_id_fetch_or_update(instanceKlassHandle ik_h, + size_t idnum, jmethodID new_id, jmethodID* new_jmeths, + jmethodID* to_dealloc_id_p, + jmethodID** to_dealloc_jmeths_p); + static void get_jmethod_id_length_value(jmethodID* cache, size_t idnum, + size_t *length_p, jmethodID* id_p); jmethodID jmethod_id_or_null(methodOop method); // cached itable index support @@ -749,6 +763,11 @@ void set_init_thread(Thread *thread) { _init_thread = thread; } u2 idnum_allocated_count() const { return _idnum_allocated_count; } + // The RedefineClasses() API can cause new method idnums to be needed + // which will cause the caches to grow. Safety requires different + // cache management logic if the caches can grow instead of just + // going from NULL to non-NULL. + bool idnum_can_increment() const { return has_been_redefined(); } jmethodID* methods_jmethod_ids_acquire() const { return (jmethodID*)OrderAccess::load_ptr_acquire(&_methods_jmethod_ids); } void release_set_methods_jmethod_ids(jmethodID* jmeths)
--- a/hotspot/src/share/vm/oops/instanceKlassKlass.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/oops/instanceKlassKlass.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/oops/instanceRefKlass.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/oops/instanceRefKlass.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/oops/methodDataOop.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/oops/methodDataOop.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/oops/methodOop.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/oops/methodOop.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -555,7 +555,7 @@ // Get this method's jmethodID -- allocate if it doesn't exist jmethodID jmethod_id() { methodHandle this_h(this); - return instanceKlass::jmethod_id_for_impl(method_holder(), this_h); } + return instanceKlass::get_jmethod_id(method_holder(), this_h); } // Lookup the jmethodID for this method. Return NULL if not found. // NOTE that this function can be called from a signal handler
--- a/hotspot/src/share/vm/oops/objArrayOop.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/oops/objArrayOop.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/opto/compile.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/opto/compile.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/opto/escape.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/opto/escape.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -439,6 +439,11 @@ Node *base = addp->in(AddPNode::Base)->uncast(); if (base->is_top()) { // The AddP case #3 and #6. base = addp->in(AddPNode::Address)->uncast(); + while (base->is_AddP()) { + // Case #6 (unsafe access) may have several chained AddP nodes. + assert(base->in(AddPNode::Base)->is_top(), "expected unsafe access address only"); + base = base->in(AddPNode::Address)->uncast(); + } assert(base->Opcode() == Op_ConP || base->Opcode() == Op_ThreadLocal || base->Opcode() == Op_CastX2P || base->is_DecodeN() || (base->is_Mem() && base->bottom_type() == TypeRawPtr::NOTNULL) ||
--- a/hotspot/src/share/vm/opto/graphKit.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/opto/graphKit.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -622,11 +622,13 @@ //---------------------------PreserveReexecuteState---------------------------- PreserveReexecuteState::PreserveReexecuteState(GraphKit* kit) { + assert(!kit->stopped(), "must call stopped() before"); _kit = kit; _sp = kit->sp(); _reexecute = kit->jvms()->_reexecute; } PreserveReexecuteState::~PreserveReexecuteState() { + if (_kit->stopped()) return; _kit->jvms()->_reexecute = _reexecute; _kit->set_sp(_sp); } @@ -1086,7 +1088,7 @@ alen = _gvn.transform( new (C, 3) LoadRangeNode(0, immutable_memory(), r_adr, TypeInt::POS)); } else { alen = alloc->Ideal_length(); - Node* ccast = alloc->make_ideal_length(_gvn.type(array)->is_aryptr(), &_gvn); + Node* ccast = alloc->make_ideal_length(_gvn.type(array)->is_oopptr(), &_gvn); if (ccast != alen) { alen = _gvn.transform(ccast); } @@ -1123,8 +1125,8 @@ case T_OBJECT : { const Type *t = _gvn.type( value ); - const TypeInstPtr* tp = t->isa_instptr(); - if (tp != NULL && !tp->klass()->is_loaded() + const TypeOopPtr* tp = t->isa_oopptr(); + if (tp != NULL && tp->klass() != NULL && !tp->klass()->is_loaded() // Only for do_null_check, not any of its siblings: && !assert_null && null_control == NULL) { // Usually, any field access or invocation on an unloaded oop type
--- a/hotspot/src/share/vm/opto/idealKit.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/opto/idealKit.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/opto/idealKit.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/opto/idealKit.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/opto/ifnode.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/opto/ifnode.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/opto/library_call.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/opto/library_call.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -3903,19 +3903,10 @@ guarantee(alloc != NULL && alloc->maybe_set_complete(&_gvn), ""); } - // Cast to Object for arraycopy. - // We can't use the original CheckCastPP since it should be moved - // after the arraycopy to prevent stores flowing above it. - Node* new_obj = new(C, 2) CheckCastPPNode(alloc_obj->in(0), raw_obj, - TypeInstPtr::NOTNULL); - new_obj = _gvn.transform(new_obj); - // Substitute in the locally valid dest_oop. - replace_in_map(alloc_obj, new_obj); - // Copy the fastest available way. // TODO: generate fields copies for small objects instead. Node* src = obj; - Node* dest = new_obj; + Node* dest = alloc_obj; Node* size = _gvn.transform(obj_size); // Exclude the header but include array length to copy by 8 bytes words. @@ -3961,7 +3952,7 @@ int raw_adr_idx = Compile::AliasIdxRaw; post_barrier(control(), memory(raw_adr_type), - new_obj, + alloc_obj, no_particular_field, raw_adr_idx, no_particular_value, @@ -3969,16 +3960,8 @@ false); } - // Move the original CheckCastPP after arraycopy. - _gvn.hash_delete(alloc_obj); - alloc_obj->set_req(0, control()); - // Replace raw memory edge with new CheckCastPP to have a live oop - // at safepoints instead of raw value. - assert(new_obj->is_CheckCastPP() && new_obj->in(1) == alloc_obj->in(1), "sanity"); - alloc_obj->set_req(1, new_obj); // cast to the original type - _gvn.hash_find_insert(alloc_obj); // put back into GVN table - // Restore in the locally valid dest_oop. - replace_in_map(new_obj, alloc_obj); + // Do not let reads from the cloned object float above the arraycopy. + insert_mem_bar(Op_MemBarCPUOrder); } //------------------------inline_native_clone---------------------------- @@ -4448,15 +4431,6 @@ assert(init->is_complete(), "we just did this"); assert(dest->is_CheckCastPP(), "sanity"); assert(dest->in(0)->in(0) == init, "dest pinned"); - - // Cast to Object for arraycopy. - // We can't use the original CheckCastPP since it should be moved - // after the arraycopy to prevent stores flowing above it. - Node* new_obj = new(C, 2) CheckCastPPNode(dest->in(0), dest->in(1), - TypeInstPtr::NOTNULL); - dest = _gvn.transform(new_obj); - // Substitute in the locally valid dest_oop. - replace_in_map(original_dest, dest); adr_type = TypeRawPtr::BOTTOM; // all initializations are into raw memory // From this point on, every exit path is responsible for // initializing any non-copied parts of the object to zero. @@ -4786,18 +4760,6 @@ set_i_o( _gvn.transform(result_i_o) ); set_memory( _gvn.transform(result_memory), adr_type ); - if (dest != original_dest) { - // Pin the "finished" array node after the arraycopy/zeroing operations. - _gvn.hash_delete(original_dest); - original_dest->set_req(0, control()); - // Replace raw memory edge with new CheckCastPP to have a live oop - // at safepoints instead of raw value. - assert(dest->is_CheckCastPP() && dest->in(1) == original_dest->in(1), "sanity"); - original_dest->set_req(1, dest); // cast to the original type - _gvn.hash_find_insert(original_dest); // put back into GVN table - // Restore in the locally valid dest_oop. - replace_in_map(dest, original_dest); - } // The memory edges above are precise in order to model effects around // array copies accurately to allow value numbering of field loads around // arraycopy. Such field loads, both before and after, are common in Java @@ -4808,7 +4770,9 @@ // The next memory barrier is added to avoid it. If the arraycopy can be // optimized away (which it can, sometimes) then we can manually remove // the membar also. - if (InsertMemBarAfterArraycopy) + // + // Do not let reads from the cloned object float above the arraycopy. + if (InsertMemBarAfterArraycopy || alloc != NULL) insert_mem_bar(Op_MemBarCPUOrder); }
--- a/hotspot/src/share/vm/opto/phaseX.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/opto/phaseX.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/opto/phaseX.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/opto/phaseX.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/opto/postaloc.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/opto/postaloc.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/opto/superword.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/opto/superword.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -990,8 +990,8 @@ // (5) We know there is no dependence cycle, so there in no other case; // (6) Finally, all memory ops in another single pack should be moved in the same direction. // -// To schedule a load pack: the memory edge of every loads in the pack must be -// the same as the memory edge of the last executed load in the pack +// To schedule a load pack, we use the memory state of either the first or the last load in +// the pack, based on the dependence constraint. void SuperWord::co_locate_pack(Node_List* pk) { if (pk->at(0)->is_Store()) { MemNode* first = executed_first(pk)->as_Mem(); @@ -1076,15 +1076,32 @@ current = my_mem->as_Mem(); } // end while } else if (pk->at(0)->is_Load()) { //load - // all use the memory state that the last executed load uses - LoadNode* last_load = executed_last(pk)->as_Load(); - Node* last_mem = last_load->in(MemNode::Memory); - _igvn.hash_delete(last_mem); - // Give each load same memory state as last + // all loads in the pack should have the same memory state. By default, + // we use the memory state of the last load. However, if any load could + // not be moved down due to the dependence constraint, we use the memory + // state of the first load. + Node* last_mem = executed_last(pk)->in(MemNode::Memory); + Node* first_mem = executed_first(pk)->in(MemNode::Memory); + bool schedule_last = true; + for (uint i = 0; i < pk->size(); i++) { + Node* ld = pk->at(i); + for (Node* current = last_mem; current != ld->in(MemNode::Memory); + current=current->in(MemNode::Memory)) { + assert(current != first_mem, "corrupted memory graph"); + if(current->is_Mem() && !independent(current, ld)){ + schedule_last = false; // a later store depends on this load + break; + } + } + } + + Node* mem_input = schedule_last ? last_mem : first_mem; + _igvn.hash_delete(mem_input); + // Give each load the same memory state for (uint i = 0; i < pk->size(); i++) { LoadNode* ld = pk->at(i)->as_Load(); _igvn.hash_delete(ld); - ld->set_req(MemNode::Memory, last_mem); + ld->set_req(MemNode::Memory, mem_input); _igvn._worklist.push(ld); } }
--- a/hotspot/src/share/vm/opto/type.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/opto/type.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -2236,12 +2236,12 @@ //------------------------------make------------------------------------------- const TypeOopPtr *TypeOopPtr::make(PTR ptr, - int offset) { + int offset, int instance_id) { assert(ptr != Constant, "no constant generic pointers"); ciKlass* k = ciKlassKlass::make(); bool xk = false; ciObject* o = NULL; - return (TypeOopPtr*)(new TypeOopPtr(OopPtr, ptr, k, xk, o, offset, InstanceBot))->hashcons(); + return (TypeOopPtr*)(new TypeOopPtr(OopPtr, ptr, k, xk, o, offset, instance_id))->hashcons(); } @@ -2330,7 +2330,8 @@ case OopPtr: { // Meeting to other OopPtrs const TypeOopPtr *tp = t->is_oopptr(); - return make( meet_ptr(tp->ptr()), meet_offset(tp->offset()) ); + int instance_id = meet_instance_id(tp->instance_id()); + return make( meet_ptr(tp->ptr()), meet_offset(tp->offset()), instance_id ); } case InstPtr: // For these, flip the call around to cut down @@ -2801,7 +2802,7 @@ case OopPtr: { // Meeting to OopPtrs // Found a OopPtr type vs self-InstPtr type - const TypePtr *tp = t->is_oopptr(); + const TypeOopPtr *tp = t->is_oopptr(); int offset = meet_offset(tp->offset()); PTR ptr = meet_ptr(tp->ptr()); switch (tp->ptr()) { @@ -2812,8 +2813,10 @@ (ptr == Constant ? const_oop() : NULL), offset, instance_id); } case NotNull: - case BotPTR: - return TypeOopPtr::make(ptr, offset); + case BotPTR: { + int instance_id = meet_instance_id(tp->instance_id()); + return TypeOopPtr::make(ptr, offset, instance_id); + } default: typerr(t); } } @@ -3259,7 +3262,7 @@ case OopPtr: { // Meeting to OopPtrs // Found a OopPtr type vs self-AryPtr type - const TypePtr *tp = t->is_oopptr(); + const TypeOopPtr *tp = t->is_oopptr(); int offset = meet_offset(tp->offset()); PTR ptr = meet_ptr(tp->ptr()); switch (tp->ptr()) { @@ -3270,8 +3273,10 @@ _ary, _klass, _klass_is_exact, offset, instance_id); } case BotPTR: - case NotNull: - return TypeOopPtr::make(ptr, offset); + case NotNull: { + int instance_id = meet_instance_id(tp->instance_id()); + return TypeOopPtr::make(ptr, offset, instance_id); + } default: ShouldNotReachHere(); } }
--- a/hotspot/src/share/vm/opto/type.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/opto/type.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -714,7 +714,7 @@ static const TypeOopPtr* make_from_constant(ciObject* o); // Make a generic (unclassed) pointer to an oop. - static const TypeOopPtr* make(PTR ptr, int offset); + static const TypeOopPtr* make(PTR ptr, int offset, int instance_id = InstanceBot); ciObject* const_oop() const { return _const_oop; } virtual ciKlass* klass() const { return _klass; }
--- a/hotspot/src/share/vm/prims/jni.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/prims/jni.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -299,7 +299,8 @@ } } klassOop k = SystemDictionary::resolve_from_stream(class_name, class_loader, - Handle(), &st, CHECK_NULL); + Handle(), &st, true, + CHECK_NULL); if (TraceClassResolution && k != NULL) { trace_class_resolution(k);
--- a/hotspot/src/share/vm/prims/jvm.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/prims/jvm.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -762,7 +762,11 @@ } // common code for JVM_DefineClass() and JVM_DefineClassWithSource() -static jclass jvm_define_class_common(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source, TRAPS) { +// and JVM_DefineClassWithSourceCond() +static jclass jvm_define_class_common(JNIEnv *env, const char *name, + jobject loader, const jbyte *buf, + jsize len, jobject pd, const char *source, + jboolean verify, TRAPS) { if (source == NULL) source = "__JVM_DefineClass__"; assert(THREAD->is_Java_thread(), "must be a JavaThread"); @@ -803,6 +807,7 @@ Handle protection_domain (THREAD, JNIHandles::resolve(pd)); klassOop k = SystemDictionary::resolve_from_stream(class_name, class_loader, protection_domain, &st, + verify != 0, CHECK_NULL); if (TraceClassResolution && k != NULL) { @@ -816,16 +821,24 @@ JVM_ENTRY(jclass, JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)) JVMWrapper2("JVM_DefineClass %s", name); - return jvm_define_class_common(env, name, loader, buf, len, pd, NULL, THREAD); + return jvm_define_class_common(env, name, loader, buf, len, pd, NULL, true, THREAD); JVM_END JVM_ENTRY(jclass, JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)) JVMWrapper2("JVM_DefineClassWithSource %s", name); - return jvm_define_class_common(env, name, loader, buf, len, pd, source, THREAD); -JVM_END - + return jvm_define_class_common(env, name, loader, buf, len, pd, source, true, THREAD); +JVM_END + +JVM_ENTRY(jclass, JVM_DefineClassWithSourceCond(JNIEnv *env, const char *name, + jobject loader, const jbyte *buf, + jsize len, jobject pd, + const char *source, jboolean verify)) + JVMWrapper2("JVM_DefineClassWithSourceCond %s", name); + + return jvm_define_class_common(env, name, loader, buf, len, pd, source, verify, THREAD); +JVM_END JVM_ENTRY(jclass, JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)) JVMWrapper("JVM_FindLoadedClass");
--- a/hotspot/src/share/vm/prims/jvm.h Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/prims/jvm.h Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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 @@ -417,6 +417,17 @@ const jbyte *buf, jsize len, jobject pd, const char *source); +/* Define a class with a source with conditional verification (added HSX 14) + * -Xverify:all will verify anyway, -Xverify:none will not verify, + * -Xverify:remote (default) will obey this conditional + * i.e. true = should_verify_class + */ +JNIEXPORT jclass JNICALL +JVM_DefineClassWithSourceCond(JNIEnv *env, const char *name, + jobject loader, const jbyte *buf, + jsize len, jobject pd, const char *source, + jboolean verify); + /* Define a class with a source (MLVM) */ JNIEXPORT jclass JNICALL JVM_DefineClassWithCP(JNIEnv *env, const char *name, jobject loader,
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -933,7 +933,7 @@ // description. RedefineVerifyMark rvm(&the_class, &scratch_class, state); Verifier::verify( - scratch_class, Verifier::ThrowException, THREAD); + scratch_class, Verifier::ThrowException, true, THREAD); } if (HAS_PENDING_EXCEPTION) { @@ -959,7 +959,7 @@ // verify what we have done during constant pool merging { RedefineVerifyMark rvm(&the_class, &scratch_class, state); - Verifier::verify(scratch_class, Verifier::ThrowException, THREAD); + Verifier::verify(scratch_class, Verifier::ThrowException, true, THREAD); } if (HAS_PENDING_EXCEPTION) {
--- a/hotspot/src/share/vm/runtime/atomic.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/runtime/atomic.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/runtime/perfData.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/runtime/perfData.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/runtime/safepoint.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/runtime/safepoint.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -769,9 +769,23 @@ // to grab the Threads_lock which we own here, so a thread cannot be // resumed during safepoint synchronization. - // We check with locking because another thread that has not yet - // synchronized may be trying to suspend this one. - bool is_suspended = _thread->is_any_suspended_with_lock(); + // We check to see if this thread is suspended without locking to + // avoid deadlocking with a third thread that is waiting for this + // thread to be suspended. The third thread can notice the safepoint + // that we're trying to start at the beginning of its SR_lock->wait() + // call. If that happens, then the third thread will block on the + // safepoint while still holding the underlying SR_lock. We won't be + // able to get the SR_lock and we'll deadlock. + // + // We don't need to grab the SR_lock here for two reasons: + // 1) The suspend flags are both volatile and are set with an + // Atomic::cmpxchg() call so we should see the suspended + // state right away. + // 2) We're being called from the safepoint polling loop; if + // we don't see the suspended state on this iteration, then + // we'll come around again. + // + bool is_suspended = _thread->is_ext_suspended(); if (is_suspended) { roll_forward(_at_safepoint); return;
--- a/hotspot/src/share/vm/runtime/sweeper.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/runtime/sweeper.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/runtime/thread.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/runtime/thread.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1942,7 +1942,7 @@ MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag); - assert(!this->is_any_suspended(), + assert(!this->is_ext_suspended(), "a thread trying to self-suspend should not already be suspended"); if (this->is_suspend_equivalent()) {
--- a/hotspot/src/share/vm/runtime/thread.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/runtime/thread.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -967,11 +967,6 @@ return (_suspend_flags & _ext_suspended) != 0; } - // legacy method that checked for either external suspension or vm suspension - bool is_any_suspended() const { - return is_ext_suspended(); - } - bool is_external_suspend_with_lock() const { MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag); return is_external_suspend(); @@ -997,10 +992,6 @@ return ret; } - bool is_any_suspended_with_lock() const { - MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag); - return is_any_suspended(); - } // utility methods to see if we are doing some kind of suspension bool is_being_ext_suspended() const { MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
--- a/hotspot/src/share/vm/runtime/vframeArray.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/runtime/vframeArray.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/runtime/vframe_hp.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/runtime/vframe_hp.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/services/threadService.cpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/services/threadService.cpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2009 Sun Microsystems, Inc. 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
--- a/hotspot/src/share/vm/services/threadService.hpp Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/src/share/vm/services/threadService.hpp Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2009 Sun Microsystems, Inc. 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
--- a/hotspot/test/compiler/6636138/Test1.java Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/test/compiler/6636138/Test1.java Wed Jul 05 17:01:05 2017 +0200 @@ -45,7 +45,7 @@ for (int i = 0; i < src.length; i++) { if (src[i] != ref[i]) { System.out.println("Error: src and ref don't match at " + i); - System.exit(-1); + System.exit(97); } } }
--- a/hotspot/test/compiler/6636138/Test2.java Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/test/compiler/6636138/Test2.java Wed Jul 05 17:01:05 2017 +0200 @@ -51,7 +51,7 @@ int value = (i-1 + src.length)%src.length; // correct value after shifting if (src[i] != value) { System.out.println("Error: src["+i+"] should be "+ value + " instead of " + src[i]); - System.exit(-1); + System.exit(97); } } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/6855215/Test6855215.java Wed Jul 05 17:01:05 2017 +0200 @@ -0,0 +1,55 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +/** + * @test + * @bug 6855215 + * @summary Calculation error (NaN) after about 1500 calculations + * + * @run main/othervm -Xbatch -XX:UseSSE=0 Test6855215 + */ + +public class Test6855215 { + private double m; + private double b; + + public static double log10(double x) { + return Math.log(x) / Math.log(10); + } + + void calcMapping(double xmin, double xmax, double ymin, double ymax) { + m = (ymax - ymin) / (log10(xmax) - log10(xmin)); + b = (log10(xmin) * ymax - log10(xmax) * ymin); + } + + public static void main(String[] args) { + Test6855215 c = new Test6855215(); + for (int i = 0; i < 30000; i++) { + c.calcMapping(91, 121, 177, 34); + if (c.m != c.m) { + throw new InternalError(); + } + } + } +}
--- a/hotspot/test/compiler/6865031/Test.java Mon Sep 28 19:39:40 2009 -0700 +++ b/hotspot/test/compiler/6865031/Test.java Wed Jul 05 17:01:05 2017 +0200 @@ -26,7 +26,7 @@ * @test * @bug 6865031 * @summary Application gives bad result (throws bad exception) with compressed oops - * @run main/othervm -XX:+UseCompressedOops -XX:HeapBaseMinAddress=32g -XX:-LoopUnswitching -XX:CompileCommand=inline,AbstractMemoryEfficientList.equals Test hello goodbye + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:HeapBaseMinAddress=32g -XX:-LoopUnswitching -XX:CompileCommand=inline,AbstractMemoryEfficientList.equals Test hello goodbye */ import java.lang.ref.ReferenceQueue;
--- a/jdk/.hgtags Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/.hgtags Wed Jul 05 17:01:05 2017 +0200 @@ -46,3 +46,4 @@ 226b20019b1f020c09ea97d137d98e011ce65d76 jdk7-b69 893bcca951b747ddcf6986362b877f0e1dbb835b jdk7-b70 b3f3240135f0c10b9f2481c174b81b7fcf0daa60 jdk7-b71 +460639b036f327282832a4fe52b7aa45688afd50 jdk7-b72
--- a/jdk/make/java/java/FILES_java.gmk Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/make/java/java/FILES_java.gmk Wed Jul 05 17:01:05 2017 +0200 @@ -454,6 +454,8 @@ sun/misc/JavaLangAccess.java \ sun/misc/JavaIOAccess.java \ sun/misc/JavaIOFileDescriptorAccess.java \ - sun/misc/JavaNioAccess.java + sun/misc/JavaNioAccess.java \ + sun/misc/Perf.java \ + sun/misc/PerfCounter.java FILES_java = $(JAVA_JAVA_java)
--- a/jdk/make/java/logging/Makefile Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/make/java/logging/Makefile Wed Jul 05 17:01:05 2017 +0200 @@ -31,7 +31,7 @@ # # Files to compile. # -AUTO_FILES_JAVA_DIRS = java/util/logging +AUTO_FILES_JAVA_DIRS = java/util/logging sun/util/logging # # Resources @@ -46,7 +46,6 @@ include $(BUILDDIR)/common/Classes.gmk properties: $(LIBDIR)/logging.properties - $(LIBDIR)/logging.properties: $(SHARE_SRC)/lib/logging.properties $(install-file)
--- a/jdk/make/sun/net/FILES_java.gmk Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/make/sun/net/FILES_java.gmk Wed Jul 05 17:01:05 2017 +0200 @@ -86,9 +86,11 @@ sun/net/www/protocol/http/AuthCache.java \ sun/net/www/protocol/http/AuthCacheImpl.java \ sun/net/www/protocol/http/AuthCacheValue.java \ + sun/net/www/protocol/http/AuthScheme.java \ sun/net/www/protocol/http/BasicAuthentication.java \ sun/net/www/protocol/http/DigestAuthentication.java \ sun/net/www/protocol/http/NTLMAuthentication.java \ + sun/net/www/protocol/http/NTLMAuthenticationProxy.java \ sun/net/www/protocol/http/NegotiateAuthentication.java \ sun/net/www/protocol/http/NegotiatorImpl.java \ sun/net/www/protocol/http/NegotiateCallbackHandler.java \ @@ -123,8 +125,7 @@ sun/net/idn/UCharacterEnums.java \ sun/net/idn/UCharacterDirection.java \ sun/net/idn/StringPrepDataReader.java \ - sun/net/idn/StringPrep.java \ - sun/net/www/protocol/http/InMemoryCookieStore.java + sun/net/idn/StringPrep.java ifeq ($(PLATFORM), windows) FILES_java += sun/net/www/protocol/http/NTLMAuthSequence.java
--- a/jdk/make/sun/security/Makefile Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/make/sun/security/Makefile Wed Jul 05 17:01:05 2017 +0200 @@ -60,8 +60,15 @@ endif endif -SUBDIRS = ec other action util tools jgss krb5 smartcardio $(PKCS11) \ - $(JGSS_WRAPPER) $(MSCAPI) +# Build in-tree elliptic curve crypto provider only when +# DISABLE_INTREE_EC is not set +INTREE_EC = ec +ifdef DISABLE_INTREE_EC + INTREE_EC = +endif + +SUBDIRS = $(INTREE_EC) other action util tools jgss krb5 smartcardio \ + $(PKCS11) $(JGSS_WRAPPER) $(MSCAPI) all build clean clobber:: $(SUBDIRS-loop)
--- a/jdk/make/sun/security/ec/Makefile Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/make/sun/security/ec/Makefile Wed Jul 05 17:01:05 2017 +0200 @@ -24,7 +24,7 @@ # # -# Makefile for building sunec.jar and sunecc native library. +# Makefile for building sunec.jar and sunec native library. # # This file was derived from make/com/sun/crypto/provider/Makefile. # @@ -121,7 +121,15 @@ # AUTO_FILES_JAVA_DIRS = $(PKGDIR) -include $(BUILDDIR)/common/Classes.gmk +# +# Exclude the sources that get built by ../other/Makefile +# +AUTO_JAVA_PRUNE = \ + ECKeyFactory.java \ + ECParameters.java \ + ECPrivateKeyImpl.java \ + ECPublicKeyImpl.java \ + NamedCurve.java # # Some licensees do not get the native ECC sources, but we still need to @@ -130,7 +138,7 @@ # NATIVE_ECC_AVAILABLE := $(shell \ - if [ -d $(SHARE_SRC)/native/$(PKGDIR) ] ; then \ + if [ -d $(SHARE_SRC)/native/$(PKGDIR)/impl ] ; then \ $(ECHO) true; \ else \ $(ECHO) false; \ @@ -138,7 +146,7 @@ ifeq ($(NATIVE_ECC_AVAILABLE), true) - LIBRARY = sunecc + LIBRARY = sunec # # Java files that define native methods @@ -166,12 +174,12 @@ # vpath %.cpp $(SHARE_SRC)/native/$(PKGDIR) - vpath %.c $(SHARE_SRC)/native/$(PKGDIR) + vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/impl # # Find include files # - OTHER_INCLUDES += -I$(SHARE_SRC)/native/$(PKGDIR) + OTHER_INCLUDES += -I$(SHARE_SRC)/native/$(PKGDIR)/impl # # Compiler flags @@ -191,6 +199,10 @@ include $(BUILDDIR)/common/Library.gmk +else # NATIVE_ECC_AVAILABLE + + include $(BUILDDIR)/common/Classes.gmk + endif # NATIVE_ECC_AVAILABLE #
--- a/jdk/make/sun/security/other/Makefile Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/make/sun/security/other/Makefile Wed Jul 05 17:01:05 2017 +0200 @@ -45,6 +45,16 @@ com/sun/net/ssl/internal/ssl # +# EC classes used by the packages above +# +FILES_java += \ + sun/security/ec/ECKeyFactory.java \ + sun/security/ec/ECParameters.java \ + sun/security/ec/ECPrivateKeyImpl.java \ + sun/security/ec/ECPublicKeyImpl.java \ + sun/security/ec/NamedCurve.java + +# # Rules # include $(BUILDDIR)/common/Classes.gmk
--- a/jdk/src/share/bin/java.h Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/bin/java.h Wed Jul 05 17:01:05 2017 +0200 @@ -187,9 +187,6 @@ * */ typedef jclass (JNICALL FindClassFromBootLoader_t(JNIEnv *env, - const char *name, - jboolean init, - jobject loader, - jboolean throwError)); + const char *name)); jclass FindBootStrapClass(JNIEnv *env, const char *classname); #endif /* _JAVA_H_ */
--- a/jdk/src/share/bin/parse_manifest.c Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/bin/parse_manifest.c Wed Jul 05 17:01:05 2017 +0200 @@ -59,7 +59,7 @@ char *out; z_stream zs; - if (entry->csize == 0xffffffff || entry->isize == 0xffffffff) + if (entry->csize == (size_t) -1 || entry->isize == (size_t) -1 ) return (NULL); if (lseek(fd, entry->offset, SEEK_SET) < (off_t)0) return (NULL);
--- a/jdk/src/share/classes/com/sun/rowset/JdbcRowSetResourceBundle.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/com/sun/rowset/JdbcRowSetResourceBundle.java Wed Jul 05 17:01:05 2017 +0200 @@ -133,7 +133,7 @@ * This method returns an enumerated handle of the keys * which correspond to values translated to various locales. * - * @returns an enumerated keys which have messages tranlated to + * @return an enumeration of keys which have messages tranlated to * corresponding locales. */ public Enumeration getKeys() { @@ -146,7 +146,7 @@ * returns the corresponding value reading it * from the Resource Bundle loaded earlier. * - * @returns value in locale specific language + * @return value in locale specific language * according to the key passed. */ public Object handleGetObject(String key) {
--- a/jdk/src/share/classes/com/sun/rowset/JoinRowSetImpl.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/com/sun/rowset/JoinRowSetImpl.java Wed Jul 05 17:01:05 2017 +0200 @@ -3737,7 +3737,6 @@ * Returns a result set containing the original value of the current * row only. * - * @return the original result set of the row * @throws SQLException if there is no current row * @see #setOriginalRow */
--- a/jdk/src/share/classes/com/sun/rowset/internal/WebRowSetXmlReader.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/com/sun/rowset/internal/WebRowSetXmlReader.java Wed Jul 05 17:01:05 2017 +0200 @@ -46,6 +46,17 @@ */ public class WebRowSetXmlReader implements XmlReader, Serializable { + + private JdbcRowSetResourceBundle resBundle; + + public WebRowSetXmlReader(){ + try { + resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle(); + } catch(IOException ioe) { + throw new RuntimeException(ioe); + } + } + /** * Parses the given <code>WebRowSet</code> object, getting its input from * the given <code>java.io.Reader</code> object. The parser will send @@ -69,17 +80,6 @@ * reader for the given rowset * @see XmlReaderContentHandler */ - - private JdbcRowSetResourceBundle resBundle; - - public WebRowSetXmlReader(){ - try { - resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle(); - } catch(IOException ioe) { - throw new RuntimeException(ioe); - } - } - public void readXML(WebRowSet caller, java.io.Reader reader) throws SQLException { try { // Crimson Parser(as in J2SE 1.4.1 is NOT able to handle
--- a/jdk/src/share/classes/java/lang/Class.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/lang/Class.java Wed Jul 05 17:01:05 2017 +0200 @@ -565,8 +565,9 @@ * represented by this object. */ public String getName() { + String name = this.name; if (name == null) - name = getName0(); + this.name = name = getName0(); return name; }
--- a/jdk/src/share/classes/java/lang/ClassLoader.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/lang/ClassLoader.java Wed Jul 05 17:01:05 2017 +0200 @@ -380,16 +380,28 @@ // First, check if the class has already been loaded Class c = findLoadedClass(name); if (c == null) { + long t0 = System.nanoTime(); try { if (parent != null) { c = parent.loadClass(name, false); } else { - c = findBootstrapClass0(name); + c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { + // ClassNotFoundException thrown if class not found + // from the non-null parent class loader + } + + if (c == null) { // If still not found, then invoke findClass in order // to find the class. + long t1 = System.nanoTime(); c = findClass(name); + + // this is the defining class loader; record the stats + sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0); + sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1); + sun.misc.PerfCounter.getFindClasses().increment(); } } if (resolve) { @@ -1008,22 +1020,29 @@ if (system == null) { if (!checkName(name)) throw new ClassNotFoundException(name); - return findBootstrapClass(name); + Class cls = findBootstrapClass(name); + if (cls == null) { + throw new ClassNotFoundException(name); + } + return cls; } return system.loadClass(name); } - private Class findBootstrapClass0(String name) - throws ClassNotFoundException + /** + * Returns a class loaded by the bootstrap class loader; + * or return null if not found. + */ + private Class findBootstrapClassOrNull(String name) { check(); - if (!checkName(name)) - throw new ClassNotFoundException(name); + if (!checkName(name)) return null; + return findBootstrapClass(name); } - private native Class findBootstrapClass(String name) - throws ClassNotFoundException; + // return null if not found + private native Class findBootstrapClass(String name); // Check to make sure the class loader has been initialized. private void check() {
--- a/jdk/src/share/classes/java/net/CookieManager.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/net/CookieManager.java Wed Jul 05 17:01:05 2017 +0200 @@ -157,7 +157,7 @@ // if not specify CookieStore to use, use default one if (store == null) { - cookieJar = new sun.net.www.protocol.http.InMemoryCookieStore(); + cookieJar = new InMemoryCookieStore(); } else { cookieJar = store; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/java/net/InMemoryCookieStore.java Wed Jul 05 17:01:05 2017 +0200 @@ -0,0 +1,393 @@ +/* + * Copyright 2005-2008 Sun Microsystems, Inc. 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package java.net; + +import java.net.URI; +import java.net.CookieStore; +import java.net.HttpCookie; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Map; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Collections; +import java.util.Iterator; +import java.util.concurrent.locks.ReentrantLock; + +/** + * A simple in-memory java.net.CookieStore implementation + * + * @author Edward Wang + * @since 1.6 + */ +class InMemoryCookieStore implements CookieStore { + // the in-memory representation of cookies + private List<HttpCookie> cookieJar = null; + + // the cookies are indexed by its domain and associated uri (if present) + // CAUTION: when a cookie removed from main data structure (i.e. cookieJar), + // it won't be cleared in domainIndex & uriIndex. Double-check the + // presence of cookie when retrieve one form index store. + private Map<String, List<HttpCookie>> domainIndex = null; + private Map<URI, List<HttpCookie>> uriIndex = null; + + // use ReentrantLock instead of syncronized for scalability + private ReentrantLock lock = null; + + + /** + * The default ctor + */ + public InMemoryCookieStore() { + cookieJar = new ArrayList<HttpCookie>(); + domainIndex = new HashMap<String, List<HttpCookie>>(); + uriIndex = new HashMap<URI, List<HttpCookie>>(); + + lock = new ReentrantLock(false); + } + + /** + * Add one cookie into cookie store. + */ + public void add(URI uri, HttpCookie cookie) { + // pre-condition : argument can't be null + if (cookie == null) { + throw new NullPointerException("cookie is null"); + } + + + lock.lock(); + try { + // remove the ole cookie if there has had one + cookieJar.remove(cookie); + + // add new cookie if it has a non-zero max-age + if (cookie.getMaxAge() != 0) { + cookieJar.add(cookie); + // and add it to domain index + if (cookie.getDomain() != null) { + addIndex(domainIndex, cookie.getDomain(), cookie); + } + // add it to uri index, too + addIndex(uriIndex, getEffectiveURI(uri), cookie); + } + } finally { + lock.unlock(); + } + } + + + /** + * Get all cookies, which: + * 1) given uri domain-matches with, or, associated with + * given uri when added to the cookie store. + * 3) not expired. + * See RFC 2965 sec. 3.3.4 for more detail. + */ + public List<HttpCookie> get(URI uri) { + // argument can't be null + if (uri == null) { + throw new NullPointerException("uri is null"); + } + + List<HttpCookie> cookies = new ArrayList<HttpCookie>(); + boolean secureLink = "https".equalsIgnoreCase(uri.getScheme()); + lock.lock(); + try { + // check domainIndex first + getInternal1(cookies, domainIndex, uri.getHost(), secureLink); + // check uriIndex then + getInternal2(cookies, uriIndex, getEffectiveURI(uri), secureLink); + } finally { + lock.unlock(); + } + + return cookies; + } + + /** + * Get all cookies in cookie store, except those have expired + */ + public List<HttpCookie> getCookies() { + List<HttpCookie> rt; + + lock.lock(); + try { + Iterator<HttpCookie> it = cookieJar.iterator(); + while (it.hasNext()) { + if (it.next().hasExpired()) { + it.remove(); + } + } + } finally { + rt = Collections.unmodifiableList(cookieJar); + lock.unlock(); + } + + return rt; + } + + /** + * Get all URIs, which are associated with at least one cookie + * of this cookie store. + */ + public List<URI> getURIs() { + List<URI> uris = new ArrayList<URI>(); + + lock.lock(); + try { + Iterator<URI> it = uriIndex.keySet().iterator(); + while (it.hasNext()) { + URI uri = it.next(); + List<HttpCookie> cookies = uriIndex.get(uri); + if (cookies == null || cookies.size() == 0) { + // no cookies list or an empty list associated with + // this uri entry, delete it + it.remove(); + } + } + } finally { + uris.addAll(uriIndex.keySet()); + lock.unlock(); + } + + return uris; + } + + + /** + * Remove a cookie from store + */ + public boolean remove(URI uri, HttpCookie ck) { + // argument can't be null + if (ck == null) { + throw new NullPointerException("cookie is null"); + } + + boolean modified = false; + lock.lock(); + try { + modified = cookieJar.remove(ck); + } finally { + lock.unlock(); + } + + return modified; + } + + + /** + * Remove all cookies in this cookie store. + */ + public boolean removeAll() { + lock.lock(); + try { + cookieJar.clear(); + domainIndex.clear(); + uriIndex.clear(); + } finally { + lock.unlock(); + } + + return true; + } + + + /* ---------------- Private operations -------------- */ + + + /* + * This is almost the same as HttpCookie.domainMatches except for + * one difference: It won't reject cookies when the 'H' part of the + * domain contains a dot ('.'). + * I.E.: RFC 2965 section 3.3.2 says that if host is x.y.domain.com + * and the cookie domain is .domain.com, then it should be rejected. + * However that's not how the real world works. Browsers don't reject and + * some sites, like yahoo.com do actually expect these cookies to be + * passed along. + * And should be used for 'old' style cookies (aka Netscape type of cookies) + */ + private boolean netscapeDomainMatches(String domain, String host) + { + if (domain == null || host == null) { + return false; + } + + // if there's no embedded dot in domain and domain is not .local + boolean isLocalDomain = ".local".equalsIgnoreCase(domain); + int embeddedDotInDomain = domain.indexOf('.'); + if (embeddedDotInDomain == 0) { + embeddedDotInDomain = domain.indexOf('.', 1); + } + if (!isLocalDomain && (embeddedDotInDomain == -1 || embeddedDotInDomain == domain.length() - 1)) { + return false; + } + + // if the host name contains no dot and the domain name is .local + int firstDotInHost = host.indexOf('.'); + if (firstDotInHost == -1 && isLocalDomain) { + return true; + } + + int domainLength = domain.length(); + int lengthDiff = host.length() - domainLength; + if (lengthDiff == 0) { + // if the host name and the domain name are just string-compare euqal + return host.equalsIgnoreCase(domain); + } else if (lengthDiff > 0) { + // need to check H & D component + String H = host.substring(0, lengthDiff); + String D = host.substring(lengthDiff); + + return (D.equalsIgnoreCase(domain)); + } else if (lengthDiff == -1) { + // if domain is actually .host + return (domain.charAt(0) == '.' && + host.equalsIgnoreCase(domain.substring(1))); + } + + return false; + } + + private void getInternal1(List<HttpCookie> cookies, Map<String, List<HttpCookie>> cookieIndex, + String host, boolean secureLink) { + // Use a separate list to handle cookies that need to be removed so + // that there is no conflict with iterators. + ArrayList<HttpCookie> toRemove = new ArrayList<HttpCookie>(); + for (Map.Entry<String, List<HttpCookie>> entry : cookieIndex.entrySet()) { + String domain = entry.getKey(); + List<HttpCookie> lst = entry.getValue(); + for (HttpCookie c : lst) { + if ((c.getVersion() == 0 && netscapeDomainMatches(domain, host)) || + (c.getVersion() == 1 && HttpCookie.domainMatches(domain, host))) { + if ((cookieJar.indexOf(c) != -1)) { + // the cookie still in main cookie store + if (!c.hasExpired()) { + // don't add twice and make sure it's the proper + // security level + if ((secureLink || !c.getSecure()) && + !cookies.contains(c)) { + cookies.add(c); + } + } else { + toRemove.add(c); + } + } else { + // the cookie has beed removed from main store, + // so also remove it from domain indexed store + toRemove.add(c); + } + } + } + // Clear up the cookies that need to be removed + for (HttpCookie c : toRemove) { + lst.remove(c); + cookieJar.remove(c); + + } + toRemove.clear(); + } + } + + // @param cookies [OUT] contains the found cookies + // @param cookieIndex the index + // @param comparator the prediction to decide whether or not + // a cookie in index should be returned + private <T> void getInternal2(List<HttpCookie> cookies, + Map<T, List<HttpCookie>> cookieIndex, + Comparable<T> comparator, boolean secureLink) + { + for (T index : cookieIndex.keySet()) { + if (comparator.compareTo(index) == 0) { + List<HttpCookie> indexedCookies = cookieIndex.get(index); + // check the list of cookies associated with this domain + if (indexedCookies != null) { + Iterator<HttpCookie> it = indexedCookies.iterator(); + while (it.hasNext()) { + HttpCookie ck = it.next(); + if (cookieJar.indexOf(ck) != -1) { + // the cookie still in main cookie store + if (!ck.hasExpired()) { + // don't add twice + if ((secureLink || !ck.getSecure()) && + !cookies.contains(ck)) + cookies.add(ck); + } else { + it.remove(); + cookieJar.remove(ck); + } + } else { + // the cookie has beed removed from main store, + // so also remove it from domain indexed store + it.remove(); + } + } + } // end of indexedCookies != null + } // end of comparator.compareTo(index) == 0 + } // end of cookieIndex iteration + } + + // add 'cookie' indexed by 'index' into 'indexStore' + private <T> void addIndex(Map<T, List<HttpCookie>> indexStore, + T index, + HttpCookie cookie) + { + if (index != null) { + List<HttpCookie> cookies = indexStore.get(index); + if (cookies != null) { + // there may already have the same cookie, so remove it first + cookies.remove(cookie); + + cookies.add(cookie); + } else { + cookies = new ArrayList<HttpCookie>(); + cookies.add(cookie); + indexStore.put(index, cookies); + } + } + } + + + // + // for cookie purpose, the effective uri should only be http://host + // the path will be taken into account when path-match algorithm applied + // + private URI getEffectiveURI(URI uri) { + URI effectiveURI = null; + try { + effectiveURI = new URI("http", + uri.getHost(), + null, // path component + null, // query component + null // fragment component + ); + } catch (URISyntaxException ignored) { + effectiveURI = uri; + } + + return effectiveURI; + } +}
--- a/jdk/src/share/classes/java/net/URLClassLoader.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/net/URLClassLoader.java Wed Jul 05 17:01:05 2017 +0200 @@ -340,6 +340,7 @@ * used. */ private Class defineClass(String name, Resource res) throws IOException { + long t0 = System.nanoTime(); int i = name.lastIndexOf('.'); URL url = res.getCodeSourceURL(); if (i != -1) { @@ -370,12 +371,14 @@ // Use (direct) ByteBuffer: CodeSigner[] signers = res.getCodeSigners(); CodeSource cs = new CodeSource(url, signers); + sun.misc.PerfCounter.getReadClassBytesTime().addElapsedTimeFrom(t0); return defineClass(name, bb, cs); } else { byte[] b = res.getBytes(); // must read certificates AFTER reading bytes. CodeSigner[] signers = res.getCodeSigners(); CodeSource cs = new CodeSource(url, signers); + sun.misc.PerfCounter.getReadClassBytesTime().addElapsedTimeFrom(t0); return defineClass(name, b, 0, b.length, cs); } }
--- a/jdk/src/share/classes/java/net/doc-files/net-properties.html Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/net/doc-files/net-properties.html Wed Jul 05 17:01:05 2017 +0200 @@ -71,12 +71,12 @@ <LI><P>HTTP</P> <P>The following proxy settings are used by the HTTP protocol handler.</P> <UL> - <LI><P><B>http.proxyHost</FONT></B> (default: <none>)<BR> + <LI><P><B>http.proxyHost</B> (default: <none>)<BR> The hostname, or address, of the proxy server </P> <LI><P><B>http.proxyPort</B> (default: 80)<BR> The port number of the proxy server.</P> - <LI><P><B>http.nonProxyHosts</B> (default: <none>)<BR> + <LI><P><B>http.nonProxyHosts</B> (default: localhost|127.*|[::1])<BR> Indicates the hosts that should be accessed without going through the proxy. Typically this defines internal hosts. The value of this property is a list of hosts, @@ -86,7 +86,8 @@ will indicate that every hosts in the foo.com domain and the localhost should be accessed directly even if a proxy server is specified.</P> - </UL> + <P>The default value excludes all common variations of the loopback address.</P> + </UL> <LI><P>HTTPS<BR>This is HTTP over SSL, a secure version of HTTP mainly used when confidentiality (like on payment sites) is needed.</P> <P>The following proxy settings are used by the HTTPS protocol handler.</P> @@ -107,7 +108,7 @@ </P> <LI><P><B>ftp.proxyPort</B> (default: 80)<BR> The port number of the proxy server.</P> - <LI><P><B>ftp.nonProxyHosts</B> (default: <none>)<BR> + <LI><P><B>ftp.nonProxyHosts</B> (default: localhost|127.*|[::1])<BR> Indicates the hosts that should be accessed without going through the proxy. Typically this defines internal hosts. The value of this property is a list of hosts, separated by @@ -117,6 +118,7 @@ will indicate that every hosts in the foo.com domain and the localhost should be accessed directly even if a proxy server is specified.</P> + <P>The default value excludes all common variations of the loopback address.</P> </UL> <LI><P>SOCKS<BR>This is another type of proxy. It allows for lower level type of tunneling since it works at the TCP level. In effect,
--- a/jdk/src/share/classes/java/nio/file/FileTreeWalker.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/nio/file/FileTreeWalker.java Wed Jul 05 17:01:05 2017 +0200 @@ -41,8 +41,12 @@ private final boolean detectCycles; private final LinkOption[] linkOptions; private final FileVisitor<? super Path> visitor; + private final int maxDepth; - FileTreeWalker(Set<FileVisitOption> options, FileVisitor<? super Path> visitor) { + FileTreeWalker(Set<FileVisitOption> options, + FileVisitor<? super Path> visitor, + int maxDepth) + { boolean fl = false; boolean dc = false; for (FileVisitOption option: options) { @@ -58,18 +62,15 @@ this.linkOptions = (fl) ? new LinkOption[0] : new LinkOption[] { LinkOption.NOFOLLOW_LINKS }; this.visitor = visitor; + this.maxDepth = maxDepth; } /** * Walk file tree starting at the given file */ - void walk(Path start, int maxDepth) { - // don't use attributes of starting file as they may be stale - if (start instanceof BasicFileAttributesHolder) { - ((BasicFileAttributesHolder)start).invalidate(); - } + void walk(Path start) { FileVisitResult result = walk(start, - maxDepth, + 0, new ArrayList<AncestorDirectory>()); if (result == null) { throw new NullPointerException("Visitor returned 'null'"); @@ -89,12 +90,15 @@ List<AncestorDirectory> ancestors) { // depth check - if (depth-- < 0) + if (depth > maxDepth) return FileVisitResult.CONTINUE; // if attributes are cached then use them if possible BasicFileAttributes attrs = null; - if (file instanceof BasicFileAttributesHolder) { + if ((depth > 0) && + (file instanceof BasicFileAttributesHolder) && + (System.getSecurityManager() == null)) + { BasicFileAttributes cached = ((BasicFileAttributesHolder)file).get(); if (!followLinks || !cached.isSymbolicLink()) attrs = cached; @@ -120,6 +124,10 @@ } } } catch (SecurityException x) { + // If access to starting file is denied then SecurityException + // is thrown, otherwise the file is ignored. + if (depth == 0) + throw x; return FileVisitResult.CONTINUE; } } @@ -196,7 +204,7 @@ try { for (Path entry: stream) { inAction = true; - result = walk(entry, depth, ancestors); + result = walk(entry, depth+1, ancestors); inAction = false; // returning null will cause NPE to be thrown
--- a/jdk/src/share/classes/java/nio/file/Files.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/nio/file/Files.java Wed Jul 05 17:01:05 2017 +0200 @@ -223,7 +223,7 @@ { if (maxDepth < 0) throw new IllegalArgumentException("'maxDepth' is negative"); - new FileTreeWalker(options, visitor).walk(start, maxDepth); + new FileTreeWalker(options, visitor, maxDepth).walk(start); } /**
--- a/jdk/src/share/classes/java/util/Currency.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/util/Currency.java Wed Jul 05 17:01:05 2017 +0200 @@ -35,12 +35,12 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.util.logging.Level; -import java.util.logging.Logger; import java.util.regex.Pattern; import java.util.regex.Matcher; import java.util.spi.CurrencyNameProvider; import java.util.spi.LocaleServiceProvider; import sun.util.LocaleServiceProviderPool; +import sun.util.logging.PlatformLogger; import sun.util.resources.LocaleData; import sun.util.resources.OpenListResourceBundle; @@ -244,7 +244,7 @@ } } } catch (IOException e) { - log(Level.INFO, "currency.properties is ignored because of an IOException", e); + info("currency.properties is ignored because of an IOException", e); } return null; } @@ -686,7 +686,7 @@ .append("The entry in currency.properties for ") .append(ctry).append(" is ignored because of the invalid country code.") .toString(); - log(Level.INFO, message, null); + info(message, null); return; } @@ -698,7 +698,7 @@ .append(ctry) .append(" is ignored because the value format is not recognized.") .toString(); - log(Level.INFO, message, null); + info(message, null); return; } @@ -726,13 +726,13 @@ setMainTableEntry(ctry.charAt(0), ctry.charAt(1), entry); } - private static void log(Level level, String message, Throwable t) { - Logger logger = Logger.getLogger("java.util.Currency"); - if (logger.isLoggable(level)) { + private static void info(String message, Throwable t) { + PlatformLogger logger = PlatformLogger.getLogger("java.util.Currency"); + if (logger.isLoggable(PlatformLogger.INFO)) { if (t != null) { - logger.log(level, message, t); + logger.info(message, t); } else { - logger.log(level, message); + logger.info(message); } } }
--- a/jdk/src/share/classes/java/util/jar/Attributes.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/util/jar/Attributes.java Wed Jul 05 17:01:05 2017 +0200 @@ -34,7 +34,7 @@ import java.util.Collection; import java.util.AbstractSet; import java.util.Iterator; -import java.util.logging.Logger; +import sun.util.logging.PlatformLogger; import java.util.Comparator; import sun.misc.ASCIICaseInsensitiveComparator; @@ -419,7 +419,7 @@ } try { if ((putValue(name, value) != null) && (!lineContinued)) { - Logger.getLogger("java.util.jar").warning( + PlatformLogger.getLogger("java.util.jar").warning( "Duplicate name in Manifest: " + name + ".\n" + "Ensure that the manifest does not "
--- a/jdk/src/share/classes/java/util/logging/ErrorManager.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/util/logging/ErrorManager.java Wed Jul 05 17:01:05 2017 +0200 @@ -28,7 +28,7 @@ /** * ErrorManager objects can be attached to Handlers to process - * any error that occur on a Handler during Logging. + * any error that occurs on a Handler during Logging. * <p> * When processing logging output, if a Handler encounters problems * then rather than throwing an Exception back to the issuer of @@ -72,7 +72,7 @@ /** * The error method is called when a Handler failure occurs. * <p> - * This method may be overriden in subclasses. The default + * This method may be overridden in subclasses. The default * behavior in this base class is that the first call is * reported to System.err, and subsequent calls are ignored. *
--- a/jdk/src/share/classes/java/util/logging/FileHandler.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/util/logging/FileHandler.java Wed Jul 05 17:01:05 2017 +0200 @@ -39,7 +39,7 @@ * For a rotating set of files, as each file reaches a given size * limit, it is closed, rotated out, and a new file opened. * Successively older files are named by adding "0", "1", "2", - * etc into the base filename. + * etc. into the base filename. * <p> * By default buffering is enabled in the IO libraries but each log * record is flushed out when it is complete. @@ -391,7 +391,7 @@ // Generate a lock file name from the "unique" int. lockFileName = generate(pattern, 0, unique).toString() + ".lck"; // Now try to lock that filename. - // Because some systems (e.g. Solaris) can only do file locks + // Because some systems (e.g., Solaris) can only do file locks // between processes (and not within a process), we first check // if we ourself already have the file locked. synchronized(locks) {
--- a/jdk/src/share/classes/java/util/logging/Formatter.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/util/logging/Formatter.java Wed Jul 05 17:01:05 2017 +0200 @@ -52,7 +52,7 @@ * Format the given log record and return the formatted string. * <p> * The resulting formatted String will normally include a - * localized and formated version of the LogRecord's message field. + * localized and formatted version of the LogRecord's message field. * It is recommended to use the {@link Formatter#formatMessage} * convenience method to localize and format the message field. * @@ -66,7 +66,7 @@ * Return the header string for a set of formatted records. * <p> * This base class returns an empty string, but this may be - * overriden by subclasses. + * overridden by subclasses. * * @param h The target handler (can be null) * @return header string @@ -79,7 +79,7 @@ * Return the tail string for a set of formatted records. * <p> * This base class returns an empty string, but this may be - * overriden by subclasses. + * overridden by subclasses. * * @param h The target handler (can be null) * @return tail string
--- a/jdk/src/share/classes/java/util/logging/Handler.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/util/logging/Handler.java Wed Jul 05 17:01:05 2017 +0200 @@ -274,7 +274,7 @@ * <tt>Level</tt> and whether it satisfies any <tt>Filter</tt>. It also * may make other <tt>Handler</tt> specific checks that might prevent a * handler from logging the <tt>LogRecord</tt>. It will return false if - * the <tt>LogRecord</tt> is Null. + * the <tt>LogRecord</tt> is null. * <p> * @param record a <tt>LogRecord</tt> * @return true if the <tt>LogRecord</tt> would be logged.
--- a/jdk/src/share/classes/java/util/logging/Level.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/util/logging/Level.java Wed Jul 05 17:01:05 2017 +0200 @@ -110,7 +110,7 @@ * Typically INFO messages will be written to the console * or its equivalent. So the INFO level should only be * used for reasonably significant messages that will - * make sense to end users and system admins. + * make sense to end users and system administrators. * This level is initialized to <CODE>800</CODE>. */ public static final Level INFO = new Level("INFO", 800, defaultBundle); @@ -245,6 +245,8 @@ } /** + * Returns a string representation of this Level. + * * @return the non-localized name of the Level, for example "INFO". */ public final String toString() { @@ -299,14 +301,14 @@ * @throws IllegalArgumentException if the value is not valid. * Valid values are integers between <CODE>Integer.MIN_VALUE</CODE> * and <CODE>Integer.MAX_VALUE</CODE>, and all known level names. - * Known names are the levels defined by this class (i.e. <CODE>FINE</CODE>, + * Known names are the levels defined by this class (e.g., <CODE>FINE</CODE>, * <CODE>FINER</CODE>, <CODE>FINEST</CODE>), or created by this class with * appropriate package access, or new levels defined or created * by subclasses. * * @return The parsed value. Passing an integer that corresponds to a known name - * (eg 700) will return the associated name (eg <CODE>CONFIG</CODE>). - * Passing an integer that does not (eg 1) will return a new level name + * (e.g., 700) will return the associated name (e.g., <CODE>CONFIG</CODE>). + * Passing an integer that does not (e.g., 1) will return a new level name * initialized to that value. */ public static synchronized Level parse(String name) throws IllegalArgumentException {
--- a/jdk/src/share/classes/java/util/logging/LogManager.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/util/logging/LogManager.java Wed Jul 05 17:01:05 2017 +0200 @@ -283,6 +283,10 @@ AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() { public Object run() throws Exception { readConfiguration(); + + // Platform loggers begin to delegate to java.util.logging.Logger + sun.util.logging.PlatformLogger.redirectPlatformLoggers(); + return null; } });
--- a/jdk/src/share/classes/java/util/logging/LogRecord.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/util/logging/LogRecord.java Wed Jul 05 17:01:05 2017 +0200 @@ -188,7 +188,7 @@ } /** - * Get the source Logger name's + * Get the source Logger's name. * * @return source logger name (may be null) */ @@ -197,7 +197,7 @@ } /** - * Set the source Logger name. + * Set the source Logger's name. * * @param name the source logger name (may be null) */ @@ -530,6 +530,7 @@ int depth = access.getStackTraceDepth(throwable); String logClassName = "java.util.logging.Logger"; + String plogClassName = "sun.util.logging.PlatformLogger"; boolean lookingForLogger = true; for (int ix = 0; ix < depth; ix++) { // Calling getStackTraceElement directly prevents the VM @@ -539,15 +540,18 @@ String cname = frame.getClassName(); if (lookingForLogger) { // Skip all frames until we have found the first logger frame. - if (cname.equals(logClassName)) { + if (cname.equals(logClassName) || cname.startsWith(plogClassName)) { lookingForLogger = false; } } else { - if (!cname.equals(logClassName)) { - // We've found the relevant frame. - setSourceClassName(cname); - setSourceMethodName(frame.getMethodName()); - return; + if (!cname.equals(logClassName) && !cname.startsWith(plogClassName)) { + // skip reflection call + if (!cname.startsWith("java.lang.reflect.") && !cname.startsWith("sun.reflect.")) { + // We've found the relevant frame. + setSourceClassName(cname); + setSourceMethodName(frame.getMethodName()); + return; + } } } }
--- a/jdk/src/share/classes/java/util/logging/Logger.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/util/logging/Logger.java Wed Jul 05 17:01:05 2017 +0200 @@ -66,7 +66,7 @@ * effective level from its parent. * <p> * On each logging call the Logger initially performs a cheap - * check of the request level (e.g. SEVERE or FINE) against the + * check of the request level (e.g., SEVERE or FINE) against the * effective log level of the logger. If the request level is * lower than the log level, the logging call returns immediately. * <p> @@ -230,7 +230,7 @@ * Protected method to construct a logger for a named subsystem. * <p> * The logger will be initially configured with a null Level - * and with useParentHandlers true. + * and with useParentHandlers set to true. * * @param name A name for the logger. This should * be a dot-separated name and should normally @@ -240,7 +240,7 @@ * @param resourceBundleName name of ResourceBundle to be used for localizing * messages for this logger. May be null if none * of the messages require localization. - * @throws MissingResourceException if the ResourceBundleName is non-null and + * @throws MissingResourceException if the resourceBundleName is non-null and * no corresponding resource can be found. */ protected Logger(String name, String resourceBundleName) { @@ -285,7 +285,7 @@ * <p> * If a new logger is created its log level will be configured * based on the LogManager configuration and it will configured - * to also send logging output to its parent's handlers. It will + * to also send logging output to its parent's Handlers. It will * be registered in the LogManager global namespace. * * @param name A name for the logger. This should @@ -308,7 +308,7 @@ * <p> * If a new logger is created its log level will be configured * based on the LogManager and it will configured to also send logging - * output to its parent loggers Handlers. It will be registered in + * output to its parent's Handlers. It will be registered in * the LogManager global namespace. * <p> * If the named Logger already exists and does not yet have a @@ -326,7 +326,8 @@ * messages for this logger. May be <CODE>null</CODE> if none of * the messages require localization. * @return a suitable Logger - * @throws MissingResourceException if the named ResourceBundle cannot be found. + * @throws MissingResourceException if the resourceBundleName is non-null and + * no corresponding resource can be found. * @throws IllegalArgumentException if the Logger already exists and uses * a different resource bundle name. * @throws NullPointerException if the name is null. @@ -395,7 +396,8 @@ * messages for this logger. * May be null if none of the messages require localization. * @return a newly created private Logger - * @throws MissingResourceException if the named ResourceBundle cannot be found. + * @throws MissingResourceException if the resourceBundleName is non-null and + * no corresponding resource can be found. */ public static synchronized Logger getAnonymousLogger(String resourceBundleName) { LogManager manager = LogManager.getLogManager(); @@ -514,7 +516,7 @@ * level then the given message is forwarded to all the * registered output Handler objects. * <p> - * @param level One of the message level identifiers, e.g. SEVERE + * @param level One of the message level identifiers, e.g., SEVERE * @param msg The string message (or a key in the message catalog) */ public void log(Level level, String msg) { @@ -532,7 +534,7 @@ * level then a corresponding LogRecord is created and forwarded * to all the registered output Handler objects. * <p> - * @param level One of the message level identifiers, e.g. SEVERE + * @param level One of the message level identifiers, e.g., SEVERE * @param msg The string message (or a key in the message catalog) * @param param1 parameter to the message */ @@ -553,7 +555,7 @@ * level then a corresponding LogRecord is created and forwarded * to all the registered output Handler objects. * <p> - * @param level One of the message level identifiers, e.g. SEVERE + * @param level One of the message level identifiers, e.g., SEVERE * @param msg The string message (or a key in the message catalog) * @param params array of parameters to the message */ @@ -578,7 +580,7 @@ * processed specially by output Formatters and is not treated * as a formatting parameter to the LogRecord message property. * <p> - * @param level One of the message level identifiers, e.g. SEVERE + * @param level One of the message level identifiers, e.g., SEVERE * @param msg The string message (or a key in the message catalog) * @param thrown Throwable associated with log message. */ @@ -603,7 +605,7 @@ * level then the given message is forwarded to all the * registered output Handler objects. * <p> - * @param level One of the message level identifiers, e.g. SEVERE + * @param level One of the message level identifiers, e.g., SEVERE * @param sourceClass name of class that issued the logging request * @param sourceMethod name of method that issued the logging request * @param msg The string message (or a key in the message catalog) @@ -626,7 +628,7 @@ * level then a corresponding LogRecord is created and forwarded * to all the registered output Handler objects. * <p> - * @param level One of the message level identifiers, e.g. SEVERE + * @param level One of the message level identifiers, e.g., SEVERE * @param sourceClass name of class that issued the logging request * @param sourceMethod name of method that issued the logging request * @param msg The string message (or a key in the message catalog) @@ -653,7 +655,7 @@ * level then a corresponding LogRecord is created and forwarded * to all the registered output Handler objects. * <p> - * @param level One of the message level identifiers, e.g. SEVERE + * @param level One of the message level identifiers, e.g., SEVERE * @param sourceClass name of class that issued the logging request * @param sourceMethod name of method that issued the logging request * @param msg The string message (or a key in the message catalog) @@ -684,7 +686,7 @@ * processed specially by output Formatters and is not treated * as a formatting parameter to the LogRecord message property. * <p> - * @param level One of the message level identifiers, e.g. SEVERE + * @param level One of the message level identifiers, e.g., SEVERE * @param sourceClass name of class that issued the logging request * @param sourceMethod name of method that issued the logging request * @param msg The string message (or a key in the message catalog) @@ -731,7 +733,7 @@ * resource bundle name is null, or an empty String or invalid * then the msg string is not localized. * <p> - * @param level One of the message level identifiers, e.g. SEVERE + * @param level One of the message level identifiers, e.g., SEVERE * @param sourceClass name of class that issued the logging request * @param sourceMethod name of method that issued the logging request * @param bundleName name of resource bundle to localize msg, @@ -762,7 +764,7 @@ * resource bundle name is null, or an empty String or invalid * then the msg string is not localized. * <p> - * @param level One of the message level identifiers, e.g. SEVERE + * @param level One of the message level identifiers, e.g., SEVERE * @param sourceClass name of class that issued the logging request * @param sourceMethod name of method that issued the logging request * @param bundleName name of resource bundle to localize msg, @@ -795,7 +797,7 @@ * resource bundle name is null, or an empty String or invalid * then the msg string is not localized. * <p> - * @param level One of the message level identifiers, e.g. SEVERE + * @param level One of the message level identifiers, e.g., SEVERE * @param sourceClass name of class that issued the logging request * @param sourceMethod name of method that issued the logging request * @param bundleName name of resource bundle to localize msg, @@ -832,7 +834,7 @@ * processed specially by output Formatters and is not treated * as a formatting parameter to the LogRecord message property. * <p> - * @param level One of the message level identifiers, e.g. SEVERE + * @param level One of the message level identifiers, e.g., SEVERE * @param sourceClass name of class that issued the logging request * @param sourceMethod name of method that issued the logging request * @param bundleName name of resource bundle to localize msg, @@ -1214,7 +1216,7 @@ /** * Specify whether or not this logger should send its output - * to it's parent Logger. This means that any LogRecords will + * to its parent Logger. This means that any LogRecords will * also be written to the parent's Handlers, and potentially * to its parent, recursively up the namespace. *
--- a/jdk/src/share/classes/java/util/logging/LoggingMXBean.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/util/logging/LoggingMXBean.java Wed Jul 05 17:01:05 2017 +0200 @@ -105,8 +105,8 @@ * * @param loggerName The name of the <tt>Logger</tt> to be set. * Must be non-null. - * @param levelName The name of the level to set the specified logger to, - * or <tt>null</tt> if to set the level to inherit + * @param levelName The name of the level to set on the specified logger, + * or <tt>null</tt> if setting the level to inherit * from its nearest ancestor. * * @throws IllegalArgumentException if the specified logger
--- a/jdk/src/share/classes/java/util/logging/MemoryHandler.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/util/logging/MemoryHandler.java Wed Jul 05 17:01:05 2017 +0200 @@ -136,7 +136,7 @@ * @param size the number of log records to buffer (must be greater than zero) * @param pushLevel message level to push on * - * @throws IllegalArgumentException is size is <= 0 + * @throws IllegalArgumentException if size is <= 0 */ public MemoryHandler(Handler target, int size, Level pushLevel) { if (target == null || pushLevel == null) { @@ -258,7 +258,7 @@ * This method checks if the <tt>LogRecord</tt> has an appropriate level and * whether it satisfies any <tt>Filter</tt>. However it does <b>not</b> * check whether the <tt>LogRecord</tt> would result in a "push" of the - * buffer contents. It will return false if the <tt>LogRecord</tt> is Null. + * buffer contents. It will return false if the <tt>LogRecord</tt> is null. * <p> * @param record a <tt>LogRecord</tt> * @return true if the <tt>LogRecord</tt> would be logged.
--- a/jdk/src/share/classes/java/util/logging/StreamHandler.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/util/logging/StreamHandler.java Wed Jul 05 17:01:05 2017 +0200 @@ -220,7 +220,7 @@ * <p> * This method checks if the <tt>LogRecord</tt> has an appropriate level and * whether it satisfies any <tt>Filter</tt>. It will also return false if - * no output stream has been assigned yet or the LogRecord is Null. + * no output stream has been assigned yet or the LogRecord is null. * <p> * @param record a <tt>LogRecord</tt> * @return true if the <tt>LogRecord</tt> would be logged.
--- a/jdk/src/share/classes/java/util/zip/ZipEntry.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/util/zip/ZipEntry.java Wed Jul 05 17:01:05 2017 +0200 @@ -253,14 +253,10 @@ * the first 0xFFFF bytes are output to the ZIP file entry. * * @param comment the comment string - * @exception IllegalArgumentException if the length of the specified - * comment string is greater than 0xFFFF bytes + * * @see #getComment() */ public void setComment(String comment) { - if (comment != null && comment.length() > 0xffff) { - throw new IllegalArgumentException("invalid entry comment length"); - } this.comment = comment; }
--- a/jdk/src/share/classes/java/util/zip/ZipFile.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/java/util/zip/ZipFile.java Wed Jul 05 17:01:05 2017 +0200 @@ -195,7 +195,10 @@ if (charset == null) throw new NullPointerException("charset is null"); this.zc = ZipCoder.get(charset); + long t0 = System.nanoTime(); jzfile = open(name, mode, file.lastModified()); + sun.misc.PerfCounter.getZipFileOpenTime().addElapsedTimeFrom(t0); + sun.misc.PerfCounter.getZipFileCount().increment(); this.name = name; this.total = getTotal(jzfile); }
--- a/jdk/src/share/classes/javax/sql/rowset/BaseRowSet.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/javax/sql/rowset/BaseRowSet.java Wed Jul 05 17:01:05 2017 +0200 @@ -168,8 +168,8 @@ * The majority of methods for setting placeholder parameters take two parameters, * with the first parameter * indicating which placeholder parameter is to be set, and the second parameter - * giving the value to be set. Methods such as <code>getInt</code>, - * <code>getString</code>, <code>getBoolean</code>, and <code>getLong</code> fall into + * giving the value to be set. Methods such as <code>setInt</code>, + * <code>setString</code>, <code>setBoolean</code>, and <code>setLong</code> fall into * this category. After these methods have been called, a call to the method * <code>getParams</code> will return an array with the values that have been set. Each * element in the array is an <code>Object</code> instance representing the @@ -3259,9 +3259,9 @@ * @param x the parameter value * @exception SQLException if a database access error occurs or * this method is called on a closed <code>CallableStatement</code> - * @see #getBoolean * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method + * @see #getParams * @since 1.4 */ public void setBoolean(String parameterName, boolean x) throws SQLException{ @@ -3281,7 +3281,7 @@ * this method is called on a closed <code>CallableStatement</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method - * @see #getByte + * @see #getParams * @since 1.4 */ public void setByte(String parameterName, byte x) throws SQLException{ @@ -3301,7 +3301,7 @@ * this method is called on a closed <code>CallableStatement</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method - * @see #getShort + * @see #getParams * @since 1.4 */ public void setShort(String parameterName, short x) throws SQLException{ @@ -3320,7 +3320,7 @@ * this method is called on a closed <code>CallableStatement</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method - * @see #getInt + * @see #getParams * @since 1.4 */ public void setInt(String parameterName, int x) throws SQLException{ @@ -3339,7 +3339,7 @@ * this method is called on a closed <code>CallableStatement</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method - * @see #getLong + * @see #getParams * @since 1.4 */ public void setLong(String parameterName, long x) throws SQLException{ @@ -3358,7 +3358,7 @@ * this method is called on a closed <code>CallableStatement</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method - * @see #getFloat + * @see #getParams * @since 1.4 */ public void setFloat(String parameterName, float x) throws SQLException{ @@ -3377,7 +3377,7 @@ * this method is called on a closed <code>CallableStatement</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method - * @see #getDouble + * @see #getParams * @since 1.4 */ public void setDouble(String parameterName, double x) throws SQLException{ @@ -3398,7 +3398,7 @@ * this method is called on a closed <code>CallableStatement</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method - * @see #getBigDecimal + * @see #getParams * @since 1.4 */ public void setBigDecimal(String parameterName, BigDecimal x) throws SQLException{ @@ -3421,7 +3421,7 @@ * this method is called on a closed <code>CallableStatement</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method - * @see #getString + * @see #getParams * @since 1.4 */ public void setString(String parameterName, String x) throws SQLException{ @@ -3443,7 +3443,7 @@ * this method is called on a closed <code>CallableStatement</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method - * @see #getBytes + * @see #getParams * @since 1.4 */ public void setBytes(String parameterName, byte x[]) throws SQLException{ @@ -3464,7 +3464,7 @@ * this method is called on a closed <code>CallableStatement</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method - * @see #getTimestamp + * @see #getParams * @since 1.4 */ public void setTimestamp(String parameterName, java.sql.Timestamp x) @@ -3712,7 +3712,7 @@ * or <code>STRUCT</code> data type and the JDBC driver does not support * this data type * @see Types - * @see #getObject + * @see #getParams * @since 1.4 */ public void setObject(String parameterName, Object x, int targetSqlType, int scale) @@ -3740,7 +3740,7 @@ * <code>REF</code>, <code>ROWID</code>, <code>SQLXML</code> * or <code>STRUCT</code> data type and the JDBC driver does not support * this data type - * @see #getObject + * @see #getParams * @since 1.4 */ public void setObject(String parameterName, Object x, int targetSqlType) @@ -3782,7 +3782,7 @@ * <code>Object</code> parameter is ambiguous * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method - * @see #getObject + * @see #getParams * @since 1.4 */ public void setObject(String parameterName, Object x) throws SQLException{ @@ -4064,7 +4064,7 @@ * this method is called on a closed <code>CallableStatement</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method - * @see #getDate + * @see #getParams * @since 1.4 */ public void setDate(String parameterName, java.sql.Date x) @@ -4091,7 +4091,7 @@ * this method is called on a closed <code>CallableStatement</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method - * @see #getDate + * @see #getParams * @since 1.4 */ public void setDate(String parameterName, java.sql.Date x, Calendar cal) @@ -4111,7 +4111,7 @@ * this method is called on a closed <code>CallableStatement</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method - * @see #getTime + * @see #getParams * @since 1.4 */ public void setTime(String parameterName, java.sql.Time x) @@ -4138,7 +4138,7 @@ * this method is called on a closed <code>CallableStatement</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method - * @see #getTime + * @see #getParams * @since 1.4 */ public void setTime(String parameterName, java.sql.Time x, Calendar cal) @@ -4165,7 +4165,7 @@ * this method is called on a closed <code>CallableStatement</code> * @exception SQLFeatureNotSupportedException if the JDBC driver does not support * this method - * @see #getTimestamp + * @see #getParams * @since 1.4 */ public void setTimestamp(String parameterName, java.sql.Timestamp x, Calendar cal)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/misc/PerfCounter.java Wed Jul 05 17:01:05 2017 +0200 @@ -0,0 +1,191 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package sun.misc; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.LongBuffer; +import java.security.AccessController; + +/** + * Performance counter support for internal JRE classes. + * This class defines a fixed list of counters for the platform + * to use as an interim solution until RFE# 6209222 is implemented. + * The perf counters will be created in the jvmstat perf buffer + * that the HotSpot VM creates. The default size is 32K and thus + * the number of counters is bounded. You can alter the size + * with -XX:PerfDataMemorySize=<bytes> option. If there is + * insufficient memory in the jvmstat perf buffer, the C heap memory + * will be used and thus the application will continue to run if + * the counters added exceeds the buffer size but the counters + * will be missing. + * + * See HotSpot jvmstat implementation for certain circumstances + * that the jvmstat perf buffer is not supported. + * + */ +public class PerfCounter { + private static final Perf perf = + AccessController.doPrivileged(new Perf.GetPerfAction()); + + // Must match values defined in hotspot/src/share/vm/runtime/perfdata.hpp + private final static int V_Constant = 1; + private final static int V_Monotonic = 2; + private final static int V_Variable = 3; + private final static int U_None = 1; + + private final String name; + private final LongBuffer lb; + + private PerfCounter(String name, int type) { + this.name = name; + ByteBuffer bb = perf.createLong(name, U_None, type, 0L); + bb.order(ByteOrder.nativeOrder()); + this.lb = bb.asLongBuffer(); + } + + static PerfCounter newPerfCounter(String name) { + return new PerfCounter(name, V_Variable); + } + + static PerfCounter newConstantPerfCounter(String name) { + PerfCounter c = new PerfCounter(name, V_Constant); + return c; + } + + /** + * Returns the current value of the perf counter. + */ + public synchronized long get() { + return lb.get(0); + } + + /** + * Sets the value of the perf counter to the given newValue. + */ + public synchronized void set(long newValue) { + lb.put(0, newValue); + } + + /** + * Adds the given value to the perf counter. + */ + public synchronized void add(long value) { + long res = get() + value; + lb.put(0, res); + } + + /** + * Increments the perf counter with 1. + */ + public void increment() { + add(1); + } + + /** + * Adds the given interval to the perf counter. + */ + public void addTime(long interval) { + add(interval); + } + + /** + * Adds the elapsed time from the given start time (ns) to the perf counter. + */ + public void addElapsedTimeFrom(long startTime) { + add(System.nanoTime() - startTime); + } + + @Override + public String toString() { + return name + " = " + get(); + } + + static class CoreCounters { + static final PerfCounter pdt = newPerfCounter("sun.classloader.parentDelegationTime"); + static final PerfCounter lc = newPerfCounter("sun.classloader.findClasses"); + static final PerfCounter lct = newPerfCounter("sun.classloader.findClassTime"); + static final PerfCounter rcbt = newPerfCounter("sun.urlClassLoader.readClassBytesTime"); + static final PerfCounter zfc = newPerfCounter("sun.zip.zipFiles"); + static final PerfCounter zfot = newPerfCounter("sun.zip.zipFile.openTime"); + } + + static class WindowsClientCounters { + static final PerfCounter d3dAvailable = newConstantPerfCounter("sun.java2d.d3d.available"); + } + + /** + * Number of findClass calls + */ + public static PerfCounter getFindClasses() { + return CoreCounters.lc; + } + + /** + * Time (ns) spent in finding classes that includes + * lookup and read class bytes and defineClass + */ + public static PerfCounter getFindClassTime() { + return CoreCounters.lct; + } + + /** + * Time (ns) spent in finding classes + */ + public static PerfCounter getReadClassBytesTime() { + return CoreCounters.rcbt; + } + + /** + * Time (ns) spent in the parent delegation to + * the parent of the defining class loader + */ + public static PerfCounter getParentDelegationTime() { + return CoreCounters.pdt; + } + + /** + * Number of zip files opened. + */ + public static PerfCounter getZipFileCount() { + return CoreCounters.zfc; + } + + /** + * Time (ns) spent in opening the zip files that + * includes building the entries hash table + */ + public static PerfCounter getZipFileOpenTime() { + return CoreCounters.zfot; + } + + /** + * D3D graphic pipeline available + */ + public static PerfCounter getD3DAvailable() { + return WindowsClientCounters.d3dAvailable; + } +}
--- a/jdk/src/share/classes/sun/net/spi/DefaultProxySelector.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/net/spi/DefaultProxySelector.java Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2009 Sun Microsystems, Inc. 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 @@ -25,11 +25,9 @@ package sun.net.spi; -import sun.net.www.http.*; import sun.net.NetProperties; import java.net.*; import java.util.*; -import java.util.regex.*; import java.io.*; import sun.misc.RegexpPool; import java.security.AccessController; @@ -102,17 +100,22 @@ */ static class NonProxyInfo { + // Default value for nonProxyHosts, this provides backward compatibility + // by excluding localhost and its litteral notations. + static final String defStringVal = "localhost|127.*|[::1]"; + String hostsSource; RegexpPool hostsPool; - String property; + final String property; + final String defaultVal; + static NonProxyInfo ftpNonProxyInfo = new NonProxyInfo("ftp.nonProxyHosts", null, null, defStringVal); + static NonProxyInfo httpNonProxyInfo = new NonProxyInfo("http.nonProxyHosts", null, null, defStringVal); - static NonProxyInfo ftpNonProxyInfo = new NonProxyInfo("ftp.nonProxyHosts", null, null); - static NonProxyInfo httpNonProxyInfo = new NonProxyInfo("http.nonProxyHosts", null, null); - - NonProxyInfo(String p, String s, RegexpPool pool) { + NonProxyInfo(String p, String s, RegexpPool pool, String d) { property = p; hostsSource = s; hostsPool = pool; + defaultVal = d; } } @@ -130,7 +133,6 @@ } String protocol = uri.getScheme(); String host = uri.getHost(); - int port = uri.getPort(); if (host == null) { // This is a hack to ensure backward compatibility in two @@ -149,11 +151,6 @@ } i = auth.lastIndexOf(':'); if (i >= 0) { - try { - port = Integer.parseInt(auth.substring(i+1)); - } catch (NumberFormatException e) { - port = -1; - } auth = auth.substring(0,i); } host = auth; @@ -165,13 +162,6 @@ } List<Proxy> proxyl = new ArrayList<Proxy>(1); - // special case localhost and loopback addresses to - // not go through proxy - if (isLoopback(host)) { - proxyl.add(Proxy.NO_PROXY); - return proxyl; - } - NonProxyInfo pinfo = null; if ("http".equalsIgnoreCase(protocol)) { @@ -244,9 +234,14 @@ nphosts = NetProperties.get(nprop.property); synchronized (nprop) { if (nphosts == null) { - nprop.hostsSource = null; - nprop.hostsPool = null; - } else { + if (nprop.defaultVal != null) { + nphosts = nprop.defaultVal; + } else { + nprop.hostsSource = null; + nprop.hostsPool = null; + } + } + if (nphosts != null) { if (!nphosts.equals(nprop.hostsSource)) { RegexpPool pool = new RegexpPool(); StringTokenizer st = new StringTokenizer(nphosts, "|", false); @@ -334,107 +329,6 @@ } } - private boolean isLoopback(String host) { - if (host == null || host.length() == 0) - return false; - - if (host.equalsIgnoreCase("localhost")) - return true; - - /* The string could represent a numerical IP address. - * For IPv4 addresses, check whether it starts with 127. - * For IPv6 addresses, check whether it is ::1 or its equivalent. - * Don't check IPv4-mapped or IPv4-compatible addresses - */ - - if (host.startsWith("127.")) { - // possible IPv4 loopback address - int p = 4; - int q; - int n = host.length(); - // Per RFC2732: At most three digits per byte - // Further constraint: Each element fits in a byte - if ((q = scanByte(host, p, n)) <= p) return false; p = q; - if ((q = scan(host, p, n, '.')) <= p) return q == n && number > 0; p = q; - if ((q = scanByte(host, p, n)) <= p) return false; p = q; - if ((q = scan(host, p, n, '.')) <= p) return q == n && number > 0; p = q; - if ((q = scanByte(host, p, n)) <= p) return false; - return q == n && number > 0; - } - - if (host.endsWith(":1")) { - final Pattern p6 = Pattern.compile("::1|(0:){7}1|(0:){1,6}:1"); - return p6.matcher(host).matches(); - } - return false; - } - - // Character-class masks, in reverse order from RFC2396 because - // initializers for static fields cannot make forward references. - - // Compute a low-order mask for the characters - // between first and last, inclusive - private static long lowMask(char first, char last) { - long m = 0; - int f = Math.max(Math.min(first, 63), 0); - int l = Math.max(Math.min(last, 63), 0); - for (int i = f; i <= l; i++) - m |= 1L << i; - return m; - } - // digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | - // "8" | "9" - private static final long L_DIGIT = lowMask('0', '9'); - private static final long H_DIGIT = 0L; - - // Scan a string of decimal digits whose value fits in a byte - // - private int number; - private int scanByte(String input, int start, int n) - { - int p = start; - int q = scan(input, p, n, L_DIGIT, H_DIGIT); - if (q <= p) return q; - number = Integer.parseInt(input.substring(p, q)); - if (number > 255) return p; - return q; - } - - // Scan a specific char: If the char at the given start position is - // equal to c, return the index of the next char; otherwise, return the - // start position. - // - private int scan(String input, int start, int end, char c) { - if ((start < end) && (input.charAt(start) == c)) - return start + 1; - return start; - } - - // Scan chars that match the given mask pair - // - private int scan(String input, int start, int n, long lowMask, long highMask) - { - int p = start; - while (p < n) { - char c = input.charAt(p); - if (match(c, lowMask, highMask)) { - p++; - continue; - } - break; - } - return p; - } - - // Tell whether the given character is permitted by the given mask pair - private boolean match(char c, long lowMask, long highMask) { - if (c < 64) - return ((1L << c) & lowMask) != 0; - if (c < 128) - return ((1L << (c - 64)) & highMask) != 0; - return false; - } - private native static boolean init(); private native Proxy getSystemProxy(String protocol, String host); }
--- a/jdk/src/share/classes/sun/net/www/http/HttpCapture.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/net/www/http/HttpCapture.java Wed Jul 05 17:01:05 2017 +0200 @@ -24,14 +24,12 @@ */ package sun.net.www.http; + import java.io.*; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.logging.Level; -import java.util.logging.Logger; +import java.util.regex.*; import sun.net.NetProperties; -import java.util.regex.*; +import sun.util.logging.PlatformLogger; /** * Main class of the HTTP traffic capture tool. @@ -62,76 +60,6 @@ private static boolean initialized = false; private static volatile ArrayList<Pattern> patterns = null; private static volatile ArrayList<String> capFiles = null; - /* Logging is done in an ugly way so that it does not require the presence - * the java.util.logging package. If the Logger class is not available, then - * logging is turned off. This is for helping the modularization effort. - */ - private static Object logger = null; - private static boolean logging = false; - - static { - Class cl; - try { - cl = Class.forName("java.util.logging.Logger"); - } catch (ClassNotFoundException ex) { - cl = null; - } - if (cl != null) { - try { - Method m = cl.getMethod("getLogger", String.class); - logger = m.invoke(null, "sun.net.www.protocol.http.HttpURLConnection"); - logging = true; - } catch (NoSuchMethodException noSuchMethodException) { - } catch (SecurityException securityException) { - } catch (IllegalAccessException illegalAccessException) { - } catch (IllegalArgumentException illegalArgumentException) { - } catch (InvocationTargetException invocationTargetException) { - } - } - } - - public static void fine(String s) { - if (logging) { - ((Logger)logger).fine(s); - } - } - - public static void finer(String s) { - if (logging) { - ((Logger)logger).finer(s); - } - } - - public static void finest(String s) { - if (logging) { - ((Logger)logger).finest(s); - } - } - - public static void severe(String s) { - if (logging) { - ((Logger)logger).finest(s); - } - } - - public static void info(String s) { - if (logging) { - ((Logger)logger).info(s); - } - } - - public static void warning(String s) { - if (logging) { - ((Logger)logger).warning(s); - } - } - - public static boolean isLoggable(String level) { - if (!logging) { - return false; - } - return ((Logger)logger).isLoggable(Level.parse(level)); - } private static synchronized void init() { initialized = true; @@ -187,7 +115,7 @@ out = new BufferedWriter(new FileWriter(file, true)); out.write("URL: " + url + "\n"); } catch (IOException ex) { - Logger.getLogger(HttpCapture.class.getName()).log(Level.SEVERE, null, ex); + PlatformLogger.getLogger(HttpCapture.class.getName()).severe(null, ex); } }
--- a/jdk/src/share/classes/sun/net/www/http/HttpClient.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/net/www/http/HttpClient.java Wed Jul 05 17:01:05 2017 +0200 @@ -35,6 +35,7 @@ import sun.net.www.MeteredStream; import sun.net.www.ParseUtil; import sun.net.www.protocol.http.HttpURLConnection; +import sun.util.logging.PlatformLogger; /** * @author Herb Jellinek @@ -804,8 +805,9 @@ if (isKeepingAlive()) { // Wrap KeepAliveStream if keep alive is enabled. - if (HttpCapture.isLoggable("FINEST")) { - HttpCapture.finest("KeepAlive stream used: " + url); + PlatformLogger logger = HttpURLConnection.getHttpLogger(); + if (logger.isLoggable(PlatformLogger.FINEST)) { + logger.finest("KeepAlive stream used: " + url); } serverInput = new KeepAliveStream(serverInput, pi, cl, this); failedOnce = false;
--- a/jdk/src/share/classes/sun/net/www/http/KeepAliveCache.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/net/www/http/KeepAliveCache.java Wed Jul 05 17:01:05 2017 +0200 @@ -25,12 +25,11 @@ package sun.net.www.http; -import java.io.InputStream; import java.io.IOException; import java.io.NotSerializableException; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; import java.net.URL; -import java.util.concurrent.ConcurrentHashMap; /** * A class that implements a cache of idle Http connections for keep-alive @@ -39,7 +38,7 @@ * @author Dave Brown */ public class KeepAliveCache - extends ConcurrentHashMap<KeepAliveKey, ClientVector> + extends HashMap<KeepAliveKey, ClientVector> implements Runnable { private static final long serialVersionUID = -2937172892064557949L; @@ -163,8 +162,8 @@ * Errs on the side of caution (leave connections idle for a relatively * short time). */ + @Override public void run() { - int total_cache; do { try { Thread.sleep(LIFETIME); @@ -311,6 +310,7 @@ /** * Determine whether or not two objects of this type are equal */ + @Override public boolean equals(Object obj) { if ((obj instanceof KeepAliveKey) == false) return false; @@ -325,6 +325,7 @@ * The hashCode() for this object is the string hashCode() of * concatenation of the protocol, host name and port. */ + @Override public int hashCode() { String str = protocol+host+port; return this.obj == null? str.hashCode() :
--- a/jdk/src/share/classes/sun/net/www/http/KeepAliveStream.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/net/www/http/KeepAliveStream.java Wed Jul 05 17:01:05 2017 +0200 @@ -25,10 +25,7 @@ package sun.net.www.http; -import java.net.URL; -import java.net.HttpURLConnection; import java.io.*; -import java.util.StringTokenizer; import sun.net.ProgressSource; import sun.net.www.MeteredStream; @@ -50,9 +47,8 @@ // has this KeepAliveStream been put on the queue for asynchronous cleanup. protected boolean queuedForCleanup = false; - private static KeepAliveStreamCleaner queue = new KeepAliveStreamCleaner(); - private static Thread cleanerThread = null; - private static boolean startCleanupThread; + private static final KeepAliveStreamCleaner queue = new KeepAliveStreamCleaner(); + private static Thread cleanerThread; // null /** * Constructor @@ -155,43 +151,46 @@ } } - private static synchronized void queueForCleanup(KeepAliveCleanerEntry kace) { - if(queue != null && !kace.getQueuedForCleanup()) { - if (!queue.offer(kace)) { - kace.getHttpClient().closeServer(); - return; + private static void queueForCleanup(KeepAliveCleanerEntry kace) { + synchronized(queue) { + if(!kace.getQueuedForCleanup()) { + if (!queue.offer(kace)) { + kace.getHttpClient().closeServer(); + return; + } + + kace.setQueuedForCleanup(); + queue.notifyAll(); } - kace.setQueuedForCleanup(); - } + boolean startCleanupThread = (cleanerThread == null); + if (!startCleanupThread) { + if (!cleanerThread.isAlive()) { + startCleanupThread = true; + } + } - startCleanupThread = (cleanerThread == null); - if (!startCleanupThread) { - if (!cleanerThread.isAlive()) { - startCleanupThread = true; + if (startCleanupThread) { + java.security.AccessController.doPrivileged( + new java.security.PrivilegedAction<Void>() { + public Void run() { + // We want to create the Keep-Alive-SocketCleaner in the + // system threadgroup + ThreadGroup grp = Thread.currentThread().getThreadGroup(); + ThreadGroup parent = null; + while ((parent = grp.getParent()) != null) { + grp = parent; + } + + cleanerThread = new Thread(grp, queue, "Keep-Alive-SocketCleaner"); + cleanerThread.setDaemon(true); + cleanerThread.setPriority(Thread.MAX_PRIORITY - 2); + cleanerThread.start(); + return null; + } + }); } - } - - if (startCleanupThread) { - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction<Void>() { - public Void run() { - // We want to create the Keep-Alive-SocketCleaner in the - // system threadgroup - ThreadGroup grp = Thread.currentThread().getThreadGroup(); - ThreadGroup parent = null; - while ((parent = grp.getParent()) != null) { - grp = parent; - } - - cleanerThread = new Thread(grp, queue, "Keep-Alive-SocketCleaner"); - cleanerThread.setDaemon(true); - cleanerThread.setPriority(Thread.MAX_PRIORITY - 2); - cleanerThread.start(); - return null; - } - }); - } + } // queue } protected long remainingToRead() {
--- a/jdk/src/share/classes/sun/net/www/http/KeepAliveStreamCleaner.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/net/www/http/KeepAliveStreamCleaner.java Wed Jul 05 17:01:05 2017 +0200 @@ -25,9 +25,8 @@ package sun.net.www.http; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; import java.io.IOException; +import java.util.LinkedList; import sun.net.NetProperties; import java.security.AccessController; import java.security.PrivilegedAction; @@ -44,7 +43,9 @@ */ @SuppressWarnings("serial") // never serialized -public class KeepAliveStreamCleaner extends LinkedBlockingQueue<KeepAliveCleanerEntry> implements Runnable +class KeepAliveStreamCleaner + extends LinkedList<KeepAliveCleanerEntry> + implements Runnable { // maximum amount of remaining data that we will try to cleanup protected static int MAX_DATA_REMAINING = 512; @@ -78,23 +79,39 @@ } - public KeepAliveStreamCleaner() - { - super(MAX_CAPACITY); + @Override + public boolean offer(KeepAliveCleanerEntry e) { + if (size() >= MAX_CAPACITY) + return false; + + return super.offer(e); } - public KeepAliveStreamCleaner(int capacity) - { - super(capacity); - } - + @Override public void run() { KeepAliveCleanerEntry kace = null; do { try { - kace = poll((long)TIMEOUT, TimeUnit.MILLISECONDS); + synchronized(this) { + long before = System.currentTimeMillis(); + long timeout = TIMEOUT; + while ((kace = poll()) == null) { + this.wait(timeout); + + long after = System.currentTimeMillis(); + long elapsed = after - before; + if (elapsed > timeout) { + /* one last try */ + kace = poll(); + break; + } + before = after; + timeout -= elapsed; + } + } + if(kace == null) break;
--- a/jdk/src/share/classes/sun/net/www/protocol/http/AuthCache.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/net/www/protocol/http/AuthCache.java Wed Jul 05 17:01:05 2017 +0200 @@ -25,14 +25,6 @@ package sun.net.www.protocol.http; -import java.io.IOException; -import java.net.URL; -import java.util.Hashtable; -import java.util.LinkedList; -import java.util.ListIterator; -import java.util.Enumeration; -import java.util.HashMap; - /** * @author Michael McMahon * @@ -49,7 +41,7 @@ * A:[B:]C:D:E[:F] Between 4 and 6 fields separated by ":" * where the fields have the following meaning: * A is "s" or "p" for server or proxy authentication respectively - * B is optional and is "D", "B", or "N" for digest, basic or ntlm auth. + * B is optional and is the {@link AuthScheme}, e.g. BASIC, DIGEST, NTLM, etc * C is either "http" or "https" * D is the hostname * E is the port number
--- a/jdk/src/share/classes/sun/net/www/protocol/http/AuthCacheValue.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/net/www/protocol/http/AuthCacheValue.java Wed Jul 05 17:01:05 2017 +0200 @@ -25,15 +25,8 @@ package sun.net.www.protocol.http; -import java.io.IOException; import java.io.Serializable; -import java.net.*; -import java.util.Hashtable; -import java.util.LinkedList; -import java.util.ListIterator; -import java.util.Enumeration; -import java.util.HashMap; - +import java.net.PasswordAuthentication; /** * AuthCacheValue: interface to minimise exposure to authentication cache @@ -62,8 +55,16 @@ AuthCacheValue() {} + /** + * Proxy or Server + */ abstract Type getAuthType (); + /** + * Authentication scheme + */ + abstract AuthScheme getAuthScheme(); + /** * name of server/proxy */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/net/www/protocol/http/AuthScheme.java Wed Jul 05 17:01:05 2017 +0200 @@ -0,0 +1,38 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package sun.net.www.protocol.http; + +/* Authentication schemes supported by the http implementation. New schemes, if + * supported, should be defined here. + */ +public enum AuthScheme { + BASIC, + DIGEST, + NTLM, + NEGOTIATE, + KERBEROS, + UNKNOWN; +} +
--- a/jdk/src/share/classes/sun/net/www/protocol/http/AuthenticationInfo.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/net/www/protocol/http/AuthenticationInfo.java Wed Jul 05 17:01:05 2017 +0200 @@ -85,6 +85,11 @@ AuthCacheValue.Type.Server: AuthCacheValue.Type.Proxy; } + + AuthScheme getAuthScheme() { + return authScheme; + } + public String getHost() { return host; } @@ -151,7 +156,7 @@ } //public String toString () { - //return ("{"+type+":"+authType+":"+protocol+":"+host+":"+port+":"+realm+":"+path+"}"); + //return ("{"+type+":"+authScheme+":"+protocol+":"+host+":"+port+":"+realm+":"+path+"}"); //} // REMIND: This cache just grows forever. We should put in a bounded @@ -160,8 +165,8 @@ /** The type (server/proxy) of authentication this is. Used for key lookup */ char type; - /** The authentication type (basic/digest). Also used for key lookup */ - char authType; + /** The authentication scheme (basic/digest). Also used for key lookup */ + AuthScheme authScheme; /** The protocol/scheme (i.e. http or https ). Need to keep the caches * logically separate for the two protocols. This field is only used @@ -183,9 +188,9 @@ String path; /** Use this constructor only for proxy entries */ - AuthenticationInfo(char type, char authType, String host, int port, String realm) { + AuthenticationInfo(char type, AuthScheme authScheme, String host, int port, String realm) { this.type = type; - this.authType = authType; + this.authScheme = authScheme; this.protocol = ""; this.host = host.toLowerCase(); this.port = port; @@ -206,9 +211,9 @@ * Constructor used to limit the authorization to the path within * the URL. Use this constructor for origin server entries. */ - AuthenticationInfo(char type, char authType, URL url, String realm) { + AuthenticationInfo(char type, AuthScheme authScheme, URL url, String realm) { this.type = type; - this.authType = authType; + this.authScheme = authScheme; this.protocol = url.getProtocol().toLowerCase(); this.host = url.getHost().toLowerCase(); this.port = url.getPort(); @@ -264,12 +269,12 @@ * In this case we do not use the path because the protection space * is identified by the host:port:realm only */ - static AuthenticationInfo getServerAuth(URL url, String realm, char atype) { + static AuthenticationInfo getServerAuth(URL url, String realm, AuthScheme scheme) { int port = url.getPort(); if (port == -1) { port = url.getDefaultPort(); } - String key = SERVER_AUTHENTICATION + ":" + atype + ":" + url.getProtocol().toLowerCase() + String key = SERVER_AUTHENTICATION + ":" + scheme + ":" + url.getProtocol().toLowerCase() + ":" + url.getHost().toLowerCase() + ":" + port + ":" + realm; AuthenticationInfo cached = getAuth(key, null); if ((cached == null) && requestIsInProgress (key)) { @@ -308,8 +313,8 @@ * Used in response to a challenge. Note, the protocol field is always * blank for proxies. */ - static AuthenticationInfo getProxyAuth(String host, int port, String realm, char atype) { - String key = PROXY_AUTHENTICATION + ":" + atype + "::" + host.toLowerCase() + static AuthenticationInfo getProxyAuth(String host, int port, String realm, AuthScheme scheme) { + String key = PROXY_AUTHENTICATION + ":" + scheme + "::" + host.toLowerCase() + ":" + port + ":" + realm; AuthenticationInfo cached = (AuthenticationInfo) cache.get(key, null); if ((cached == null) && requestIsInProgress (key)) { @@ -409,7 +414,7 @@ // This must be kept in sync with the getXXXAuth() methods in this // class. if (includeRealm) { - return type + ":" + authType + ":" + protocol + ":" + return type + ":" + authScheme + ":" + protocol + ":" + host + ":" + port + ":" + realm; } else { return type + ":" + protocol + ":" + host + ":" + port;
--- a/jdk/src/share/classes/sun/net/www/protocol/http/BasicAuthentication.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/net/www/protocol/http/BasicAuthentication.java Wed Jul 05 17:01:05 2017 +0200 @@ -44,8 +44,6 @@ private static final long serialVersionUID = 100L; - static final char BASIC_AUTH = 'B'; - /** The authentication string for this host, port, and realm. This is a simple BASE64 encoding of "login:password". */ String auth; @@ -56,7 +54,7 @@ public BasicAuthentication(boolean isProxy, String host, int port, String realm, PasswordAuthentication pw) { super(isProxy ? PROXY_AUTHENTICATION : SERVER_AUTHENTICATION, - BASIC_AUTH, host, port, realm); + AuthScheme.BASIC, host, port, realm); String plain = pw.getUserName() + ":"; byte[] nameBytes = null; try { @@ -86,7 +84,7 @@ public BasicAuthentication(boolean isProxy, String host, int port, String realm, String auth) { super(isProxy ? PROXY_AUTHENTICATION : SERVER_AUTHENTICATION, - BASIC_AUTH, host, port, realm); + AuthScheme.BASIC, host, port, realm); this.auth = "Basic " + auth; } @@ -96,7 +94,7 @@ public BasicAuthentication(boolean isProxy, URL url, String realm, PasswordAuthentication pw) { super(isProxy ? PROXY_AUTHENTICATION : SERVER_AUTHENTICATION, - BASIC_AUTH, url, realm); + AuthScheme.BASIC, url, realm); String plain = pw.getUserName() + ":"; byte[] nameBytes = null; try { @@ -126,7 +124,7 @@ public BasicAuthentication(boolean isProxy, URL url, String realm, String auth) { super(isProxy ? PROXY_AUTHENTICATION : SERVER_AUTHENTICATION, - BASIC_AUTH, url, realm); + AuthScheme.BASIC, url, realm); this.auth = "Basic " + auth; }
--- a/jdk/src/share/classes/sun/net/www/protocol/http/DigestAuthentication.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/net/www/protocol/http/DigestAuthentication.java Wed Jul 05 17:01:05 2017 +0200 @@ -38,7 +38,6 @@ import java.security.NoSuchAlgorithmException; import static sun.net.www.protocol.http.HttpURLConnection.HTTP_CONNECT; - /** * DigestAuthentication: Encapsulate an http server authentication using * the "Digest" scheme, as described in RFC2069 and updated in RFC2617 @@ -50,8 +49,6 @@ private static final long serialVersionUID = 100L; - static final char DIGEST_AUTH = 'D'; - private String authMethod; // Authentication parameters defined in RFC2617. @@ -178,7 +175,10 @@ public DigestAuthentication(boolean isProxy, URL url, String realm, String authMethod, PasswordAuthentication pw, Parameters params) { - super(isProxy?PROXY_AUTHENTICATION:SERVER_AUTHENTICATION, DIGEST_AUTH,url, realm); + super(isProxy ? PROXY_AUTHENTICATION : SERVER_AUTHENTICATION, + AuthScheme.DIGEST, + url, + realm); this.authMethod = authMethod; this.pw = pw; this.params = params; @@ -187,7 +187,11 @@ public DigestAuthentication(boolean isProxy, String host, int port, String realm, String authMethod, PasswordAuthentication pw, Parameters params) { - super(isProxy?PROXY_AUTHENTICATION:SERVER_AUTHENTICATION, DIGEST_AUTH,host, port, realm); + super(isProxy ? PROXY_AUTHENTICATION : SERVER_AUTHENTICATION, + AuthScheme.DIGEST, + host, + port, + realm); this.authMethod = authMethod; this.pw = pw; this.params = params;
--- a/jdk/src/share/classes/sun/net/www/protocol/http/HttpLogFormatter.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/net/www/protocol/http/HttpLogFormatter.java Wed Jul 05 17:01:05 2017 +0200 @@ -49,8 +49,10 @@ @Override public String format(LogRecord record) { - if (!"sun.net.www.http.HttpCapture".equalsIgnoreCase(record.getSourceClassName())) { - // Don't change format for stuff that doesn't concern us + String sourceClassName = record.getSourceClassName(); + if (sourceClassName == null || + !(sourceClassName.startsWith("sun.net.www.protocol.http") || + sourceClassName.startsWith("sun.net.www.http"))) { return super.format(record); } String src = record.getMessage();
--- a/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Wed Jul 05 17:01:05 2017 +0200 @@ -57,11 +57,17 @@ import sun.net.www.http.PosterOutputStream; import sun.net.www.http.ChunkedInputStream; import sun.net.www.http.ChunkedOutputStream; -import sun.net.www.http.HttpCapture; +import sun.util.logging.PlatformLogger; import java.text.SimpleDateFormat; import java.util.TimeZone; import java.net.MalformedURLException; import java.nio.ByteBuffer; +import static sun.net.www.protocol.http.AuthScheme.BASIC; +import static sun.net.www.protocol.http.AuthScheme.DIGEST; +import static sun.net.www.protocol.http.AuthScheme.NTLM; +import static sun.net.www.protocol.http.AuthScheme.NEGOTIATE; +import static sun.net.www.protocol.http.AuthScheme.KERBEROS; +import static sun.net.www.protocol.http.AuthScheme.UNKNOWN; /** * A class to represent an HTTP connection to a remote object. @@ -231,9 +237,11 @@ boolean needToCheck = true; private boolean doingNTLM2ndStage = false; /* doing the 2nd stage of an NTLM server authentication */ private boolean doingNTLMp2ndStage = false; /* doing the 2nd stage of an NTLM proxy authentication */ - /* try auth without calling Authenticator */ - private boolean tryTransparentNTLMServer = NTLMAuthentication.supportsTransparentAuth(); - private boolean tryTransparentNTLMProxy = NTLMAuthentication.supportsTransparentAuth(); + + /* try auth without calling Authenticator. Used for transparent NTLM authentication */ + private boolean tryTransparentNTLMServer = true; + private boolean tryTransparentNTLMProxy = true; + /* Used by Windows specific code */ Object authObj; @@ -284,6 +292,10 @@ private int connectTimeout = -1; private int readTimeout = -1; + /* Logging support */ + private static final PlatformLogger logger = + PlatformLogger.getLogger("sun.net.www.protocol.http.HttpURLConnection"); + /* * privileged request password authentication * @@ -301,20 +313,25 @@ return java.security.AccessController.doPrivileged( new java.security.PrivilegedAction<PasswordAuthentication>() { public PasswordAuthentication run() { - if (HttpCapture.isLoggable("FINEST")) { - HttpCapture.finest("Requesting Authentication: host =" + host + " url = " + url); + if (logger.isLoggable(PlatformLogger.FINEST)) { + logger.finest("Requesting Authentication: host =" + host + " url = " + url); } PasswordAuthentication pass = Authenticator.requestPasswordAuthentication( host, addr, port, protocol, prompt, scheme, url, authType); - if (HttpCapture.isLoggable("FINEST")) { - HttpCapture.finest("Authentication returned: " + (pass != null ? pass.toString() : "null")); + if (logger.isLoggable(PlatformLogger.FINEST)) { + logger.finest("Authentication returned: " + (pass != null ? pass.toString() : "null")); } return pass; } }); } + /* Logging support */ + public static PlatformLogger getHttpLogger() { + return logger; + } + /* * checks the validity of http message header and throws * IllegalArgumentException if invalid. @@ -463,8 +480,8 @@ setRequests=true; } - if (HttpCapture.isLoggable("FINE")) { - HttpCapture.fine(requests.toString()); + if (logger.isLoggable(PlatformLogger.FINE)) { + logger.fine(requests.toString()); } http.writeRequests(requests, poster); if (ps.checkError()) { @@ -728,9 +745,9 @@ && !(cachedResponse instanceof SecureCacheResponse)) { cachedResponse = null; } - if (HttpCapture.isLoggable("FINEST")) { - HttpCapture.finest("Cache Request for " + uri + " / " + getRequestMethod()); - HttpCapture.finest("From cache: " + (cachedResponse != null ? cachedResponse.toString() : "null")); + if (logger.isLoggable(PlatformLogger.FINEST)) { + logger.finest("Cache Request for " + uri + " / " + getRequestMethod()); + logger.finest("From cache: " + (cachedResponse != null ? cachedResponse.toString() : "null")); } if (cachedResponse != null) { cachedHeaders = mapToMessageHeader(cachedResponse.getHeaders()); @@ -769,8 +786,8 @@ }); if (sel != null) { URI uri = sun.net.www.ParseUtil.toURI(url); - if (HttpCapture.isLoggable("FINEST")) { - HttpCapture.finest("ProxySelector Request for " + uri); + if (logger.isLoggable(PlatformLogger.FINEST)) { + logger.finest("ProxySelector Request for " + uri); } Iterator<Proxy> it = sel.select(uri).iterator(); Proxy p; @@ -786,9 +803,9 @@ http = getNewHttpClient(url, p, connectTimeout, false); http.setReadTimeout(readTimeout); } - if (HttpCapture.isLoggable("FINEST")) { + if (logger.isLoggable(PlatformLogger.FINEST)) { if (p != null) { - HttpCapture.finest("Proxy used: " + p.toString()); + logger.finest("Proxy used: " + p.toString()); } } break; @@ -1018,15 +1035,15 @@ URI uri = ParseUtil.toURI(url); if (uri != null) { - if (HttpCapture.isLoggable("FINEST")) { - HttpCapture.finest("CookieHandler request for " + uri); + if (logger.isLoggable(PlatformLogger.FINEST)) { + logger.finest("CookieHandler request for " + uri); } Map<String, List<String>> cookies = cookieHandler.get( uri, requests.getHeaders(EXCLUDE_HEADERS)); if (!cookies.isEmpty()) { - if (HttpCapture.isLoggable("FINEST")) { - HttpCapture.finest("Cookies retrieved: " + cookies.toString()); + if (logger.isLoggable(PlatformLogger.FINEST)) { + logger.finest("Cookies retrieved: " + cookies.toString()); } for (Map.Entry<String, List<String>> entry : cookies.entrySet()) { @@ -1157,8 +1174,8 @@ writeRequests(); } http.parseHTTP(responses, pi, this); - if (HttpCapture.isLoggable("FINE")) { - HttpCapture.fine(responses.toString()); + if (logger.isLoggable(PlatformLogger.FINE)) { + logger.fine(responses.toString()); } inputStream = http.getInputStream(); @@ -1270,7 +1287,7 @@ String raw = srvHdr.raw(); if (!doingNTLM2ndStage) { if ((serverAuthentication != null)&& - !(serverAuthentication instanceof NTLMAuthentication)) { + serverAuthentication.getAuthScheme() != NTLM) { if (serverAuthentication.isAuthorizationStale (raw)) { /* we can retry with the current credentials */ disconnectInternal(); @@ -1523,8 +1540,8 @@ */ private AuthenticationInfo resetProxyAuthentication(AuthenticationInfo proxyAuthentication, AuthenticationHeader auth) { - if ((proxyAuthentication != null )&& ! (proxyAuthentication instanceof - NTLMAuthentication)) { + if ((proxyAuthentication != null )&& + proxyAuthentication.getAuthScheme() != NTLM) { String raw = auth.raw(); if (proxyAuthentication.isAuthorizationStale (raw)) { /* we can retry with the current credentials */ @@ -1602,8 +1619,8 @@ http.parseHTTP(responses, null, this); /* Log the response to the CONNECT */ - if (HttpCapture.isLoggable("FINE")) { - HttpCapture.fine(responses.toString()); + if (logger.isLoggable(PlatformLogger.FINE)) { + logger.fine(responses.toString()); } statusLine = responses.getValue(0); @@ -1730,8 +1747,8 @@ setPreemptiveProxyAuthentication(requests); /* Log the CONNECT request */ - if (HttpCapture.isLoggable("FINE")) { - HttpCapture.fine(requests.toString()); + if (logger.isLoggable(PlatformLogger.FINE)) { + logger.fine(requests.toString()); } http.writeRequests(requests, null); @@ -1776,28 +1793,31 @@ HeaderParser p = authhdr.headerParser(); String realm = p.findValue("realm"); String scheme = authhdr.scheme(); - char schemeID; + AuthScheme authScheme = UNKNOWN; if ("basic".equalsIgnoreCase(scheme)) { - schemeID = BasicAuthentication.BASIC_AUTH; + authScheme = BASIC; } else if ("digest".equalsIgnoreCase(scheme)) { - schemeID = DigestAuthentication.DIGEST_AUTH; + authScheme = DIGEST; } else if ("ntlm".equalsIgnoreCase(scheme)) { - schemeID = NTLMAuthentication.NTLM_AUTH; + authScheme = NTLM; doingNTLMp2ndStage = true; } else if ("Kerberos".equalsIgnoreCase(scheme)) { - schemeID = NegotiateAuthentication.KERBEROS_AUTH; + authScheme = KERBEROS; doingNTLMp2ndStage = true; } else if ("Negotiate".equalsIgnoreCase(scheme)) { - schemeID = NegotiateAuthentication.NEGOTIATE_AUTH; + authScheme = NEGOTIATE; doingNTLMp2ndStage = true; - } else { - schemeID = 0; } + if (realm == null) realm = ""; - ret = AuthenticationInfo.getProxyAuth(host, port, realm, schemeID); + ret = AuthenticationInfo.getProxyAuth(host, + port, + realm, + authScheme); if (ret == null) { - if (schemeID == BasicAuthentication.BASIC_AUTH) { + switch (authScheme) { + case BASIC: InetAddress addr = null; try { final String finalHost = host; @@ -1818,9 +1838,9 @@ if (a != null) { ret = new BasicAuthentication(true, host, port, realm, a); } - } else if (schemeID == DigestAuthentication.DIGEST_AUTH) { - PasswordAuthentication a = - privilegedRequestPasswordAuthentication( + break; + case DIGEST: + a = privilegedRequestPasswordAuthentication( host, null, port, url.getProtocol(), realm, scheme, url, RequestorType.PROXY); if (a != null) { @@ -1829,29 +1849,49 @@ ret = new DigestAuthentication(true, host, port, realm, scheme, a, params); } - } else if (schemeID == NTLMAuthentication.NTLM_AUTH) { - PasswordAuthentication a = null; - if (!tryTransparentNTLMProxy) { - a = privilegedRequestPasswordAuthentication( - host, null, port, url.getProtocol(), - "", scheme, url, RequestorType.PROXY); + break; + case NTLM: + if (NTLMAuthenticationProxy.proxy.supported) { + /* tryTransparentNTLMProxy will always be true the first + * time around, but verify that the platform supports it + * otherwise don't try. */ + if (tryTransparentNTLMProxy) { + tryTransparentNTLMProxy = + NTLMAuthenticationProxy.proxy.supportsTransparentAuth; + } + a = null; + if (tryTransparentNTLMProxy) { + logger.finest("Trying Transparent NTLM authentication"); + } else { + a = privilegedRequestPasswordAuthentication( + host, null, port, url.getProtocol(), + "", scheme, url, RequestorType.PROXY); + } + /* If we are not trying transparent authentication then + * we need to have a PasswordAuthentication instance. For + * transparent authentication (Windows only) the username + * and password will be picked up from the current logged + * on users credentials. + */ + if (tryTransparentNTLMProxy || + (!tryTransparentNTLMProxy && a != null)) { + ret = NTLMAuthenticationProxy.proxy.create(true, host, port, a); + } + + /* set to false so that we do not try again */ + tryTransparentNTLMProxy = false; } - /* If we are not trying transparent authentication then - * we need to have a PasswordAuthentication instance. For - * transparent authentication (Windows only) the username - * and password will be picked up from the current logged - * on users credentials. - */ - if (tryTransparentNTLMProxy || - (!tryTransparentNTLMProxy && a != null)) { - ret = new NTLMAuthentication(true, host, port, a); - } - - tryTransparentNTLMProxy = false; - } else if (schemeID == NegotiateAuthentication.NEGOTIATE_AUTH) { + break; + case NEGOTIATE: ret = new NegotiateAuthentication(new HttpCallerInfo(authhdr.getHttpCallerInfo(), "Negotiate")); - } else if (schemeID == NegotiateAuthentication.KERBEROS_AUTH) { + break; + case KERBEROS: ret = new NegotiateAuthentication(new HttpCallerInfo(authhdr.getHttpCallerInfo(), "Kerberos")); + break; + case UNKNOWN: + logger.finest("Unknown/Unsupported authentication scheme: " + scheme); + default: + throw new AssertionError("should not reach here"); } } // For backwards compatibility, we also try defaultAuth @@ -1875,8 +1915,8 @@ } } } - if (HttpCapture.isLoggable("FINER")) { - HttpCapture.finer("Proxy Authentication for " + authhdr.toString() +" returned " + (ret != null ? ret.toString() : "null")); + if (logger.isLoggable(PlatformLogger.FINER)) { + logger.finer("Proxy Authentication for " + authhdr.toString() +" returned " + (ret != null ? ret.toString() : "null")); } return ret; } @@ -1896,27 +1936,26 @@ HeaderParser p = authhdr.headerParser(); String realm = p.findValue("realm"); String scheme = authhdr.scheme(); - char schemeID; + AuthScheme authScheme = UNKNOWN; if ("basic".equalsIgnoreCase(scheme)) { - schemeID = BasicAuthentication.BASIC_AUTH; + authScheme = BASIC; } else if ("digest".equalsIgnoreCase(scheme)) { - schemeID = DigestAuthentication.DIGEST_AUTH; + authScheme = DIGEST; } else if ("ntlm".equalsIgnoreCase(scheme)) { - schemeID = NTLMAuthentication.NTLM_AUTH; + authScheme = NTLM; doingNTLM2ndStage = true; } else if ("Kerberos".equalsIgnoreCase(scheme)) { - schemeID = NegotiateAuthentication.KERBEROS_AUTH; + authScheme = KERBEROS; doingNTLM2ndStage = true; } else if ("Negotiate".equalsIgnoreCase(scheme)) { - schemeID = NegotiateAuthentication.NEGOTIATE_AUTH; + authScheme = NEGOTIATE; doingNTLM2ndStage = true; - } else { - schemeID = 0; } + domain = p.findValue ("domain"); if (realm == null) realm = ""; - ret = AuthenticationInfo.getServerAuth(url, realm, schemeID); + ret = AuthenticationInfo.getServerAuth(url, realm, authScheme); InetAddress addr = null; if (ret == null) { try { @@ -1931,13 +1970,14 @@ port = url.getDefaultPort(); } if (ret == null) { - if (schemeID == NegotiateAuthentication.KERBEROS_AUTH) { + switch(authScheme) { + case KERBEROS: ret = new NegotiateAuthentication(new HttpCallerInfo(authhdr.getHttpCallerInfo(), "Kerberos")); - } - if (schemeID == NegotiateAuthentication.NEGOTIATE_AUTH) { + break; + case NEGOTIATE: ret = new NegotiateAuthentication(new HttpCallerInfo(authhdr.getHttpCallerInfo(), "Negotiate")); - } - if (schemeID == BasicAuthentication.BASIC_AUTH) { + break; + case BASIC: PasswordAuthentication a = privilegedRequestPasswordAuthentication( url.getHost(), addr, port, url.getProtocol(), @@ -1945,45 +1985,60 @@ if (a != null) { ret = new BasicAuthentication(false, url, realm, a); } - } - - if (schemeID == DigestAuthentication.DIGEST_AUTH) { - PasswordAuthentication a = - privilegedRequestPasswordAuthentication( + break; + case DIGEST: + a = privilegedRequestPasswordAuthentication( url.getHost(), addr, port, url.getProtocol(), realm, scheme, url, RequestorType.SERVER); if (a != null) { digestparams = new DigestAuthentication.Parameters(); ret = new DigestAuthentication(false, url, realm, scheme, a, digestparams); } - } + break; + case NTLM: + if (NTLMAuthenticationProxy.proxy.supported) { + URL url1; + try { + url1 = new URL (url, "/"); /* truncate the path */ + } catch (Exception e) { + url1 = url; + } - if (schemeID == NTLMAuthentication.NTLM_AUTH) { - URL url1; - try { - url1 = new URL (url, "/"); /* truncate the path */ - } catch (Exception e) { - url1 = url; + /* tryTransparentNTLMServer will always be true the first + * time around, but verify that the platform supports it + * otherwise don't try. */ + if (tryTransparentNTLMServer) { + tryTransparentNTLMServer = + NTLMAuthenticationProxy.proxy.supportsTransparentAuth; + } + a = null; + if (tryTransparentNTLMServer) { + logger.finest("Trying Transparent NTLM authentication"); + } else { + a = privilegedRequestPasswordAuthentication( + url.getHost(), addr, port, url.getProtocol(), + "", scheme, url, RequestorType.SERVER); + } + + /* If we are not trying transparent authentication then + * we need to have a PasswordAuthentication instance. For + * transparent authentication (Windows only) the username + * and password will be picked up from the current logged + * on users credentials. + */ + if (tryTransparentNTLMServer || + (!tryTransparentNTLMServer && a != null)) { + ret = NTLMAuthenticationProxy.proxy.create(false, url1, a); + } + + /* set to false so that we do not try again */ + tryTransparentNTLMServer = false; } - PasswordAuthentication a = null; - if (!tryTransparentNTLMServer) { - a = privilegedRequestPasswordAuthentication( - url.getHost(), addr, port, url.getProtocol(), - "", scheme, url, RequestorType.SERVER); - } - - /* If we are not trying transparent authentication then - * we need to have a PasswordAuthentication instance. For - * transparent authentication (Windows only) the username - * and password will be picked up from the current logged - * on users credentials. - */ - if (tryTransparentNTLMServer || - (!tryTransparentNTLMServer && a != null)) { - ret = new NTLMAuthentication(false, url1, a); - } - - tryTransparentNTLMServer = false; + break; + case UNKNOWN: + logger.finest("Unknown/Unsupported authentication scheme: " + scheme); + default: + throw new AssertionError("should not reach here"); } } @@ -2005,8 +2060,8 @@ } } } - if (HttpCapture.isLoggable("FINER")) { - HttpCapture.finer("Server Authentication for " + authhdr.toString() +" returned " + (ret != null ? ret.toString() : "null")); + if (logger.isLoggable(PlatformLogger.FINER)) { + logger.finer("Server Authentication for " + authhdr.toString() +" returned " + (ret != null ? ret.toString() : "null")); } return ret; } @@ -2081,8 +2136,8 @@ if (streaming()) { throw new HttpRetryException (RETRY_MSG3, stat, loc); } - if (HttpCapture.isLoggable("FINE")) { - HttpCapture.fine("Redirected from " + url + " to " + locUrl); + if (logger.isLoggable(PlatformLogger.FINE)) { + logger.fine("Redirected from " + url + " to " + locUrl); } // clear out old response headers!!!!
--- a/jdk/src/share/classes/sun/net/www/protocol/http/InMemoryCookieStore.java Mon Sep 28 19:39:40 2009 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,393 +0,0 @@ -/* - * Copyright 2005-2008 Sun Microsystems, Inc. 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. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -package sun.net.www.protocol.http; - -import java.net.URI; -import java.net.CookieStore; -import java.net.HttpCookie; -import java.net.URISyntaxException; -import java.util.List; -import java.util.Map; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Collections; -import java.util.Iterator; -import java.util.concurrent.locks.ReentrantLock; - -/** - * A simple in-memory java.net.CookieStore implementation - * - * @author Edward Wang - * @since 1.6 - */ -public class InMemoryCookieStore implements CookieStore { - // the in-memory representation of cookies - private List<HttpCookie> cookieJar = null; - - // the cookies are indexed by its domain and associated uri (if present) - // CAUTION: when a cookie removed from main data structure (i.e. cookieJar), - // it won't be cleared in domainIndex & uriIndex. Double-check the - // presence of cookie when retrieve one form index store. - private Map<String, List<HttpCookie>> domainIndex = null; - private Map<URI, List<HttpCookie>> uriIndex = null; - - // use ReentrantLock instead of syncronized for scalability - private ReentrantLock lock = null; - - - /** - * The default ctor - */ - public InMemoryCookieStore() { - cookieJar = new ArrayList<HttpCookie>(); - domainIndex = new HashMap<String, List<HttpCookie>>(); - uriIndex = new HashMap<URI, List<HttpCookie>>(); - - lock = new ReentrantLock(false); - } - - /** - * Add one cookie into cookie store. - */ - public void add(URI uri, HttpCookie cookie) { - // pre-condition : argument can't be null - if (cookie == null) { - throw new NullPointerException("cookie is null"); - } - - - lock.lock(); - try { - // remove the ole cookie if there has had one - cookieJar.remove(cookie); - - // add new cookie if it has a non-zero max-age - if (cookie.getMaxAge() != 0) { - cookieJar.add(cookie); - // and add it to domain index - if (cookie.getDomain() != null) { - addIndex(domainIndex, cookie.getDomain(), cookie); - } - // add it to uri index, too - addIndex(uriIndex, getEffectiveURI(uri), cookie); - } - } finally { - lock.unlock(); - } - } - - - /** - * Get all cookies, which: - * 1) given uri domain-matches with, or, associated with - * given uri when added to the cookie store. - * 3) not expired. - * See RFC 2965 sec. 3.3.4 for more detail. - */ - public List<HttpCookie> get(URI uri) { - // argument can't be null - if (uri == null) { - throw new NullPointerException("uri is null"); - } - - List<HttpCookie> cookies = new ArrayList<HttpCookie>(); - boolean secureLink = "https".equalsIgnoreCase(uri.getScheme()); - lock.lock(); - try { - // check domainIndex first - getInternal1(cookies, domainIndex, uri.getHost(), secureLink); - // check uriIndex then - getInternal2(cookies, uriIndex, getEffectiveURI(uri), secureLink); - } finally { - lock.unlock(); - } - - return cookies; - } - - /** - * Get all cookies in cookie store, except those have expired - */ - public List<HttpCookie> getCookies() { - List<HttpCookie> rt; - - lock.lock(); - try { - Iterator<HttpCookie> it = cookieJar.iterator(); - while (it.hasNext()) { - if (it.next().hasExpired()) { - it.remove(); - } - } - } finally { - rt = Collections.unmodifiableList(cookieJar); - lock.unlock(); - } - - return rt; - } - - /** - * Get all URIs, which are associated with at least one cookie - * of this cookie store. - */ - public List<URI> getURIs() { - List<URI> uris = new ArrayList<URI>(); - - lock.lock(); - try { - Iterator<URI> it = uriIndex.keySet().iterator(); - while (it.hasNext()) { - URI uri = it.next(); - List<HttpCookie> cookies = uriIndex.get(uri); - if (cookies == null || cookies.size() == 0) { - // no cookies list or an empty list associated with - // this uri entry, delete it - it.remove(); - } - } - } finally { - uris.addAll(uriIndex.keySet()); - lock.unlock(); - } - - return uris; - } - - - /** - * Remove a cookie from store - */ - public boolean remove(URI uri, HttpCookie ck) { - // argument can't be null - if (ck == null) { - throw new NullPointerException("cookie is null"); - } - - boolean modified = false; - lock.lock(); - try { - modified = cookieJar.remove(ck); - } finally { - lock.unlock(); - } - - return modified; - } - - - /** - * Remove all cookies in this cookie store. - */ - public boolean removeAll() { - lock.lock(); - try { - cookieJar.clear(); - domainIndex.clear(); - uriIndex.clear(); - } finally { - lock.unlock(); - } - - return true; - } - - - /* ---------------- Private operations -------------- */ - - - /* - * This is almost the same as HttpCookie.domainMatches except for - * one difference: It won't reject cookies when the 'H' part of the - * domain contains a dot ('.'). - * I.E.: RFC 2965 section 3.3.2 says that if host is x.y.domain.com - * and the cookie domain is .domain.com, then it should be rejected. - * However that's not how the real world works. Browsers don't reject and - * some sites, like yahoo.com do actually expect these cookies to be - * passed along. - * And should be used for 'old' style cookies (aka Netscape type of cookies) - */ - private boolean netscapeDomainMatches(String domain, String host) - { - if (domain == null || host == null) { - return false; - } - - // if there's no embedded dot in domain and domain is not .local - boolean isLocalDomain = ".local".equalsIgnoreCase(domain); - int embeddedDotInDomain = domain.indexOf('.'); - if (embeddedDotInDomain == 0) { - embeddedDotInDomain = domain.indexOf('.', 1); - } - if (!isLocalDomain && (embeddedDotInDomain == -1 || embeddedDotInDomain == domain.length() - 1)) { - return false; - } - - // if the host name contains no dot and the domain name is .local - int firstDotInHost = host.indexOf('.'); - if (firstDotInHost == -1 && isLocalDomain) { - return true; - } - - int domainLength = domain.length(); - int lengthDiff = host.length() - domainLength; - if (lengthDiff == 0) { - // if the host name and the domain name are just string-compare euqal - return host.equalsIgnoreCase(domain); - } else if (lengthDiff > 0) { - // need to check H & D component - String H = host.substring(0, lengthDiff); - String D = host.substring(lengthDiff); - - return (D.equalsIgnoreCase(domain)); - } else if (lengthDiff == -1) { - // if domain is actually .host - return (domain.charAt(0) == '.' && - host.equalsIgnoreCase(domain.substring(1))); - } - - return false; - } - - private void getInternal1(List<HttpCookie> cookies, Map<String, List<HttpCookie>> cookieIndex, - String host, boolean secureLink) { - // Use a separate list to handle cookies that need to be removed so - // that there is no conflict with iterators. - ArrayList<HttpCookie> toRemove = new ArrayList<HttpCookie>(); - for (Map.Entry<String, List<HttpCookie>> entry : cookieIndex.entrySet()) { - String domain = entry.getKey(); - List<HttpCookie> lst = entry.getValue(); - for (HttpCookie c : lst) { - if ((c.getVersion() == 0 && netscapeDomainMatches(domain, host)) || - (c.getVersion() == 1 && HttpCookie.domainMatches(domain, host))) { - if ((cookieJar.indexOf(c) != -1)) { - // the cookie still in main cookie store - if (!c.hasExpired()) { - // don't add twice and make sure it's the proper - // security level - if ((secureLink || !c.getSecure()) && - !cookies.contains(c)) { - cookies.add(c); - } - } else { - toRemove.add(c); - } - } else { - // the cookie has beed removed from main store, - // so also remove it from domain indexed store - toRemove.add(c); - } - } - } - // Clear up the cookies that need to be removed - for (HttpCookie c : toRemove) { - lst.remove(c); - cookieJar.remove(c); - - } - toRemove.clear(); - } - } - - // @param cookies [OUT] contains the found cookies - // @param cookieIndex the index - // @param comparator the prediction to decide whether or not - // a cookie in index should be returned - private <T> void getInternal2(List<HttpCookie> cookies, - Map<T, List<HttpCookie>> cookieIndex, - Comparable<T> comparator, boolean secureLink) - { - for (T index : cookieIndex.keySet()) { - if (comparator.compareTo(index) == 0) { - List<HttpCookie> indexedCookies = cookieIndex.get(index); - // check the list of cookies associated with this domain - if (indexedCookies != null) { - Iterator<HttpCookie> it = indexedCookies.iterator(); - while (it.hasNext()) { - HttpCookie ck = it.next(); - if (cookieJar.indexOf(ck) != -1) { - // the cookie still in main cookie store - if (!ck.hasExpired()) { - // don't add twice - if ((secureLink || !ck.getSecure()) && - !cookies.contains(ck)) - cookies.add(ck); - } else { - it.remove(); - cookieJar.remove(ck); - } - } else { - // the cookie has beed removed from main store, - // so also remove it from domain indexed store - it.remove(); - } - } - } // end of indexedCookies != null - } // end of comparator.compareTo(index) == 0 - } // end of cookieIndex iteration - } - - // add 'cookie' indexed by 'index' into 'indexStore' - private <T> void addIndex(Map<T, List<HttpCookie>> indexStore, - T index, - HttpCookie cookie) - { - if (index != null) { - List<HttpCookie> cookies = indexStore.get(index); - if (cookies != null) { - // there may already have the same cookie, so remove it first - cookies.remove(cookie); - - cookies.add(cookie); - } else { - cookies = new ArrayList<HttpCookie>(); - cookies.add(cookie); - indexStore.put(index, cookies); - } - } - } - - - // - // for cookie purpose, the effective uri should only be http://host - // the path will be taken into account when path-match algorithm applied - // - private URI getEffectiveURI(URI uri) { - URI effectiveURI = null; - try { - effectiveURI = new URI("http", - uri.getHost(), - null, // path component - null, // query component - null // fragment component - ); - } catch (URISyntaxException ignored) { - effectiveURI = uri; - } - - return effectiveURI; - } -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/net/www/protocol/http/NTLMAuthenticationProxy.java Wed Jul 05 17:01:05 2017 +0200 @@ -0,0 +1,131 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package sun.net.www.protocol.http; + +import java.net.URL; +import java.net.PasswordAuthentication; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import sun.util.logging.PlatformLogger; + +/** + * Proxy class for loading NTLMAuthentication, so as to remove static + * dependancy. + */ +class NTLMAuthenticationProxy { + private static Method supportsTA; + private static final String clazzStr = "sun.net.www.protocol.http.NTLMAuthentication"; + private static final String supportsTAStr = "supportsTransparentAuth"; + + static final NTLMAuthenticationProxy proxy = tryLoadNTLMAuthentication(); + static final boolean supported = proxy != null ? true : false; + static final boolean supportsTransparentAuth = supported ? supportsTransparentAuth(supportsTA) : false; + + private final Constructor<? extends AuthenticationInfo> threeArgCtr; + private final Constructor<? extends AuthenticationInfo> fiveArgCtr; + + private NTLMAuthenticationProxy(Constructor<? extends AuthenticationInfo> threeArgCtr, + Constructor<? extends AuthenticationInfo> fiveArgCtr) { + this.threeArgCtr = threeArgCtr; + this.fiveArgCtr = fiveArgCtr; + } + + + AuthenticationInfo create(boolean isProxy, + URL url, + PasswordAuthentication pw) { + try { + return threeArgCtr.newInstance(isProxy, url, pw); + } catch (ReflectiveOperationException roe) { + finest(roe); + } + + return null; + } + + AuthenticationInfo create(boolean isProxy, + String host, + int port, + PasswordAuthentication pw) { + try { + return fiveArgCtr.newInstance(isProxy, host, port, pw); + } catch (ReflectiveOperationException roe) { + finest(roe); + } + + return null; + } + + /* Returns true if the NTLM implementation supports transparent + * authentication (try with the current users credentials before + * prompting for username and password, etc). + */ + private static boolean supportsTransparentAuth(Method method) { + try { + return (Boolean)method.invoke(null); + } catch (ReflectiveOperationException roe) { + finest(roe); + } + + return false; + } + + /** + * Loads the NTLM authentiation implementation through reflection. If + * the class is present, then it must have the required constructors and + * method. Otherwise, it is considered an error. + */ + @SuppressWarnings("unchecked") + private static NTLMAuthenticationProxy tryLoadNTLMAuthentication() { + Class<? extends AuthenticationInfo> cl; + Constructor<? extends AuthenticationInfo> threeArg, fiveArg; + try { + cl = (Class<? extends AuthenticationInfo>)Class.forName(clazzStr, true, null); + if (cl != null) { + threeArg = cl.getConstructor(boolean.class, + URL.class, + PasswordAuthentication.class); + fiveArg = cl.getConstructor(boolean.class, + String.class, + int.class, + PasswordAuthentication.class); + supportsTA = cl.getDeclaredMethod(supportsTAStr); + return new NTLMAuthenticationProxy(threeArg, + fiveArg); + } + } catch (ClassNotFoundException cnfe) { + finest(cnfe); + } catch (ReflectiveOperationException roe) { + throw new AssertionError(roe); + } + + return null; + } + + static void finest(Exception e) { + PlatformLogger logger = HttpURLConnection.getHttpLogger(); + logger.finest("NTLMAuthenticationProxy: " + e); + } +}
--- a/jdk/src/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java Wed Jul 05 17:01:05 2017 +0200 @@ -30,11 +30,14 @@ import sun.net.www.HeaderParser; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; +import sun.util.logging.PlatformLogger; import java.net.URL; import java.io.IOException; import java.net.Authenticator.RequestorType; - +import java.lang.reflect.Constructor; +import static sun.net.www.protocol.http.AuthScheme.NEGOTIATE; +import static sun.net.www.protocol.http.AuthScheme.KERBEROS; /** * NegotiateAuthentication: @@ -49,9 +52,6 @@ final private HttpCallerInfo hci; - static final char NEGOTIATE_AUTH = 'S'; - static final char KERBEROS_AUTH = 'K'; - // These maps are used to manage the GSS availability for diffrent // hosts. The key for both maps is the host name. // <code>supported</code> is set when isSupported is checked, @@ -68,11 +68,10 @@ * @param hci a schemed object. */ public NegotiateAuthentication(HttpCallerInfo hci) { - super(RequestorType.PROXY==hci.authType? - PROXY_AUTHENTICATION:SERVER_AUTHENTICATION, - hci.scheme.equalsIgnoreCase("Negotiate")? - NEGOTIATE_AUTH:KERBEROS_AUTH, - hci.url, ""); + super(RequestorType.PROXY==hci.authType ? PROXY_AUTHENTICATION : SERVER_AUTHENTICATION, + hci.scheme.equalsIgnoreCase("Negotiate") ? NEGOTIATE : KERBEROS, + hci.url, + ""); this.hci = hci; } @@ -249,13 +248,41 @@ // The current implementation will make sure NegotiatorImpl is not // directly referenced when compiling, thus smooth the way of building // the J2SE platform where HttpURLConnection is a bootstrap class. + // + // Makes NegotiatorImpl, and the security classes it references, a + // runtime dependency rather than a static one. - Class clazz = Class.forName("sun.net.www.protocol.http.NegotiatorImpl"); - java.lang.reflect.Constructor c = clazz.getConstructor(HttpCallerInfo.class); - return (Negotiator) (c.newInstance(hci)); + Class clazz; + Constructor c; + try { + clazz = Class.forName("sun.net.www.protocol.http.NegotiatorImpl", true, null); + c = clazz.getConstructor(HttpCallerInfo.class); + } catch (ClassNotFoundException cnfe) { + finest(cnfe); + throw cnfe; + } catch (ReflectiveOperationException roe) { + // if the class is there then something seriously wrong if + // the constructor is not. + throw new AssertionError(roe); + } + + try { + return (Negotiator) (c.newInstance(hci)); + } catch (ReflectiveOperationException roe) { + finest(roe); + Throwable t = roe.getCause(); + if (t != null && t instanceof Exception) + finest((Exception)t); + throw roe; + } } abstract byte[] firstToken() throws IOException; abstract byte[] nextToken(byte[] in) throws IOException; + + static void finest(Exception e) { + PlatformLogger logger = HttpURLConnection.getHttpLogger(); + logger.finest("NegotiateAuthentication: " + e); + } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/security/action/GetBooleanSecurityPropertyAction.java Wed Jul 05 17:01:05 2017 +0200 @@ -0,0 +1,74 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package sun.security.action; + +import java.security.Security; + +/** + * A convenience class for retrieving the boolean value of a security property + * as a privileged action. + * + * <p>An instance of this class can be used as the argument of + * <code>AccessController.doPrivileged</code>. + * + * <p>The following code retrieves the boolean value of the security + * property named <code>"prop"</code> as a privileged action: <p> + * + * <pre> + * boolean b = java.security.AccessController.doPrivileged + * (new GetBooleanSecurityPropertyAction("prop")).booleanValue(); + * </pre> + * + */ +public class GetBooleanSecurityPropertyAction + implements java.security.PrivilegedAction<Boolean> { + private String theProp; + + /** + * Constructor that takes the name of the security property whose boolean + * value needs to be determined. + * + * @param theProp the name of the security property + */ + public GetBooleanSecurityPropertyAction(String theProp) { + this.theProp = theProp; + } + + /** + * Determines the boolean value of the security property whose name was + * specified in the constructor. + * + * @return the <code>Boolean</code> value of the security property. + */ + public Boolean run() { + boolean b = false; + try { + String value = Security.getProperty(theProp); + b = (value != null) && value.equalsIgnoreCase("true"); + } catch (NullPointerException e) {} + return b; + } +}
--- a/jdk/src/share/classes/sun/security/ec/ECDHKeyAgreement.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/security/ec/ECDHKeyAgreement.java Wed Jul 05 17:01:05 2017 +0200 @@ -39,21 +39,6 @@ */ public final class ECDHKeyAgreement extends KeyAgreementSpi { - // flag indicating whether the native ECC implementation is present - private static boolean implementationPresent = true; - static { - try { - AccessController.doPrivileged(new PrivilegedAction<Void>() { - public Void run() { - System.loadLibrary("sunecc"); - return null; - } - }); - } catch (UnsatisfiedLinkError e) { - implementationPresent = false; - } - } - // private key, if initialized private ECPrivateKey privateKey; @@ -65,16 +50,12 @@ /** * Constructs a new ECDHKeyAgreement. - * - * @exception ProviderException if the native ECC library is unavailable. */ public ECDHKeyAgreement() { - if (!implementationPresent) { - throw new ProviderException("ECDH implementation is not available"); - } } // see JCE spec + @Override protected void engineInit(Key key, SecureRandom random) throws InvalidKeyException { if (!(key instanceof PrivateKey)) { @@ -86,6 +67,7 @@ } // see JCE spec + @Override protected void engineInit(Key key, AlgorithmParameterSpec params, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException { @@ -97,6 +79,7 @@ } // see JCE spec + @Override protected Key engineDoPhase(Key key, boolean lastPhase) throws InvalidKeyException, IllegalStateException { if (privateKey == null) { @@ -130,6 +113,7 @@ } // see JCE spec + @Override protected byte[] engineGenerateSecret() throws IllegalStateException { if ((privateKey == null) || (publicValue == null)) { throw new IllegalStateException("Not initialized correctly"); @@ -150,6 +134,7 @@ } // see JCE spec + @Override protected int engineGenerateSecret(byte[] sharedSecret, int offset) throws IllegalStateException, ShortBufferException { if (offset + secretLen > sharedSecret.length) { @@ -162,6 +147,7 @@ } // see JCE spec + @Override protected SecretKey engineGenerateSecret(String algorithm) throws IllegalStateException, NoSuchAlgorithmException, InvalidKeyException {
--- a/jdk/src/share/classes/sun/security/ec/ECDSASignature.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/security/ec/ECDSASignature.java Wed Jul 05 17:01:05 2017 +0200 @@ -52,21 +52,6 @@ */ abstract class ECDSASignature extends SignatureSpi { - // flag indicating whether the native ECC implementation is present - private static boolean implementationPresent = true; - static { - try { - AccessController.doPrivileged(new PrivilegedAction<Void>() { - public Void run() { - System.loadLibrary("sunecc"); - return null; - } - }); - } catch (UnsatisfiedLinkError e) { - implementationPresent = false; - } - } - // message digest implementation we use private final MessageDigest messageDigest; @@ -88,24 +73,13 @@ * @exception ProviderException if the native ECC library is unavailable. */ ECDSASignature() { - if (!implementationPresent) { - throw new - ProviderException("ECDSA implementation is not available"); - } messageDigest = null; } /** * Constructs a new ECDSASignature. Used by subclasses. - * - * @exception ProviderException if the native ECC library is unavailable. */ ECDSASignature(String digestName) { - if (!implementationPresent) { - throw new - ProviderException("ECDSA implementation is not available"); - } - try { messageDigest = MessageDigest.getInstance(digestName); } catch (NoSuchAlgorithmException e) { @@ -299,8 +273,8 @@ byte[] encodedParams = ECParameters.encodeParameters(params); // DER OID int keySize = params.getCurve().getField().getFieldSize(); - // seed is twice the key size (in bytes) - byte[] seed = new byte[((keySize + 7) >> 3) * 2]; + // seed is twice the key size (in bytes) plus 1 + byte[] seed = new byte[(((keySize + 7) >> 3) + 1) * 2]; if (random == null) { random = JCAUtil.getSecureRandom(); } @@ -356,6 +330,7 @@ // Convert the concatenation of R and S into their DER encoding private byte[] encodeSignature(byte[] signature) throws SignatureException { + try { int n = signature.length >> 1;
--- a/jdk/src/share/classes/sun/security/ec/ECKeyPairGenerator.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/security/ec/ECKeyPairGenerator.java Wed Jul 05 17:01:05 2017 +0200 @@ -46,20 +46,6 @@ */ public final class ECKeyPairGenerator extends KeyPairGeneratorSpi { - // flag indicating whether the native ECC implementation is present - private static boolean implementationPresent = true; - static { - try { - AccessController.doPrivileged(new PrivilegedAction<Void>() { - public Void run() { - System.loadLibrary("sunecc"); - return null; - } - }); - } catch (UnsatisfiedLinkError e) { - implementationPresent = false; - } - } private static final int KEY_SIZE_MIN = 112; // min bits (see ecc_impl.h) private static final int KEY_SIZE_MAX = 571; // max bits (see ecc_impl.h) private static final int KEY_SIZE_DEFAULT = 256; @@ -75,13 +61,8 @@ /** * Constructs a new ECKeyPairGenerator. - * - * @exception ProviderException if the native ECC library is unavailable. */ public ECKeyPairGenerator() { - if (!implementationPresent) { - throw new ProviderException("EC implementation is not available"); - } // initialize to default in case the app does not call initialize() initialize(KEY_SIZE_DEFAULT, null); } @@ -133,8 +114,8 @@ byte[] encodedParams = ECParameters.encodeParameters((ECParameterSpec)params); - // seed is twice the key size (in bytes) - byte[] seed = new byte[2 * ((keySize + 7) >> 3)]; + // seed is twice the key size (in bytes) plus 1 + byte[] seed = new byte[(((keySize + 7) >> 3) + 1) * 2]; if (random == null) { random = JCAUtil.getSecureRandom(); }
--- a/jdk/src/share/classes/sun/security/ec/SunEC.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/security/ec/SunEC.java Wed Jul 05 17:01:05 2017 +0200 @@ -39,7 +39,10 @@ * via JNI to a C++ wrapper class which in turn calls C functions. * The Java classes are packaged into the signed sunec.jar in the JRE * extensions directory and the C++ and C functions are packaged into - * libsunecc.so or sunecc.dll in the JRE native libraries directory. + * libsunec.so or sunec.dll in the JRE native libraries directory. + * If the native library is not present then this provider is registered + * with support for fewer ECC algorithms (KeyPairGenerator, Signature and + * KeyAgreement are omitted). * * @since 1.7 */ @@ -47,6 +50,22 @@ private static final long serialVersionUID = -2279741672933606418L; + // flag indicating whether the full EC implementation is present + // (when native library is absent then fewer EC algorithms are available) + private static boolean useFullImplementation = true; + static { + try { + AccessController.doPrivileged(new PrivilegedAction<Void>() { + public Void run() { + System.loadLibrary("sunec"); // check for native library + return null; + } + }); + } catch (UnsatisfiedLinkError e) { + useFullImplementation = false; + } + } + public SunEC() { super("SunEC", 1.7d, "Sun Elliptic Curve provider (EC, ECDSA, ECDH)"); @@ -54,10 +73,10 @@ // the provider. Otherwise, create a temporary map and use a // doPrivileged() call at the end to transfer the contents if (System.getSecurityManager() == null) { - SunECEntries.putEntries(this); + SunECEntries.putEntries(this, useFullImplementation); } else { Map<Object, Object> map = new HashMap<Object, Object>(); - SunECEntries.putEntries(map); + SunECEntries.putEntries(map, useFullImplementation); AccessController.doPrivileged(new PutAllAction(this, map)); } }
--- a/jdk/src/share/classes/sun/security/ec/SunECEntries.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/security/ec/SunECEntries.java Wed Jul 05 17:01:05 2017 +0200 @@ -38,7 +38,93 @@ // empty } - static void putEntries(Map<Object, Object> map) { + static void putEntries(Map<Object, Object> map, + boolean useFullImplementation) { + + /* + * Key Factory engine + */ + map.put("KeyFactory.EC", "sun.security.ec.ECKeyFactory"); + map.put("Alg.Alias.KeyFactory.EllipticCurve", "EC"); + + map.put("KeyFactory.EC ImplementedIn", "Software"); + + /* + * Algorithm Parameter engine + */ + map.put("AlgorithmParameters.EC", "sun.security.ec.ECParameters"); + map.put("Alg.Alias.AlgorithmParameters.EllipticCurve", "EC"); + + map.put("AlgorithmParameters.EC KeySize", "256"); + + map.put("AlgorithmParameters.EC ImplementedIn", "Software"); + + map.put("AlgorithmParameters.EC SupportedCurves", + + // A list comprising lists of curve names and object identifiers. + // '[' ( <curve-name> ',' )+ <curve-object-identifier> ']' '|' + + // SEC 2 prime curves + "[secp112r1,1.3.132.0.6]|" + + "[secp112r2,1.3.132.0.7]|" + + "[secp128r1,1.3.132.0.28]|" + + "[secp128r2,1.3.132.0.29]|" + + "[secp160k1,1.3.132.0.9]|" + + "[secp160r1,1.3.132.0.8]|" + + "[secp160r2,1.3.132.0.30]|" + + "[secp192k1,1.3.132.0.31]|" + + "[secp192r1,NIST P-192,X9.62 prime192v1,1.2.840.10045.3.1.1]|" + + "[secp224k1,1.3.132.0.32]|" + + "[secp224r1,NIST P-224,1.3.132.0.33]|" + + "[secp256k1,1.3.132.0.10]|" + + "[secp256r1,NIST P-256,X9.62 prime256v1,1.2.840.10045.3.1.7]|" + + "[secp384r1,NIST P-384,1.3.132.0.34]|" + + "[secp521r1,NIST P-521,1.3.132.0.35]|" + + + // ANSI X9.62 prime curves + "[X9.62 prime192v2,1.2.840.10045.3.1.2]|" + + "[X9.62 prime192v3,1.2.840.10045.3.1.3]|" + + "[X9.62 prime239v1,1.2.840.10045.3.1.4]|" + + "[X9.62 prime239v2,1.2.840.10045.3.1.5]|" + + "[X9.62 prime239v3,1.2.840.10045.3.1.6]|" + + + // SEC 2 binary curves + "[sect113r1,1.3.132.0.4]|" + + "[sect113r2,1.3.132.0.5]|" + + "[sect131r1,1.3.132.0.22]|" + + "[sect131r2,1.3.132.0.23]|" + + "[sect163k1,NIST K-163,1.3.132.0.1]|" + + "[sect163r1,1.3.132.0.2]|" + + "[sect163r2,NIST B-163,1.3.132.0.15]|" + + "[sect193r1,1.3.132.0.24]|" + + "[sect193r2,1.3.132.0.25]|" + + "[sect233k1,NIST K-233,1.3.132.0.26]|" + + "[sect233r1,NIST B-233,1.3.132.0.27]|" + + "[sect239k1,1.3.132.0.3]|" + + "[sect283k1,NIST K-283,1.3.132.0.16]|" + + "[sect283r1,NIST B-283,1.3.132.0.17]|" + + "[sect409k1,NIST K-409,1.3.132.0.36]|" + + "[sect409r1,NIST B-409,1.3.132.0.37]|" + + "[sect571k1,NIST K-571,1.3.132.0.38]|" + + "[sect571r1,NIST B-571,1.3.132.0.39]|" + + + // ANSI X9.62 binary curves + "[X9.62 c2tnb191v1,1.2.840.10045.3.0.5]|" + + "[X9.62 c2tnb191v2,1.2.840.10045.3.0.6]|" + + "[X9.62 c2tnb191v3,1.2.840.10045.3.0.7]|" + + "[X9.62 c2tnb239v1,1.2.840.10045.3.0.11]|" + + "[X9.62 c2tnb239v2,1.2.840.10045.3.0.12]|" + + "[X9.62 c2tnb239v3,1.2.840.10045.3.0.13]|" + + "[X9.62 c2tnb359v1,1.2.840.10045.3.0.18]|" + + "[X9.62 c2tnb431r1,1.2.840.10045.3.0.20]"); + + /* + * Register the algorithms below only when the full ECC implementation + * is available + */ + if (!useFullImplementation) { + return; + } /* * Signature engines @@ -62,48 +148,31 @@ map.put("Signature.SHA384withECDSA SupportedKeyClasses", ecKeyClasses); map.put("Signature.SHA512withECDSA SupportedKeyClasses", ecKeyClasses); + map.put("Signature.SHA1withECDSA KeySize", "256"); + + map.put("Signature.NONEwithECDSA ImplementedIn", "Software"); + map.put("Signature.SHA1withECDSA ImplementedIn", "Software"); + map.put("Signature.SHA256withECDSA ImplementedIn", "Software"); + map.put("Signature.SHA384withECDSA ImplementedIn", "Software"); + map.put("Signature.SHA512withECDSA ImplementedIn", "Software"); + /* * Key Pair Generator engine */ map.put("KeyPairGenerator.EC", "sun.security.ec.ECKeyPairGenerator"); map.put("Alg.Alias.KeyPairGenerator.EllipticCurve", "EC"); - /* - * Key Factory engine - */ - map.put("KeyFactory.EC", "sun.security.ec.ECKeyFactory"); - map.put("Alg.Alias.KeyFactory.EllipticCurve", "EC"); + map.put("KeyPairGenerator.EC KeySize", "256"); - /* - * Algorithm Parameter engine - */ - map.put("AlgorithmParameters.EC", "sun.security.ec.ECParameters"); - map.put("Alg.Alias.AlgorithmParameters.EllipticCurve", "EC"); + map.put("KeyPairGenerator.EC ImplementedIn", "Software"); /* * Key Agreement engine */ map.put("KeyAgreement.ECDH", "sun.security.ec.ECDHKeyAgreement"); + map.put("KeyAgreement.ECDH SupportedKeyClasses", ecKeyClasses); - /* - * Key sizes - */ - map.put("Signature.SHA1withECDSA KeySize", "256"); - map.put("KeyPairGenerator.EC KeySize", "256"); - map.put("AlgorithmParameterGenerator.ECDSA KeySize", "256"); - - /* - * Implementation type: software or hardware - */ - map.put("Signature.NONEwithECDSA ImplementedIn", "Software"); - map.put("Signature.SHA1withECDSA ImplementedIn", "Software"); - map.put("Signature.SHA256withECDSA ImplementedIn", "Software"); - map.put("Signature.SHA384withECDSA ImplementedIn", "Software"); - map.put("Signature.SHA512withECDSA ImplementedIn", "Software"); - map.put("KeyPairGenerator.EC ImplementedIn", "Software"); - map.put("KeyFactory.EC ImplementedIn", "Software"); map.put("KeyAgreement.ECDH ImplementedIn", "Software"); - map.put("AlgorithmParameters.EC ImplementedIn", "Software"); } }
--- a/jdk/src/share/classes/sun/security/krb5/KrbKdcReq.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/security/krb5/KrbKdcReq.java Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Portions Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2000-2009 Sun Microsystems, Inc. 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 @@ -149,6 +149,11 @@ send(realm,tempKdc,useTCP); break; } catch (Exception e) { + if (DEBUG) { + System.out.println(">>> KrbKdcReq send: error trying " + + tempKdc); + e.printStackTrace(System.out); + } savedException = e; } } @@ -179,10 +184,36 @@ /* * Get port number for this KDC. */ - StringTokenizer strTok = new StringTokenizer(tempKdc, ":"); - String kdc = strTok.nextToken(); - if (strTok.hasMoreTokens()) { - String portStr = strTok.nextToken(); + String kdc = null; + String portStr = null; + + if (tempKdc.charAt(0) == '[') { // Explicit IPv6 in [] + int pos = tempKdc.indexOf(']', 1); + if (pos == -1) { + throw new IOException("Illegal KDC: " + tempKdc); + } + kdc = tempKdc.substring(1, pos); + if (pos != tempKdc.length() - 1) { // with port number + if (tempKdc.charAt(pos+1) != ':') { + throw new IOException("Illegal KDC: " + tempKdc); + } + portStr = tempKdc.substring(pos+2); + } + } else { + int colon = tempKdc.indexOf(':'); + if (colon == -1) { // Hostname or IPv4 host only + kdc = tempKdc; + } else { + int nextColon = tempKdc.indexOf(':', colon+1); + if (nextColon > 0) { // >=2 ":", IPv6 with no port + kdc = tempKdc; + } else { // 1 ":", hostname or IPv4 with port + kdc = tempKdc.substring(0, colon); + portStr = tempKdc.substring(colon+1); + } + } + } + if (portStr != null) { int tempPort = parsePositiveIntString(portStr); if (tempPort > 0) port = tempPort;
--- a/jdk/src/share/classes/sun/security/provider/certpath/Builder.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/security/provider/certpath/Builder.java Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2009 Sun Microsystems, Inc. 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,14 @@ package sun.security.provider.certpath; import java.io.IOException; +import java.security.AccessController; import java.security.GeneralSecurityException; import java.security.cert.*; import java.util.*; import javax.security.auth.x500.X500Principal; +import sun.security.action.GetBooleanAction; import sun.security.util.Debug; import sun.security.x509.GeneralNames; import sun.security.x509.GeneralNameInterface; @@ -64,9 +66,8 @@ * Authority Information Access extension shall be enabled. Currently * disabled by default for compatibility reasons. */ - final static boolean USE_AIA = - DistributionPointFetcher.getBooleanProperty - ("com.sun.security.enableAIAcaIssuers", false); + final static boolean USE_AIA = AccessController.doPrivileged + (new GetBooleanAction("com.sun.security.enableAIAcaIssuers")); /** * Initialize the builder with the input parameters.
--- a/jdk/src/share/classes/sun/security/provider/certpath/CertId.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/security/provider/certpath/CertId.java Wed Jul 05 17:01:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2009 Sun Microsystems, Inc. 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 @@ -25,9 +25,11 @@ package sun.security.provider.certpath; -import java.io.*; +import java.io.IOException; import java.math.BigInteger; import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; import java.util.Arrays; import sun.misc.HexDumpEncoder; import sun.security.x509.*; @@ -54,21 +56,28 @@ public class CertId { private static final boolean debug = false; - private AlgorithmId hashAlgId; - private byte[] issuerNameHash; - private byte[] issuerKeyHash; - private SerialNumber certSerialNumber; + private static final AlgorithmId SHA1_ALGID + = new AlgorithmId(AlgorithmId.SHA_oid); + private final AlgorithmId hashAlgId; + private final byte[] issuerNameHash; + private final byte[] issuerKeyHash; + private final SerialNumber certSerialNumber; private int myhash = -1; // hashcode for this CertId /** * Creates a CertId. The hash algorithm used is SHA-1. */ - public CertId(X509CertImpl issuerCert, SerialNumber serialNumber) - throws Exception { + public CertId(X509Certificate issuerCert, SerialNumber serialNumber) + throws IOException { // compute issuerNameHash - MessageDigest md = MessageDigest.getInstance("SHA1"); - hashAlgId = AlgorithmId.get("SHA1"); + MessageDigest md = null; + try { + md = MessageDigest.getInstance("SHA1"); + } catch (NoSuchAlgorithmException nsae) { + throw new IOException("Unable to create CertId", nsae); + } + hashAlgId = SHA1_ALGID; md.update(issuerCert.getSubjectX500Principal().getEncoded()); issuerNameHash = md.digest(); @@ -90,6 +99,7 @@ encoder.encode(issuerNameHash)); System.out.println("issuerKeyHash is " + encoder.encode(issuerKeyHash)); + System.out.println("SerialNumber is " + serialNumber.getNumber()); } } @@ -97,7 +107,6 @@ * Creates a CertId from its ASN.1 DER encoding. */ public CertId(DerInputStream derIn) throws IOException { - hashAlgId = AlgorithmId.parse(derIn.getDerValue()); issuerNameHash = derIn.getOctetString(); issuerKeyHash = derIn.getOctetString(); @@ -157,7 +166,7 @@ * * @return the hashcode value. */ - public int hashCode() { + @Override public int hashCode() { if (myhash == -1) { myhash = hashAlgId.hashCode(); for (int i = 0; i < issuerNameHash.length; i++) { @@ -180,8 +189,7 @@ * @param other the object to test for equality with this object. * @return true if the objects are considered equal, false otherwise. */ - public boolean equals(Object other) { - + @Override public boolean equals(Object other) { if (this == other) { return true; } @@ -203,7 +211,7 @@ /** * Create a string representation of the CertId. */ - public String toString() { + @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("CertId \n"); sb.append("Algorithm: " + hashAlgId.toString() +"\n");
--- a/jdk/src/share/classes/sun/security/provider/certpath/CrlRevocationChecker.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/security/provider/certpath/CrlRevocationChecker.java Wed Jul 05 17:01:05 2017 +0200 @@ -80,6 +80,7 @@ { false, false, false, false, false, false, true }; private static final boolean[] ALL_REASONS = {true, true, true, true, true, true, true, true, true}; + private boolean mOnlyEECert = false; // Maximum clock skew in milliseconds (15 minutes) allowed when checking // validity of CRLs @@ -114,6 +115,12 @@ CrlRevocationChecker(TrustAnchor anchor, PKIXParameters params, Collection<X509Certificate> certs) throws CertPathValidatorException { + this(anchor, params, certs, false); + } + + CrlRevocationChecker(TrustAnchor anchor, PKIXParameters params, + Collection<X509Certificate> certs, boolean onlyEECert) + throws CertPathValidatorException { mAnchor = anchor; mParams = params; mStores = new ArrayList<CertStore>(params.getCertStores()); @@ -133,6 +140,7 @@ } Date testDate = params.getDate(); mCurrentTime = (testDate != null ? testDate : new Date()); + mOnlyEECert = onlyEECert; init(false); } @@ -264,6 +272,13 @@ " ---checking " + msg + "..."); } + if (mOnlyEECert && currCert.getBasicConstraints() != -1) { + if (debug != null) { + debug.println("Skipping revocation check, not end entity cert"); + } + return; + } + // reject circular dependencies - RFC 3280 is not explicit on how // to handle this, so we feel it is safest to reject them until // the issue is resolved in the PKIX WG.
--- a/jdk/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java Wed Jul 05 17:01:05 2017 +0200 @@ -32,7 +32,7 @@ import java.security.cert.*; import javax.security.auth.x500.X500Principal; -import sun.security.action.GetPropertyAction; +import sun.security.action.GetBooleanAction; import sun.security.util.Debug; import sun.security.util.DerOutputStream; import sun.security.x509.*; @@ -62,28 +62,8 @@ * extension shall be enabled. Currently disabled by default for * compatibility and legal reasons. */ - private final static boolean USE_CRLDP = - getBooleanProperty("com.sun.security.enableCRLDP", false); - - /** - * Return the value of the boolean System property propName. - */ - public static boolean getBooleanProperty(String propName, - boolean defaultValue) { - // if set, require value of either true or false - String b = AccessController.doPrivileged( - new GetPropertyAction(propName)); - if (b == null) { - return defaultValue; - } else if (b.equalsIgnoreCase("false")) { - return false; - } else if (b.equalsIgnoreCase("true")) { - return true; - } else { - throw new RuntimeException("Value of " + propName - + " must either be 'true' or 'false'"); - } - } + private final static boolean USE_CRLDP = AccessController.doPrivileged + (new GetBooleanAction("com.sun.security.enableCRLDP")); // singleton instance private static final DistributionPointFetcher INSTANCE =
--- a/jdk/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java Wed Jul 05 17:01:05 2017 +0200 @@ -82,6 +82,7 @@ TrustAnchor trustAnchor; private Comparator<X509Certificate> comparator; private boolean searchAllCertStores = true; + private boolean onlyEECert = false; /** * Initialize the builder with the input parameters. @@ -89,7 +90,8 @@ * @param params the parameter set used to build a certification path */ ForwardBuilder(PKIXBuilderParameters buildParams, - X500Principal targetSubjectDN, boolean searchAllCertStores) + X500Principal targetSubjectDN, boolean searchAllCertStores, + boolean onlyEECert) { super(buildParams, targetSubjectDN); @@ -108,6 +110,7 @@ } comparator = new PKIXCertComparator(trustedSubjectDNs); this.searchAllCertStores = searchAllCertStores; + this.onlyEECert = onlyEECert; } /** @@ -875,8 +878,8 @@ /* Check revocation if it is enabled */ if (buildParams.isRevocationEnabled()) { try { - CrlRevocationChecker crlChecker = - new CrlRevocationChecker(anchor, buildParams); + CrlRevocationChecker crlChecker = new CrlRevocationChecker + (anchor, buildParams, null, onlyEECert); crlChecker.check(cert, anchor.getCAPublicKey(), true); } catch (CertPathValidatorException cpve) { if (debug != null) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/security/provider/certpath/OCSP.java Wed Jul 05 17:01:05 2017 +0200 @@ -0,0 +1,329 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package sun.security.provider.certpath; + +import java.io.InputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.URI; +import java.net.URL; +import java.net.HttpURLConnection; +import java.security.cert.CertificateException; +import java.security.cert.CertPathValidatorException; +import java.security.cert.CRLReason; +import java.security.cert.Extension; +import java.security.cert.X509Certificate; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import static sun.security.provider.certpath.OCSPResponse.*; +import sun.security.util.Debug; +import sun.security.x509.AccessDescription; +import sun.security.x509.AuthorityInfoAccessExtension; +import sun.security.x509.GeneralName; +import sun.security.x509.GeneralNameInterface; +import sun.security.x509.URIName; +import sun.security.x509.X509CertImpl; + +/** + * This is a class that checks the revocation status of a certificate(s) using + * OCSP. It is not a PKIXCertPathChecker and therefore can be used outside of + * the CertPathValidator framework. It is useful when you want to + * just check the revocation status of a certificate, and you don't want to + * incur the overhead of validating all of the certificates in the + * associated certificate chain. + * + * @author Sean Mullan + */ +public final class OCSP { + + private static final Debug debug = Debug.getInstance("certpath"); + + private OCSP() {} + + /** + * Obtains the revocation status of a certificate using OCSP using the most + * common defaults. The OCSP responder URI is retrieved from the + * certificate's AIA extension. The OCSP responder certificate is assumed + * to be the issuer's certificate (or issued by the issuer CA). + * + * @param cert the certificate to be checked + * @param issuerCert the issuer certificate + * @return the RevocationStatus + * @throws IOException if there is an exception connecting to or + * communicating with the OCSP responder + * @throws CertPathValidatorException if an exception occurs while + * encoding the OCSP Request or validating the OCSP Response + */ + public static RevocationStatus check(X509Certificate cert, + X509Certificate issuerCert) + throws IOException, CertPathValidatorException { + CertId certId = null; + URI responderURI = null; + try { + X509CertImpl certImpl = X509CertImpl.toImpl(cert); + responderURI = getResponderURI(certImpl); + if (responderURI == null) { + throw new CertPathValidatorException + ("No OCSP Responder URI in certificate"); + } + certId = new CertId(issuerCert, certImpl.getSerialNumberObject()); + } catch (CertificateException ce) { + throw new CertPathValidatorException + ("Exception while encoding OCSPRequest", ce); + } catch (IOException ioe) { + throw new CertPathValidatorException + ("Exception while encoding OCSPRequest", ioe); + } + OCSPResponse ocspResponse = check(Collections.singletonList(certId), + responderURI, issuerCert, null); + return (RevocationStatus) ocspResponse.getSingleResponse(certId); + } + + /** + * Obtains the revocation status of a certificate using OCSP. + * + * @param cert the certificate to be checked + * @param issuerCert the issuer certificate + * @param responderURI the URI of the OCSP responder + * @param responderCert the OCSP responder's certificate + * @param date the time the validity of the OCSP responder's certificate + * should be checked against. If null, the current time is used. + * @return the RevocationStatus + * @throws IOException if there is an exception connecting to or + * communicating with the OCSP responder + * @throws CertPathValidatorException if an exception occurs while + * encoding the OCSP Request or validating the OCSP Response + */ + public static RevocationStatus check(X509Certificate cert, + X509Certificate issuerCert, URI responderURI, X509Certificate + responderCert, Date date) + throws IOException, CertPathValidatorException { + CertId certId = null; + try { + X509CertImpl certImpl = X509CertImpl.toImpl(cert); + certId = new CertId(issuerCert, certImpl.getSerialNumberObject()); + } catch (CertificateException ce) { + throw new CertPathValidatorException + ("Exception while encoding OCSPRequest", ce); + } catch (IOException ioe) { + throw new CertPathValidatorException + ("Exception while encoding OCSPRequest", ioe); + } + OCSPResponse ocspResponse = check(Collections.singletonList(certId), + responderURI, responderCert, date); + return (RevocationStatus) ocspResponse.getSingleResponse(certId); + } + + /** + * Checks the revocation status of a list of certificates using OCSP. + * + * @param certs the CertIds to be checked + * @param responderURI the URI of the OCSP responder + * @param responderCert the OCSP responder's certificate + * @param date the time the validity of the OCSP responder's certificate + * should be checked against. If null, the current time is used. + * @return the OCSPResponse + * @throws IOException if there is an exception connecting to or + * communicating with the OCSP responder + * @throws CertPathValidatorException if an exception occurs while + * encoding the OCSP Request or validating the OCSP Response + */ + static OCSPResponse check(List<CertId> certIds, URI responderURI, + X509Certificate responderCert, Date date) + throws IOException, CertPathValidatorException { + + byte[] bytes = null; + try { + OCSPRequest request = new OCSPRequest(certIds); + bytes = request.encodeBytes(); + } catch (IOException ioe) { + throw new CertPathValidatorException + ("Exception while encoding OCSPRequest", ioe); + } + + InputStream in = null; + OutputStream out = null; + byte[] response = null; + try { + URL url = responderURI.toURL(); + if (debug != null) { + debug.println("connecting to OCSP service at: " + url); + } + HttpURLConnection con = (HttpURLConnection)url.openConnection(); + con.setDoOutput(true); + con.setDoInput(true); + con.setRequestMethod("POST"); + con.setRequestProperty + ("Content-type", "application/ocsp-request"); + con.setRequestProperty + ("Content-length", String.valueOf(bytes.length)); + out = con.getOutputStream(); + out.write(bytes); + out.flush(); + // Check the response + if (debug != null && + con.getResponseCode() != HttpURLConnection.HTTP_OK) { + debug.println("Received HTTP error: " + con.getResponseCode() + + " - " + con.getResponseMessage()); + } + in = con.getInputStream(); + int contentLength = con.getContentLength(); + if (contentLength == -1) { + contentLength = Integer.MAX_VALUE; + } + response = new byte[contentLength > 2048 ? 2048 : contentLength]; + int total = 0; + while (total < contentLength) { + int count = in.read(response, total, response.length - total); + if (count < 0) + break; + + total += count; + if (total >= response.length && total < contentLength) { + response = Arrays.copyOf(response, total * 2); + } + } + response = Arrays.copyOf(response, total); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException ioe) { + throw ioe; + } + } + if (out != null) { + try { + out.close(); + } catch (IOException ioe) { + throw ioe; + } + } + } + + OCSPResponse ocspResponse = null; + try { + ocspResponse = new OCSPResponse(response, date, responderCert); + } catch (IOException ioe) { + // response decoding exception + throw new CertPathValidatorException(ioe); + } + if (ocspResponse.getResponseStatus() != ResponseStatus.SUCCESSFUL) { + throw new CertPathValidatorException + ("OCSP response error: " + ocspResponse.getResponseStatus()); + } + + // Check that the response includes a response for all of the + // certs that were supplied in the request + for (CertId certId : certIds) { + SingleResponse sr = ocspResponse.getSingleResponse(certId); + if (sr == null) { + if (debug != null) { + debug.println("No response found for CertId: " + certId); + } + throw new CertPathValidatorException( + "OCSP response does not include a response for a " + + "certificate supplied in the OCSP request"); + } + if (debug != null) { + debug.println("Status of certificate (with serial number " + + certId.getSerialNumber() + ") is: " + sr.getCertStatus()); + } + } + return ocspResponse; + } + + /** + * Returns the URI of the OCSP Responder as specified in the + * certificate's Authority Information Access extension, or null if + * not specified. + * + * @param cert the certificate + * @return the URI of the OCSP Responder, or null if not specified + */ + public static URI getResponderURI(X509Certificate cert) { + try { + return getResponderURI(X509CertImpl.toImpl(cert)); + } catch (CertificateException ce) { + // treat this case as if the cert had no extension + return null; + } + } + + static URI getResponderURI(X509CertImpl certImpl) { + + // Examine the certificate's AuthorityInfoAccess extension + AuthorityInfoAccessExtension aia = + certImpl.getAuthorityInfoAccessExtension(); + if (aia == null) { + return null; + } + + List<AccessDescription> descriptions = aia.getAccessDescriptions(); + for (AccessDescription description : descriptions) { + if (description.getAccessMethod().equals( + AccessDescription.Ad_OCSP_Id)) { + + GeneralName generalName = description.getAccessLocation(); + if (generalName.getType() == GeneralNameInterface.NAME_URI) { + URIName uri = (URIName) generalName.getName(); + return uri.getURI(); + } + } + } + return null; + } + + /** + * The Revocation Status of a certificate. + */ + public static interface RevocationStatus { + public enum CertStatus { GOOD, REVOKED, UNKNOWN }; + + /** + * Returns the revocation status. + */ + CertStatus getCertStatus(); + /** + * Returns the time when the certificate was revoked, or null + * if it has not been revoked. + */ + Date getRevocationTime(); + /** + * Returns the reason the certificate was revoked, or null if it + * has not been revoked. + */ + CRLReason getRevocationReason(); + + /** + * Returns a Map of additional extensions. + */ + Map<String, Extension> getSingleExtensions(); + } +}
--- a/jdk/src/share/classes/sun/security/provider/certpath/OCSPChecker.java Mon Sep 28 19:39:40 2009 -0700 +++ b/jdk/src/share/classes/sun/security/provider/certpath/OCSPChecker.java Wed Jul 05 17:01:05 2017 +0200 @@ -25,19 +25,20 @@ package sun.security.provider.certpath; -import java.io.*; +import java.io.IOException; import java.math.BigInteger; import java.util.*; import java.security.AccessController; -import java.security.Principal; import java.security.PrivilegedAction; import java.security.Security; import java.security.cert.*; import java.security.cert.CertPathValidatorException.BasicReason; -import java.net.*; +import java.net.URI; +import java.net.URISyntaxException; import javax.security.auth.x500.X500Principal; -import sun.security.util.*; +import static sun.security.provider.certpath.OCSP.*; +import sun.security.util.Debug; import sun.security.x509.*; /** @@ -50,27 +51,18 @@ */ class OCSPChecker extends PKIXCertPathChecker { - public static final String OCSP_ENABLE_PROP = "ocsp.enable"; - public static final String OCSP_URL_PROP = "ocsp.responderURL"; - public static final String OCSP_CERT_SUBJECT_PROP = + static final String OCSP_ENABLE_PROP = "ocsp.enable"; + static final String OCSP_URL_PROP = "ocsp.responderURL"; + static final String OCSP_CERT_SUBJECT_PROP = "ocsp.responderCertSubjectName"; - public static final String OCSP_CERT_ISSUER_PROP = - "ocsp.responderCertIssuerName"; - public static final String OCSP_CERT_NUMBER_PROP = + static final String OCSP_CERT_ISSUER_PROP = "ocsp.responderCertIssuerName"; + static final String OCSP_CERT_NUMBER_PROP = "ocsp.responderCertSerialNumber"; private static final String HEX_DIGITS = "0123456789ABCDEFabcdef"; private static final Debug DEBUG = Debug.getInstance("certpath"); private static final boolean dump = false; - // Supported extensions - private static final int OCSP_NONCE_DATA[] = - { 1, 3, 6, 1, 5, 5, 7, 48, 1, 2 }; - private static final ObjectIdentifier OCSP_NONCE_OID; - static { - OCSP_NONCE_OID = ObjectIdentifier.newInternal(OCSP_NONCE_DATA); - } - private int remainingCerts; private X509Certificate[] certs; @@ -79,19 +71,26 @@ private PKIXParameters pkixParams; + private boolean onlyEECert = false; + /** * Default Constructor * * @param certPath the X509 certification path * @param pkixParams the input PKIX parameter set - * @exception CertPathValidatorException Exception thrown if cert path - * does not validate. + * @throws CertPathValidatorException if OCSPChecker can not be created */ OCSPChecker(CertPath certPath, PKIXParameters pkixParams) throws CertPathValidatorException { + this(certPath, pkixParams, false); + } + + OCSPChecker(CertPath certPath, PKIXParameters pkixParams, boolean onlyEECert) + throws CertPathValidatorException { this.cp = certPath; this.pkixParams = pkixParams; + this.onlyEECert = onlyEECert; List<? extends Certificate> tmp = cp.getCertificates(); certs = tmp.toArray(new X509Certificate[tmp.size()]); init(false); @@ -101,6 +100,7 @@ * Initializes the internal state of the checker from parameters * specified in the constructor */ + @Override public void init(boolean forward) throws CertPathValidatorException { if (!forward) { remainingCerts = certs.length + 1; @@ -110,11 +110,11 @@ } } - public boolean isForwardCheckingSupported() { + @Override public boolean isForwardCheckingSupported() { return false; } - public Set<String> getSupportedExtensions() { + @Override public Set<String> getSupportedExtensions() { return Collections.<String>emptySet(); } @@ -127,300 +127,233 @@ * @exception CertPathValidatorException Exception is thrown if the * certificate has been revoked. */ + @Override public void check(Certificate cert, Collection<String> unresolvedCritExts) throws CertPathValidatorException { - InputStream in = null; - OutputStream out = null; - // Decrement the certificate counter remainingCerts--; + X509CertImpl currCertImpl = null; try { - X509Certificate responderCert = null; - boolean seekResponderCert = false; - X500Principal responderSubjectName = null; - X500Principal responderIssuerName = null; - BigInteger responderSerialNumber = null; + currCertImpl = X509CertImpl.toImpl((X509Certificate)cert); + } catch (CertificateException ce) { + throw new CertPathValidatorException(ce); + } - boolean seekIssuerCert = true; - X509CertImpl issuerCertImpl = null; - X509CertImpl currCertImpl = - X509CertImpl.toImpl((X509Certificate)cert); + if (onlyEECert && currCertImpl.getBasicConstraints() != -1) { + if (DEBUG != null) { + DEBUG.println("Skipping revocation check, not end entity cert"); + } + return; + } - /* - * OCSP security property values, in the following order: - * 1. ocsp.responderURL - * 2. ocsp.responderCertSubjectName - * 3. ocsp.responderCertIssuerName - * 4. ocsp.responderCertSerialNumber - */ - String[] properties = getOCSPProperties(); + /* + * OCSP security property values, in the following order: + * 1. ocsp.responderURL + * 2. ocsp.responderCertSubjectName + * 3. ocsp.responderCertIssuerName + * 4. ocsp.responderCertSerialNumber + */ + // should cache these properties to avoid calling every time? + String[] properties = getOCSPProperties(); - // Check whether OCSP is feasible before seeking cert information - URL url = getOCSPServerURL(currCertImpl, properties); + // Check whether OCSP is feasible before seeking cert information + URI uri = getOCSPServerURI(currCertImpl, properties[0]); - // When responder's subject name is set then the issuer/serial - // properties are ignored - if (properties[1] != null) { - responderSubjectName = new X500Principal(properties[1]); + // When responder's subject name is set then the issuer/serial + // properties are ignored + X500Principal responderSubjectName = null; + X500Principal responderIssuerName = null; + BigInteger responderSerialNumber = null; + if (properties[1] != null) { + responderSubjectName = new X500Principal(properties[1]); + } else if (properties[2] != null && properties[3] != null) { + responderIssuerName = new X500Principal(properties[2]); + // remove colon or space separators + String value = stripOutSeparators(properties[3]); + responderSerialNumber = new BigInteger(value, 16); + } else if (properties[2] != null || properties[3] != null) { + throw new CertPathValidatorException( + "Must specify both ocsp.responderCertIssuerName and " + + "ocsp.responderCertSerialNumber properties"); + } - } else if (properties[2] != null && properties[3] != null) { - responderIssuerName = new X500Principal(properties[2]); - // remove colon or space separators - String value = stripOutSeparators(properties[3]); - responderSerialNumber = new BigInteger(value, 16); + // If the OCSP responder cert properties are set then the + // identified cert must be located in the trust anchors or + // in the cert stores. + boolean seekResponderCert = false; + if (responderSubjectName != null || responderIssuerName != null) { + seekResponderCert = true; + } - } else if (properties[2] != null || properties[3] != null) { - throw new CertPathValidatorException( - "Must specify both ocsp.responderCertIssuerName and " + - "ocsp.responderCertSerialNumber properties"); + // Set the issuer certificate to the next cert in the chain + // (unless we're processing the final cert). + X509Certificate issuerCert = null; + boolean seekIssuerCert = true; + X509Certificate responderCert = null; + if (remainingCerts < certs.length) { + issuerCert = certs[remainingCerts]; + seekIssuerCert = false; // done + + // By default, the OCSP responder's cert is the same as the + // issuer of the cert being validated. + if (!seekResponderCert) { + responderCert = issuerCert; + if (DEBUG != null) { + DEBUG.println("Responder's certificate is the same " + + "as the issuer of the certificate being validated"); + } + } + } + + // Check anchor certs for: + // - the issuer cert (of the cert being validated) + // - the OCSP responder's cert + if (seekIssuerCert || seekResponderCert) { + + if (DEBUG != null && seekResponderCert) { + DEBUG.println("Searching trust anchors for responder's " + + "certificate"); } - // If the OCSP responder cert properties are set then the - // identified cert must be located in the trust anchors or - // in the cert stores. - if (responderSubjectName != null || responderIssuerName != null) { - seekResponderCert = true; + // Extract the anchor certs + Iterator<TrustAnchor> anchors + = pkixParams.getTrustAnchors().iterator(); + if (!anchors.hasNext()) { + throw new CertPathValidatorException( + "Must specify at least one trust anchor"); } - // Set the issuer certificate to the next cert in the chain - // (unless we're processing the final cert). - if (remainingCerts < certs.length) { - issuerCertImpl = X509CertImpl.toImpl(certs[remainingCerts]); - seekIssuerCert = false; // done + X500Principal certIssuerName = + currCertImpl.getIssuerX500Principal(); + while (anchors.hasNext() && (seekIssuerCert || seekResponderCert)) { - // By default, the OCSP responder's cert is the same as the - // issuer of the cert being validated. - if (! seekResponderCert) { - responderCert = certs[remainingCerts]; - if (DEBUG != null) { - DEBUG.println("Responder's certificate is the same " + - "as the issuer of the certificate being validated"); + TrustAnchor anchor = anchors.next(); + X509Certificate anchorCert = anchor.getTrustedCert(); + X500Principal anchorSubjectName = + anchorCert.getSubjectX500Principal(); + + if (dump) { + System.out.println("Issuer DN is " + certIssuerName); + System.out.println("Subject DN is " + anchorSubjectName); + } + + // Check if anchor cert is the issuer cert + if (seekIssuerCert && + certIssuerName.equals(anchorSubjectName)) { + + issuerCert = anchorCert; + seekIssuerCert = false; // done + + // By default, the OCSP responder's cert is the same as + // the issuer of the cert being validated. + if (!seekResponderCert && responderCert == null) { + responderCert = anchorCert; + if (DEBUG != null) { + DEBUG.println("Responder's certificate is the" + + " same as the issuer of the certificate " + + "being validated"); + } + } + } + + // Check if anchor cert is the responder cert + if (seekResponderCert) { + // Satisfy the responder subject name property only, or + // satisfy the responder issuer name and serial number + // properties only + if ((responderSubjectName != null && + responderSubjectName.equals(anchorSubjectName)) || + (responderIssuerName != null && + responderSerialNumber != null && + responderIssuerName.equals( + anchorCert.getIssuerX500Principal()) && + responderSerialNumber.equals( + anchorCert.getSerialNumber()))) { + + responderCert = anchorCert; + seekResponderCert = false; // done } } } + if (issuerCert == null) { + throw new CertPathValidatorException( + "No trusted certificate for " + currCertImpl.getIssuerDN()); + } - // Check anchor certs for: - // - the issuer cert (of the cert being validated) - // - the OCSP responder's cert - if (seekIssuerCert || seekResponderCert) { - - if (DEBUG != null && seekResponderCert) { - DEBUG.println("Searching trust anchors for responder's " + + // Check cert stores if responder cert has not yet been found + if (seekResponderCert) { + if (DEBUG != null) { + DEBUG.println("Searching cert stores for responder's " + "certificate"); } - - // Extract the anchor certs - Iterator anchors = pkixParams.getTrustAnchors().iterator(); - if (! anchors.hasNext()) { - throw new CertPathValidatorException( - "Must specify at least one trust anchor"); + X509CertSelector filter = null; + if (responderSubjectName != null) { + filter = new X509CertSelector(); + filter.setSubject(responderSubjectName); + } else if (responderIssuerName != null && + responderSerialNumber != null) { + filter = new X509CertSelector(); + filter.setIssuer(responderIssuerName); + filter.setSerialNumber(responderSerialNumber); } - - X500Principal certIssuerName = - currCertImpl.getIssuerX500Principal(); - while (anchors.hasNext() && - (seekIssuerCert || seekResponderCert)) { - - TrustAnchor anchor = (TrustAnchor)anchors.next(); - X509Certificate anchorCert = anchor.getTrustedCert(); - X500Principal anchorSubjectName = - anchorCert.getSubjectX500Principal(); - - if (dump) { - System.out.println("Issuer DN is " + certIssuerName); - System.out.println("Subject DN is " + - anchorSubjectName); - } - - // Check if anchor cert is the issuer cert - if (seekIssuerCert && - certIssuerName.equals(anchorSubjectName)) { - - issuerCertImpl = X509CertImpl.toImpl(anchorCert); - seekIssuerCert = false; // done - - // By default, the OCSP responder's cert is the same as - // the issuer of the cert being validated. - if (! seekResponderCert && responderCert == null) { - responderCert = anchorCert; + if (filter != null) { + List<CertStore> certStores = pkixParams.getCertStores(); + for (CertStore certStore : certStores) { + Iterator i = null; + try { + i = certStore.getCertificates(filter).iterator(); + } catch (CertStoreException cse) { + // ignore and try next certStore if (DEBUG != null) { - DEBUG.println("Responder's certificate is the" + - " same as the issuer of the certificate " + - "being validated"); + DEBUG.println("CertStore exception:" + cse); } + continue; } - } - - // Check if anchor cert is the responder cert - if (seekResponderCert) { - // Satisfy the responder subject name property only, or - // satisfy the responder issuer name and serial number - // properties only - if ((responderSubjectName != null && - responderSubjectName.equals(anchorSubjectName)) || - (responderIssuerName != null && - responderSerialNumber != null && - responderIssuerName.equals( - anchorCert.getIssuerX500Principal()) && - responderSerialNumber.equals( - anchorCert.getSerialNumber()))) { - - responderCert = anchorCert; + if (i.hasNext()) { + responderCert = (X509Certificate) i.next(); seekResponderCert = false; // done - } - } - } - if (issuerCertImpl == null) {