提交 67166499 编写于 作者: L lana

Merge

......@@ -75,7 +75,6 @@ import_product -- copy in the product components \n\
import_fastdebug -- copy in the fastdebug components \n\
import_debug -- copy in the debug components \n\
modules -- build the jdk and jre module images (experimental) \n\
sccs_get -- make sure all SCCS files are up-to-date (need SCCS) \n\
create_links -- create softlinks in Solaris 32bit build to 64bit dirs \n\
"
......@@ -278,21 +277,6 @@ include $(BUILDDIR)/common/Sanity.gmk
$(OUTPUTDIR) $(TEMPDIR):
$(MKDIR) -p $@
# cleanup everything. If the workspace is not being built by the control
# workspace, and if it is a Teamware workspace, then see if there are
# any files which are not under SCCS control.
clean clobber::
ifndef EXTERNALSANITYCONTROL
@if [ -d $(TOPDIR)/Codemgr_wsdata ]; then \
$(ECHO) '\nPerforming workspace scan for remnant files.\n' \
' Any files listed below are not under SCCS control in the workspace\n' \
' and you should review them and possibly remove them manually:' ; \
$(FIND) $(TOPDIR)/make $(TOPDIR)/src -type f | \
$(SED) 's+SCCS/[ps]\.++' | $(SORT) | $(UNIQ) -c | $(NAWK) '$$1<2 {print $$2;}' ; \
$(ECHO) 'End of workspace scan.' ; \
fi
endif
# this should be the last rule in this file:
all::
@if [ -r $(WARNING_FILE) ]; then \
......@@ -341,16 +325,70 @@ endif
include $(BUILDDIR)/common/internal/BinaryPlugs.gmk
#
# Get top level sccs_get rule
# Test rule
#
include $(BUILDDIR)/common/Rules-SCCS.gmk
.NOTPARALLEL: test_run
test:
$(MAKE) test_run
test_run: test_clean test_start test_summary
test_start:
@$(ECHO) "Tests started at `$(DATE)`"
test_clean:
$(RM) $(OUTPUTDIR)/test_failures.txt $(OUTPUTDIR)/test_log.txt
test_summary: $(OUTPUTDIR)/test_failures.txt
@$(ECHO) "#################################################"
@$(ECHO) "Tests completed at `$(DATE)`"
@( $(EGREP) '^TEST STATS:' $(OUTPUTDIR)/test_log.txt \
|| $(ECHO) "No TEST STATS seen in log" )
@$(ECHO) "For complete details see: $(OUTPUTDIR)/test_log.txt"
@$(ECHO) "#################################################"
@if [ -s $< ] ; then \
$(ECHO) "ERROR: Test failure count: `$(CAT) $< | $(WC) -l`"; \
$(CAT) $<; \
exit 1; \
else \
$(ECHO) "Success! No failures detected"; \
fi
# Get failure list from log
$(OUTPUTDIR)/test_failures.txt: $(OUTPUTDIR)/test_log.txt
@$(RM) $@
@( $(EGREP) '^FAILED:' $< || $(ECHO) "" ) | $(NAWK) 'length>0' > $@
# Get log file of all tests run
JDK_TO_TEST := $(shell \
if [ -d "$(ABS_OUTPUTDIR)/j2sdk-image" ] ; then \
$(ECHO) "$(ABS_OUTPUTDIR)/j2sdk-image"; \
elif [ -d "$(ABS_OUTPUTDIR)/bin" ] ; then \
$(ECHO) "$(ABS_OUTPUTDIR)"; \
elif [ "$(PRODUCT_HOME)" != "" -a -d "$(PRODUCT_HOME)/bin" ] ; then \
$(ECHO) "$(PRODUCT_HOME)"; \
fi \
)
TEST_TARGETS=jdk_all
$(OUTPUTDIR)/test_log.txt:
$(RM) $@
( $(CD) ../test && \
$(MAKE) NO_STOPPING=- PRODUCT_HOME=$(JDK_TO_TEST) $(TEST_TARGETS) \
) | tee $@
#
# JPRT rules
#
include jprt.gmk
#
# Phonies to avoid accidents.
#
.PHONY: all build clean clobber optimized debug fastdebug create_links \
import import_product import_fastdebug import_debug
import import_product import_fastdebug import_debug \
test test_run test_start test_clean test_summary
......@@ -76,7 +76,7 @@ cscope.out: cscope.files FRC
# What files should we include? A simple rule might be just those files under
# SCM control, however this would miss files we create like the opcodes and
# CClassHeaders. The following attempts to find everything that is *useful*.
# (.del files are created by sccsrm, demo directories contain many .java files
# (demo directories contain many .java files
# that probably aren't useful for development, and the pkgarchive may contain
# duplicates of files within the source hierarchy). The ordering of the .raw
# file is an attempt to make cscope display the most relevant files first.
......
......@@ -334,7 +334,7 @@ DOCSDIR = $(OUTPUTDIR)/docs$(DOCSDIRSUFFIX)
DOCSDIRSUFFIX =
# The MESSAGE, WARNING and ERROR files are used to store sanityck and
# SCCS check messages, warnings and errors.
# warnings and errors.
ifndef ERROR_FILE
ERROR_FILE = $(OUTPUTDIR)/sanityCheckErrors.txt
endif
......@@ -634,38 +634,6 @@ LINTFLAGS = $(LINTFLAGS_$(VARIANT)) $(LINTFLAGS_COMMON) \
VERSION_DEFINES = -DRELEASE='"$(RELEASE)"'
# 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.
# 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
ifdef INSANE
export INSANE
endif
......
#
# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
#
# Only get these rules if SCCS is available
#
ifdef SCCS
# SCCS command to extract out latest source
SCCS_GET=$(SCCS) get -s
#
# Make sure all files in workspace are fresh
#
TEMP_ALL_FILES=$(JDK_TOPDIR)/temp_filelist
$(TEMP_ALL_FILES): $(JDK_TOPDIR)/Codemgr_wsdata/nametable
$(prep-target)
@$(CUT) -d' ' -f1 $< \
| $(GREP) -v '^VERSION' \
| $(GREP) -v '^deleted_files' \
| $(GREP) -v '^Codemgr_wsdata' > $@
sccs_get: $(TEMP_ALL_FILES)
@$(PRINTF) "Workspace has %d files\n" `$(CAT) $< | $(WC) -l`
@count=0; \
for i in `$(CAT) $<` ; do \
f=$(JDK_TOPDIR)/$$i; \
count=`$(EXPR) $$count '+' 1`; \
if [ `$(EXPR) $$count '%' 100` = 0 ] ; then \
$(PRINTF) "\rChecked $$count files"; \
fi; \
if [ ! -f $$f ] ; then \
$(PRINTF) "\r$(SCCS_GET) $$f\n"; \
(cd `$(DIRNAME) $$f` && $(SCCS_GET) `$(BASENAME) $$f`); \
elif /usr/bin/test $$f -ot `$(DIRNAME) $$f`/SCCS/s.`$(BASENAME) $$f` ; then \
$(PRINTF) "\r$(SCCS_GET) $$f\n"; \
(cd `$(DIRNAME) $$f` && $(SCCS_GET) `$(BASENAME) $$f`); \
fi; \
done; \
$(PRINTF) "\rChecked $$count files\n"
#
# Phonies to avoid accidents.
#
.PHONY: sccs_get
endif
......@@ -33,7 +33,7 @@
# UTILS_COMMAND_PATH
# /usr/bin/
# UTILS_USR_BIN_PATH
# /usr/ccs/bin/ (sccs, m4, lex, yacc, as, ar, strip, mcs)
# /usr/ccs/bin/ (m4, lex, yacc, as, ar, strip, mcs)
# UTILS_CCS_BIN_PATH
# Dev Tools: zip, unzip, etc that we may have special versions of
# UTILS_DEVTOOL_PATH
......@@ -117,7 +117,6 @@ RC = $(UTILS_COMMAND_PATH)rc
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
......@@ -183,7 +182,7 @@ ifeq ($(PLATFORM),linux)
NAWK = $(USRBIN_PATH)gawk
# Intrinsic unix command, with backslash-escaped character interpretation
ECHO = /bin/echo -e
# These are really in UTILS_USR_BIN_PATH on Linux (only sccs is not)
# These are really in UTILS_USR_BIN_PATH on Linux
AR = $(UTILS_USR_BIN_PATH)ar
AS = $(UTILS_USR_BIN_PATH)as
LD = $(UTILS_USR_BIN_PATH)ld
......
......@@ -219,7 +219,7 @@ else
PRODUCT_NAME = Java(TM)
PRODUCT_SUFFIX = SE Runtime Environment
JDK_RC_PLATFORM_NAME = Platform SE
COMPANY_NAME = Oracle
COMPANY_NAME = Oracle Corporation
endif
RUNTIME_NAME = $(PRODUCT_NAME) $(PRODUCT_SUFFIX)
......
......@@ -284,6 +284,7 @@ JAVA_JAVA_java = \
java/util/concurrent/CancellationException.java \
java/util/concurrent/CompletionService.java \
java/util/concurrent/ConcurrentHashMap.java \
java/util/concurrent/ConcurrentLinkedDeque.java \
java/util/concurrent/ConcurrentLinkedQueue.java \
java/util/concurrent/ConcurrentMap.java \
java/util/concurrent/ConcurrentNavigableMap.java \
......
......@@ -25,43 +25,265 @@
# Properties for jprt
# Use whatever release that the submitted job requests
# At submit time, the release supplied will be in jprt.submit.release
# and will be one of the official release names defined in jprt.
# jprt supports property value expansion using ${property.name} syntax.
# This tells jprt what default release we want to build
jprt.tools.default.release=${jprt.submit.release}
# The different build flavors we want, we override here so we just get these 2
jprt.build.flavors=product,fastdebug
# Standard test target for everybody
jprt.test.targets=*-*-*-jvm98
# Define the Windows we want (temporary)
jprt.my.windows.i586.jdk7b107=windows_i586_5.0
jprt.my.windows.i586.jdk7temp=windows_i586_5.0
jprt.my.windows.i586.jdk7=windows_i586_5.1
jprt.my.windows.i586=${jprt.my.windows.i586.${jprt.tools.default.release}}
# Standard list of jprt build targets for this source tree
jprt.build.targets= \
solaris_sparc_5.10-{product|fastdebug}, \
solaris_sparcv9_5.10-{product|fastdebug}, \
solaris_i586_5.10-{product|fastdebug}, \
solaris_x64_5.10-{product|fastdebug}, \
linux_i586_2.6-{product|fastdebug}, \
linux_x64_2.6-{product|fastdebug}, \
${jprt.my.windows.i586}-{product|fastdebug}, \
windows_x64_5.2-{product|fastdebug}
# Standard vm test target
jprt.test.targets= \
solaris_sparc_5.10-product-c1-jvm98, \
solaris_sparcv9_5.10-product-c2-jvm98, \
solaris_i586_5.10-product-c1-jvm98, \
solaris_x64_5.10-product-c2-jvm98, \
linux_i586_2.6-product-{c1|c2}-jvm98, \
linux_x64_2.6-product-c2-jvm98, \
${jprt.my.windows.i586}-product-c1-jvm98, \
windows_x64_5.2-product-c2-jvm98
# User can select the test set with jprt submit "-testset name" option
jprt.my.test.set=${jprt.test.set}
# Default jdk test targets in test/Makefile (no fastdebug & limited c2)
jprt.make.rule.default.test.targets= \
\
solaris_sparc_5.10-product-c1-jdk_beans1, \
solaris_sparcv9_5.10-product-c2-jdk_beans1, \
solaris_i586_5.10-product-c1-jdk_beans1, \
solaris_x64_5.10-product-c2-jdk_beans1, \
linux_i586_2.6-product-{c1|c2}-jdk_beans1, \
linux_x64_2.6-product-c2-jdk_beans1, \
${jprt.my.windows.i586}-product-c1-jdk_beans1, \
windows_x64_5.2-product-c2-jdk_beans1, \
\
solaris_sparc_5.10-product-c1-jdk_io, \
solaris_sparcv9_5.10-product-c2-jdk_io, \
solaris_i586_5.10-product-c1-jdk_io, \
solaris_x64_5.10-product-c2-jdk_io, \
linux_i586_2.6-product-{c1|c2}-jdk_io, \
linux_x64_2.6-product-c2-jdk_io, \
${jprt.my.windows.i586}-product-c1-jdk_io, \
windows_x64_5.2-product-c2-jdk_io, \
\
solaris_sparc_5.10-product-c1-jdk_lang, \
solaris_sparcv9_5.10-product-c2-jdk_lang, \
solaris_i586_5.10-product-c1-jdk_lang, \
solaris_x64_5.10-product-c2-jdk_lang, \
linux_i586_2.6-product-{c1|c2}-jdk_lang, \
linux_x64_2.6-product-c2-jdk_lang, \
${jprt.my.windows.i586}-product-c1-jdk_lang, \
windows_x64_5.2-product-c2-jdk_lang, \
\
solaris_sparc_5.10-product-c1-jdk_math, \
solaris_sparcv9_5.10-product-c2-jdk_math, \
solaris_i586_5.10-product-c1-jdk_math, \
solaris_x64_5.10-product-c2-jdk_math, \
linux_i586_2.6-product-{c1|c2}-jdk_math, \
linux_x64_2.6-product-c2-jdk_math, \
${jprt.my.windows.i586}-product-c1-jdk_math, \
windows_x64_5.2-product-c2-jdk_math, \
\
solaris_sparc_5.10-product-c1-jdk_misc, \
solaris_sparcv9_5.10-product-c2-jdk_misc, \
solaris_i586_5.10-product-c1-jdk_misc, \
solaris_x64_5.10-product-c2-jdk_misc, \
linux_i586_2.6-product-{c1|c2}-jdk_misc, \
linux_x64_2.6-product-c2-jdk_misc, \
${jprt.my.windows.i586}-product-c1-jdk_misc, \
windows_x64_5.2-product-c2-jdk_misc, \
\
solaris_sparc_5.10-product-c1-jdk_net, \
solaris_sparcv9_5.10-product-c2-jdk_net, \
solaris_i586_5.10-product-c1-jdk_net, \
solaris_x64_5.10-product-c2-jdk_net, \
linux_i586_2.6-product-{c1|c2}-jdk_net, \
linux_x64_2.6-product-c2-jdk_net, \
${jprt.my.windows.i586}-product-c1-jdk_net, \
windows_x64_5.2-product-c2-jdk_net, \
\
solaris_sparc_5.10-product-c1-jdk_nio1, \
solaris_sparcv9_5.10-product-c2-jdk_nio1, \
solaris_i586_5.10-product-c1-jdk_nio1, \
solaris_x64_5.10-product-c2-jdk_nio1, \
linux_i586_2.6-product-{c1|c2}-jdk_nio1, \
linux_x64_2.6-product-c2-jdk_nio1, \
${jprt.my.windows.i586}-product-c1-jdk_nio1, \
windows_x64_5.2-product-c2-jdk_nio1, \
\
solaris_sparc_5.10-product-c1-jdk_nio2, \
solaris_sparcv9_5.10-product-c2-jdk_nio2, \
solaris_i586_5.10-product-c1-jdk_nio2, \
solaris_x64_5.10-product-c2-jdk_nio2, \
linux_i586_2.6-product-{c1|c2}-jdk_nio2, \
linux_x64_2.6-product-c2-jdk_nio2, \
${jprt.my.windows.i586}-product-c1-jdk_nio2, \
windows_x64_5.2-product-c2-jdk_nio2, \
\
solaris_sparc_5.10-product-c1-jdk_nio3, \
solaris_sparcv9_5.10-product-c2-jdk_nio3, \
solaris_i586_5.10-product-c1-jdk_nio3, \
solaris_x64_5.10-product-c2-jdk_nio3, \
linux_i586_2.6-product-{c1|c2}-jdk_nio3, \
linux_x64_2.6-product-c2-jdk_nio3, \
${jprt.my.windows.i586}-product-c1-jdk_nio3, \
windows_x64_5.2-product-c2-jdk_nio3, \
\
solaris_sparc_5.10-product-c1-jdk_security1, \
solaris_sparcv9_5.10-product-c2-jdk_security1, \
solaris_i586_5.10-product-c1-jdk_security1, \
solaris_x64_5.10-product-c2-jdk_security1, \
linux_i586_2.6-product-{c1|c2}-jdk_security1, \
linux_x64_2.6-product-c2-jdk_security1, \
${jprt.my.windows.i586}-product-c1-jdk_security1, \
windows_x64_5.2-product-c2-jdk_security1, \
\
solaris_sparc_5.10-product-c1-jdk_text, \
solaris_sparcv9_5.10-product-c2-jdk_text, \
solaris_i586_5.10-product-c1-jdk_text, \
solaris_x64_5.10-product-c2-jdk_text, \
linux_i586_2.6-product-{c1|c2}-jdk_text, \
linux_x64_2.6-product-c2-jdk_text, \
${jprt.my.windows.i586}-product-c1-jdk_text, \
windows_x64_5.2-product-c2-jdk_text, \
\
solaris_sparc_5.10-product-c1-jdk_tools1, \
solaris_sparcv9_5.10-product-c2-jdk_tools1, \
solaris_i586_5.10-product-c1-jdk_tools1, \
solaris_x64_5.10-product-c2-jdk_tools1, \
linux_i586_2.6-product-{c1|c2}-jdk_tools1, \
linux_x64_2.6-product-c2-jdk_tools1, \
${jprt.my.windows.i586}-product-c1-jdk_tools1, \
windows_x64_5.2-product-c2-jdk_tools1, \
\
solaris_sparc_5.10-product-c1-jdk_util, \
solaris_sparcv9_5.10-product-c2-jdk_util, \
solaris_i586_5.10-product-c1-jdk_util, \
solaris_x64_5.10-product-c2-jdk_util, \
linux_i586_2.6-product-{c1|c2}-jdk_util, \
linux_x64_2.6-product-c2-jdk_util, \
${jprt.my.windows.i586}-product-c1-jdk_util, \
windows_x64_5.2-product-c2-jdk_util
# Test targets in test/Makefile (some longer running tests only test c2)
jprt.make.rule.test.targets= \
*-product-*-jdk_beans1, \
*-product-*-jdk_beans2, \
*-product-*-jdk_beans3, \
*-product-*-jdk_io, \
*-product-*-jdk_lang, \
*-product-*-jdk_management1, \
*-product-*-jdk_management2, \
*-product-*-jdk_math, \
*-product-*-jdk_misc, \
*-product-*-jdk_net, \
*-product-*-jdk_nio1, \
*-product-*-jdk_nio2, \
*-product-*-jdk_nio3, \
*-product-*-jdk_security1, \
*-product-*-jdk_security2, \
*-product-*-jdk_security3, \
*-product-*-jdk_text, \
*-product-*-jdk_tools1, \
*-product-*-jdk_tools2, \
*-product-*-jdk_util
# All jdk test targets in test/Makefile (still no fastdebug & limited c2)
jprt.make.rule.all.test.targets= \
\
${jprt.make.rule.default.test.targets}, \
\
solaris_sparc_5.10-product-c1-jdk_awt, \
solaris_sparcv9_5.10-product-c2-jdk_awt, \
solaris_i586_5.10-product-c1-jdk_awt, \
solaris_x64_5.10-product-c2-jdk_awt, \
linux_i586_2.6-product-{c1|c2}-jdk_awt, \
linux_x64_2.6-product-c2-jdk_awt, \
${jprt.my.windows.i586}-product-c1-jdk_awt, \
windows_x64_5.2-product-c2-jdk_awt, \
\
solaris_sparc_5.10-product-c1-jdk_beans2, \
solaris_sparcv9_5.10-product-c2-jdk_beans2, \
solaris_i586_5.10-product-c1-jdk_beans2, \
solaris_x64_5.10-product-c2-jdk_beans2, \
linux_i586_2.6-product-{c1|c2}-jdk_beans2, \
linux_x64_2.6-product-c2-jdk_beans2, \
${jprt.my.windows.i586}-product-c1-jdk_beans2, \
windows_x64_5.2-product-c2-jdk_beans2, \
\
solaris_sparc_5.10-product-c1-jdk_beans3, \
solaris_sparcv9_5.10-product-c2-jdk_beans3, \
solaris_i586_5.10-product-c1-jdk_beans3, \
solaris_x64_5.10-product-c2-jdk_beans3, \
linux_i586_2.6-product-{c1|c2}-jdk_beans3, \
linux_x64_2.6-product-c2-jdk_beans3, \
${jprt.my.windows.i586}-product-c1-jdk_beans3, \
windows_x64_5.2-product-c2-jdk_beans3, \
\
solaris_sparc_5.10-product-c1-jdk_management1, \
solaris_sparcv9_5.10-product-c2-jdk_management1, \
solaris_i586_5.10-product-c1-jdk_management1, \
solaris_x64_5.10-product-c2-jdk_management1, \
linux_i586_2.6-product-{c1|c2}-jdk_management1, \
linux_x64_2.6-product-c2-jdk_management1, \
${jprt.my.windows.i586}-product-c1-jdk_management1, \
windows_x64_5.2-product-c2-jdk_management1, \
\
solaris_sparc_5.10-product-c1-jdk_management2, \
solaris_sparcv9_5.10-product-c2-jdk_management2, \
solaris_i586_5.10-product-c1-jdk_management2, \
solaris_x64_5.10-product-c2-jdk_management2, \
linux_i586_2.6-product-{c1|c2}-jdk_management2, \
linux_x64_2.6-product-c2-jdk_management2, \
${jprt.my.windows.i586}-product-c1-jdk_management2, \
windows_x64_5.2-product-c2-jdk_management2, \
\
solaris_sparc_5.10-product-c1-jdk_rmi, \
solaris_sparcv9_5.10-product-c2-jdk_rmi, \
solaris_i586_5.10-product-c1-jdk_rmi, \
solaris_x64_5.10-product-c2-jdk_rmi, \
linux_i586_2.6-product-{c1|c2}-jdk_rmi, \
linux_x64_2.6-product-c2-jdk_rmi, \
${jprt.my.windows.i586}-product-c1-jdk_rmi, \
windows_x64_5.2-product-c2-jdk_rmi, \
\
solaris_sparc_5.10-product-c1-jdk_security2, \
solaris_sparcv9_5.10-product-c2-jdk_security2, \
solaris_i586_5.10-product-c1-jdk_security2, \
solaris_x64_5.10-product-c2-jdk_security2, \
linux_i586_2.6-product-{c1|c2}-jdk_security2, \
linux_x64_2.6-product-c2-jdk_security2, \
${jprt.my.windows.i586}-product-c1-jdk_security2, \
windows_x64_5.2-product-c2-jdk_security2, \
\
solaris_sparc_5.10-product-c1-jdk_security3, \
solaris_sparcv9_5.10-product-c2-jdk_security3, \
solaris_i586_5.10-product-c1-jdk_security3, \
solaris_x64_5.10-product-c2-jdk_security3, \
linux_i586_2.6-product-{c1|c2}-jdk_security3, \
linux_x64_2.6-product-c2-jdk_security3, \
${jprt.my.windows.i586}-product-c1-jdk_security3, \
windows_x64_5.2-product-c2-jdk_security3, \
\
solaris_sparc_5.10-product-c1-jdk_swing, \
solaris_sparcv9_5.10-product-c2-jdk_swing, \
solaris_i586_5.10-product-c1-jdk_swing, \
solaris_x64_5.10-product-c2-jdk_swing, \
linux_i586_2.6-product-{c1|c2}-jdk_swing, \
linux_x64_2.6-product-c2-jdk_swing, \
${jprt.my.windows.i586}-product-c1-jdk_swing, \
windows_x64_5.2-product-c2-jdk_swing, \
\
solaris_sparc_5.10-product-c1-jdk_tools2, \
solaris_sparcv9_5.10-product-c2-jdk_tools2, \
solaris_i586_5.10-product-c1-jdk_tools2, \
solaris_x64_5.10-product-c2-jdk_tools2, \
linux_i586_2.6-product-{c1|c2}-jdk_tools2, \
linux_x64_2.6-product-c2-jdk_tools2, \
${jprt.my.windows.i586}-product-c1-jdk_tools2, \
windows_x64_5.2-product-c2-jdk_tools2
# Some of these are crashing Xvfb or windows manager, need dedicated DISPLAY per test batch
jprt2.make.rule.test.targets= \
*-product-*-jdk_awt, \
*-product-*-jdk_rmi, \
*-product-*-jdk_swing, \
# Select list to use (allow for testset to be empty too)
jprt.make.rule..test.targets=${jprt.make.rule.default.test.targets}
jprt.make.rule.test.targets=${jprt.make.rule.${jprt.my.test.set}.test.targets}
# Directories to be excluded from the source bundles
jprt.bundle.exclude.src.dirs=build dist webrev
......
......@@ -525,7 +525,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
iMatchColumns = new Vector(10);
for(int i = 0; i < 10 ; i++) {
iMatchColumns.add(i,new Integer(-1));
iMatchColumns.add(i,Integer.valueOf(-1));
}
strMatchColumns = new Vector(10);
......@@ -889,7 +889,12 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
success = false;
} else {
tWriter = (TransactionalWriter)rowSetWriter;
if (tWriter instanceof CachedRowSetWriter) {
((CachedRowSetWriter)tWriter).commit(this, updateOnInsert);
} else {
tWriter.commit();
}
success = true;
}
}
......@@ -1294,7 +1299,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
tMap = new TreeMap();
for (int i = 0; i<numRows; i++) {
tMap.put(new Integer(i), rvh.get(i));
tMap.put(Integer.valueOf(i), rvh.get(i));
}
return (tMap.values());
......@@ -1806,7 +1811,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
return (byte)0;
}
try {
return ((new Byte(value.toString())).byteValue());
return ((Byte.valueOf(value.toString())).byteValue());
} catch (NumberFormatException ex) {
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.bytefail").toString(),
new Object[] {value.toString().trim(), columnIndex}));
......@@ -1850,7 +1855,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
}
try {
return ((new Short(value.toString().trim())).shortValue());
return ((Short.valueOf(value.toString().trim())).shortValue());
} catch (NumberFormatException ex) {
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.shortfail").toString(),
new Object[] {value.toString().trim(), columnIndex}));
......@@ -1893,7 +1898,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
}
try {
return ((new Integer(value.toString().trim())).intValue());
return ((Integer.valueOf(value.toString().trim())).intValue());
} catch (NumberFormatException ex) {
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.intfail").toString(),
new Object[] {value.toString().trim(), columnIndex}));
......@@ -1936,7 +1941,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
return (long)0;
}
try {
return ((new Long(value.toString().trim())).longValue());
return ((Long.valueOf(value.toString().trim())).longValue());
} catch (NumberFormatException ex) {
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.longfail").toString(),
new Object[] {value.toString().trim(), columnIndex}));
......@@ -4014,18 +4019,18 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
try {
switch (trgType) {
case java.sql.Types.BIT:
Integer i = new Integer(srcObj.toString().trim());
return i.equals(new Integer((int)0)) ?
new Boolean(false) :
new Boolean(true);
Integer i = Integer.valueOf(srcObj.toString().trim());
return i.equals(Integer.valueOf((int)0)) ?
Boolean.valueOf(false) :
Boolean.valueOf(true);
case java.sql.Types.TINYINT:
return new Byte(srcObj.toString().trim());
return Byte.valueOf(srcObj.toString().trim());
case java.sql.Types.SMALLINT:
return new Short(srcObj.toString().trim());
return Short.valueOf(srcObj.toString().trim());
case java.sql.Types.INTEGER:
return new Integer(srcObj.toString().trim());
return Integer.valueOf(srcObj.toString().trim());
case java.sql.Types.BIGINT:
return new Long(srcObj.toString().trim());
return Long.valueOf(srcObj.toString().trim());
case java.sql.Types.NUMERIC:
case java.sql.Types.DECIMAL:
return new BigDecimal(srcObj.toString().trim());
......@@ -4037,7 +4042,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
case java.sql.Types.CHAR:
case java.sql.Types.VARCHAR:
case java.sql.Types.LONGVARCHAR:
return new String(srcObj.toString());
return srcObj.toString();
default:
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString()+ trgType);
}
......@@ -4134,7 +4139,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
case java.sql.Types.CHAR:
case java.sql.Types.VARCHAR:
case java.sql.Types.LONGVARCHAR:
return new String(srcObj.toString());
return srcObj.toString();
default:
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
}
......@@ -4181,12 +4186,12 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
try {
switch (trgType) {
case java.sql.Types.BIT:
Integer i = new Integer(srcObj.toString().trim());
return i.equals(new Integer((int)0)) ?
new Boolean(false) :
new Boolean(true);
Integer i = Integer.valueOf(srcObj.toString().trim());
return i.equals(Integer.valueOf((int)0)) ?
Boolean.valueOf(false) :
Boolean.valueOf(true);
case java.sql.Types.BOOLEAN:
return new Boolean(srcObj.toString().trim());
return Boolean.valueOf(srcObj.toString().trim());
default:
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString()+ trgType);
}
......@@ -4260,7 +4265,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
checkIndex(columnIndex);
// make sure the cursor is on a valid row
checkCursor();
Object obj = convertBoolean(new Boolean(x),
Object obj = convertBoolean(Boolean.valueOf(x),
java.sql.Types.BIT,
RowSetMD.getColumnType(columnIndex));
......@@ -4296,7 +4301,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
// make sure the cursor is on a valid row
checkCursor();
Object obj = convertNumeric(new Byte(x),
Object obj = convertNumeric(Byte.valueOf(x),
java.sql.Types.TINYINT,
RowSetMD.getColumnType(columnIndex));
......@@ -4332,7 +4337,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
// make sure the cursor is on a valid row
checkCursor();
Object obj = convertNumeric(new Short(x),
Object obj = convertNumeric(Short.valueOf(x),
java.sql.Types.SMALLINT,
RowSetMD.getColumnType(columnIndex));
......@@ -4367,7 +4372,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
checkIndex(columnIndex);
// make sure the cursor is on a valid row
checkCursor();
Object obj = convertNumeric(new Integer(x),
Object obj = convertNumeric(Integer.valueOf(x),
java.sql.Types.INTEGER,
RowSetMD.getColumnType(columnIndex));
......@@ -4403,7 +4408,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
// make sure the cursor is on a valid row
checkCursor();
Object obj = convertNumeric(new Long(x),
Object obj = convertNumeric(Long.valueOf(x),
java.sql.Types.BIGINT,
RowSetMD.getColumnType(columnIndex));
......@@ -6429,7 +6434,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
if (tabName == null)
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.tablename").toString());
else
tableName = new String(tabName);
tableName = tabName;
}
/**
......@@ -6940,7 +6945,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
}
for( int i = 0;i < columnIdxes.length ;i++) {
iMatchColumns.set(i,new Integer(-1));
iMatchColumns.set(i,Integer.valueOf(-1));
}
}
......@@ -7049,7 +7054,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
}
}
for(int i = 0 ;i < columnIdxes.length; i++) {
iMatchColumns.add(i,new Integer(columnIdxes[i]));
iMatchColumns.add(i,Integer.valueOf(columnIdxes[i]));
}
}
......@@ -7104,7 +7109,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.matchcols1").toString());
} else {
// set iMatchColumn
iMatchColumns.set(0, new Integer(columnIdx));
iMatchColumns.set(0, Integer.valueOf(columnIdx));
//strMatchColumn = null;
}
}
......@@ -7126,7 +7131,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
*/
public void setMatchColumn(String columnName) throws SQLException {
// validate, if col is ok to be set
if(columnName.equals(null) || ((columnName = columnName.trim()) == "" )) {
if(columnName == null || (columnName= columnName.trim()).equals("") ) {
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.matchcols2").toString());
} else {
// set strMatchColumn
......@@ -7151,13 +7156,13 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
*/
public void unsetMatchColumn(int columnIdx) throws SQLException {
// check if we are unsetting the SAME column
if(! iMatchColumns.get(0).equals(new Integer(columnIdx) ) ) {
if(! iMatchColumns.get(0).equals(Integer.valueOf(columnIdx) ) ) {
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.unsetmatch").toString());
} else if(strMatchColumns.get(0) != null) {
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.unsetmatch1").toString());
} else {
// that is, we are unsetting it.
iMatchColumns.set(0, new Integer(-1));
iMatchColumns.set(0, Integer.valueOf(-1));
}
}
......
......@@ -499,7 +499,7 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C
if(onInsertRow) {
if(p != null) {
bool = p.evaluate(new Integer(x),columnIndex);
bool = p.evaluate(Integer.valueOf(x),columnIndex);
if(!bool) {
throw new SQLException(resBundle.handleGetObject("filteredrowsetimpl.notallowed").toString());
......@@ -566,7 +566,7 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C
if(onInsertRow) {
if(p != null) {
bool = p.evaluate(new Boolean(x) , columnIndex);
bool = p.evaluate(Boolean.valueOf(x) , columnIndex);
if(!bool) {
throw new SQLException(resBundle.handleGetObject("filteredrowsetimpl.notallowed").toString());
......@@ -634,7 +634,7 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C
if(onInsertRow) {
if(p != null) {
bool = p.evaluate(new Byte(x),columnIndex);
bool = p.evaluate(Byte.valueOf(x),columnIndex);
if(!bool) {
throw new SQLException(resBundle.handleGetObject("filteredrowsetimpl.notallowed").toString());
......@@ -703,7 +703,7 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C
if(onInsertRow) {
if(p != null) {
bool = p.evaluate(new Short(x), columnIndex);
bool = p.evaluate(Short.valueOf(x), columnIndex);
if(!bool) {
throw new SQLException(resBundle.handleGetObject("filteredrowsetimpl.notallowed").toString());
......@@ -771,7 +771,7 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C
if(onInsertRow) {
if(p != null) {
bool = p.evaluate(new Long(x), columnIndex);
bool = p.evaluate(Long.valueOf(x), columnIndex);
if(!bool) {
throw new SQLException(resBundle.handleGetObject("filteredrowsetimpl.notallowed").toString());
......@@ -1106,12 +1106,12 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C
public void updateBytes(int columnIndex , byte []x) throws SQLException {
boolean bool;
String val = new String();
String val = "";
Byte [] obj_arr = new Byte[x.length];
for(int i = 0; i < x.length; i++) {
obj_arr[i] = new Byte(x[i]);
obj_arr[i] = Byte.valueOf(x[i]);
val = val.concat(obj_arr[i].toString());
}
......
......@@ -215,7 +215,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
iMatchColumns = new Vector(10);
for(int i = 0; i < 10 ; i++) {
iMatchColumns.add(i,new Integer(-1));
iMatchColumns.add(i,Integer.valueOf(-1));
}
strMatchColumns = new Vector(10);
......@@ -288,7 +288,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
iMatchColumns = new Vector(10);
for(int i = 0; i < 10 ; i++) {
iMatchColumns.add(i,new Integer(-1));
iMatchColumns.add(i,Integer.valueOf(-1));
}
strMatchColumns = new Vector(10);
......@@ -375,7 +375,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
iMatchColumns = new Vector(10);
for(int i = 0; i < 10 ; i++) {
iMatchColumns.add(i,new Integer(-1));
iMatchColumns.add(i,Integer.valueOf(-1));
}
strMatchColumns = new Vector(10);
......@@ -465,7 +465,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
iMatchColumns = new Vector(10);
for(int i = 0; i < 10 ; i++) {
iMatchColumns.add(i,new Integer(-1));
iMatchColumns.add(i,Integer.valueOf(-1));
}
strMatchColumns = new Vector(10);
......@@ -3754,7 +3754,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
}
for( int i = 0;i < columnIdxes.length ;i++) {
iMatchColumns.set(i,new Integer(-1));
iMatchColumns.set(i,Integer.valueOf(-1));
}
}
......@@ -3863,7 +3863,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
}
}
for(int i = 0 ;i < columnIdxes.length; i++) {
iMatchColumns.add(i,new Integer(columnIdxes[i]));
iMatchColumns.add(i,Integer.valueOf(columnIdxes[i]));
}
}
......@@ -3918,7 +3918,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.matchcols1").toString());
} else {
// set iMatchColumn
iMatchColumns.set(0, new Integer(columnIdx));
iMatchColumns.set(0, Integer.valueOf(columnIdx));
//strMatchColumn = null;
}
}
......@@ -3940,7 +3940,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
*/
public void setMatchColumn(String columnName) throws SQLException {
// validate, if col is ok to be set
if(columnName.equals(null) || ((columnName = columnName.trim()) == "" )) {
if(columnName == null || (columnName= columnName.trim()).equals("")) {
throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.matchcols2").toString());
} else {
// set strMatchColumn
......@@ -3965,13 +3965,13 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
*/
public void unsetMatchColumn(int columnIdx) throws SQLException {
// check if we are unsetting the SAME column
if(! iMatchColumns.get(0).equals(new Integer(columnIdx) ) ) {
if(! iMatchColumns.get(0).equals(Integer.valueOf(columnIdx) ) ) {
throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.unsetmatch").toString());
} else if(strMatchColumns.get(0) != null) {
throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.usecolname").toString());
} else {
// that is, we are unsetting it.
iMatchColumns.set(0, new Integer(-1));
iMatchColumns.set(0, Integer.valueOf(-1));
}
}
......
......@@ -33,6 +33,8 @@ import java.math.*;
import java.util.*;
import javax.sql.rowset.*;
import javax.sql.rowset.spi.SyncProvider;
import javax.sql.rowset.spi.SyncProviderException;
/**
* The standard implementation of the <code>JoinRowSet</code>
......@@ -550,7 +552,7 @@ public class JoinRowSetImpl extends WebRowSetImpl implements JoinRowSet {
// This 'if' will be removed after all joins are implemented.
throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.notsupported").toString());
} else {
Integer Intgr = new Integer(JoinRowSet.INNER_JOIN);
Integer Intgr = Integer.valueOf(JoinRowSet.INNER_JOIN);
vecJoinType.add(Intgr);
}
} else {
......@@ -874,8 +876,8 @@ public class JoinRowSetImpl extends WebRowSetImpl implements JoinRowSet {
String strWhereClause = "Select ";
String whereClause;
String tabName= null;
String strTabName = null;
String tabName= "";
String strTabName = "";
int sz,cols;
int j;
CachedRowSetImpl crs;
......@@ -889,8 +891,6 @@ public class JoinRowSetImpl extends WebRowSetImpl implements JoinRowSet {
// tableNameX.(rowsetX.getMatchColumnName()) ==
// tableNameZ.(rowsetZ.getMatchColumnName()));
tabName = new String();
strTabName = new String();
sz = vecRowSetsInJOIN.size();
for(int i=0;i<sz; i++) {
crs = (CachedRowSetImpl)vecRowSetsInJOIN.get(i);
......@@ -4311,6 +4311,27 @@ public class JoinRowSetImpl extends WebRowSetImpl implements JoinRowSet {
return crsInternal.createCopySchema();
}
/**
* {@inheritDoc}
*/
public void setSyncProvider(String providerStr) throws SQLException {
crsInternal.setSyncProvider(providerStr);
}
/**
* {@inheritDoc}
*/
public void acceptChanges() throws SyncProviderException {
crsInternal.acceptChanges();
}
/**
* {@inheritDoc}
*/
public SyncProvider getSyncProvider() throws SQLException {
return crsInternal.getSyncProvider();
}
/**
* This method re populates the resBundle
* during the deserialization process
......
......@@ -338,11 +338,11 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
if (crs.rowDeleted()) {
// The row has been deleted.
if (conflict = (deleteOriginalRow(crs, this.crsResolve)) == true) {
status.add(rows, new Integer(SyncResolver.DELETE_ROW_CONFLICT));
status.add(rows, Integer.valueOf(SyncResolver.DELETE_ROW_CONFLICT));
} else {
// delete happened without any occurrence of conflicts
// so update status accordingly
status.add(rows, new Integer(SyncResolver.NO_ROW_CONFLICT));
status.add(rows, Integer.valueOf(SyncResolver.NO_ROW_CONFLICT));
}
} else if (crs.rowInserted()) {
......@@ -350,20 +350,20 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
pstmtIns = con.prepareStatement(insertCmd);
if ( (conflict = insertNewRow(crs, pstmtIns, this.crsResolve)) == true) {
status.add(rows, new Integer(SyncResolver.INSERT_ROW_CONFLICT));
status.add(rows, Integer.valueOf(SyncResolver.INSERT_ROW_CONFLICT));
} else {
// insert happened without any occurrence of conflicts
// so update status accordingly
status.add(rows, new Integer(SyncResolver.NO_ROW_CONFLICT));
status.add(rows, Integer.valueOf(SyncResolver.NO_ROW_CONFLICT));
}
} else if (crs.rowUpdated()) {
// The row has been updated.
if ( conflict = (updateOriginalRow(crs)) == true) {
status.add(rows, new Integer(SyncResolver.UPDATE_ROW_CONFLICT));
status.add(rows, Integer.valueOf(SyncResolver.UPDATE_ROW_CONFLICT));
} else {
// update happened without any occurrence of conflicts
// so update status accordingly
status.add(rows, new Integer(SyncResolver.NO_ROW_CONFLICT));
status.add(rows, Integer.valueOf(SyncResolver.NO_ROW_CONFLICT));
}
} else {
......@@ -375,7 +375,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
* that is fine.
**/
int icolCount = crs.getMetaData().getColumnCount();
status.add(rows, new Integer(SyncResolver.NO_ROW_CONFLICT));
status.add(rows, Integer.valueOf(SyncResolver.NO_ROW_CONFLICT));
this.crsResolve.moveToInsertRow();
for(int cols=0;cols<iColCount;cols++) {
......@@ -398,7 +398,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
boolean boolConf = false;
for (int j=1;j<status.size();j++){
// ignore status for index = 0 which is set to null
if(! ((status.get(j)).equals(new Integer(SyncResolver.NO_ROW_CONFLICT)))) {
if(! ((status.get(j)).equals(Integer.valueOf(SyncResolver.NO_ROW_CONFLICT)))) {
// there is at least one conflict which needs to be resolved
boolConf = true;
break;
......@@ -541,7 +541,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
// how many fields need to be updated
int colsNotChanged = 0;
Vector cols = new Vector();
String updateExec = new String(updateCmd);
String updateExec = updateCmd;
Object orig;
Object curr;
Object rsval;
......@@ -652,7 +652,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
updateExec += ", ";
}
updateExec += crs.getMetaData().getColumnName(i);
cols.add(new Integer(i));
cols.add(Integer.valueOf(i));
updateExec += " = ? ";
first = false;
......@@ -698,7 +698,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
updateExec += ", ";
}
updateExec += crs.getMetaData().getColumnName(i);
cols.add(new Integer(i));
cols.add(Integer.valueOf(i));
updateExec += " = ? ";
flag = false;
} else {
......@@ -1184,7 +1184,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
// trim all the leading and trailing whitespaces,
// white spaces can never be catalog, schema or a table name.
String cmd = new String();
String cmd = "";
catalog = catalog.trim();
schema = schema.trim();
......
......@@ -248,7 +248,7 @@ public class WebRowSetXmlWriter implements XmlWriter, Serializable {
String strProvider = strProviderInstance.substring(0, (caller.getSyncProvider()).toString().indexOf("@"));
propString("sync-provider-name", strProvider);
propString("sync-provider-vendor", "Sun Microsystems Inc.");
propString("sync-provider-vendor", "Oracle Corporation");
propString("sync-provider-version", "1.0");
propInteger("sync-provider-grade", caller.getSyncProvider().getProviderGrade());
propInteger("data-source-lock", caller.getSyncProvider().getDataSourceLock());
......@@ -387,7 +387,7 @@ public class WebRowSetXmlWriter implements XmlWriter, Serializable {
if (caller.wasNull())
writeNull();
else
writeInteger(caller.getInt(idx));
writeInteger(i);
break;
case java.sql.Types.BIGINT:
long l = caller.getLong(idx);
......@@ -574,7 +574,7 @@ public class WebRowSetXmlWriter implements XmlWriter, Serializable {
}
private void writeBoolean(boolean b) throws java.io.IOException {
writer.write(new Boolean(b).toString());
writer.write(Boolean.valueOf(b).toString());
}
private void writeFloat(float f) throws java.io.IOException {
......@@ -641,7 +641,7 @@ public class WebRowSetXmlWriter implements XmlWriter, Serializable {
return null;
}
char []charStr = s.toCharArray();
String specialStr = new String();
String specialStr = "";
for(int i = 0; i < charStr.length; i++) {
if(charStr[i] == '&') {
......
......@@ -441,9 +441,9 @@ public class XmlReaderContentHandler extends DefaultHandler {
updates = new Vector();
// start out with the empty string
columnValue = new String("");
propertyValue = new String("");
metaDataValue = new String("");
columnValue = "";
propertyValue = "";
metaDataValue = "";
nullVal = false;
idx = 0;
......@@ -481,21 +481,21 @@ public class XmlReaderContentHandler extends DefaultHandler {
items = properties.length;
for (i=0;i<items;i++) {
propMap.put(properties[i], new Integer(i));
propMap.put(properties[i], Integer.valueOf(i));
}
colDefMap = new HashMap();
items = colDef.length;
for (i=0;i<items;i++) {
colDefMap.put(colDef[i], new Integer(i));
colDefMap.put(colDef[i], Integer.valueOf(i));
}
dataMap = new HashMap();
items = data.length;
for (i=0;i<items;i++) {
dataMap.put(data[i], new Integer(i));
dataMap.put(data[i], Integer.valueOf(i));
}
//Initialize connection map here
......@@ -686,7 +686,7 @@ public class XmlReaderContentHandler extends DefaultHandler {
}
// propertyValue need to be reset to an empty string
propertyValue = new String("");
propertyValue = "";
setTag(-1);
break;
case METADATA:
......@@ -710,7 +710,7 @@ public class XmlReaderContentHandler extends DefaultHandler {
}
// metaDataValue needs to be reset to an empty string
metaDataValue = new String("");
metaDataValue = "";
}
setTag(-1);
break;
......@@ -736,7 +736,7 @@ public class XmlReaderContentHandler extends DefaultHandler {
insertValue(tempStr);
}
// columnValue now need to be reset to the empty string
columnValue = new String("");
columnValue = "";
} catch (SQLException ex) {
throw new SAXException(MessageFormat.format(resBundle.handleGetObject("xmlrch.errinsert").toString(), ex.getMessage()));
}
......@@ -981,7 +981,7 @@ public class XmlReaderContentHandler extends DefaultHandler {
private boolean getBooleanValue(String s) {
return new Boolean(s).booleanValue();
return Boolean.valueOf(s).booleanValue();
}
private java.math.BigDecimal getBigDecimalValue(String s) {
......@@ -1316,7 +1316,7 @@ public class XmlReaderContentHandler extends DefaultHandler {
**/
tempUpdate = tempUpdate.concat(new String(ch,start,len));
upd[0] = new Integer(idx);
upd[0] = Integer.valueOf(idx);
upd[1] = tempUpdate;
//updates.add(upd);
......
......@@ -93,14 +93,14 @@ public final class RIOptimisticProvider extends SyncProvider implements Serializ
private CachedRowSetWriter writer;
/**
* The unique provider indentifier.
* The unique provider identifier.
*/
private String providerID = "com.sun.rowset.providers.RIOptimisticProvider";
/**
* The vendor name of this SyncProvider implementation
*/
private String vendorName = "Sun Microsystems Inc.";
private String vendorName = "Oracle Corporation";
/**
* The version number of this SyncProvider implementation
......@@ -236,8 +236,8 @@ public final class RIOptimisticProvider extends SyncProvider implements Serializ
}
/**
* Returns the vendor name of the Reference Implemntation Optimistic
* Syncchronication Provider
* Returns the vendor name of the Reference Implementation Optimistic
* Synchronization Provider
*
* @return the <code>String</code> detailing the vendor name of this
* SyncProvider
......
/*
* Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -85,7 +85,7 @@ public final class RIXMLProvider extends SyncProvider {
/**
* The vendor name of this SyncProvider implementation.
*/
private String vendorName = "Sun Microsystems Inc.";
private String vendorName = "Oracle Corporation";
/**
* The version number of this SyncProvider implementation.
......
......@@ -43,7 +43,8 @@ public class Installer {
"servicetag.dir.path";
private static String SVCTAG_ENABLE_REGISTRATION =
"servicetag.registration.enabled";
private final static String SUN_VENDOR = "Sun Microsystems";
private final static String ORACLE = "Oracle";
private final static String SUN = "Sun Microsystems";
private final static String REGISTRATION_XML = "registration.xml";
private final static String SERVICE_TAG_FILE = "servicetag";
private final static String REGISTRATION_HTML_NAME = "register";
......@@ -84,9 +85,10 @@ public class Installer {
// Implementation of ServiceTag.getJavaServiceTag(String) method
static ServiceTag getJavaServiceTag(String source) throws IOException {
if (!System.getProperty("java.vendor").startsWith(SUN_VENDOR)) {
String vendor = System.getProperty("java.vendor", "");
if (!vendor.startsWith(SUN) && !vendor.startsWith(ORACLE)) {
// Products bundling this implementation may run on
// Mac OS which is not a Sun JDK
// Mac OS which is not a Sun/Oracle JDK
return null;
}
boolean cleanup = false;
......@@ -365,7 +367,7 @@ public class Installer {
props.getProperty("servicetag.parent.name"),
props.getProperty("servicetag.parent.urn"),
getProductDefinedId(),
SUN_VENDOR,
System.getProperty("java.vendor"),
System.getProperty("os.arch"),
getZoneName(),
svcTagSource);
......
......@@ -80,12 +80,12 @@ import static com.sun.servicetag.RegistrationDocument.*;
* <tr>
* <td><tt>systemManufacturer</tt></td>
* <td>System manufacturer</td>
* <td> e.g. Sun Microsystems</td>
* <td> e.g. Oracle Corporation</td>
* </tr>
* <tr>
* <td><tt>cpuManufacturer</tt></td>
* <td>CPU manufacturer</td>
* <td> e.g. Sun Microsystems</td>
* <td> e.g. Oracle Corporation</td>
* </tr>
* <tr>
* <td><tt>serialNumber</tt></td>
......
......@@ -90,7 +90,7 @@ public class Registry {
stclient = getWindowsStClientFile();
} else {
if (isVerbose()) {
System.out.println("Running on non-Sun JDK");
System.out.println("Running on unsupported platform");
}
}
initialized = true;
......
......@@ -44,6 +44,7 @@ import java.io.*;
* Solaris implementation of the SystemEnvironment class.
*/
class SolarisSystemEnvironment extends SystemEnvironment {
private static final String ORACLE = "Oracle Corporation";
SolarisSystemEnvironment() {
setHostId(getCommandOutput("/usr/bin/hostid"));
setSystemModel(getCommandOutput("/usr/bin/uname", "-i"));
......@@ -59,7 +60,7 @@ class SolarisSystemEnvironment extends SystemEnvironment {
private String getSolarisCpuManufacturer() {
// not fully accurate, this could be another manufacturer (fujitsu for example)
if ("sparc".equalsIgnoreCase(System.getProperty("os.arch"))) {
return "Sun Microsystems, Inc";
return ORACLE;
}
// if we're here, then we'll try smbios (type 4)
......@@ -73,7 +74,7 @@ class SolarisSystemEnvironment extends SystemEnvironment {
private String getSolarisSystemManufacturer() {
// not fully accurate, this could be another manufacturer (fujitsu for example)
if ("sparc".equalsIgnoreCase(System.getProperty("os.arch"))) {
return "Sun Microsystems, Inc";
return ORACLE;
}
// if we're here, then we'll try smbios (type 1)
......@@ -117,7 +118,7 @@ class SolarisSystemEnvironment extends SystemEnvironment {
// ID SIZE TYPE
// 1 150 SMB_TYPE_SYSTEM (system information)
//
// Manufacturer: Sun Microsystems
// Manufacturer: Oracle Corporation
// Product: Sun Fire X4600
// Version: To Be Filled By O.E.M.
// Serial Number: 00:14:4F:45:0C:2A
......
......@@ -1101,22 +1101,12 @@ public final class System {
lineSeparator = props.getProperty("line.separator");
sun.misc.Version.init();
// Workaround until DownloadManager initialization is revisited.
// Make JavaLangAccess available early enough for internal
// Shutdown hooks to be registered
setJavaLangAccess();
// Gets and removes system properties that configure the Integer
// cache used to support the object identity semantics of autoboxing.
// At this time, the size of the cache may be controlled by the
// vm option -XX:AutoBoxCacheMax=<size>.
Integer.getAndRemoveCacheProperties();
// Load the zip library now in order to keep java.util.zip.ZipFile
// from trying to use itself to load this library later.
loadLibrary("zip");
FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
......@@ -1124,6 +1114,10 @@ public final class System {
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true));
// Load the zip library now in order to keep java.util.zip.ZipFile
// from trying to use itself to load this library later.
loadLibrary("zip");
// Setup Java signal handlers for HUP, TERM, and INT (where available).
Terminator.setup();
......@@ -1153,6 +1147,9 @@ public final class System {
// way as other threads; we must do it ourselves here.
Thread current = Thread.currentThread();
current.getThreadGroup().add(current);
// register shared secrets
setJavaLangAccess();
}
private static void setJavaLangAccess() {
......
......@@ -677,19 +677,20 @@ class InetAddress implements java.io.Serializable {
static InetAddressImpl impl;
private static HashMap lookupTable = new HashMap();
private static HashMap<String, InetAddress[]> lookupTable
= new HashMap<String, InetAddress[]>();
/**
* Represents a cache entry
*/
static final class CacheEntry {
CacheEntry(Object address, long expiration) {
this.address = address;
CacheEntry(InetAddress[] addresses, long expiration) {
this.addresses = addresses;
this.expiration = expiration;
}
Object address;
InetAddress[] addresses;
long expiration;
}
......@@ -698,7 +699,7 @@ class InetAddress implements java.io.Serializable {
* at creation time.
*/
static final class Cache {
private LinkedHashMap cache;
private LinkedHashMap<String, CacheEntry> cache;
private Type type;
enum Type {Positive, Negative};
......@@ -708,7 +709,7 @@ class InetAddress implements java.io.Serializable {
*/
public Cache(Type type) {
this.type = type;
cache = new LinkedHashMap();
cache = new LinkedHashMap<String, CacheEntry>();
}
private int getPolicy() {
......@@ -724,7 +725,7 @@ class InetAddress implements java.io.Serializable {
* entry then for this host then the entry will be
* replaced.
*/
public Cache put(String host, Object address) {
public Cache put(String host, InetAddress[] addresses) {
int policy = getPolicy();
if (policy == InetAddressCachePolicy.NEVER) {
return this;
......@@ -736,12 +737,10 @@ class InetAddress implements java.io.Serializable {
// As we iterate in insertion order we can
// terminate when a non-expired entry is found.
LinkedList expired = new LinkedList();
Iterator i = cache.keySet().iterator();
LinkedList<String> expired = new LinkedList<String>();
long now = System.currentTimeMillis();
while (i.hasNext()) {
String key = (String)i.next();
CacheEntry entry = (CacheEntry)cache.get(key);
for (String key : cache.keySet()) {
CacheEntry entry = cache.get(key);
if (entry.expiration >= 0 && entry.expiration < now) {
expired.add(key);
......@@ -750,9 +749,8 @@ class InetAddress implements java.io.Serializable {
}
}
i = expired.iterator();
while (i.hasNext()) {
cache.remove(i.next());
for (String key : expired) {
cache.remove(key);
}
}
......@@ -766,7 +764,7 @@ class InetAddress implements java.io.Serializable {
} else {
expiration = System.currentTimeMillis() + (policy * 1000);
}
CacheEntry entry = new CacheEntry(address, expiration);
CacheEntry entry = new CacheEntry(addresses, expiration);
cache.put(host, entry);
return this;
}
......@@ -780,7 +778,7 @@ class InetAddress implements java.io.Serializable {
if (policy == InetAddressCachePolicy.NEVER) {
return null;
}
CacheEntry entry = (CacheEntry)cache.get(host);
CacheEntry entry = cache.get(host);
// check if entry has expired
if (entry != null && policy != InetAddressCachePolicy.FOREVER) {
......@@ -814,42 +812,41 @@ class InetAddress implements java.io.Serializable {
}
/*
* Cache the given hostname and address.
* Cache the given hostname and addresses.
*/
private static void cacheAddress(String hostname, Object address,
private static void cacheAddresses(String hostname,
InetAddress[] addresses,
boolean success) {
hostname = hostname.toLowerCase();
synchronized (addressCache) {
cacheInitIfNeeded();
if (success) {
addressCache.put(hostname, address);
addressCache.put(hostname, addresses);
} else {
negativeCache.put(hostname, address);
negativeCache.put(hostname, addresses);
}
}
}
/*
* Lookup hostname in cache (positive & negative cache). If
* found return address, null if not found.
* found return addresses, null if not found.
*/
private static Object getCachedAddress(String hostname) {
private static InetAddress[] getCachedAddresses(String hostname) {
hostname = hostname.toLowerCase();
// search both positive & negative caches
synchronized (addressCache) {
CacheEntry entry;
cacheInitIfNeeded();
entry = addressCache.get(hostname);
CacheEntry entry = addressCache.get(hostname);
if (entry == null) {
entry = negativeCache.get(hostname);
}
if (entry != null) {
return entry.address;
return entry.addresses;
}
}
......@@ -911,7 +908,7 @@ class InetAddress implements java.io.Serializable {
static {
// create the impl
impl = (new InetAddressImplFactory()).create();
impl = InetAddressImplFactory.create();
// get name service if provided and requested
String provider = null;;
......@@ -931,7 +928,7 @@ class InetAddress implements java.io.Serializable {
}
// if not designate any name services provider,
// creat a default one
// create a default one
if (nameServices.size() == 0) {
NameService ns = createNSProvider("default");
nameServices.add(ns);
......@@ -939,7 +936,7 @@ class InetAddress implements java.io.Serializable {
}
/**
* Create an InetAddress based on the provided host name and IP address
* Creates an InetAddress based on the provided host name and IP address.
* No name service is checked for the validity of the address.
*
* <p> The host name can either be a machine name, such as
......@@ -1067,13 +1064,13 @@ class InetAddress implements java.io.Serializable {
boolean ipv6Expected = false;
if (host.charAt(0) == '[') {
// This is supposed to be an IPv6 litteral
// This is supposed to be an IPv6 literal
if (host.length() > 2 && host.charAt(host.length()-1) == ']') {
host = host.substring(1, host.length() -1);
ipv6Expected = true;
} else {
// This was supposed to be a IPv6 address, but it's not!
throw new UnknownHostException(host);
throw new UnknownHostException(host + ": invalid IPv6 address");
}
}
......@@ -1180,8 +1177,6 @@ class InetAddress implements java.io.Serializable {
throws UnknownHostException {
/* If it gets here it is presumed to be a hostname */
/* Cache.get can return: null, unknownAddress, or InetAddress[] */
Object obj = null;
Object objcopy = null;
/* make sure the connection to the host is allowed, before we
* give out a hostname
......@@ -1193,26 +1188,23 @@ class InetAddress implements java.io.Serializable {
}
}
obj = getCachedAddress(host);
InetAddress[] addresses = getCachedAddresses(host);
/* If no entry in cache, then do the host lookup */
if (obj == null) {
obj = getAddressFromNameService(host);
if (addresses == null) {
addresses = getAddressesFromNameService(host);
}
if (obj == unknown_array)
if (addresses == unknown_array)
throw new UnknownHostException(host);
/* Make a copy of the InetAddress array */
objcopy = ((InetAddress [])obj).clone();
return (InetAddress [])objcopy;
return addresses.clone();
}
private static Object getAddressFromNameService(String host)
private static InetAddress[] getAddressesFromNameService(String host)
throws UnknownHostException
{
Object obj = null;
InetAddress[] addresses = null;
boolean success = false;
UnknownHostException ex = null;
......@@ -1226,16 +1218,16 @@ class InetAddress implements java.io.Serializable {
// would be blocked until the host is removed
// from the lookupTable. Then this thread
// should try to look up the addressCache.
// i) if it found the address in the
// i) if it found the addresses in the
// addressCache, checkLookupTable() would
// return the address.
// ii) if it didn't find the address in the
// return the addresses.
// ii) if it didn't find the addresses in the
// addressCache for any reason,
// it should add the host in the
// lookupTable and return null so the
// following code would do a lookup itself.
if ((obj = checkLookupTable(host)) == null) {
// This is the first thread which looks up the address
if ((addresses = checkLookupTable(host)) == null) {
// This is the first thread which looks up the addresses
// this host or the cache entry for this host has been
// expired so this thread should do the lookup.
for (NameService nameService : nameServices) {
......@@ -1246,26 +1238,26 @@ class InetAddress implements java.io.Serializable {
* allocating space when the lookup fails.
*/
obj = nameService.lookupAllHostAddr(host);
addresses = nameService.lookupAllHostAddr(host);
success = true;
break;
} catch (UnknownHostException uhe) {
if (host.equalsIgnoreCase("localhost")) {
InetAddress[] local = new InetAddress[] { impl.loopbackAddress() };
obj = local;
addresses = local;
success = true;
break;
}
else {
obj = unknown_array;
addresses = unknown_array;
success = false;
ex = uhe;
}
}
}
// Cache the address.
cacheAddress(host, obj, success);
// Cache the addresses.
cacheAddresses(host, addresses, success);
// Delete the host from the lookupTable, and
// notify all threads waiting for the monitor
// for lookupTable.
......@@ -1274,13 +1266,13 @@ class InetAddress implements java.io.Serializable {
throw ex;
}
return obj;
return addresses;
}
private static Object checkLookupTable(String host) {
// make sure obj is null.
Object obj = null;
private static InetAddress[] checkLookupTable(String host) {
// make sure addresses is null.
InetAddress[] addresses = null;
synchronized (lookupTable) {
// If the host isn't in the lookupTable, add it in the
......@@ -1288,11 +1280,11 @@ class InetAddress implements java.io.Serializable {
// the lookup.
if (lookupTable.containsKey(host) == false) {
lookupTable.put(host, null);
return obj;
return addresses;
}
// If the host is in the lookupTable, it means that another
// thread is trying to look up the address of this host.
// thread is trying to look up the addresses of this host.
// This thread should wait.
while (lookupTable.containsKey(host)) {
try {
......@@ -1302,18 +1294,18 @@ class InetAddress implements java.io.Serializable {
}
}
// The other thread has finished looking up the address of
// the host. This thread should retry to get the address
// from the addressCache. If it doesn't get the address from
// the cache, it will try to look up the address itself.
obj = getCachedAddress(host);
if (obj == null) {
// The other thread has finished looking up the addresses of
// the host. This thread should retry to get the addresses
// from the addressCache. If it doesn't get the addresses from
// the cache, it will try to look up the addresses itself.
addresses = getCachedAddresses(host);
if (addresses == null) {
synchronized (lookupTable) {
lookupTable.put(host, null);
}
}
return obj;
return addresses;
}
private static void updateLookupTable(String host) {
......@@ -1396,15 +1388,20 @@ class InetAddress implements java.io.Serializable {
cachedLocalHost = null;
}
// we are calling getAddressFromNameService directly
// we are calling getAddressesFromNameService directly
// to avoid getting localHost from cache
if (ret == null) {
InetAddress[] localAddrs;
try {
localAddrs =
(InetAddress[]) InetAddress.getAddressFromNameService(local);
InetAddress.getAddressesFromNameService(local);
} catch (UnknownHostException uhe) {
throw new UnknownHostException(local + ": " + uhe.getMessage());
// Rethrow with a more informative error message.
UnknownHostException uhe2 =
new UnknownHostException(local + ": " +
uhe.getMessage());
uhe2.initCause(uhe);
throw uhe2;
}
cachedLocalHost = localAddrs[0];
cacheTime = now;
......@@ -1434,8 +1431,8 @@ class InetAddress implements java.io.Serializable {
/*
* Load and instantiate an underlying impl class
*/
static Object loadImpl(String implName) {
Object impl;
static InetAddressImpl loadImpl(String implName) {
Object impl = null;
/*
* Property "impl.prefix" will be prepended to the classname
......@@ -1446,7 +1443,6 @@ class InetAddress implements java.io.Serializable {
*/
String prefix = AccessController.doPrivileged(
new GetPropertyAction("impl.prefix", ""));
impl = null;
try {
impl = Class.forName("java.net." + prefix + implName).newInstance();
} catch (ClassNotFoundException e) {
......@@ -1471,7 +1467,7 @@ class InetAddress implements java.io.Serializable {
}
}
return impl;
return (InetAddressImpl) impl;
}
private void readObjectNoData (ObjectInputStream s) throws
......@@ -1498,13 +1494,8 @@ class InetAddress implements java.io.Serializable {
class InetAddressImplFactory {
static InetAddressImpl create() {
Object o;
if (isIPv6Supported()) {
o = InetAddress.loadImpl("Inet6AddressImpl");
} else {
o = InetAddress.loadImpl("Inet4AddressImpl");
}
return (InetAddressImpl)o;
return InetAddress.loadImpl(isIPv6Supported() ?
"Inet6AddressImpl" : "Inet4AddressImpl");
}
static native boolean isIPv6Supported();
......
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package java.nio.file;
/**
* Checked exception thrown when a file system loop, or cycle, is encountered.
*
* @since 1.7
* @see Files#walkFileTree
*/
public class FileSystemLoopException
extends FileSystemException
{
private static final long serialVersionUID = 4843039591949217617L;
/**
* Constructs an instance of this class.
*
* @param file
* a string identifying the file causing the cycle or {@code null} if
* not known
*/
public FileSystemLoopException(String file) {
super(file);
}
}
......@@ -38,7 +38,6 @@ import sun.nio.fs.BasicFileAttributesHolder;
class FileTreeWalker {
private final boolean followLinks;
private final boolean detectCycles;
private final LinkOption[] linkOptions;
private final FileVisitor<? super Path> visitor;
private final int maxDepth;
......@@ -48,17 +47,15 @@ class FileTreeWalker {
int maxDepth)
{
boolean fl = false;
boolean dc = false;
for (FileVisitOption option: options) {
// will throw NPE if options contains null
switch (option) {
case FOLLOW_LINKS : fl = true; break;
case DETECT_CYCLES : dc = true; break;
default:
throw new AssertionError("Should not get here");
}
}
this.followLinks = fl;
this.detectCycles = fl | dc;
this.linkOptions = (fl) ? new LinkOption[0] :
new LinkOption[] { LinkOption.NOFOLLOW_LINKS };
this.visitor = visitor;
......@@ -68,13 +65,11 @@ class FileTreeWalker {
/**
* Walk file tree starting at the given file
*/
void walk(Path start) {
void walk(Path start) throws IOException {
FileVisitResult result = walk(start,
0,
new ArrayList<AncestorDirectory>());
if (result == null) {
throw new NullPointerException("Visitor returned 'null'");
}
Objects.nonNull(result, "FileVisitor returned null");
}
/**
......@@ -88,11 +83,8 @@ class FileTreeWalker {
private FileVisitResult walk(Path file,
int depth,
List<AncestorDirectory> ancestors)
throws IOException
{
// depth check
if (depth > maxDepth)
return FileVisitResult.CONTINUE;
// if attributes are cached then use them if possible
BasicFileAttributes attrs = null;
if ((depth > 0) &&
......@@ -137,13 +129,13 @@ class FileTreeWalker {
return visitor.visitFileFailed(file, exc);
}
// file is not a directory so invoke visitFile method
if (!attrs.isDirectory()) {
// at maximum depth or file is not a directory
if (depth >= maxDepth || !attrs.isDirectory()) {
return visitor.visitFile(file, attrs);
}
// check for cycles
if (detectCycles) {
// check for cycles when following links
if (followLinks) {
Object key = attrs.fileKey();
// if this directory and ancestor has a file key then we compare
......@@ -153,19 +145,23 @@ class FileTreeWalker {
if (key != null && ancestorKey != null) {
if (key.equals(ancestorKey)) {
// cycle detected
return visitor.visitFile(file, attrs);
return visitor.visitFileFailed(file,
new FileSystemLoopException(file.toString()));
}
} else {
boolean isSameFile = false;
try {
if (file.isSameFile(ancestor.file())) {
// cycle detected
return visitor.visitFile(file, attrs);
}
isSameFile = file.isSameFile(ancestor.file());
} catch (IOException x) {
// ignore
} catch (SecurityException x) {
// ignore
}
if (isSameFile) {
// cycle detected
return visitor.visitFileFailed(file,
new FileSystemLoopException(file.toString()));
}
}
}
......@@ -181,7 +177,7 @@ class FileTreeWalker {
try {
stream = file.newDirectoryStream();
} catch (IOException x) {
return visitor.preVisitDirectoryFailed(file, x);
return visitor.visitFileFailed(file, x);
} catch (SecurityException x) {
// ignore, as per spec
return FileVisitResult.CONTINUE;
......@@ -192,20 +188,14 @@ class FileTreeWalker {
// invoke preVisitDirectory and then visit each entry
try {
result = visitor.preVisitDirectory(file);
result = visitor.preVisitDirectory(file, attrs);
if (result != FileVisitResult.CONTINUE) {
return result;
}
// if an I/O occurs during iteration then a CME is thrown. We
// need to distinguish this from a CME thrown by the visitor.
boolean inAction = false;
try {
for (Path entry: stream) {
inAction = true;
result = walk(entry, depth+1, ancestors);
inAction = false;
// returning null will cause NPE to be thrown
if (result == null || result == FileVisitResult.TERMINATE)
......@@ -215,17 +205,9 @@ class FileTreeWalker {
if (result == FileVisitResult.SKIP_SIBLINGS)
break;
}
} catch (ConcurrentModificationException x) {
// if CME thrown because the iteration failed then remember
// the IOException so that it is notified to postVisitDirectory
if (!inAction) {
// iteration failed
Throwable t = x.getCause();
if (t instanceof IOException)
ioe = (IOException)t;
}
if (ioe == null)
throw x;
} catch (DirectoryIteratorException e) {
// IOException will be notified to postVisitDirectory
ioe = e.getCause();
}
} finally {
try {
......@@ -238,7 +220,7 @@ class FileTreeWalker {
} finally {
// remove key from trail if doing cycle detection
if (detectCycles) {
if (followLinks) {
ancestors.remove(ancestors.size()-1);
}
}
......
......@@ -37,9 +37,5 @@ public enum FileVisitOption {
/**
* Follow symbolic links.
*/
FOLLOW_LINKS,
/**
* Detect cycles in the file tree.
*/
DETECT_CYCLES;
FOLLOW_LINKS;
}
......@@ -40,33 +40,28 @@ import java.io.IOException;
* Path start = ...
* Files.walkFileTree(start, new SimpleFileVisitor&lt;Path&gt;() {
* &#64;Override
* public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
* try {
* public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
* throws IOException
* {
* file.delete();
* } catch (IOException exc) {
* // failed to delete, do error handling here
* }
* return FileVisitResult.CONTINUE;
* }
* &#64;Override
* public FileVisitResult postVisitDirectory(Path dir, IOException e) {
* if (e == null) {
* try {
* dir.delete();
* } catch (IOException exc) {
* // failed to delete, do error handling here
* }
* } else {
* public FileVisitResult postVisitDirectory(Path dir, IOException e)
* throws IOException
* {
* if (e != null) {
* // directory iteration failed
* throw e;
* }
* dir.delete();
* return FileVisitResult.CONTINUE;
* }
* });
* </pre>
* <p> Furthermore, suppose we want to copy a file tree rooted at a source
* directory to a target location. In that case, symbolic links should be
* followed and the target directory should be created before the entries in
* the directory are copied.
* <p> Furthermore, suppose we want to copy a file tree to a target location.
* In that case, symbolic links should be followed and the target directory
* should be created before the entries in the directory are copied.
* <pre>
* final Path source = ...
* final Path target = ...
......@@ -74,25 +69,21 @@ import java.io.IOException;
* Files.walkFileTree(source, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
* new SimpleFileVisitor&lt;Path&gt;() {
* &#64;Override
* public FileVisitResult preVisitDirectory(Path dir) {
* public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
* throws IOException
* {
* try {
* dir.copyTo(target.resolve(source.relativize(dir)));
* } catch (FileAlreadyExistsException e) {
* // ignore
* } catch (IOException e) {
* // copy failed, do error handling here
* // skip rest of directory and descendants
* return SKIP_SUBTREE;
* }
* return CONTINUE;
* }
* &#64;Override
* public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
* try {
* public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
* throws IOException
* {
* file.copyTo(target.resolve(source.relativize(file)));
* } catch (IOException e) {
* // copy failed, do error handling here
* }
* return CONTINUE;
* }
* });
......@@ -114,22 +105,16 @@ public interface FileVisitor<T> {
*
* @param dir
* a reference to the directory
* @param attrs
* the directory's basic attributes
*
* @return the visit result
*/
FileVisitResult preVisitDirectory(T dir);
/**
* Invoked for a directory that could not be opened.
*
* @param dir
* a reference to the directory
* @param exc
* the I/O exception thrown from the attempt to open the directory
*
* @return the visit result
* @throws IOException
* if an I/O error occurs
*/
FileVisitResult preVisitDirectoryFailed(T dir, IOException exc);
FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
throws IOException;
/**
* Invoked for a file in a directory.
......@@ -140,21 +125,30 @@ public interface FileVisitor<T> {
* the file's basic attributes
*
* @return the visit result
*
* @throws IOException
* if an I/O error occurs
*/
FileVisitResult visitFile(T file, BasicFileAttributes attrs);
FileVisitResult visitFile(T file, BasicFileAttributes attrs)
throws IOException;
/**
* Invoked for a file when its basic file attributes could not be read.
* Invoked for a file that could not be visited. This method is invoked
* if the file's attributes could not be read, the file is a directory
* that could not be opened, and other reasons.
*
* @param file
* a reference to the file
* @param exc
* the I/O exception thrown from the attempt to read the file
* attributes
* the I/O exception that prevented the file from being visited
*
* @return the visit result
*
* @throws IOException
* if an I/O error occurs
*/
FileVisitResult visitFileFailed(T file, IOException exc);
FileVisitResult visitFileFailed(T file, IOException exc)
throws IOException;
/**
* Invoked for a directory after entries in the directory, and all of their
......@@ -171,6 +165,10 @@ public interface FileVisitor<T> {
* of the directory to complete prematurely
*
* @return the visit result
*
* @throws IOException
* if an I/O error occurs
*/
FileVisitResult postVisitDirectory(T dir, IOException exc);
FileVisitResult postVisitDirectory(T dir, IOException exc)
throws IOException;
}
......@@ -135,9 +135,9 @@ public final class Files {
* FileVisitor} invoked for each file encountered. File tree traversal
* completes when all accessible files in the tree have been visited, or a
* visit method returns a result of {@link FileVisitResult#TERMINATE
* TERMINATE}. Where a visit method terminates due an uncaught error or
* runtime exception then the traversal is terminated and the error or
* exception is propagated to the caller of this method.
* TERMINATE}. Where a visit method terminates due an {@code IOException},
* an uncaught error, or runtime exception, then the traversal is terminated
* and the error or exception is propagated to the caller of this method.
*
* <p> For each file encountered this method attempts to gets its {@link
* java.nio.file.attribute.BasicFileAttributes}. If the file is not a
......@@ -146,12 +146,10 @@ public final class Files {
* due to an I/O exception, then the {@link FileVisitor#visitFileFailed
* visitFileFailed} method is invoked with the I/O exception.
*
* <p> Where the file is a directory, this method attempts to open it by
* invoking its {@link Path#newDirectoryStream newDirectoryStream} method.
* Where the directory could not be opened, due to an {@code IOException},
* then the {@link FileVisitor#preVisitDirectoryFailed preVisitDirectoryFailed}
* method is invoked with the I/O exception, after which, the file tree walk
* continues, by default, at the next <em>sibling</em> of the directory.
* <p> Where the file is a directory, and the directory could not be opened,
* then the {@code visitFileFailed} method is invoked with the I/O exception,
* after which, the file tree walk continues, by default, at the next
* <em>sibling</em> of the directory.
*
* <p> Where the directory is opened successfully, then the entries in the
* directory, and their <em>descendants</em> are visited. When all entries
......@@ -171,26 +169,25 @@ public final class Files {
* method is invoked as specified above).
*
* <p> If the {@code options} parameter contains the {@link
* FileVisitOption#DETECT_CYCLES DETECT_CYCLES} or {@link
* FileVisitOption#FOLLOW_LINKS FOLLOW_LINKS} options then this method keeps
* FileVisitOption#FOLLOW_LINKS FOLLOW_LINKS} option then this method keeps
* track of directories visited so that cycles can be detected. A cycle
* arises when there is an entry in a directory that is an ancestor of the
* directory. Cycle detection is done by recording the {@link
* java.nio.file.attribute.BasicFileAttributes#fileKey file-key} of directories,
* or if file keys are not available, by invoking the {@link Path#isSameFile
* isSameFile} method to test if a directory is the same file as an
* ancestor. When a cycle is detected the {@link FileVisitor#visitFile
* visitFile} is invoked with the attributes of the directory. The {@link
* java.nio.file.attribute.BasicFileAttributes#isDirectory isDirectory}
* method may be used to test if the file is a directory and that a cycle is
* detected. The {@code preVisitDirectory} and {@code postVisitDirectory}
* methods are not invoked.
* ancestor. When a cycle is detected it is treated as an I/O error, and the
* {@link FileVisitor#visitFileFailed visitFileFailed} method is invoked with
* an instance of {@link FileSystemLoopException}.
*
* <p> The {@code maxDepth} parameter is the maximum number of levels of
* directories to visit. A value of {@code 0} means that only the starting
* file is visited, unless denied by the security manager. A value of
* {@link Integer#MAX_VALUE MAX_VALUE} may be used to indicate that all
* levels should be visited.
* levels should be visited. The {@code visitFile} method is invoked for all
* files, including directories, encountered at {@code maxDepth}, unless the
* basic file attributes cannot be read, in which case the {@code
* visitFileFailed} method is invoked.
*
* <p> If a visitor returns a result of {@code null} then {@code
* NullPointerException} is thrown.
......@@ -215,11 +212,14 @@ public final class Files {
* In the case of the default provider, the {@link
* SecurityManager#checkRead(String) checkRead} method is invoked
* to check read access to the directory.
* @throws IOException
* If an I/O error is thrown by a visitor method
*/
public static void walkFileTree(Path start,
Set<FileVisitOption> options,
int maxDepth,
FileVisitor<? super Path> visitor)
throws IOException
{
if (maxDepth < 0)
throw new IllegalArgumentException("'maxDepth' is negative");
......@@ -245,8 +245,12 @@ public final class Files {
* In the case of the default provider, the {@link
* SecurityManager#checkRead(String) checkRead} method is invoked
* to check read access to the directory.
* @throws IOException
* If an I/O error is thrown by a visitor method
*/
public static void walkFileTree(Path start, FileVisitor<? super Path> visitor) {
public static void walkFileTree(Path start, FileVisitor<? super Path> visitor)
throws IOException
{
walkFileTree(start,
EnumSet.noneOf(FileVisitOption.class),
Integer.MAX_VALUE,
......
......@@ -27,7 +27,7 @@ package java.nio.file;
import java.nio.file.attribute.BasicFileAttributes;
import java.io.IOException;
import java.io.IOError;
import java.util.Objects;
/**
* A simple visitor of files with default behavior to visit all files and to
......@@ -47,14 +47,6 @@ public class SimpleFileVisitor<T> implements FileVisitor<T> {
protected SimpleFileVisitor() {
}
/**
* Throws NullPointerException if obj is null.
*/
private static void checkNotNull(Object obj) {
if (obj == null)
throw new NullPointerException();
}
/**
* Invoked for a directory before entries in the directory are visited.
*
......@@ -62,28 +54,14 @@ public class SimpleFileVisitor<T> implements FileVisitor<T> {
* CONTINUE}.
*/
@Override
public FileVisitResult preVisitDirectory(T dir) {
checkNotNull(dir);
public FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
throws IOException
{
Objects.nonNull(dir);
Objects.nonNull(attrs);
return FileVisitResult.CONTINUE;
}
/**
* Invoked for a directory that could not be opened.
*
* <p> Unless overridden, this method throws {@link IOError} with the I/O
* exception as cause.
*
* @throws IOError
* with the I/O exception thrown when the attempt to open the
* directory failed
*/
@Override
public FileVisitResult preVisitDirectoryFailed(T dir, IOException exc) {
checkNotNull(dir);
checkNotNull(exc);
throw new IOError(exc);
}
/**
* Invoked for a file in a directory.
*
......@@ -91,27 +69,26 @@ public class SimpleFileVisitor<T> implements FileVisitor<T> {
* CONTINUE}.
*/
@Override
public FileVisitResult visitFile(T file, BasicFileAttributes attrs) {
checkNotNull(file);
checkNotNull(attrs);
public FileVisitResult visitFile(T file, BasicFileAttributes attrs)
throws IOException
{
Objects.nonNull(file);
Objects.nonNull(attrs);
return FileVisitResult.CONTINUE;
}
/**
* Invoked for a file when its basic file attributes could not be read.
*
* <p> Unless overridden, this method throws {@link IOError} with the I/O
* exception as cause.
* Invoked for a file that could not be visited.
*
* @throws IOError
* with the I/O exception thrown when the attempt to read the file
* attributes failed
* <p> Unless overridden, this method re-throws the I/O exception that prevented
* the file from being visited.
*/
@Override
public FileVisitResult visitFileFailed(T file, IOException exc) {
checkNotNull(file);
checkNotNull(exc);
throw new IOError(exc);
public FileVisitResult visitFileFailed(T file, IOException exc)
throws IOException
{
Objects.nonNull(file);
throw exc;
}
/**
......@@ -120,18 +97,16 @@ public class SimpleFileVisitor<T> implements FileVisitor<T> {
*
* <p> Unless overridden, this method returns {@link FileVisitResult#CONTINUE
* CONTINUE} if the directory iteration completes without an I/O exception;
* otherwise this method throws {@link IOError} with the I/O exception as
* cause.
*
* @throws IOError
* with the I/O exception thrown when iteration of the directory
* completed prematurely due to an I/O error
* otherwise this method re-throws the I/O exception that caused the iteration
* of the directory to terminate prematurely.
*/
@Override
public FileVisitResult postVisitDirectory(T dir, IOException exc) {
checkNotNull(dir);
public FileVisitResult postVisitDirectory(T dir, IOException exc)
throws IOException
{
Objects.nonNull(dir);
if (exc != null)
throw new IOError(exc);
throw exc;
return FileVisitResult.CONTINUE;
}
}
......@@ -3643,7 +3643,7 @@ public interface DatabaseMetaData extends Wrapper {
/**
* Retrieves whether a generated key will always be returned if the column
* name(s) or indexe(s) specified for the auto generated key column(s)
* name(s) or index(es) specified for the auto generated key column(s)
* are valid and the statement succeeds. The key that is returned may or
* may not be based on the column(s) for the auto generated key.
* Consult your JDBC driver documentation for additional details.
......
......@@ -1051,9 +1051,9 @@ public interface Statement extends Wrapper, AutoCloseable {
/**
* Returns a value indicating whether this {@code Statement} will be
* closed when all dependent objects such as resultsets are closed.
* closed when all its dependent result sets are closed.
* @return {@code true} if the {@code Statement} will be closed when all
* of its dependent objects are closed; {@code false} otherwise
* of its dependent result sets are closed; {@code false} otherwise
* @throws SQLException if this method is called on a closed
* {@code Statement}
* @since 1.7
......
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* This file is available under and governed by the GNU General Public
* License version 2 only, as published by the Free Software Foundation.
* However, the following notice accompanied the original version of this
* file:
*
* Written by Doug Lea and Martin Buchholz with assistance from members of
* JCP JSR-166 Expert Group and released to the public domain, as explained
* at http://creativecommons.org/licenses/publicdomain
*/
package java.util.concurrent;
import java.util.AbstractCollection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.ConcurrentModificationException;
import java.util.Deque;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Queue;
/**
* An unbounded concurrent {@linkplain Deque deque} based on linked nodes.
* Concurrent insertion, removal, and access operations execute safely
* across multiple threads.
* A {@code ConcurrentLinkedDeque} is an appropriate choice when
* many threads will share access to a common collection.
* Like most other concurrent collection implementations, this class
* does not permit the use of {@code null} elements.
*
* <p>Iterators are <i>weakly consistent</i>, returning elements
* reflecting the state of the deque at some point at or since the
* creation of the iterator. They do <em>not</em> throw {@link
* java.util.ConcurrentModificationException
* ConcurrentModificationException}, and may proceed concurrently with
* other operations.
*
* <p>Beware that, unlike in most collections, the {@code size}
* method is <em>NOT</em> a constant-time operation. Because of the
* asynchronous nature of these deques, determining the current number
* of elements requires a traversal of the elements.
*
* <p>This class and its iterator implement all of the <em>optional</em>
* methods of the {@link Deque} and {@link Iterator} interfaces.
*
* <p>Memory consistency effects: As with other concurrent collections,
* actions in a thread prior to placing an object into a
* {@code ConcurrentLinkedDeque}
* <a href="package-summary.html#MemoryVisibility"><i>happen-before</i></a>
* actions subsequent to the access or removal of that element from
* the {@code ConcurrentLinkedDeque} in another thread.
*
* <p>This class is a member of the
* <a href="{@docRoot}/../technotes/guides/collections/index.html">
* Java Collections Framework</a>.
*
* @since 1.7
* @author Doug Lea
* @author Martin Buchholz
* @param <E> the type of elements held in this collection
*/
public class ConcurrentLinkedDeque<E>
extends AbstractCollection<E>
implements Deque<E>, java.io.Serializable {
/*
* This is an implementation of a concurrent lock-free deque
* supporting interior removes but not interior insertions, as
* required to support the entire Deque interface.
*
* We extend the techniques developed for ConcurrentLinkedQueue and
* LinkedTransferQueue (see the internal docs for those classes).
* Understanding the ConcurrentLinkedQueue implementation is a
* prerequisite for understanding the implementation of this class.
*
* The data structure is a symmetrical doubly-linked "GC-robust"
* linked list of nodes. We minimize the number of volatile writes
* using two techniques: advancing multiple hops with a single CAS
* and mixing volatile and non-volatile writes of the same memory
* locations.
*
* A node contains the expected E ("item") and links to predecessor
* ("prev") and successor ("next") nodes:
*
* class Node<E> { volatile Node<E> prev, next; volatile E item; }
*
* A node p is considered "live" if it contains a non-null item
* (p.item != null). When an item is CASed to null, the item is
* atomically logically deleted from the collection.
*
* At any time, there is precisely one "first" node with a null
* prev reference that terminates any chain of prev references
* starting at a live node. Similarly there is precisely one
* "last" node terminating any chain of next references starting at
* a live node. The "first" and "last" nodes may or may not be live.
* The "first" and "last" nodes are always mutually reachable.
*
* A new element is added atomically by CASing the null prev or
* next reference in the first or last node to a fresh node
* containing the element. The element's node atomically becomes
* "live" at that point.
*
* A node is considered "active" if it is a live node, or the
* first or last node. Active nodes cannot be unlinked.
*
* A "self-link" is a next or prev reference that is the same node:
* p.prev == p or p.next == p
* Self-links are used in the node unlinking process. Active nodes
* never have self-links.
*
* A node p is active if and only if:
*
* p.item != null ||
* (p.prev == null && p.next != p) ||
* (p.next == null && p.prev != p)
*
* The deque object has two node references, "head" and "tail".
* The head and tail are only approximations to the first and last
* nodes of the deque. The first node can always be found by
* following prev pointers from head; likewise for tail. However,
* it is permissible for head and tail to be referring to deleted
* nodes that have been unlinked and so may not be reachable from
* any live node.
*
* There are 3 stages of node deletion;
* "logical deletion", "unlinking", and "gc-unlinking".
*
* 1. "logical deletion" by CASing item to null atomically removes
* the element from the collection, and makes the containing node
* eligible for unlinking.
*
* 2. "unlinking" makes a deleted node unreachable from active
* nodes, and thus eventually reclaimable by GC. Unlinked nodes
* may remain reachable indefinitely from an iterator.
*
* Physical node unlinking is merely an optimization (albeit a
* critical one), and so can be performed at our convenience. At
* any time, the set of live nodes maintained by prev and next
* links are identical, that is, the live nodes found via next
* links from the first node is equal to the elements found via
* prev links from the last node. However, this is not true for
* nodes that have already been logically deleted - such nodes may
* be reachable in one direction only.
*
* 3. "gc-unlinking" takes unlinking further by making active
* nodes unreachable from deleted nodes, making it easier for the
* GC to reclaim future deleted nodes. This step makes the data
* structure "gc-robust", as first described in detail by Boehm
* (http://portal.acm.org/citation.cfm?doid=503272.503282).
*
* GC-unlinked nodes may remain reachable indefinitely from an
* iterator, but unlike unlinked nodes, are never reachable from
* head or tail.
*
* Making the data structure GC-robust will eliminate the risk of
* unbounded memory retention with conservative GCs and is likely
* to improve performance with generational GCs.
*
* When a node is dequeued at either end, e.g. via poll(), we would
* like to break any references from the node to active nodes. We
* develop further the use of self-links that was very effective in
* other concurrent collection classes. The idea is to replace
* prev and next pointers with special values that are interpreted
* to mean off-the-list-at-one-end. These are approximations, but
* good enough to preserve the properties we want in our
* traversals, e.g. we guarantee that a traversal will never visit
* the same element twice, but we don't guarantee whether a
* traversal that runs out of elements will be able to see more
* elements later after enqueues at that end. Doing gc-unlinking
* safely is particularly tricky, since any node can be in use
* indefinitely (for example by an iterator). We must ensure that
* the nodes pointed at by head/tail never get gc-unlinked, since
* head/tail are needed to get "back on track" by other nodes that
* are gc-unlinked. gc-unlinking accounts for much of the
* implementation complexity.
*
* Since neither unlinking nor gc-unlinking are necessary for
* correctness, there are many implementation choices regarding
* frequency (eagerness) of these operations. Since volatile
* reads are likely to be much cheaper than CASes, saving CASes by
* unlinking multiple adjacent nodes at a time may be a win.
* gc-unlinking can be performed rarely and still be effective,
* since it is most important that long chains of deleted nodes
* are occasionally broken.
*
* The actual representation we use is that p.next == p means to
* goto the first node (which in turn is reached by following prev
* pointers from head), and p.next == null && p.prev == p means
* that the iteration is at an end and that p is a (final static)
* dummy node, NEXT_TERMINATOR, and not the last active node.
* Finishing the iteration when encountering such a TERMINATOR is
* good enough for read-only traversals, so such traversals can use
* p.next == null as the termination condition. When we need to
* find the last (active) node, for enqueueing a new node, we need
* to check whether we have reached a TERMINATOR node; if so,
* restart traversal from tail.
*
* The implementation is completely directionally symmetrical,
* except that most public methods that iterate through the list
* follow next pointers ("forward" direction).
*
* We believe (without full proof) that all single-element deque
* operations (e.g., addFirst, peekLast, pollLast) are linearizable
* (see Herlihy and Shavit's book). However, some combinations of
* operations are known not to be linearizable. In particular,
* when an addFirst(A) is racing with pollFirst() removing B, it is
* possible for an observer iterating over the elements to observe
* A B C and subsequently observe A C, even though no interior
* removes are ever performed. Nevertheless, iterators behave
* reasonably, providing the "weakly consistent" guarantees.
*
* Empirically, microbenchmarks suggest that this class adds about
* 40% overhead relative to ConcurrentLinkedQueue, which feels as
* good as we can hope for.
*/
private static final long serialVersionUID = 876323262645176354L;
/**
* A node from which the first node on list (that is, the unique node p
* with p.prev == null && p.next != p) can be reached in O(1) time.
* Invariants:
* - the first node is always O(1) reachable from head via prev links
* - all live nodes are reachable from the first node via succ()
* - head != null
* - (tmp = head).next != tmp || tmp != head
* - head is never gc-unlinked (but may be unlinked)
* Non-invariants:
* - head.item may or may not be null
* - head may not be reachable from the first or last node, or from tail
*/
private transient volatile Node<E> head;
/**
* A node from which the last node on list (that is, the unique node p
* with p.next == null && p.prev != p) can be reached in O(1) time.
* Invariants:
* - the last node is always O(1) reachable from tail via next links
* - all live nodes are reachable from the last node via pred()
* - tail != null
* - tail is never gc-unlinked (but may be unlinked)
* Non-invariants:
* - tail.item may or may not be null
* - tail may not be reachable from the first or last node, or from head
*/
private transient volatile Node<E> tail;
private final static Node<Object> PREV_TERMINATOR, NEXT_TERMINATOR;
static {
PREV_TERMINATOR = new Node<Object>(null);
PREV_TERMINATOR.next = PREV_TERMINATOR;
NEXT_TERMINATOR = new Node<Object>(null);
NEXT_TERMINATOR.prev = NEXT_TERMINATOR;
}
@SuppressWarnings("unchecked")
Node<E> prevTerminator() {
return (Node<E>) PREV_TERMINATOR;
}
@SuppressWarnings("unchecked")
Node<E> nextTerminator() {
return (Node<E>) NEXT_TERMINATOR;
}
static final class Node<E> {
volatile Node<E> prev;
volatile E item;
volatile Node<E> next;
/**
* Constructs a new node. Uses relaxed write because item can
* only be seen after publication via casNext or casPrev.
*/
Node(E item) {
UNSAFE.putObject(this, itemOffset, item);
}
boolean casItem(E cmp, E val) {
return UNSAFE.compareAndSwapObject(this, itemOffset, cmp, val);
}
void lazySetNext(Node<E> val) {
UNSAFE.putOrderedObject(this, nextOffset, val);
}
boolean casNext(Node<E> cmp, Node<E> val) {
return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
}
void lazySetPrev(Node<E> val) {
UNSAFE.putOrderedObject(this, prevOffset, val);
}
boolean casPrev(Node<E> cmp, Node<E> val) {
return UNSAFE.compareAndSwapObject(this, prevOffset, cmp, val);
}
// Unsafe mechanics
private static final sun.misc.Unsafe UNSAFE =
sun.misc.Unsafe.getUnsafe();
private static final long prevOffset =
objectFieldOffset(UNSAFE, "prev", Node.class);
private static final long itemOffset =
objectFieldOffset(UNSAFE, "item", Node.class);
private static final long nextOffset =
objectFieldOffset(UNSAFE, "next", Node.class);
}
/**
* Links e as first element.
*/
private void linkFirst(E e) {
checkNotNull(e);
final Node<E> newNode = new Node<E>(e);
restartFromHead:
for (;;)
for (Node<E> h = head, p = h, q;;) {
if ((q = p.prev) != null &&
(q = (p = q).prev) != null)
// Check for head updates every other hop.
// If p == q, we are sure to follow head instead.
p = (h != (h = head)) ? h : q;
else if (p.next == p) // PREV_TERMINATOR
continue restartFromHead;
else {
// p is first node
newNode.lazySetNext(p); // CAS piggyback
if (p.casPrev(null, newNode)) {
// Successful CAS is the linearization point
// for e to become an element of this deque,
// and for newNode to become "live".
if (p != h) // hop two nodes at a time
casHead(h, newNode); // Failure is OK.
return;
}
// Lost CAS race to another thread; re-read prev
}
}
}
/**
* Links e as last element.
*/
private void linkLast(E e) {
checkNotNull(e);
final Node<E> newNode = new Node<E>(e);
restartFromTail:
for (;;)
for (Node<E> t = tail, p = t, q;;) {
if ((q = p.next) != null &&
(q = (p = q).next) != null)
// Check for tail updates every other hop.
// If p == q, we are sure to follow tail instead.
p = (t != (t = tail)) ? t : q;
else if (p.prev == p) // NEXT_TERMINATOR
continue restartFromTail;
else {
// p is last node
newNode.lazySetPrev(p); // CAS piggyback
if (p.casNext(null, newNode)) {
// Successful CAS is the linearization point
// for e to become an element of this deque,
// and for newNode to become "live".
if (p != t) // hop two nodes at a time
casTail(t, newNode); // Failure is OK.
return;
}
// Lost CAS race to another thread; re-read next
}
}
}
private final static int HOPS = 2;
/**
* Unlinks non-null node x.
*/
void unlink(Node<E> x) {
// assert x != null;
// assert x.item == null;
// assert x != PREV_TERMINATOR;
// assert x != NEXT_TERMINATOR;
final Node<E> prev = x.prev;
final Node<E> next = x.next;
if (prev == null) {
unlinkFirst(x, next);
} else if (next == null) {
unlinkLast(x, prev);
} else {
// Unlink interior node.
//
// This is the common case, since a series of polls at the
// same end will be "interior" removes, except perhaps for
// the first one, since end nodes cannot be unlinked.
//
// At any time, all active nodes are mutually reachable by
// following a sequence of either next or prev pointers.
//
// Our strategy is to find the unique active predecessor
// and successor of x. Try to fix up their links so that
// they point to each other, leaving x unreachable from
// active nodes. If successful, and if x has no live
// predecessor/successor, we additionally try to gc-unlink,
// leaving active nodes unreachable from x, by rechecking
// that the status of predecessor and successor are
// unchanged and ensuring that x is not reachable from
// tail/head, before setting x's prev/next links to their
// logical approximate replacements, self/TERMINATOR.
Node<E> activePred, activeSucc;
boolean isFirst, isLast;
int hops = 1;
// Find active predecessor
for (Node<E> p = prev; ; ++hops) {
if (p.item != null) {
activePred = p;
isFirst = false;
break;
}
Node<E> q = p.prev;
if (q == null) {
if (p.next == p)
return;
activePred = p;
isFirst = true;
break;
}
else if (p == q)
return;
else
p = q;
}
// Find active successor
for (Node<E> p = next; ; ++hops) {
if (p.item != null) {
activeSucc = p;
isLast = false;
break;
}
Node<E> q = p.next;
if (q == null) {
if (p.prev == p)
return;
activeSucc = p;
isLast = true;
break;
}
else if (p == q)
return;
else
p = q;
}
// TODO: better HOP heuristics
if (hops < HOPS
// always squeeze out interior deleted nodes
&& (isFirst | isLast))
return;
// Squeeze out deleted nodes between activePred and
// activeSucc, including x.
skipDeletedSuccessors(activePred);
skipDeletedPredecessors(activeSucc);
// Try to gc-unlink, if possible
if ((isFirst | isLast) &&
// Recheck expected state of predecessor and successor
(activePred.next == activeSucc) &&
(activeSucc.prev == activePred) &&
(isFirst ? activePred.prev == null : activePred.item != null) &&
(isLast ? activeSucc.next == null : activeSucc.item != null)) {
updateHead(); // Ensure x is not reachable from head
updateTail(); // Ensure x is not reachable from tail
// Finally, actually gc-unlink
x.lazySetPrev(isFirst ? prevTerminator() : x);
x.lazySetNext(isLast ? nextTerminator() : x);
}
}
}
/**
* Unlinks non-null first node.
*/
private void unlinkFirst(Node<E> first, Node<E> next) {
// assert first != null;
// assert next != null;
// assert first.item == null;
for (Node<E> o = null, p = next, q;;) {
if (p.item != null || (q = p.next) == null) {
if (o != null && p.prev != p && first.casNext(next, p)) {
skipDeletedPredecessors(p);
if (first.prev == null &&
(p.next == null || p.item != null) &&
p.prev == first) {
updateHead(); // Ensure o is not reachable from head
updateTail(); // Ensure o is not reachable from tail
// Finally, actually gc-unlink
o.lazySetNext(o);
o.lazySetPrev(prevTerminator());
}
}
return;
}
else if (p == q)
return;
else {
o = p;
p = q;
}
}
}
/**
* Unlinks non-null last node.
*/
private void unlinkLast(Node<E> last, Node<E> prev) {
// assert last != null;
// assert prev != null;
// assert last.item == null;
for (Node<E> o = null, p = prev, q;;) {
if (p.item != null || (q = p.prev) == null) {
if (o != null && p.next != p && last.casPrev(prev, p)) {
skipDeletedSuccessors(p);
if (last.next == null &&
(p.prev == null || p.item != null) &&
p.next == last) {
updateHead(); // Ensure o is not reachable from head
updateTail(); // Ensure o is not reachable from tail
// Finally, actually gc-unlink
o.lazySetPrev(o);
o.lazySetNext(nextTerminator());
}
}
return;
}
else if (p == q)
return;
else {
o = p;
p = q;
}
}
}
/**
* Guarantees that any node which was unlinked before a call to
* this method will be unreachable from head after it returns.
* Does not guarantee to eliminate slack, only that head will
* point to a node that was active while this method was running.
*/
private final void updateHead() {
// Either head already points to an active node, or we keep
// trying to cas it to the first node until it does.
Node<E> h, p, q;
restartFromHead:
while ((h = head).item == null && (p = h.prev) != null) {
for (;;) {
if ((q = p.prev) == null ||
(q = (p = q).prev) == null) {
// It is possible that p is PREV_TERMINATOR,
// but if so, the CAS is guaranteed to fail.
if (casHead(h, p))
return;
else
continue restartFromHead;
}
else if (h != head)
continue restartFromHead;
else
p = q;
}
}
}
/**
* Guarantees that any node which was unlinked before a call to
* this method will be unreachable from tail after it returns.
* Does not guarantee to eliminate slack, only that tail will
* point to a node that was active while this method was running.
*/
private final void updateTail() {
// Either tail already points to an active node, or we keep
// trying to cas it to the last node until it does.
Node<E> t, p, q;
restartFromTail:
while ((t = tail).item == null && (p = t.next) != null) {
for (;;) {
if ((q = p.next) == null ||
(q = (p = q).next) == null) {
// It is possible that p is NEXT_TERMINATOR,
// but if so, the CAS is guaranteed to fail.
if (casTail(t, p))
return;
else
continue restartFromTail;
}
else if (t != tail)
continue restartFromTail;
else
p = q;
}
}
}
private void skipDeletedPredecessors(Node<E> x) {
whileActive:
do {
Node<E> prev = x.prev;
// assert prev != null;
// assert x != NEXT_TERMINATOR;
// assert x != PREV_TERMINATOR;
Node<E> p = prev;
findActive:
for (;;) {
if (p.item != null)
break findActive;
Node<E> q = p.prev;
if (q == null) {
if (p.next == p)
continue whileActive;
break findActive;
}
else if (p == q)
continue whileActive;
else
p = q;
}
// found active CAS target
if (prev == p || x.casPrev(prev, p))
return;
} while (x.item != null || x.next == null);
}
private void skipDeletedSuccessors(Node<E> x) {
whileActive:
do {
Node<E> next = x.next;
// assert next != null;
// assert x != NEXT_TERMINATOR;
// assert x != PREV_TERMINATOR;
Node<E> p = next;
findActive:
for (;;) {
if (p.item != null)
break findActive;
Node<E> q = p.next;
if (q == null) {
if (p.prev == p)
continue whileActive;
break findActive;
}
else if (p == q)
continue whileActive;
else
p = q;
}
// found active CAS target
if (next == p || x.casNext(next, p))
return;
} while (x.item != null || x.prev == null);
}
/**
* Returns the successor of p, or the first node if p.next has been
* linked to self, which will only be true if traversing with a
* stale pointer that is now off the list.
*/
final Node<E> succ(Node<E> p) {
// TODO: should we skip deleted nodes here?
Node<E> q = p.next;
return (p == q) ? first() : q;
}
/**
* Returns the predecessor of p, or the last node if p.prev has been
* linked to self, which will only be true if traversing with a
* stale pointer that is now off the list.
*/
final Node<E> pred(Node<E> p) {
Node<E> q = p.prev;
return (p == q) ? last() : q;
}
/**
* Returns the first node, the unique node p for which:
* p.prev == null && p.next != p
* The returned node may or may not be logically deleted.
* Guarantees that head is set to the returned node.
*/
Node<E> first() {
restartFromHead:
for (;;)
for (Node<E> h = head, p = h, q;;) {
if ((q = p.prev) != null &&
(q = (p = q).prev) != null)
// Check for head updates every other hop.
// If p == q, we are sure to follow head instead.
p = (h != (h = head)) ? h : q;
else if (p == h
// It is possible that p is PREV_TERMINATOR,
// but if so, the CAS is guaranteed to fail.
|| casHead(h, p))
return p;
else
continue restartFromHead;
}
}
/**
* Returns the last node, the unique node p for which:
* p.next == null && p.prev != p
* The returned node may or may not be logically deleted.
* Guarantees that tail is set to the returned node.
*/
Node<E> last() {
restartFromTail:
for (;;)
for (Node<E> t = tail, p = t, q;;) {
if ((q = p.next) != null &&
(q = (p = q).next) != null)
// Check for tail updates every other hop.
// If p == q, we are sure to follow tail instead.
p = (t != (t = tail)) ? t : q;
else if (p == t
// It is possible that p is NEXT_TERMINATOR,
// but if so, the CAS is guaranteed to fail.
|| casTail(t, p))
return p;
else
continue restartFromTail;
}
}
// Minor convenience utilities
/**
* Throws NullPointerException if argument is null.
*
* @param v the element
*/
private static void checkNotNull(Object v) {
if (v == null)
throw new NullPointerException();
}
/**
* Returns element unless it is null, in which case throws
* NoSuchElementException.
*
* @param v the element
* @return the element
*/
private E screenNullResult(E v) {
if (v == null)
throw new NoSuchElementException();
return v;
}
/**
* Creates an array list and fills it with elements of this list.
* Used by toArray.
*
* @return the arrayList
*/
private ArrayList<E> toArrayList() {
ArrayList<E> list = new ArrayList<E>();
for (Node<E> p = first(); p != null; p = succ(p)) {
E item = p.item;
if (item != null)
list.add(item);
}
return list;
}
/**
* Constructs an empty deque.
*/
public ConcurrentLinkedDeque() {
head = tail = new Node<E>(null);
}
/**
* Constructs a deque initially containing the elements of
* the given collection, added in traversal order of the
* collection's iterator.
*
* @param c the collection of elements to initially contain
* @throws NullPointerException if the specified collection or any
* of its elements are null
*/
public ConcurrentLinkedDeque(Collection<? extends E> c) {
// Copy c into a private chain of Nodes
Node<E> h = null, t = null;
for (E e : c) {
checkNotNull(e);
Node<E> newNode = new Node<E>(e);
if (h == null)
h = t = newNode;
else {
t.lazySetNext(newNode);
newNode.lazySetPrev(t);
t = newNode;
}
}
initHeadTail(h, t);
}
/**
* Initializes head and tail, ensuring invariants hold.
*/
private void initHeadTail(Node<E> h, Node<E> t) {
if (h == t) {
if (h == null)
h = t = new Node<E>(null);
else {
// Avoid edge case of a single Node with non-null item.
Node<E> newNode = new Node<E>(null);
t.lazySetNext(newNode);
newNode.lazySetPrev(t);
t = newNode;
}
}
head = h;
tail = t;
}
/**
* Inserts the specified element at the front of this deque.
*
* @throws NullPointerException {@inheritDoc}
*/
public void addFirst(E e) {
linkFirst(e);
}
/**
* Inserts the specified element at the end of this deque.
*
* <p>This method is equivalent to {@link #add}.
*
* @throws NullPointerException {@inheritDoc}
*/
public void addLast(E e) {
linkLast(e);
}
/**
* Inserts the specified element at the front of this deque.
*
* @return {@code true} always
* @throws NullPointerException {@inheritDoc}
*/
public boolean offerFirst(E e) {
linkFirst(e);
return true;
}
/**
* Inserts the specified element at the end of this deque.
*
* <p>This method is equivalent to {@link #add}.
*
* @return {@code true} always
* @throws NullPointerException {@inheritDoc}
*/
public boolean offerLast(E e) {
linkLast(e);
return true;
}
public E peekFirst() {
for (Node<E> p = first(); p != null; p = succ(p)) {
E item = p.item;
if (item != null)
return item;
}
return null;
}
public E peekLast() {
for (Node<E> p = last(); p != null; p = pred(p)) {
E item = p.item;
if (item != null)
return item;
}
return null;
}
/**
* @throws NoSuchElementException {@inheritDoc}
*/
public E getFirst() {
return screenNullResult(peekFirst());
}
/**
* @throws NoSuchElementException {@inheritDoc}
*/
public E getLast() {
return screenNullResult(peekLast());
}
public E pollFirst() {
for (Node<E> p = first(); p != null; p = succ(p)) {
E item = p.item;
if (item != null && p.casItem(item, null)) {
unlink(p);
return item;
}
}
return null;
}
public E pollLast() {
for (Node<E> p = last(); p != null; p = pred(p)) {
E item = p.item;
if (item != null && p.casItem(item, null)) {
unlink(p);
return item;
}
}
return null;
}
/**
* @throws NoSuchElementException {@inheritDoc}
*/
public E removeFirst() {
return screenNullResult(pollFirst());
}
/**
* @throws NoSuchElementException {@inheritDoc}
*/
public E removeLast() {
return screenNullResult(pollLast());
}
// *** Queue and stack methods ***
/**
* Inserts the specified element at the tail of this deque.
*
* @return {@code true} (as specified by {@link Queue#offer})
* @throws NullPointerException if the specified element is null
*/
public boolean offer(E e) {
return offerLast(e);
}
/**
* Inserts the specified element at the tail of this deque.
*
* @return {@code true} (as specified by {@link Collection#add})
* @throws NullPointerException if the specified element is null
*/
public boolean add(E e) {
return offerLast(e);
}
public E poll() { return pollFirst(); }
public E remove() { return removeFirst(); }
public E peek() { return peekFirst(); }
public E element() { return getFirst(); }
public void push(E e) { addFirst(e); }
public E pop() { return removeFirst(); }
/**
* Removes the first element {@code e} such that
* {@code o.equals(e)}, if such an element exists in this deque.
* If the deque does not contain the element, it is unchanged.
*
* @param o element to be removed from this deque, if present
* @return {@code true} if the deque contained the specified element
* @throws NullPointerException if the specified element is {@code null}
*/
public boolean removeFirstOccurrence(Object o) {
checkNotNull(o);
for (Node<E> p = first(); p != null; p = succ(p)) {
E item = p.item;
if (item != null && o.equals(item) && p.casItem(item, null)) {
unlink(p);
return true;
}
}
return false;
}
/**
* Removes the last element {@code e} such that
* {@code o.equals(e)}, if such an element exists in this deque.
* If the deque does not contain the element, it is unchanged.
*
* @param o element to be removed from this deque, if present
* @return {@code true} if the deque contained the specified element
* @throws NullPointerException if the specified element is {@code null}
*/
public boolean removeLastOccurrence(Object o) {
checkNotNull(o);
for (Node<E> p = last(); p != null; p = pred(p)) {
E item = p.item;
if (item != null && o.equals(item) && p.casItem(item, null)) {
unlink(p);
return true;
}
}
return false;
}
/**
* Returns {@code true} if this deque contains at least one
* element {@code e} such that {@code o.equals(e)}.
*
* @param o element whose presence in this deque is to be tested
* @return {@code true} if this deque contains the specified element
*/
public boolean contains(Object o) {
if (o == null) return false;
for (Node<E> p = first(); p != null; p = succ(p)) {
E item = p.item;
if (item != null && o.equals(item))
return true;
}
return false;
}
/**
* Returns {@code true} if this collection contains no elements.
*
* @return {@code true} if this collection contains no elements
*/
public boolean isEmpty() {
return peekFirst() == null;
}
/**
* Returns the number of elements in this deque. If this deque
* contains more than {@code Integer.MAX_VALUE} elements, it
* returns {@code Integer.MAX_VALUE}.
*
* <p>Beware that, unlike in most collections, this method is
* <em>NOT</em> a constant-time operation. Because of the
* asynchronous nature of these deques, determining the current
* number of elements requires traversing them all to count them.
* Additionally, it is possible for the size to change during
* execution of this method, in which case the returned result
* will be inaccurate. Thus, this method is typically not very
* useful in concurrent applications.
*
* @return the number of elements in this deque
*/
public int size() {
int count = 0;
for (Node<E> p = first(); p != null; p = succ(p))
if (p.item != null)
// Collection.size() spec says to max out
if (++count == Integer.MAX_VALUE)
break;
return count;
}
/**
* Removes the first element {@code e} such that
* {@code o.equals(e)}, if such an element exists in this deque.
* If the deque does not contain the element, it is unchanged.
*
* @param o element to be removed from this deque, if present
* @return {@code true} if the deque contained the specified element
* @throws NullPointerException if the specified element is {@code null}
*/
public boolean remove(Object o) {
return removeFirstOccurrence(o);
}
/**
* Appends all of the elements in the specified collection to the end of
* this deque, in the order that they are returned by the specified
* collection's iterator. Attempts to {@code addAll} of a deque to
* itself result in {@code IllegalArgumentException}.
*
* @param c the elements to be inserted into this deque
* @return {@code true} if this deque changed as a result of the call
* @throws NullPointerException if the specified collection or any
* of its elements are null
* @throws IllegalArgumentException if the collection is this deque
*/
public boolean addAll(Collection<? extends E> c) {
if (c == this)
// As historically specified in AbstractQueue#addAll
throw new IllegalArgumentException();
// Copy c into a private chain of Nodes
Node<E> beginningOfTheEnd = null, last = null;
for (E e : c) {
checkNotNull(e);
Node<E> newNode = new Node<E>(e);
if (beginningOfTheEnd == null)
beginningOfTheEnd = last = newNode;
else {
last.lazySetNext(newNode);
newNode.lazySetPrev(last);
last = newNode;
}
}
if (beginningOfTheEnd == null)
return false;
// Atomically append the chain at the tail of this collection
restartFromTail:
for (;;)
for (Node<E> t = tail, p = t, q;;) {
if ((q = p.next) != null &&
(q = (p = q).next) != null)
// Check for tail updates every other hop.
// If p == q, we are sure to follow tail instead.
p = (t != (t = tail)) ? t : q;
else if (p.prev == p) // NEXT_TERMINATOR
continue restartFromTail;
else {
// p is last node
beginningOfTheEnd.lazySetPrev(p); // CAS piggyback
if (p.casNext(null, beginningOfTheEnd)) {
// Successful CAS is the linearization point
// for all elements to be added to this queue.
if (!casTail(t, last)) {
// Try a little harder to update tail,
// since we may be adding many elements.
t = tail;
if (last.next == null)
casTail(t, last);
}
return true;
}
// Lost CAS race to another thread; re-read next
}
}
}
/**
* Removes all of the elements from this deque.
*/
public void clear() {
while (pollFirst() != null)
;
}
/**
* Returns an array containing all of the elements in this deque, in
* proper sequence (from first to last element).
*
* <p>The returned array will be "safe" in that no references to it are
* maintained by this deque. (In other words, this method must allocate
* a new array). The caller is thus free to modify the returned array.
*
* <p>This method acts as bridge between array-based and collection-based
* APIs.
*
* @return an array containing all of the elements in this deque
*/
public Object[] toArray() {
return toArrayList().toArray();
}
/**
* Returns an array containing all of the elements in this deque,
* in proper sequence (from first to last element); the runtime
* type of the returned array is that of the specified array. If
* the deque fits in the specified array, it is returned therein.
* Otherwise, a new array is allocated with the runtime type of
* the specified array and the size of this deque.
*
* <p>If this deque fits in the specified array with room to spare
* (i.e., the array has more elements than this deque), the element in
* the array immediately following the end of the deque is set to
* {@code null}.
*
* <p>Like the {@link #toArray()} method, this method acts as
* bridge between array-based and collection-based APIs. Further,
* this method allows precise control over the runtime type of the
* output array, and may, under certain circumstances, be used to
* save allocation costs.
*
* <p>Suppose {@code x} is a deque known to contain only strings.
* The following code can be used to dump the deque into a newly
* allocated array of {@code String}:
*
* <pre>
* String[] y = x.toArray(new String[0]);</pre>
*
* Note that {@code toArray(new Object[0])} is identical in function to
* {@code toArray()}.
*
* @param a the array into which the elements of the deque are to
* be stored, if it is big enough; otherwise, a new array of the
* same runtime type is allocated for this purpose
* @return an array containing all of the elements in this deque
* @throws ArrayStoreException if the runtime type of the specified array
* is not a supertype of the runtime type of every element in
* this deque
* @throws NullPointerException if the specified array is null
*/
public <T> T[] toArray(T[] a) {
return toArrayList().toArray(a);
}
/**
* Returns an iterator over the elements in this deque in proper sequence.
* The elements will be returned in order from first (head) to last (tail).
*
* <p>The returned {@code Iterator} is a "weakly consistent" iterator that
* will never throw {@link java.util.ConcurrentModificationException
* ConcurrentModificationException},
* and guarantees to traverse elements as they existed upon
* construction of the iterator, and may (but is not guaranteed to)
* reflect any modifications subsequent to construction.
*
* @return an iterator over the elements in this deque in proper sequence
*/
public Iterator<E> iterator() {
return new Itr();
}
/**
* Returns an iterator over the elements in this deque in reverse
* sequential order. The elements will be returned in order from
* last (tail) to first (head).
*
* <p>The returned {@code Iterator} is a "weakly consistent" iterator that
* will never throw {@link java.util.ConcurrentModificationException
* ConcurrentModificationException},
* and guarantees to traverse elements as they existed upon
* construction of the iterator, and may (but is not guaranteed to)
* reflect any modifications subsequent to construction.
*
* @return an iterator over the elements in this deque in reverse order
*/
public Iterator<E> descendingIterator() {
return new DescendingItr();
}
private abstract class AbstractItr implements Iterator<E> {
/**
* Next node to return item for.
*/
private Node<E> nextNode;
/**
* nextItem holds on to item fields because once we claim
* that an element exists in hasNext(), we must return it in
* the following next() call even if it was in the process of
* being removed when hasNext() was called.
*/
private E nextItem;
/**
* Node returned by most recent call to next. Needed by remove.
* Reset to null if this element is deleted by a call to remove.
*/
private Node<E> lastRet;
abstract Node<E> startNode();
abstract Node<E> nextNode(Node<E> p);
AbstractItr() {
advance();
}
/**
* Sets nextNode and nextItem to next valid node, or to null
* if no such.
*/
private void advance() {
lastRet = nextNode;
Node<E> p = (nextNode == null) ? startNode() : nextNode(nextNode);
for (;; p = nextNode(p)) {
if (p == null) {
// p might be active end or TERMINATOR node; both are OK
nextNode = null;
nextItem = null;
break;
}
E item = p.item;
if (item != null) {
nextNode = p;
nextItem = item;
break;
}
}
}
public boolean hasNext() {
return nextItem != null;
}
public E next() {
E item = nextItem;
if (item == null) throw new NoSuchElementException();
advance();
return item;
}
public void remove() {
Node<E> l = lastRet;
if (l == null) throw new IllegalStateException();
l.item = null;
unlink(l);
lastRet = null;
}
}
/** Forward iterator */
private class Itr extends AbstractItr {
Node<E> startNode() { return first(); }
Node<E> nextNode(Node<E> p) { return succ(p); }
}
/** Descending iterator */
private class DescendingItr extends AbstractItr {
Node<E> startNode() { return last(); }
Node<E> nextNode(Node<E> p) { return pred(p); }
}
/**
* Saves the state to a stream (that is, serializes it).
*
* @serialData All of the elements (each an {@code E}) in
* the proper order, followed by a null
* @param s the stream
*/
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
// Write out any hidden stuff
s.defaultWriteObject();
// Write out all elements in the proper order.
for (Node<E> p = first(); p != null; p = succ(p)) {
E item = p.item;
if (item != null)
s.writeObject(item);
}
// Use trailing null as sentinel
s.writeObject(null);
}
/**
* Reconstitutes the instance from a stream (that is, deserializes it).
* @param s the stream
*/
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();
// Read in elements until trailing null sentinel found
Node<E> h = null, t = null;
Object item;
while ((item = s.readObject()) != null) {
@SuppressWarnings("unchecked")
Node<E> newNode = new Node<E>((E) item);
if (h == null)
h = t = newNode;
else {
t.lazySetNext(newNode);
newNode.lazySetPrev(t);
t = newNode;
}
}
initHeadTail(h, t);
}
// Unsafe mechanics
private static final sun.misc.Unsafe UNSAFE =
sun.misc.Unsafe.getUnsafe();
private static final long headOffset =
objectFieldOffset(UNSAFE, "head", ConcurrentLinkedDeque.class);
private static final long tailOffset =
objectFieldOffset(UNSAFE, "tail", ConcurrentLinkedDeque.class);
private boolean casHead(Node<E> cmp, Node<E> val) {
return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val);
}
private boolean casTail(Node<E> cmp, Node<E> val) {
return UNSAFE.compareAndSwapObject(this, tailOffset, cmp, val);
}
static long objectFieldOffset(sun.misc.Unsafe UNSAFE,
String field, Class<?> klazz) {
try {
return UNSAFE.objectFieldOffset(klazz.getDeclaredField(field));
} catch (NoSuchFieldException e) {
// Convert Exception to corresponding Error
NoSuchFieldError error = new NoSuchFieldError(field);
error.initCause(e);
throw error;
}
}
}
......@@ -28,9 +28,9 @@
* However, the following notice accompanied the original version of this
* file:
*
* Written by Doug Lea with assistance from members of JCP JSR-166
* Expert Group and released to the public domain, as explained at
* http://creativecommons.org/licenses/publicdomain
* Written by Doug Lea and Martin Buchholz with assistance from members of
* JCP JSR-166 Expert Group and released to the public domain, as explained
* at http://creativecommons.org/licenses/publicdomain
*/
package java.util.concurrent;
......@@ -53,7 +53,8 @@ import java.util.Queue;
* operations obtain elements at the head of the queue.
* A {@code ConcurrentLinkedQueue} is an appropriate choice when
* many threads will share access to a common collection.
* This queue does not permit {@code null} elements.
* Like most other concurrent collection implementations, this class
* does not permit the use of {@code null} elements.
*
* <p>This implementation employs an efficient &quot;wait-free&quot;
* algorithm based on one described in <a
......@@ -61,14 +62,20 @@ import java.util.Queue;
* Fast, and Practical Non-Blocking and Blocking Concurrent Queue
* Algorithms</a> by Maged M. Michael and Michael L. Scott.
*
* <p>Iterators are <i>weakly consistent</i>, returning elements
* reflecting the state of the queue at some point at or since the
* creation of the iterator. They do <em>not</em> throw {@link
* ConcurrentModificationException}, and may proceed concurrently with
* other operations. Elements contained in the queue since the creation
* of the iterator will be returned exactly once.
*
* <p>Beware that, unlike in most collections, the {@code size} method
* is <em>NOT</em> a constant-time operation. Because of the
* asynchronous nature of these queues, determining the current number
* of elements requires a traversal of the elements.
*
* <p>This class and its iterator implement all of the
* <em>optional</em> methods of the {@link Collection} and {@link
* Iterator} interfaces.
* <p>This class and its iterator implement all of the <em>optional</em>
* methods of the {@link Queue} and {@link Iterator} interfaces.
*
* <p>Memory consistency effects: As with other concurrent
* collections, actions in a thread prior to placing an object into a
......@@ -132,9 +139,10 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
*
* Both head and tail are permitted to lag. In fact, failing to
* update them every time one could is a significant optimization
* (fewer CASes). This is controlled by local "hops" variables
* that only trigger helping-CASes after experiencing multiple
* lags.
* (fewer CASes). As with LinkedTransferQueue (see the internal
* documentation for that class), we use a slack threshold of two;
* that is, we update head/tail when the current pointer appears
* to be two or more steps away from the first/last node.
*
* Since head and tail are updated concurrently and independently,
* it is possible for tail to lag behind head (why not)?
......@@ -148,8 +156,8 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
* this is merely an optimization.
*
* When constructing a Node (before enqueuing it) we avoid paying
* for a volatile write to item by using lazySet instead of a
* normal write. This allows the cost of enqueue to be
* for a volatile write to item by using Unsafe.putObject instead
* of a normal write. This allows the cost of enqueue to be
* "one-and-a-half" CASes.
*
* Both head and tail may or may not point to a Node with a
......@@ -161,38 +169,25 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
*/
private static class Node<E> {
private volatile E item;
private volatile Node<E> next;
volatile E item;
volatile Node<E> next;
/**
* Constructs a new node. Uses relaxed write because item can
* only be seen after publication via casNext.
*/
Node(E item) {
// Piggyback on imminent casNext()
lazySetItem(item);
}
E getItem() {
return item;
UNSAFE.putObject(this, itemOffset, item);
}
boolean casItem(E cmp, E val) {
return UNSAFE.compareAndSwapObject(this, itemOffset, cmp, val);
}
void setItem(E val) {
item = val;
}
void lazySetItem(E val) {
UNSAFE.putOrderedObject(this, itemOffset, val);
}
void lazySetNext(Node<E> val) {
UNSAFE.putOrderedObject(this, nextOffset, val);
}
Node<E> getNext() {
return next;
}
boolean casNext(Node<E> cmp, Node<E> val) {
return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
}
......@@ -219,7 +214,7 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
* - it is permitted for tail to lag behind head, that is, for tail
* to not be reachable from head!
*/
private transient volatile Node<E> head = new Node<E>(null);
private transient volatile Node<E> head;
/**
* A node from which the last node on list (that is, the unique
......@@ -233,25 +228,41 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
* to not be reachable from head!
* - tail.next may or may not be self-pointing to tail.
*/
private transient volatile Node<E> tail = head;
private transient volatile Node<E> tail;
/**
* Creates a {@code ConcurrentLinkedQueue} that is initially empty.
*/
public ConcurrentLinkedQueue() {}
public ConcurrentLinkedQueue() {
head = tail = new Node<E>(null);
}
/**
* Creates a {@code ConcurrentLinkedQueue}
* initially containing the elements of the given collection,
* added in traversal order of the collection's iterator.
*
* @param c the collection of elements to initially contain
* @throws NullPointerException if the specified collection or any
* of its elements are null
*/
public ConcurrentLinkedQueue(Collection<? extends E> c) {
for (E e : c)
add(e);
Node<E> h = null, t = null;
for (E e : c) {
checkNotNull(e);
Node<E> newNode = new Node<E>(e);
if (h == null)
h = t = newNode;
else {
t.lazySetNext(newNode);
t = newNode;
}
}
if (h == null)
h = t = new Node<E>(null);
head = h;
tail = t;
}
// Have to override just to update the javadoc
......@@ -266,13 +277,6 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
return offer(e);
}
/**
* We don't bother to update head or tail pointers if fewer than
* HOPS links from "true" location. We assume that volatile
* writes are significantly more expensive than volatile reads.
*/
private static final int HOPS = 1;
/**
* Try to CAS head to p. If successful, repoint old head to itself
* as sentinel for succ(), below.
......@@ -288,7 +292,7 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
* stale pointer that is now off the list.
*/
final Node<E> succ(Node<E> p) {
Node<E> next = p.getNext();
Node<E> next = p.next;
return (p == next) ? head : next;
}
......@@ -299,69 +303,76 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
* @throws NullPointerException if the specified element is null
*/
public boolean offer(E e) {
if (e == null) throw new NullPointerException();
Node<E> n = new Node<E>(e);
retry:
for (;;) {
Node<E> t = tail;
Node<E> p = t;
for (int hops = 0; ; hops++) {
Node<E> next = succ(p);
if (next != null) {
if (hops > HOPS && t != tail)
continue retry;
p = next;
} else if (p.casNext(null, n)) {
if (hops >= HOPS)
casTail(t, n); // Failure is OK.
checkNotNull(e);
final Node<E> newNode = new Node<E>(e);
for (Node<E> t = tail, p = t;;) {
Node<E> q = p.next;
if (q == null) {
// p is last node
if (p.casNext(null, newNode)) {
// Successful CAS is the linearization point
// for e to become an element of this queue,
// and for newNode to become "live".
if (p != t) // hop two nodes at a time
casTail(t, newNode); // Failure is OK.
return true;
} else {
p = succ(p);
}
// Lost CAS race to another thread; re-read next
}
else if (p == q)
// We have fallen off list. If tail is unchanged, it
// will also be off-list, in which case we need to
// jump to head, from which all live nodes are always
// reachable. Else the new tail is a better bet.
p = (t != (t = tail)) ? t : head;
else
// Check for tail updates after two hops.
p = (p != t && t != (t = tail)) ? t : q;
}
}
public E poll() {
Node<E> h = head;
Node<E> p = h;
for (int hops = 0; ; hops++) {
E item = p.getItem();
restartFromHead:
for (;;) {
for (Node<E> h = head, p = h, q;;) {
E item = p.item;
if (item != null && p.casItem(item, null)) {
if (hops >= HOPS) {
Node<E> q = p.getNext();
updateHead(h, (q != null) ? q : p);
}
// Successful CAS is the linearization point
// for item to be removed from this queue.
if (p != h) // hop two nodes at a time
updateHead(h, ((q = p.next) != null) ? q : p);
return item;
}
Node<E> next = succ(p);
if (next == null) {
else if ((q = p.next) == null) {
updateHead(h, p);
break;
return null;
}
else if (p == q)
continue restartFromHead;
else
p = q;
}
p = next;
}
return null;
}
public E peek() {
Node<E> h = head;
Node<E> p = h;
E item;
restartFromHead:
for (;;) {
item = p.getItem();
if (item != null)
break;
Node<E> next = succ(p);
if (next == null) {
break;
}
p = next;
}
for (Node<E> h = head, p = h, q;;) {
E item = p.item;
if (item != null || (q = p.next) == null) {
updateHead(h, p);
return item;
}
else if (p == q)
continue restartFromHead;
else
p = q;
}
}
}
/**
* Returns the first live (non-deleted) node on list, or null if none.
......@@ -372,24 +383,20 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
* of losing a race to a concurrent poll().
*/
Node<E> first() {
Node<E> h = head;
Node<E> p = h;
Node<E> result;
restartFromHead:
for (;;) {
E item = p.getItem();
if (item != null) {
result = p;
break;
for (Node<E> h = head, p = h, q;;) {
boolean hasItem = (p.item != null);
if (hasItem || (q = p.next) == null) {
updateHead(h, p);
return hasItem ? p : null;
}
Node<E> next = succ(p);
if (next == null) {
result = null;
break;
else if (p == q)
continue restartFromHead;
else
p = q;
}
p = next;
}
updateHead(h, p);
return result;
}
/**
......@@ -410,18 +417,20 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
* <em>NOT</em> a constant-time operation. Because of the
* asynchronous nature of these queues, determining the current
* number of elements requires an O(n) traversal.
* Additionally, if elements are added or removed during execution
* of this method, the returned result may be inaccurate. Thus,
* this method is typically not very useful in concurrent
* applications.
*
* @return the number of elements in this queue
*/
public int size() {
int count = 0;
for (Node<E> p = first(); p != null; p = succ(p)) {
if (p.getItem() != null) {
// Collections.size() spec says to max out
for (Node<E> p = first(); p != null; p = succ(p))
if (p.item != null)
// Collection.size() spec says to max out
if (++count == Integer.MAX_VALUE)
break;
}
}
return count;
}
......@@ -436,9 +445,8 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
public boolean contains(Object o) {
if (o == null) return false;
for (Node<E> p = first(); p != null; p = succ(p)) {
E item = p.getItem();
if (item != null &&
o.equals(item))
E item = p.item;
if (item != null && o.equals(item))
return true;
}
return false;
......@@ -459,7 +467,7 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
if (o == null) return false;
Node<E> pred = null;
for (Node<E> p = first(); p != null; p = succ(p)) {
E item = p.getItem();
E item = p.item;
if (item != null &&
o.equals(item) &&
p.casItem(item, null)) {
......@@ -473,6 +481,69 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
return false;
}
/**
* Appends all of the elements in the specified collection to the end of
* this queue, in the order that they are returned by the specified
* collection's iterator. Attempts to {@code addAll} of a queue to
* itself result in {@code IllegalArgumentException}.
*
* @param c the elements to be inserted into this queue
* @return {@code true} if this queue changed as a result of the call
* @throws NullPointerException if the specified collection or any
* of its elements are null
* @throws IllegalArgumentException if the collection is this queue
*/
public boolean addAll(Collection<? extends E> c) {
if (c == this)
// As historically specified in AbstractQueue#addAll
throw new IllegalArgumentException();
// Copy c into a private chain of Nodes
Node<E> beginningOfTheEnd = null, last = null;
for (E e : c) {
checkNotNull(e);
Node<E> newNode = new Node<E>(e);
if (beginningOfTheEnd == null)
beginningOfTheEnd = last = newNode;
else {
last.lazySetNext(newNode);
last = newNode;
}
}
if (beginningOfTheEnd == null)
return false;
// Atomically append the chain at the tail of this collection
for (Node<E> t = tail, p = t;;) {
Node<E> q = p.next;
if (q == null) {
// p is last node
if (p.casNext(null, beginningOfTheEnd)) {
// Successful CAS is the linearization point
// for all elements to be added to this queue.
if (!casTail(t, last)) {
// Try a little harder to update tail,
// since we may be adding many elements.
t = tail;
if (last.next == null)
casTail(t, last);
}
return true;
}
// Lost CAS race to another thread; re-read next
}
else if (p == q)
// We have fallen off list. If tail is unchanged, it
// will also be off-list, in which case we need to
// jump to head, from which all live nodes are always
// reachable. Else the new tail is a better bet.
p = (t != (t = tail)) ? t : head;
else
// Check for tail updates after two hops.
p = (p != t && t != (t = tail)) ? t : q;
}
}
/**
* Returns an array containing all of the elements in this queue, in
* proper sequence.
......@@ -490,7 +561,7 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
// Use ArrayList to deal with resizing.
ArrayList<E> al = new ArrayList<E>();
for (Node<E> p = first(); p != null; p = succ(p)) {
E item = p.getItem();
E item = p.item;
if (item != null)
al.add(item);
}
......@@ -539,7 +610,7 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
int k = 0;
Node<E> p;
for (p = first(); p != null && k < a.length; p = succ(p)) {
E item = p.getItem();
E item = p.item;
if (item != null)
a[k++] = (T)item;
}
......@@ -552,7 +623,7 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
// If won't fit, use ArrayList version
ArrayList<E> al = new ArrayList<E>();
for (Node<E> q = first(); q != null; q = succ(q)) {
E item = q.getItem();
E item = q.item;
if (item != null)
al.add(item);
}
......@@ -561,7 +632,9 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
/**
* Returns an iterator over the elements in this queue in proper sequence.
* The returned iterator is a "weakly consistent" iterator that
* The elements will be returned in order from first (head) to last (tail).
*
* <p>The returned {@code Iterator} is a "weakly consistent" iterator that
* will never throw {@link java.util.ConcurrentModificationException
* ConcurrentModificationException},
* and guarantees to traverse elements as they existed upon
......@@ -620,7 +693,7 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
nextItem = null;
return x;
}
E item = p.getItem();
E item = p.item;
if (item != null) {
nextNode = p;
nextItem = item;
......@@ -648,13 +721,13 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
Node<E> l = lastRet;
if (l == null) throw new IllegalStateException();
// rely on a future traversal to relink.
l.setItem(null);
l.item = null;
lastRet = null;
}
}
/**
* Save the state to a stream (that is, serialize it).
* Saves the state to a stream (that is, serializes it).
*
* @serialData All of the elements (each an {@code E}) in
* the proper order, followed by a null
......@@ -668,7 +741,7 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
// Write out all elements in the proper order.
for (Node<E> p = first(); p != null; p = succ(p)) {
Object item = p.getItem();
Object item = p.item;
if (item != null)
s.writeObject(item);
}
......@@ -678,25 +751,40 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
}
/**
* Reconstitute the Queue instance from a stream (that is,
* deserialize it).
* Reconstitutes the instance from a stream (that is, deserializes it).
* @param s the stream
*/
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
// Read in capacity, and any hidden stuff
s.defaultReadObject();
head = new Node<E>(null);
tail = head;
// Read in all elements and place in queue
for (;;) {
// Read in elements until trailing null sentinel found
Node<E> h = null, t = null;
Object item;
while ((item = s.readObject()) != null) {
@SuppressWarnings("unchecked")
E item = (E)s.readObject();
if (item == null)
break;
else
offer(item);
Node<E> newNode = new Node<E>((E) item);
if (h == null)
h = t = newNode;
else {
t.lazySetNext(newNode);
t = newNode;
}
}
if (h == null)
h = t = new Node<E>(null);
head = h;
tail = t;
}
/**
* Throws NullPointerException if argument is null.
*
* @param v the element
*/
private static void checkNotNull(Object v) {
if (v == null)
throw new NullPointerException();
}
// Unsafe mechanics
......@@ -715,10 +803,6 @@ public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val);
}
private void lazySetHead(Node<E> val) {
UNSAFE.putOrderedObject(this, headOffset, val);
}
static long objectFieldOffset(sun.misc.Unsafe UNSAFE,
String field, Class<?> klazz) {
try {
......
......@@ -42,7 +42,6 @@ import java.util.Collections;
import java.util.List;
import java.util.concurrent.AbstractExecutorService;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.RejectedExecutionException;
......@@ -823,15 +822,13 @@ public class ForkJoinPool extends AbstractExecutorService {
(workerCounts & RUNNING_COUNT_MASK) <= 1);
long startTime = untimed? 0 : System.nanoTime();
Thread.interrupted(); // clear/ignore interrupt
if (eventCount != ec || w.runState != 0 ||
runState >= TERMINATING) // recheck after clear
break;
if (eventCount != ec || w.isTerminating())
break; // recheck after clear
if (untimed)
LockSupport.park(w);
else {
LockSupport.parkNanos(w, SHRINK_RATE_NANOS);
if (eventCount != ec || w.runState != 0 ||
runState >= TERMINATING)
if (eventCount != ec || w.isTerminating())
break;
if (System.nanoTime() - startTime >= SHRINK_RATE_NANOS)
tryShutdownUnusedWorker(ec);
......@@ -899,16 +896,23 @@ public class ForkJoinPool extends AbstractExecutorService {
UNSAFE.compareAndSwapInt(this, workerCountsOffset, wc,
wc + (ONE_RUNNING|ONE_TOTAL))) {
ForkJoinWorkerThread w = null;
Throwable fail = null;
try {
w = factory.newThread(this);
} finally { // adjust on null or exceptional factory return
if (w == null) {
} catch (Throwable ex) {
fail = ex;
}
if (w == null) { // null or exceptional factory return
decrementWorkerCounts(ONE_RUNNING, ONE_TOTAL);
tryTerminate(false); // handle failure during shutdown
}
}
if (w == null)
// If originating from an external caller,
// propagate exception, else ignore
if (fail != null && runState < TERMINATING &&
!(Thread.currentThread() instanceof
ForkJoinWorkerThread))
UNSAFE.throwException(fail);
break;
}
w.start(recordWorker(w), ueh);
if ((workerCounts >>> TOTAL_COUNT_SHIFT) >= pc) {
int c; // advance event count
......@@ -997,8 +1001,12 @@ public class ForkJoinPool extends AbstractExecutorService {
boolean active = w.active;
boolean inactivate = false;
int pc = parallelism;
int rs;
while (w.runState == 0 && (rs = runState) < TERMINATING) {
while (w.runState == 0) {
int rs = runState;
if (rs >= TERMINATING) { // propagate shutdown
w.shutdown();
break;
}
if ((inactivate || (active && (rs & ACTIVE_COUNT_MASK) >= pc)) &&
UNSAFE.compareAndSwapInt(this, runStateOffset, rs, rs - 1))
inactivate = active = w.active = false;
......@@ -1126,6 +1134,7 @@ public class ForkJoinPool extends AbstractExecutorService {
return true;
}
/**
* Actions on transition to TERMINATING
*
......@@ -1149,7 +1158,7 @@ public class ForkJoinPool extends AbstractExecutorService {
if (passes > 0 && !w.isTerminated()) {
w.cancelTasks();
LockSupport.unpark(w);
if (passes > 1) {
if (passes > 1 && !w.isInterrupted()) {
try {
w.interrupt();
} catch (SecurityException ignore) {
......@@ -1725,6 +1734,13 @@ public class ForkJoinPool extends AbstractExecutorService {
return (runState & (TERMINATING|TERMINATED)) == TERMINATING;
}
/**
* Returns true if terminating or terminated. Used by ForkJoinWorkerThread.
*/
final boolean isAtLeastTerminating() {
return runState >= TERMINATING;
}
/**
* Returns {@code true} if this pool has been shut down.
*
......
......@@ -55,10 +55,10 @@ import java.util.WeakHashMap;
* start other subtasks. As indicated by the name of this class,
* many programs using {@code ForkJoinTask} employ only methods
* {@link #fork} and {@link #join}, or derivatives such as {@link
* #invokeAll}. However, this class also provides a number of other
* methods that can come into play in advanced usages, as well as
* extension mechanics that allow support of new forms of fork/join
* processing.
* #invokeAll(ForkJoinTask...) invokeAll}. However, this class also
* provides a number of other methods that can come into play in
* advanced usages, as well as extension mechanics that allow
* support of new forms of fork/join processing.
*
* <p>A {@code ForkJoinTask} is a lightweight form of {@link Future}.
* The efficiency of {@code ForkJoinTask}s stems from a set of
......@@ -250,7 +250,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
int s; // the odd construction reduces lock bias effects
while ((s = status) >= 0) {
try {
synchronized(this) {
synchronized (this) {
if (UNSAFE.compareAndSwapInt(this, statusOffset, s,SIGNAL))
wait();
}
......@@ -270,7 +270,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
int s;
if ((s = status) >= 0) {
try {
synchronized(this) {
synchronized (this) {
if (UNSAFE.compareAndSwapInt(this, statusOffset, s,SIGNAL))
wait(millis, 0);
}
......@@ -288,7 +288,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
private void externalAwaitDone() {
int s;
while ((s = status) >= 0) {
synchronized(this) {
synchronized (this) {
if (UNSAFE.compareAndSwapInt(this, statusOffset, s, SIGNAL)){
boolean interrupted = false;
while (status >= 0) {
......@@ -669,11 +669,34 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
setCompletion(NORMAL);
}
/**
* Waits if necessary for the computation to complete, and then
* retrieves its result.
*
* @return the computed result
* @throws CancellationException if the computation was cancelled
* @throws ExecutionException if the computation threw an
* exception
* @throws InterruptedException if the current thread is not a
* member of a ForkJoinPool and was interrupted while waiting
*/
public final V get() throws InterruptedException, ExecutionException {
int s;
if (Thread.currentThread() instanceof ForkJoinWorkerThread) {
quietlyJoin();
if (Thread.interrupted())
throw new InterruptedException();
int s = status;
s = status;
}
else {
while ((s = status) >= 0) {
synchronized (this) { // interruptible form of awaitDone
if (UNSAFE.compareAndSwapInt(this, statusOffset,
s, SIGNAL)) {
while (status >= 0)
wait();
}
}
}
}
if (s < NORMAL) {
Throwable ex;
if (s == CANCELLED)
......@@ -684,6 +707,20 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
return getRawResult();
}
/**
* Waits if necessary for at most the given time for the computation
* to complete, and then retrieves its result, if available.
*
* @param timeout the maximum time to wait
* @param unit the time unit of the timeout argument
* @return the computed result
* @throws CancellationException if the computation was cancelled
* @throws ExecutionException if the computation threw an
* exception
* @throws InterruptedException if the current thread is not a
* member of a ForkJoinPool and was interrupted while waiting
* @throws TimeoutException if the wait timed out
*/
public final V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException {
Thread t = Thread.currentThread();
......@@ -725,7 +762,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
long ms = nt / 1000000;
int ns = (int) (nt % 1000000);
try {
synchronized(this) {
synchronized (this) {
if (status >= 0)
wait(ms, ns);
}
......
......@@ -778,11 +778,20 @@ public class ForkJoinWorkerThread extends Thread {
// status check methods used mainly by ForkJoinPool
final boolean isRunning() { return runState == 0; }
final boolean isTerminating() { return (runState & TERMINATING) != 0; }
final boolean isTerminated() { return (runState & TERMINATED) != 0; }
final boolean isSuspended() { return (runState & SUSPENDED) != 0; }
final boolean isTrimmed() { return (runState & TRIMMED) != 0; }
final boolean isTerminating() {
if ((runState & TERMINATING) != 0)
return true;
if (pool.isAtLeastTerminating()) { // propagate pool state
shutdown();
return true;
}
return false;
}
/**
* Sets state to TERMINATING. Does NOT unpark or interrupt
* to wake up if currently blocked. Callers must do so if desired.
......
......@@ -138,7 +138,7 @@ package java.util.concurrent;
* if (right.tryUnfork()) // directly calculate if not stolen
* sum += right.atLeaf(right.lo, right.hi);
* else {
* right.helpJoin();
* right.join();
* sum += right.result;
* }
* right = right.next;
......
......@@ -690,6 +690,11 @@ public class LogManager {
* Note that since untrusted code may create loggers with
* arbitrary names this method should not be relied on to
* find Loggers for security sensitive logging.
* It is also important to note that the Logger associated with the
* String {@code name} may be garbage collected at any time if there
* is no strong reference to the Logger. The caller of this method
* must check the return value for null in order to properly handle
* the case where the Logger has been garbage collected.
* <p>
* @param name name of the logger
* @return matching logger or null if none is found
......@@ -713,6 +718,14 @@ public class LogManager {
* <p>
* Note: Loggers may be added dynamically as new classes are loaded.
* This method only reports on the loggers that are currently registered.
* It is also important to note that this method only returns the name
* of a Logger, not a strong reference to the Logger itself.
* The returned String does nothing to prevent the Logger from being
* garbage collected. In particular, if the returned name is passed
* to {@code LogManager.getLogger()}, then the caller must check the
* return value from {@code LogManager.getLogger()} for null to properly
* handle the case where the Logger has been garbage collected in the
* time since its name was returned by this method.
* <p>
* @return enumeration of logger name strings
*/
......
......@@ -42,7 +42,10 @@ import java.lang.ref.WeakReference;
* <p>
* Logger objects may be obtained by calls on one of the getLogger
* factory methods. These will either create a new Logger or
* return a suitable existing Logger.
* return a suitable existing Logger. It is important to note that
* the Logger returned by one of the {@code getLogger} factory methods
* may be garbage collected at any time if a strong reference to the
* Logger is not kept.
* <p>
* Logging messages will be forwarded to registered Handler
* objects, which can forward the messages to a variety of
......@@ -210,7 +213,9 @@ public class Logger {
* who are making serious use of the logging package (for example
* in products) should create and use their own Logger objects,
* with appropriate names, so that logging can be controlled on a
* suitable per-Logger granularity.
* suitable per-Logger granularity. Developers also need to keep a
* strong reference to their Logger objects to prevent them from
* being garbage collected.
* <p>
* @deprecated Initialization of this field is prone to deadlocks.
* The field must be initialized by the Logger class initialization
......@@ -287,6 +292,15 @@ public class Logger {
* based on the LogManager configuration and it will configured
* to also send logging output to its parent's Handlers. It will
* be registered in the LogManager global namespace.
* <p>
* Note: The LogManager may only retain a weak reference to the newly
* created Logger. It is important to understand that a previously
* created Logger with the given name may be garbage collected at any
* time if there is no strong reference to the Logger. In particular,
* this means that two back-to-back calls like
* {@code getLogger("MyLogger").log(...)} may use different Logger
* objects named "MyLogger" if there is no strong reference to the
* Logger named "MyLogger" elsewhere in the program.
*
* @param name A name for the logger. This should
* be a dot-separated name and should normally
......@@ -311,6 +325,15 @@ public class Logger {
* output to its parent's Handlers. It will be registered in
* the LogManager global namespace.
* <p>
* Note: The LogManager may only retain a weak reference to the newly
* created Logger. It is important to understand that a previously
* created Logger with the given name may be garbage collected at any
* time if there is no strong reference to the Logger. In particular,
* this means that two back-to-back calls like
* {@code getLogger("MyLogger", ...).log(...)} may use different Logger
* objects named "MyLogger" if there is no strong reference to the
* Logger named "MyLogger" elsewhere in the program.
* <p>
* If the named Logger already exists and does not yet have a
* localization resource bundle then the given resource bundle
* name is used. If the named Logger already exists and has
......
/*
* Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -734,7 +734,7 @@ public static final int ASCII_STREAM_PARAM = 2;
throw new SQLException("Set initParams() before setCommand");
}
params.clear();
command = new String(cmd);
command = cmd;
}
}
......@@ -797,7 +797,7 @@ public static final int ASCII_STREAM_PARAM = 2;
throw new SQLException("Invalid url string detected. " +
"Cannot be of length less than 1");
} else {
URL = new String(url);
URL = url;
}
dataSource = null;
......@@ -854,7 +854,7 @@ public static final int ASCII_STREAM_PARAM = 2;
} else if (name.equals("")) {
throw new SQLException("DataSource name cannot be empty string");
} else {
dataSource = new String(name);
dataSource = name;
}
URL = null;
......@@ -889,7 +889,7 @@ public static final int ASCII_STREAM_PARAM = 2;
{
username = null;
} else {
username = new String(name);
username = name;
}
}
......@@ -924,7 +924,7 @@ public static final int ASCII_STREAM_PARAM = 2;
{
password = null;
} else {
password = new String(pass);
password = pass;
}
}
......@@ -1563,13 +1563,13 @@ public static final int ASCII_STREAM_PARAM = 2;
nullVal = new Object[2];
nullVal[0] = null;
nullVal[1] = new Integer(sqlType);
nullVal[1] = Integer.valueOf(sqlType);
if (params == null){
throw new SQLException("Set initParams() before setNull");
}
params.put(new Integer(parameterIndex - 1), nullVal);
params.put(Integer.valueOf(parameterIndex - 1), nullVal);
}
/**
......@@ -1644,14 +1644,14 @@ public static final int ASCII_STREAM_PARAM = 2;
nullVal = new Object[3];
nullVal[0] = null;
nullVal[1] = new Integer(sqlType);
nullVal[2] = new String(typeName);
nullVal[1] = Integer.valueOf(sqlType);
nullVal[2] = typeName;
if(params == null){
throw new SQLException("Set initParams() before setNull");
}
params.put(new Integer(parameterIndex - 1), nullVal);
params.put(Integer.valueOf(parameterIndex - 1), nullVal);
}
......@@ -1686,7 +1686,7 @@ public static final int ASCII_STREAM_PARAM = 2;
throw new SQLException("Set initParams() before setNull");
}
params.put(new Integer(parameterIndex - 1), new Boolean(x));
params.put(Integer.valueOf(parameterIndex - 1), Boolean.valueOf(x));
}
/**
......@@ -1720,7 +1720,7 @@ public static final int ASCII_STREAM_PARAM = 2;
throw new SQLException("Set initParams() before setByte");
}
params.put(new Integer(parameterIndex - 1), new Byte(x));
params.put(Integer.valueOf(parameterIndex - 1), Byte.valueOf(x));
}
/**
......@@ -1754,7 +1754,7 @@ public static final int ASCII_STREAM_PARAM = 2;
throw new SQLException("Set initParams() before setShort");
}
params.put(new Integer(parameterIndex - 1), new Short(x));
params.put(Integer.valueOf(parameterIndex - 1), Short.valueOf(x));
}
/**
......@@ -1786,7 +1786,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){
throw new SQLException("Set initParams() before setInt");
}
params.put(new Integer(parameterIndex - 1), new Integer(x));
params.put(Integer.valueOf(parameterIndex - 1), Integer.valueOf(x));
}
/**
......@@ -1818,7 +1818,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){
throw new SQLException("Set initParams() before setLong");
}
params.put(new Integer(parameterIndex - 1), new Long(x));
params.put(Integer.valueOf(parameterIndex - 1), Long.valueOf(x));
}
/**
......@@ -1850,7 +1850,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){
throw new SQLException("Set initParams() before setFloat");
}
params.put(new Integer(parameterIndex - 1), new Float(x));
params.put(Integer.valueOf(parameterIndex - 1), new Float(x));
}
/**
......@@ -1882,7 +1882,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){
throw new SQLException("Set initParams() before setDouble");
}
params.put(new Integer(parameterIndex - 1), new Double(x));
params.put(Integer.valueOf(parameterIndex - 1), new Double(x));
}
/**
......@@ -1914,7 +1914,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){
throw new SQLException("Set initParams() before setBigDecimal");
}
params.put(new Integer(parameterIndex - 1), x);
params.put(Integer.valueOf(parameterIndex - 1), x);
}
/**
......@@ -1948,7 +1948,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){
throw new SQLException("Set initParams() before setString");
}
params.put(new Integer(parameterIndex - 1), x);
params.put(Integer.valueOf(parameterIndex - 1), x);
}
/**
......@@ -1982,7 +1982,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){
throw new SQLException("Set initParams() before setBytes");
}
params.put(new Integer(parameterIndex - 1), x);
params.put(Integer.valueOf(parameterIndex - 1), x);
}
/**
......@@ -2024,7 +2024,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){
throw new SQLException("Set initParams() before setDate");
}
params.put(new Integer(parameterIndex - 1), x);
params.put(Integer.valueOf(parameterIndex - 1), x);
}
/**
......@@ -2069,7 +2069,7 @@ public static final int ASCII_STREAM_PARAM = 2;
throw new SQLException("Set initParams() before setTime");
}
params.put(new Integer(parameterIndex - 1), x);
params.put(Integer.valueOf(parameterIndex - 1), x);
}
/**
......@@ -2112,7 +2112,7 @@ public static final int ASCII_STREAM_PARAM = 2;
throw new SQLException("Set initParams() before setTimestamp");
}
params.put(new Integer(parameterIndex - 1), x);
params.put(Integer.valueOf(parameterIndex - 1), x);
}
/**
......@@ -2185,14 +2185,14 @@ public static final int ASCII_STREAM_PARAM = 2;
asciiStream = new Object[3];
asciiStream[0] = x;
asciiStream[1] = new Integer(length);
asciiStream[2] = new Integer(ASCII_STREAM_PARAM);
asciiStream[1] = Integer.valueOf(length);
asciiStream[2] = Integer.valueOf(ASCII_STREAM_PARAM);
if(params == null){
throw new SQLException("Set initParams() before setAsciiStream");
}
params.put(new Integer(parameterIndex - 1), asciiStream);
params.put(Integer.valueOf(parameterIndex - 1), asciiStream);
}
/**
......@@ -2290,13 +2290,13 @@ public static final int ASCII_STREAM_PARAM = 2;
binaryStream = new Object[3];
binaryStream[0] = x;
binaryStream[1] = new Integer(length);
binaryStream[2] = new Integer(BINARY_STREAM_PARAM);
binaryStream[1] = Integer.valueOf(length);
binaryStream[2] = Integer.valueOf(BINARY_STREAM_PARAM);
if(params == null){
throw new SQLException("Set initParams() before setBinaryStream");
}
params.put(new Integer(parameterIndex - 1), binaryStream);
params.put(Integer.valueOf(parameterIndex - 1), binaryStream);
}
......@@ -2396,12 +2396,12 @@ public static final int ASCII_STREAM_PARAM = 2;
unicodeStream = new Object[3];
unicodeStream[0] = x;
unicodeStream[1] = new Integer(length);
unicodeStream[2] = new Integer(UNICODE_STREAM_PARAM);
unicodeStream[1] = Integer.valueOf(length);
unicodeStream[2] = Integer.valueOf(UNICODE_STREAM_PARAM);
if(params == null){
throw new SQLException("Set initParams() before setUnicodeStream");
}
params.put(new Integer(parameterIndex - 1), unicodeStream);
params.put(Integer.valueOf(parameterIndex - 1), unicodeStream);
}
/**
......@@ -2475,11 +2475,11 @@ public static final int ASCII_STREAM_PARAM = 2;
charStream = new Object[2];
charStream[0] = reader;
charStream[1] = new Integer(length);
charStream[1] = Integer.valueOf(length);
if(params == null){
throw new SQLException("Set initParams() before setCharacterStream");
}
params.put(new Integer(parameterIndex - 1), charStream);
params.put(Integer.valueOf(parameterIndex - 1), charStream);
}
/**
......@@ -2591,12 +2591,12 @@ public static final int ASCII_STREAM_PARAM = 2;
obj = new Object[3];
obj[0] = x;
obj[1] = new Integer(targetSqlType);
obj[2] = new Integer(scale);
obj[1] = Integer.valueOf(targetSqlType);
obj[2] = Integer.valueOf(scale);
if(params == null){
throw new SQLException("Set initParams() before setObject");
}
params.put(new Integer(parameterIndex - 1), obj);
params.put(Integer.valueOf(parameterIndex - 1), obj);
}
/**
......@@ -2654,11 +2654,11 @@ public static final int ASCII_STREAM_PARAM = 2;
obj = new Object[2];
obj[0] = x;
obj[1] = new Integer(targetSqlType);
obj[1] = Integer.valueOf(targetSqlType);
if (params == null){
throw new SQLException("Set initParams() before setObject");
}
params.put(new Integer(parameterIndex - 1), obj);
params.put(Integer.valueOf(parameterIndex - 1), obj);
}
/**
......@@ -2726,7 +2726,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if (params == null) {
throw new SQLException("Set initParams() before setObject");
}
params.put(new Integer(parameterIndex - 1), x);
params.put(Integer.valueOf(parameterIndex - 1), x);
}
/**
......@@ -2773,7 +2773,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if (params == null) {
throw new SQLException("Set initParams() before setRef");
}
params.put(new Integer(parameterIndex - 1), new SerialRef(ref));
params.put(Integer.valueOf(parameterIndex - 1), new SerialRef(ref));
}
/**
......@@ -2817,7 +2817,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){
throw new SQLException("Set initParams() before setBlob");
}
params.put(new Integer(parameterIndex - 1), new SerialBlob(x));
params.put(Integer.valueOf(parameterIndex - 1), new SerialBlob(x));
}
/**
......@@ -2862,7 +2862,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){
throw new SQLException("Set initParams() before setClob");
}
params.put(new Integer(parameterIndex - 1), new SerialClob(x));
params.put(Integer.valueOf(parameterIndex - 1), new SerialClob(x));
}
/**
......@@ -2910,7 +2910,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if (params == null){
throw new SQLException("Set initParams() before setArray");
}
params.put(new Integer(parameterIndex - 1), new SerialArray(array));
params.put(Integer.valueOf(parameterIndex - 1), new SerialArray(array));
}
/**
......@@ -2975,7 +2975,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){
throw new SQLException("Set initParams() before setDate");
}
params.put(new Integer(parameterIndex - 1), date);
params.put(Integer.valueOf(parameterIndex - 1), date);
}
/**
......@@ -3041,7 +3041,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){
throw new SQLException("Set initParams() before setTime");
}
params.put(new Integer(parameterIndex - 1), time);
params.put(Integer.valueOf(parameterIndex - 1), time);
}
/**
......@@ -3107,7 +3107,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){
throw new SQLException("Set initParams() before setTimestamp");
}
params.put(new Integer(parameterIndex - 1), timestamp);
params.put(Integer.valueOf(parameterIndex - 1), timestamp);
}
/**
......@@ -3181,7 +3181,7 @@ public static final int ASCII_STREAM_PARAM = 2;
Object[] paramsArray = new Object[params.size()];
for (int i = 0; i < params.size(); i++) {
paramsArray[i] = params.get(new Integer(i));
paramsArray[i] = params.get(Integer.valueOf(i));
if (paramsArray[i] == null) {
throw new SQLException("missing parameter: " + (i + 1));
} //end if
......
......@@ -39,7 +39,7 @@ import javax.sql.rowset.spi.*;
* <code>CachedRowSet</code> must implement.
* <P>
* The reference implementation of the <code>CachedRowSet</code> interface provided
* by Sun Microsystems is a standard implementation. Developers may use this implementation
* by Oracle Corporation is a standard implementation. Developers may use this implementation
* just as it is, they may extend it, or they may choose to write their own implementations
* of this interface.
* <P>
......@@ -1623,4 +1623,3 @@ public interface CachedRowSet extends RowSet, Joinable {
public boolean previousPage() throws SQLException;
}
/*
* Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -306,9 +306,9 @@ public class RowSetMetaDataImpl implements RowSetMetaData, Serializable {
public void setColumnLabel(int columnIndex, String label) throws SQLException {
checkColRange(columnIndex);
if (label != null) {
colInfo[columnIndex].columnLabel = new String(label);
colInfo[columnIndex].columnLabel = label;
} else {
colInfo[columnIndex].columnLabel = new String("");
colInfo[columnIndex].columnLabel = "";
}
}
......@@ -326,9 +326,9 @@ public class RowSetMetaDataImpl implements RowSetMetaData, Serializable {
public void setColumnName(int columnIndex, String columnName) throws SQLException {
checkColRange(columnIndex);
if (columnName != null) {
colInfo[columnIndex].columnName = new String(columnName);
colInfo[columnIndex].columnName = columnName;
} else {
colInfo[columnIndex].columnName = new String("");
colInfo[columnIndex].columnName = "";
}
}
......@@ -348,9 +348,9 @@ public class RowSetMetaDataImpl implements RowSetMetaData, Serializable {
public void setSchemaName(int columnIndex, String schemaName) throws SQLException {
checkColRange(columnIndex);
if (schemaName != null ) {
colInfo[columnIndex].schemaName = new String(schemaName);
colInfo[columnIndex].schemaName = schemaName;
} else {
colInfo[columnIndex].schemaName = new String("");
colInfo[columnIndex].schemaName = "";
}
}
......@@ -411,9 +411,9 @@ public class RowSetMetaDataImpl implements RowSetMetaData, Serializable {
public void setTableName(int columnIndex, String tableName) throws SQLException {
checkColRange(columnIndex);
if (tableName != null) {
colInfo[columnIndex].tableName = new String(tableName);
colInfo[columnIndex].tableName = tableName;
} else {
colInfo[columnIndex].tableName = new String("");
colInfo[columnIndex].tableName = "";
}
}
......@@ -432,9 +432,9 @@ public class RowSetMetaDataImpl implements RowSetMetaData, Serializable {
public void setCatalogName(int columnIndex, String catalogName) throws SQLException {
checkColRange(columnIndex);
if (catalogName != null)
colInfo[columnIndex].catName = new String(catalogName);
colInfo[columnIndex].catName = catalogName;
else
colInfo[columnIndex].catName = new String("");
colInfo[columnIndex].catName = "";
}
/**
......@@ -474,9 +474,9 @@ public class RowSetMetaDataImpl implements RowSetMetaData, Serializable {
throws SQLException {
checkColRange(columnIndex);
if (typeName != null) {
colInfo[columnIndex].colTypeName = new String(typeName);
colInfo[columnIndex].colTypeName = typeName;
} else {
colInfo[columnIndex].colTypeName = new String("");
colInfo[columnIndex].colTypeName = "";
}
}
......@@ -827,7 +827,7 @@ public class RowSetMetaDataImpl implements RowSetMetaData, Serializable {
* or the given column number is out of bounds
*/
public String getColumnClassName(int columnIndex) throws SQLException {
String className = (new String()).getClass().getName();
String className = String.class.getName();
int sqlType = getColumnType(columnIndex);
......@@ -835,65 +835,62 @@ public class RowSetMetaDataImpl implements RowSetMetaData, Serializable {
case Types.NUMERIC:
case Types.DECIMAL:
className = (new java.math.BigDecimal(0)).getClass().getName ();
className = java.math.BigDecimal.class.getName();
break;
case Types.BIT:
className = (new Boolean(false)).getClass().getName ();
className = java.lang.Boolean.class.getName();
break;
case Types.TINYINT:
className = (new Byte("0")).getClass().getName ();
className = java.lang.Byte.class.getName();
break;
case Types.SMALLINT:
className = (new Short("0")).getClass().getName ();
className = java.lang.Short.class.getName();
break;
case Types.INTEGER:
className = (new Integer(0)).getClass().getName ();
className = java.lang.Integer.class.getName();
break;
case Types.BIGINT:
className = (new Long(0)).getClass().getName ();
className = java.lang.Long.class.getName();
break;
case Types.REAL:
className = (new Float(0)).getClass().getName ();
className = java.lang.Float.class.getName();
break;
case Types.FLOAT:
case Types.DOUBLE:
className = (new Double(0)).getClass().getName();
className = java.lang.Double.class.getName();
break;
case Types.BINARY:
case Types.VARBINARY:
case Types.LONGVARBINARY:
byte[] b = {};
className = (b.getClass()).getName();
className = "byte[]";
break;
case Types.DATE:
className = (new java.sql.Date(123456)).getClass().getName ();
className = java.sql.Date.class.getName();
break;
case Types.TIME:
className = (new java.sql.Time(123456)).getClass().getName ();
className = java.sql.Time.class.getName();
break;
case Types.TIMESTAMP:
className = (new java.sql.Timestamp(123456)).getClass().getName ();
className = java.sql.Timestamp.class.getName();
break;
case Types.BLOB:
byte[] blob = {};
className = (blob.getClass()).getName();
className = java.sql.Blob.class.getName();
break;
case Types.CLOB:
char[] c = {};
className = (c.getClass()).getName();
className = java.sql.Clob.class.getName();
break;
}
......
......@@ -29,7 +29,6 @@ import java.security.AccessController;
import java.security.PrivilegedAction;
import java.sql.SQLException;
import java.util.ServiceLoader;
import javax.sql.rowset.RowSetFactory;
/**
* A factory API that enables applications to obtain a
......@@ -82,15 +81,15 @@ public class RowSetProvider {
* the <code>RowSetFactory</code> implementation class to load:</p>
* <ul>
* <li>
* The System property {@code javax.sql.rowset.RowsetFactory}. For example:
* The System property {@code javax.sql.rowset.RowSetFactory}. For example:
* <ul>
* <li>
* -Djavax.sql.rowset.RowsetFactory=com.sun.rowset.RowSetFactoryImpl
* -Djavax.sql.rowset.RowSetFactory=com.sun.rowset.RowSetFactoryImpl
* </li>
* </ul>
* <li>
* The ServiceLocator API. The ServiceLocator API will look
* for a classname in the file
* The {@link ServiceLoader} API. The {@code ServiceLoader} API will look
* for a class name in the file
* {@code META-INF/services/javax.sql.rowset.RowSetFactory}
* in jars available to the runtime. For example, to have the the RowSetFactory
* implementation {@code com.sun.rowset.RowSetFactoryImpl } loaded, the
......@@ -271,7 +270,7 @@ public class RowSetProvider {
/**
* Returns the requested System Property. If a {@code SecurityException}
* occurs, just return NULL
* @param propName - System property to retreive
* @param propName - System property to retrieve
* @return The System property value or NULL if the property does not exist
* or a {@code SecurityException} occurs.
*/
......
/*
* Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -115,7 +115,7 @@ import org.xml.sax.*;
* &lt;<font color=red>url</font>&gt;jdbc:thin:oracle&lt;<font color=red>/url</font>&gt;
* &lt;<font color=red>sync-provider</font>&gt;
* &lt;<font color=red>sync-provider-name</font>&gt;.com.rowset.provider.RIOptimisticProvider&lt;<font color=red>/sync-provider-name</font>&gt;
* &lt;<font color=red>sync-provider-vendor</font>&gt;Sun Microsystems&lt;<font color=red>/sync-provider-vendor</font>&gt;
* &lt;<font color=red>sync-provider-vendor</font>&gt;Oracle Corporation&lt;<font color=red>/sync-provider-vendor</font>&gt;
* &lt;<font color=red>sync-provider-version</font>&gt;1.0&lt;<font color=red>/sync-provider-name</font>&gt;
* &lt;<font color=red>sync-provider-grade</font>&gt;LOW&lt;<font color=red>/sync-provider-grade</font>&gt;
* &lt;<font color=red>data-source-lock</font>&gt;NONE&lt;<font color=red>/data-source-lock</font>&gt;
......@@ -489,7 +489,7 @@ public interface WebRowSet extends CachedRowSet {
* tags and their valid values for a <code>WebRowSet</code> implementation.
*/
public static String PUBLIC_XML_SCHEMA =
"--//Sun Microsystems, Inc.//XSD Schema//EN";
"--//Oracle Corporation//XSD Schema//EN";
/**
* The URL for the XML Schema definition file that defines the XML tags and
......
......@@ -3,10 +3,10 @@
# Optimistic synchonriztaion provider
rowset.provider.classname.0=com.sun.rowset.providers.RIOptimisticProvider
rowset.provider.vendor.0=Sun Microsystems Inc
rowset.provider.vendor.0=Oracle Corporation
rowset.provider.version.0=1.0
# XML Provider using standard XML schema
rowset.provider.classname.1=com.sun.rowset.providers.RIXMLProvider
rowset.provider.vendor.1=Sun Microsystems Inc.
rowset.provider.vendor.1=Oracle Corporation
rowset.provider.version.1=1.0
/*
* Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -137,7 +137,7 @@ public class SQLOutputImpl implements SQLOutput {
* values of a UDT to the database.
*/
public void writeBoolean(boolean x) throws SQLException {
attribs.add(new Boolean(x));
attribs.add(Boolean.valueOf(x));
}
/**
......@@ -151,7 +151,7 @@ public class SQLOutputImpl implements SQLOutput {
* values of a UDT to the database.
*/
public void writeByte(byte x) throws SQLException {
attribs.add(new Byte(x));
attribs.add(Byte.valueOf(x));
}
/**
......@@ -165,7 +165,7 @@ public class SQLOutputImpl implements SQLOutput {
* values of a UDT to the database.
*/
public void writeShort(short x) throws SQLException {
attribs.add(new Short(x));
attribs.add(Short.valueOf(x));
}
/**
......@@ -179,7 +179,7 @@ public class SQLOutputImpl implements SQLOutput {
* values of a UDT to the database.
*/
public void writeInt(int x) throws SQLException {
attribs.add(new Integer(x));
attribs.add(Integer.valueOf(x));
}
/**
......@@ -193,7 +193,7 @@ public class SQLOutputImpl implements SQLOutput {
* values of a UDT to the database.
*/
public void writeLong(long x) throws SQLException {
attribs.add(new Long(x));
attribs.add(Long.valueOf(x));
}
/**
......
/*
* Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -77,7 +77,7 @@ public class SerialRef implements Ref, Serializable, Cloneable {
throw new SQLException("Cannot instantiate a SerialRef object " +
"that returns a null base type name");
} else {
baseTypeName = new String(ref.getBaseTypeName());
baseTypeName = ref.getBaseTypeName();
}
}
......@@ -110,7 +110,7 @@ public class SerialRef implements Ref, Serializable, Cloneable {
throws SerialException
{
map = new Hashtable(map);
if (!object.equals(null)) {
if (object != null) {
return map.get(object);
} else {
throw new SerialException("The object is not set");
......
/*
* Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -94,7 +94,7 @@ public class SerialStruct implements Struct, Serializable, Cloneable {
try {
// get the type name
SQLTypeName = new String(in.getSQLTypeName());
SQLTypeName = in.getSQLTypeName();
System.out.println("SQLTypeName: " + SQLTypeName);
// get the attributes of the struct
......@@ -137,7 +137,7 @@ public class SerialStruct implements Struct, Serializable, Cloneable {
try {
//set the type name
SQLTypeName = new String(in.getSQLTypeName());
SQLTypeName = in.getSQLTypeName();
Vector tmp = new Vector();
in.writeSQL(new SQLOutputImpl(tmp, map));
......
......@@ -125,12 +125,12 @@ import javax.naming.*;
*
* # Optimistic synchronization provider
* rowset.provider.classname.0=com.sun.rowset.providers.RIOptimisticProvider
* rowset.provider.vendor.0=Sun Microsystems Inc
* rowset.provider.vendor.0=Oracle Corporation
* rowset.provider.version.0=1.0
*
* # XML Provider using standard XML schema
* rowset.provider.classname.1=com.sun.rowset.providers.RIXMLProvider
* rowset.provider.vendor.1=Sun Microsystems Inc.
* rowset.provider.vendor.1=Oracle Corporation
* rowset.provider.version.1=1.0
* </PRE>
* The <code>SyncFactory</code> checks this file and registers the
......@@ -369,7 +369,7 @@ public class SyncFactory {
try {
// check if user is supplying his Synchronisation Provider
// Implementation if not use Sun's implementation.
// Implementation if not using Oracle's implementation.
// properties.load(new FileInputStream(ROWSET_PROPERTIES));
// The rowset.properties needs to be in jdk/jre/lib when
......
......@@ -91,8 +91,8 @@ import javax.sql.*;
* </pre>
* <p>
* A vendor can register a <code>SyncProvider</code> implementation class name
* with Sun Microsystems, Inc. by sending email to jdbc@sun.com.
* Sun will maintain a database listing the
* with Oracle Corporation by sending email to jdbc@sun.com.
* Oracle will maintain a database listing the
* available <code>SyncProvider</code> implementations for use with compliant
* <code>RowSet</code> implementations. This database will be similar to the
* one already maintained to list available JDBC drivers.
......
......@@ -8,7 +8,7 @@
<meta name="GENERATOR"
content="Mozilla/4.79 [en] (Windows NT 5.0; U) [Netscape]">
<!--
Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
......@@ -199,7 +199,7 @@ specification for further details.
Vendors may develop a <tt>SyncProvider</tt> implementation with any one of the possible
levels of synchronization, thus giving <code>RowSet</code> objects a choice of
synchronization mechanisms. A vendor can make its implementation available by
registering the fully qualified class name with Sun Microsystems at
registering the fully qualified class name with Oracle Corporation at
<code>jdbc@sun.com</code>. This process is discussed in further detail below.
<P>
......
......@@ -55,6 +55,9 @@ public class HttpClient extends NetworkClient {
// Http data we send with the headers
PosterOutputStream poster = null;
// true if we are in streaming mode (fixed length or chunked)
boolean streaming;
// if we've had one io error
boolean failedOnce = false;
......@@ -275,6 +278,10 @@ public class HttpClient extends NetworkClient {
ret.cachedHttpClient = true;
assert ret.inCache;
ret.inCache = false;
PlatformLogger logger = HttpURLConnection.getHttpLogger();
if (logger.isLoggable(PlatformLogger.FINEST)) {
logger.finest("KeepAlive stream retrieved from the cache, " + ret);
}
}
} else {
// We cannot return this connection to the cache as it's
......@@ -545,6 +552,13 @@ public class HttpClient extends NetworkClient {
serverOutput.flush();
}
public void writeRequests(MessageHeader head,
PosterOutputStream pos,
boolean streaming) throws IOException {
this.streaming = streaming;
writeRequests(head, pos);
}
/** Parse the first line of the HTTP request. It usually looks
something like: "HTTP/1.0 <number> comment\r\n". */
......@@ -577,11 +591,11 @@ public class HttpClient extends NetworkClient {
closeServer();
cachedHttpClient = false;
if (!failedOnce && requests != null) {
if (httpuc.getRequestMethod().equals("POST") && !retryPostProp) {
failedOnce = true;
if (httpuc.getRequestMethod().equals("POST") && (!retryPostProp || streaming)) {
// do not retry the request
} else {
// try once more
failedOnce = true;
openServer();
if (needsTunneling()) {
httpuc.doTunneling();
......@@ -684,10 +698,10 @@ public class HttpClient extends NetworkClient {
}
} else if (nread != 8) {
if (!failedOnce && requests != null) {
if (httpuc.getRequestMethod().equals("POST") && !retryPostProp) {
failedOnce = true;
if (httpuc.getRequestMethod().equals("POST") && (!retryPostProp || streaming)) {
// do not retry the request
} else {
failedOnce = true;
closeServer();
cachedHttpClient = false;
openServer();
......
......@@ -494,7 +494,7 @@ public class HttpURLConnection extends java.net.HttpURLConnection {
if (logger.isLoggable(PlatformLogger.FINE)) {
logger.fine(requests.toString());
}
http.writeRequests(requests, poster);
http.writeRequests(requests, poster, streaming());
if (ps.checkError()) {
String proxyHost = http.getProxyHostUsed();
int proxyPort = http.getProxyPortUsed();
......@@ -2825,6 +2825,38 @@ public class HttpURLConnection extends java.net.HttpURLConnection {
}
}
/* skip() calls read() in order to ensure that entire response gets
* cached. same implementation as InputStream.skip */
private byte[] skipBuffer;
private static final int SKIP_BUFFER_SIZE = 8096;
@Override
public long skip (long n) throws IOException {
long remaining = n;
int nr;
if (skipBuffer == null)
skipBuffer = new byte[SKIP_BUFFER_SIZE];
byte[] localSkipBuffer = skipBuffer;
if (n <= 0) {
return 0;
}
while (remaining > 0) {
nr = read(localSkipBuffer, 0,
(int) Math.min(SKIP_BUFFER_SIZE, remaining));
if (nr < 0) {
break;
}
remaining -= nr;
}
return n - remaining;
}
@Override
public void close () throws IOException {
try {
......
......@@ -281,7 +281,7 @@ public final class KeyTool {
RFC("rfc", null, "output in RFC style"),
SIGALG("sigalg", "<sigalg>", "signature algorithm name"),
SRCALIAS("srcalias", "<srcalias>", "source alias"),
SRCKEYPASS("srckeypass", "<arg>", "source keystore password"),
SRCKEYPASS("srckeypass", "<arg>", "source key password"),
SRCKEYSTORE("srckeystore", "<srckeystore>", "source keystore name"),
SRCPROTECTED("srcprotected", null, "source keystore password protected"),
SRCPROVIDERNAME("srcprovidername", "<srcprovidername>", "source keystore provider name"),
......
......@@ -116,11 +116,9 @@ public class Resources extends java.util.ListResourceBundle {
{"X.509 extension",
"X.509 extension"}, //-ext
{"output file name",
"output file name"}, //-file
"output file name"}, //-file and -outfile
{"input file name",
"input file name"}, //-file
{"input file name",
"input file name"}, //-infile
"input file name"}, //-file and -infile
{"key algorithm name",
"key algorithm name"}, //-keyalg
{"key password",
......@@ -133,8 +131,6 @@ public class Resources extends java.util.ListResourceBundle {
"new password"}, //-new
{"do not prompt",
"do not prompt"}, //-noprompt
{"output file name",
"output file name"}, //-outfile
{"password through protected mechanism",
"password through protected mechanism"}, //-protected
{"provider argument",
......@@ -151,8 +147,8 @@ public class Resources extends java.util.ListResourceBundle {
"signature algorithm name"}, //-sigalg
{"source alias",
"source alias"}, //-srcalias
{"source keystore password",
"source keystore password"}, //-srckeypass
{"source key password",
"source key password"}, //-srckeypass
{"source keystore name",
"source keystore name"}, //-srckeystore
{"source keystore password protected",
......@@ -276,8 +272,6 @@ public class Resources extends java.util.ListResourceBundle {
"Alias <{0}> has no certificate"},
{"Key pair not generated, alias <alias> already exists",
"Key pair not generated, alias <{0}> already exists"},
{"Cannot derive signature algorithm",
"Cannot derive signature algorithm"},
{"Generating keysize bit keyAlgName key pair and self-signed certificate (sigAlgName) with a validity of validality days\n\tfor: x500Name",
"Generating {0} bit {1} key pair and self-signed certificate ({2}) with a validity of {3} days\n\tfor: {4}"},
{"Enter key password for <alias>", "Enter key password for <{0}>"},
......@@ -321,8 +315,6 @@ public class Resources extends java.util.ListResourceBundle {
{"Failed to parse input", "Failed to parse input"},
{"Empty input", "Empty input"},
{"Not X.509 certificate", "Not X.509 certificate"},
{"Cannot derive signature algorithm",
"Cannot derive signature algorithm"},
{"alias has no public key", "{0} has no public key"},
{"alias has no X.509 certificate", "{0} has no X.509 certificate"},
{"New certificate (self-signed):", "New certificate (self-signed):"},
......@@ -552,7 +544,6 @@ public class Resources extends java.util.ListResourceBundle {
{"package name", "package name"},
{"policy type", "policy type"},
{"property name", "property name"},
{"provider name", "provider name"},
{"Principal List", "Principal List"},
{"Permission List", "Permission List"},
{"Code Base", "Code Base"},
......
......@@ -97,14 +97,20 @@ Java_java_lang_System_identityHashCode(JNIEnv *env, jobject this, jobject x)
} else ((void) 0)
#ifndef VENDOR /* Third party may overwrite this. */
#define VENDOR "Sun Microsystems Inc."
#define VENDOR_URL "http://java.sun.com/"
#define VENDOR "Oracle Corporation"
#define VENDOR_URL "http://java.oracle.com/"
#define VENDOR_URL_BUG "http://java.sun.com/cgi-bin/bugreport.cgi"
#endif
#define JAVA_MAX_SUPPORTED_VERSION 51
#define JAVA_MAX_SUPPORTED_MINOR_VERSION 0
#ifdef JAVA_SPECIFICATION_VENDOR /* Third party may NOT overwrite this. */
#error "ERROR: No override of JAVA_SPECIFICATION_VENDOR is allowed"
#else
#define JAVA_SPECIFICATION_VENDOR "Oracle Corporation"
#endif
static int fmtdefault; // boolean value
jobject fillI18nProps(JNIEnv *env, jobject props, char *baseKey,
char *platformDispVal, char *platformFmtVal,
......@@ -185,7 +191,8 @@ Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props)
JDK_MAJOR_VERSION "." JDK_MINOR_VERSION);
PUTPROP(props, "java.specification.name",
"Java Platform API Specification");
PUTPROP(props, "java.specification.vendor", "Sun Microsystems Inc.");
PUTPROP(props, "java.specification.vendor",
JAVA_SPECIFICATION_VENDOR);
PUTPROP(props, "java.version", RELEASE);
PUTPROP(props, "java.vendor", VENDOR);
......@@ -239,7 +246,7 @@ Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props)
/* Printing properties */
/* Note: java.awt.printerjob is an implementation private property which
* just happens to have a java.* name because it is referenced in
* a java.awt class. It is the mechanism by which the Sun implementation
* a java.awt class. It is the mechanism by which the implementation
* finds the appropriate class in the JRE for the platform.
* It is explicitly not designed to be overridden by clients as
* a way of replacing the implementation class, and in any case
......@@ -267,7 +274,7 @@ Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props)
/* Java2D properties */
/* Note: java.awt.graphicsenv is an implementation private property which
* just happens to have a java.* name because it is referenced in
* a java.awt class. It is the mechanism by which the Sun implementation
* a java.awt class. It is the mechanism by which the implementation
* finds the appropriate class in the JRE for the platform.
* It is explicitly not designed to be overridden by clients as
* a way of replacing the implementation class, and in any case
......
......@@ -285,17 +285,11 @@ public class Chmod {
}
@Override
public FileVisitResult preVisitDirectory(FileRef dir) {
public FileVisitResult preVisitDirectory(FileRef dir, BasicFileAttributes attrs) {
chmod(dir, changer);
return CONTINUE;
}
@Override
public FileVisitResult preVisitDirectoryFailed(FileRef dir, IOException exc) {
System.err.println("WARNING: " + exc);
return CONTINUE;
}
@Override
public FileVisitResult visitFile(FileRef file, BasicFileAttributes attrs) {
chmod(file, changer);
......
......@@ -85,7 +85,7 @@ public class Copy {
}
@Override
public FileVisitResult preVisitDirectory(Path dir) {
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
// before visiting entries in a directory we copy the directory
// (okay if directory already exists).
CopyOption[] options = (preserve) ?
......@@ -103,20 +103,10 @@ public class Copy {
return CONTINUE;
}
@Override
public FileVisitResult preVisitDirectoryFailed(Path dir, IOException exc) {
System.err.format("Unable to copy: %s: %s%n", dir, exc);
return CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (attrs.isDirectory()) {
System.err.println("cycle detected: " + file);
} else {
copyFile(file, target.resolve(source.relativize(file)),
prompt, preserve);
}
return CONTINUE;
}
......@@ -137,7 +127,11 @@ public class Copy {
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
if (exc instanceof FileSystemLoopException) {
System.err.println("cycle detected: " + file);
} else {
System.err.format("Unable to copy: %s: %s%n", file, exc);
}
return CONTINUE;
}
}
......
......@@ -78,12 +78,10 @@ public class WatchDir {
// register directory and sub-directories
Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir) {
try {
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException
{
register(dir);
} catch (IOException x) {
throw new IOError(x);
}
return FileVisitResult.CONTINUE;
}
});
......
......@@ -176,7 +176,13 @@ final class UNIXProcess extends Process {
}});
}
synchronized void processExited(int exitcode) {
void processExited(int exitcode) {
synchronized (this) {
this.exitcode = exitcode;
hasExited = true;
notifyAll();
}
if (stdout instanceof ProcessPipeInputStream)
((ProcessPipeInputStream) stdout).processExited();
......@@ -185,10 +191,6 @@ final class UNIXProcess extends Process {
if (stdin instanceof ProcessPipeOutputStream)
((ProcessPipeOutputStream) stdin).processExited();
this.exitcode = exitcode;
hasExited = true;
notifyAll();
}
public OutputStream getOutputStream() {
......
......@@ -156,9 +156,4 @@ class LinuxFileStore
return supportsFileAttributeView(UserDefinedFileAttributeView.class);
return super.supportsFileAttributeView(name);
}
@Override
boolean isLoopback() {
return false;
}
}
......@@ -108,9 +108,4 @@ class SolarisFileStore
return supportsFileAttributeView(UserDefinedFileAttributeView.class);
return super.supportsFileAttributeView(name);
}
@Override
boolean isLoopback() {
return type().equals("lofs");
}
}
......@@ -76,12 +76,6 @@ abstract class UnixFileStore
*/
abstract UnixMountEntry findMountEntry() throws IOException;
/**
* Returns true if this file store represents a loopback file system that
* will have the same device ID as underlying file system.
*/
abstract boolean isLoopback();
UnixPath file() {
return file;
}
......@@ -169,22 +163,13 @@ abstract class UnixFileStore
if (!(ob instanceof UnixFileStore))
return false;
UnixFileStore other = (UnixFileStore)ob;
if (dev != other.dev)
return false;
// deviceIDs are equal but they may not be equal if one or both of
// them is a loopback file system
boolean thisIsLoopback = isLoopback();
if (thisIsLoopback != other.isLoopback())
return false; // one, but not both, are lofs
if (!thisIsLoopback)
return true; // neither is lofs
// both are lofs so compare mount points
return Arrays.equals(this.entry.dir(), other.entry.dir());
return (this.dev == other.dev) &&
Arrays.equals(this.entry.dir(), other.entry.dir());
}
@Override
public int hashCode() {
return (int)(dev ^ (dev >>> 32));
return (int)(dev ^ (dev >>> 32)) ^ Arrays.hashCode(entry.dir());
}
@Override
......
......@@ -83,8 +83,6 @@ fileClose(JNIEnv *env, jobject this, jfieldID fid)
close(devnull);
}
} else if (JVM_Close(fd) == -1) {
SET_FD(this, fd, fid); // restore fd
printf("JVM_Close returned -1\n");
JNU_ThrowIOExceptionWithLastError(env, "close failed");
}
}
......@@ -124,7 +124,7 @@ static jfieldID ni_ia6ipaddressID;
static int initialized = 0;
/*
* Find an internet address for a given hostname. Not this this
* Find an internet address for a given hostname. Note that this
* code only works for addresses of type INET. The translation
* of %d.%d.%d.%d to an address (int) occurs in java now, so the
* String "host" shouldn't *ever* be a %d.%d.%d.%d string
......@@ -200,7 +200,7 @@ Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
*/
if (isspace((unsigned char)hostname[0])) {
JNU_ThrowByName(env, JNU_JAVANETPKG "UnknownHostException",
(char *)hostname);
hostname);
JNU_ReleaseStringPlatformChars(env, host, hostname);
return NULL;
}
......@@ -210,8 +210,7 @@ Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
if (error) {
/* report error */
JNU_ThrowByName(env, JNU_JAVANETPKG "UnknownHostException",
(char *)hostname);
ThrowUnknownHostExceptionWithGaiError(env, hostname, error);
JNU_ReleaseStringPlatformChars(env, host, hostname);
return NULL;
} else {
......@@ -407,7 +406,7 @@ Java_java_net_Inet6AddressImpl_getHostByAddr(JNIEnv *env, jobject this,
addr |= ((caddr[1] <<16) & 0xff0000);
addr |= ((caddr[2] <<8) & 0xff00);
addr |= (caddr[3] & 0xff);
memset((char *) &him4, 0, sizeof(him4));
memset((void *) &him4, 0, sizeof(him4));
him4.sin_addr.s_addr = (uint32_t) htonl(addr);
him4.sin_family = AF_INET;
sa = (struct sockaddr *) &him4;
......@@ -417,7 +416,7 @@ Java_java_net_Inet6AddressImpl_getHostByAddr(JNIEnv *env, jobject this,
* For IPv6 address construct a sockaddr_in6 structure.
*/
(*env)->GetByteArrayRegion(env, addrArray, 0, 16, caddr);
memset((char *) &him6, 0, sizeof(him6));
memset((void *) &him6, 0, sizeof(him6));
memcpy((void *)&(him6.sin6_addr), caddr, sizeof(struct in6_addr) );
him6.sin6_family = AF_INET6;
sa = (struct sockaddr *) &him6 ;
......@@ -579,8 +578,8 @@ Java_java_net_Inet6AddressImpl_isReachable0(JNIEnv *env, jobject this,
ifArray, ttl);
}
memset((char *) caddr, 0, 16);
memset((char *) &him6, 0, sizeof(him6));
memset((void *) caddr, 0, 16);
memset((void *) &him6, 0, sizeof(him6));
(*env)->GetByteArrayRegion(env, addrArray, 0, 16, caddr);
memcpy((void *)&(him6.sin6_addr), caddr, sizeof(struct in6_addr) );
him6.sin6_family = AF_INET6;
......@@ -600,8 +599,8 @@ Java_java_net_Inet6AddressImpl_isReachable0(JNIEnv *env, jobject this,
* for it.
*/
if (!(IS_NULL(ifArray))) {
memset((char *) caddr, 0, 16);
memset((char *) &inf6, 0, sizeof(inf6));
memset((void *) caddr, 0, 16);
memset((void *) &inf6, 0, sizeof(inf6));
(*env)->GetByteArrayRegion(env, ifArray, 0, 16, caddr);
memcpy((void *)&(inf6.sin6_addr), caddr, sizeof(struct in6_addr) );
inf6.sin6_family = AF_INET6;
......
......@@ -61,6 +61,7 @@
getaddrinfo_f getaddrinfo_ptr = NULL;
freeaddrinfo_f freeaddrinfo_ptr = NULL;
gai_strerror_f gai_strerror_ptr = NULL;
getnameinfo_f getnameinfo_ptr = NULL;
/*
......@@ -342,11 +343,14 @@ jint IPv6_supported()
freeaddrinfo_ptr = (freeaddrinfo_f)
JVM_FindLibraryEntry(RTLD_DEFAULT, "freeaddrinfo");
gai_strerror_ptr = (gai_strerror_f)
JVM_FindLibraryEntry(RTLD_DEFAULT, "gai_strerror");
getnameinfo_ptr = (getnameinfo_f)
JVM_FindLibraryEntry(RTLD_DEFAULT, "getnameinfo");
if (freeaddrinfo_ptr == NULL || getnameinfo_ptr == NULL) {
/* Wee need all 3 of them */
/* We need all 3 of them */
getaddrinfo_ptr = NULL;
}
......@@ -355,6 +359,35 @@ jint IPv6_supported()
#endif /* AF_INET6 */
}
void ThrowUnknownHostExceptionWithGaiError(JNIEnv *env,
const char* hostname,
int gai_error)
{
int size;
char *buf;
const char *format = "%s: %s";
const char *error_string =
(gai_strerror_ptr == NULL) ? NULL : (*gai_strerror_ptr)(gai_error);
if (error_string == NULL)
error_string = "unknown error";
size = strlen(format) + strlen(hostname) + strlen(error_string) + 2;
buf = (char *) malloc(size);
if (buf) {
jstring s;
sprintf(buf, format, hostname, error_string);
s = JNU_NewStringPlatform(env, buf);
if (s != NULL) {
jobject x = JNU_NewObjectByName(env,
"java/net/UnknownHostException",
"(Ljava/lang/String;)V", s);
if (x != NULL)
(*env)->Throw(env, x);
}
free(buf);
}
}
void
NET_AllocSockaddr(struct sockaddr **him, int *len) {
#ifdef AF_INET6
......@@ -1173,19 +1206,26 @@ NET_SetSockOpt(int fd, int level, int opt, const void *arg,
}
/*
* SOL_SOCKET/{SO_SNDBUF,SO_RCVBUF} - On Solaris need to
* ensure that value is <= max_buf as otherwise we get
* an invalid argument.
* SOL_SOCKET/{SO_SNDBUF,SO_RCVBUF} - On Solaris we may need to clamp
* the value when it exceeds the system limit.
*/
#ifdef __solaris__
if (level == SOL_SOCKET) {
if (opt == SO_SNDBUF || opt == SO_RCVBUF) {
int sotype, arglen;
int *bufsize, maxbuf;
int ret;
/* Attempt with the original size */
ret = setsockopt(fd, level, opt, arg, len);
if ((ret == 0) || (ret == -1 && errno != ENOBUFS))
return ret;
/* Exceeded system limit so clamp and retry */
if (!init_max_buf) {
tcp_max_buf = getParam("/dev/tcp", "tcp_max_buf", 64*1024);
udp_max_buf = getParam("/dev/udp", "udp_max_buf", 64*1024);
tcp_max_buf = getParam("/dev/tcp", "tcp_max_buf", 1024*1024);
udp_max_buf = getParam("/dev/udp", "udp_max_buf", 2048*1024);
init_max_buf = 1;
}
......
......@@ -89,6 +89,8 @@ typedef int (*getaddrinfo_f)(const char *nodename, const char *servname,
typedef void (*freeaddrinfo_f)(struct addrinfo *);
typedef const char * (*gai_strerror_f)(int ecode);
typedef int (*getnameinfo_f)(const struct sockaddr *, size_t,
char *, size_t, char *, size_t, int);
......@@ -96,6 +98,10 @@ extern getaddrinfo_f getaddrinfo_ptr;
extern freeaddrinfo_f freeaddrinfo_ptr;
extern getnameinfo_f getnameinfo_ptr;
void ThrowUnknownHostExceptionWithGaiError(JNIEnv *env,
const char* hostname,
int gai_error);
/* do we have address translation support */
extern jboolean NET_addrtransAvailable();
......
......@@ -531,7 +531,6 @@ handleClose(JNIEnv *env, jobject this, jfieldID fid)
SET_FD(this, -1, fid);
if (CloseHandle(h) == 0) { /* Returns zero on failure */
SET_FD(this, fd, fid); // restore fd
JNU_ThrowIOExceptionWithLastError(env, "close failed");
}
return 0;
......
......@@ -250,6 +250,10 @@ Java_sun_net_spi_DefaultProxySelector_getSystemProxy(JNIEnv *env,
return proxy;
}
}
} else {
/* ProxyEnable == 0 or Query failed */
/* close the handle to the registry key */
RegCloseKey(hKey);
}
}
......
......@@ -165,6 +165,12 @@ java/awt/Mouse/MouseModifiersUnitTest/ExtraButtonDrag.java generic-all
# very small tests and could greatly benefit from a samevm test run.
# So a large batch of beans tests are currently run with othervm mode.
# Filed 6986807
java/beans/Introspector/TestTypeResolver.java generic-all
# Filed 6986813
java/beans/Introspector/memory/Test4508780.java generic-all
# Linux, some kind of problems with X11 display
java/beans/PropertyChangeSupport/Test4682386.java generic-all
java/beans/PropertyChangeSupport/TestSynchronization.java generic-all
......@@ -493,6 +499,9 @@ java/rmi/server/UnicastRemoteObject/unexportObject/UnexportLeak.java generic-all
# jdk_security
# Filed 6986868
sun/security/tools/jarsigner/crl.sh generic-all
# Filed 6951285, not sure how often this fails, last was Linux 64bit Fedora 9
sun/security/krb5/auto/MaxRetries.java generic-all
......@@ -689,10 +698,22 @@ java/text/Bidi/Bug6665028.java linux-x64
# jdk_tools
# Filed 6952105
com/sun/jdi/SuspendThreadTest.java generic-all
# Filed 6986875
sun/tools/jps/jps-Vvml.sh generic-all
# Filed 6979016
sun/tools/jconsole/ResourceCheckTest.sh generic-all
############################################################################
# jdk_util
# Filed 6933803
java/util/concurrent/ThreadPoolExecutor/CoreThreadTimeOut.java generic-all
# Fails with assertion error on windows
# 11 separate stacktraces created... file reuse problem?
java/util/zip/ZipFile/ReadLongZipFileName.java generic-all
......
......@@ -31,8 +31,6 @@ import javax.security.sasl.*;
import javax.security.auth.callback.*;
import java.util.*;
import com.sun.security.ntlm.NTLMException;
public class NTLMTest {
private static final String MECH = "NTLM";
......@@ -95,19 +93,13 @@ public class NTLMTest {
checkVersion("LM/NTLM", "LMv2");
throw new Exception("Should not succeed");
} catch (SaslException se) {
NTLMException ne = (NTLMException)se.getCause();
if (ne.errorCode() != NTLMException.AUTH_FAILED) {
throw new Exception("Failed false");
}
// OK
}
try {
checkVersion("LMv2/NTLMv2", "LM");
throw new Exception("Should not succeed");
} catch (SaslException se) {
NTLMException ne = (NTLMException)se.getCause();
if (ne.errorCode() != NTLMException.AUTH_FAILED) {
throw new Exception("Failed false");
}
// OK
}
}
......
......@@ -124,8 +124,9 @@ public class JavaServiceTagTest {
throw new RuntimeException("Unexpected platform_arch: " +
st.getPlatformArch());
}
String vendor = System.getProperty("java.vendor");
if (!st.getProductVendor().
equals("Sun Microsystems")) {
equals(vendor)) {
throw new RuntimeException("Unexpected product_vendor: " +
st.getProductVendor());
}
......
......@@ -196,8 +196,10 @@ public class JavaServiceTagTest1 {
throw new RuntimeException("Unexpected platform_arch: " +
st.getPlatformArch());
}
String vendor = System.getProperty("java.vendor");
if (!st.getProductVendor().
equals("Sun Microsystems")) {
equals(vendor)) {
throw new RuntimeException("Unexpected product_vendor: " +
st.getProductVendor());
}
......
......@@ -162,6 +162,8 @@ public class Util {
for (ServiceTag st : svcTags) {
ServiceTag st1 = stMap.get(st.getInstanceURN());
if (!matches(st, st1)) {
System.err.println(st);
System.err.println(st1);
throw new RuntimeException("ServiceTag in the registry " +
"does not match the one in the map");
}
......
......@@ -4,6 +4,6 @@ osName=SunOS
osVersion=5.10
osArchitecture=sparc
systemModel=Sun-Fire-V440
systemManufacturer=Sun Microsystems
cpuManufacturer=Sun Microsystems
systemManufacturer=Oracle Corporation
cpuManufacturer=Oracle Corporation
serialNumber=BEL078932
......@@ -19,7 +19,7 @@
<product_parent_urn>urn:uuid:fdc90b21-018d-4cab-b866-612c7c119ed3</product_parent_urn>
<product_parent>Java Platform Standard Edition 6 (Java SE 6)</product_parent>
<product_defined_inst_id>id=1.6.0-internal-b00 sparc,dir=/myjdk/solaris-sparc</product_defined_inst_id>
<product_vendor>Sun Microsystems</product_vendor>
<product_vendor>Oracle Corporation</product_vendor>
<platform_arch>sparc</platform_arch>
<timestamp>2007-11-12 06:15:11 GMT</timestamp>
<container>global</container>
......@@ -34,7 +34,7 @@
<product_parent_urn>urn:uuid:fdc90b21-018d-4cab-b866-612c7c119ed3</product_parent_urn>
<product_parent>Java Platform Standard Edition 6 (Java SE 6)</product_parent>
<product_defined_inst_id>id=1.6.0_05-b01 sparc,dir=/myjdk/solaris-i586</product_defined_inst_id>
<product_vendor>Sun Microsystems</product_vendor>
<product_vendor>Oracle Corporation</product_vendor>
<platform_arch>i386</platform_arch>
<timestamp>2007-11-12 06:15:11 GMT</timestamp>
<container>global</container>
......
......@@ -20,7 +20,7 @@
<product_parent_urn>urn:uuid:fdc90b21-018d-4cab-b866-612c7c119ed3</product_parent_urn>
<product_parent>Java Platform Standard Edition 6 (Java SE 6)</product_parent>
<product_defined_inst_id>id=1.6.0-internal-b00 sparc,dir=/myjdk/solaris-sparc</product_defined_inst_id>
<product_vendor>Sun Microsystems</product_vendor>
<product_vendor>Oracle Corporation</product_vendor>
<platform_arch>sparc</platform_arch>
<timestamp>2007-11-13 00:49:01 GMT</timestamp>
<container>global</container>
......
......@@ -7,8 +7,8 @@
<osVersion>5.10</osVersion>
<osArchitecture>sparc</osArchitecture>
<systemModel>Sun-Fire-V440</systemModel>
<systemManufacturer>Sun Microsystems</systemManufacturer>
<cpuManufacturer>Sun Microsystems</cpuManufacturer>
<systemManufacturer>Oracle Corporation</systemManufacturer>
<cpuManufacturer>Oracle Corporation</cpuManufacturer>
<serialNumber>BEL078932</serialNumber>
</environment>
<registry urn="urn:st:9543ffaa-a4f1-4f77-b2d1-f561922d4e4a" version="1.0">
......@@ -20,7 +20,7 @@
<product_parent_urn>urn:uuid:fdc90b21-018d-4cab-b866-612c7c119ed3</product_parent_urn>
<product_parent>Java Platform Standard Edition 6 (Java SE 6)</product_parent>
<product_defined_inst_id>id=1.6.0-internal-b00 sparc,dir=/myjdk/solaris-sparc</product_defined_inst_id>
<product_vendor>Sun Microsystems</product_vendor>
<product_vendor>Oracle Corporation</product_vendor>
<platform_arch>sparc</platform_arch>
<timestamp>2007-11-13 00:49:01 GMT</timestamp>
<container>global</container>
......@@ -35,7 +35,7 @@
<product_parent_urn>urn:uuid:fdc90b21-018d-4cab-b866-612c7c119ed3</product_parent_urn>
<product_parent>Java Platform Standard Edition 6 (Java SE 6)</product_parent>
<product_defined_inst_id>id=1.6.0_05-b01 i386,dir=/myjdk/solaris-i586</product_defined_inst_id>
<product_vendor>Sun Microsystems</product_vendor>
<product_vendor>Oracle Corporation</product_vendor>
<platform_arch>i386</platform_arch>
<timestamp>2007-11-13 00:49:01 GMT</timestamp>
<container>global</container>
......@@ -50,7 +50,7 @@
<product_parent_urn>urn:uuid:596ffcfa-63d5-11d7-9886-ac816a682f92</product_parent_urn>
<product_parent>Solaris Operating System</product_parent>
<product_defined_inst_id/>
<product_vendor>Sun Microsystems</product_vendor>
<product_vendor>Oracle Corporation</product_vendor>
<platform_arch>sparc</platform_arch>
<timestamp>2007-11-13 00:49:01 GMT</timestamp>
<container>global</container>
......
......@@ -5,7 +5,7 @@ product_urn=urn:uuid:92d1de8c-1e59-42c6-a280-1c379526bcbc
product_parent_urn=urn:uuid:fdc90b21-018d-4cab-b866-612c7c119ed3
product_parent=Java Platform Standard Edition 6 (Java SE 6)
product_defined_inst_id=id=1.6.0-internal-b00 sparc,dir=/myjdk/solaris-sparc
product_vendor=Sun Microsystems
product_vendor=Oracle Corporation
platform_arch=sparc
timestamp=2007-11-12 05:19:40 GMT
container=global
......
......@@ -5,7 +5,7 @@ product_urn=urn:uuid:b58ef9a8-5ae8-11db-a023-080020a9ed93
product_parent_urn=urn:uuid:fdc90b21-018d-4cab-b866-612c7c119ed3
product_parent=Java Platform Standard Edition 6 (Java SE 6)
product_defined_inst_id=id=1.6.0_05-b01 i386,dir=/myjdk/solaris-i586
product_vendor=Sun Microsystems
product_vendor=Oracle Corporation
platform_arch=i386
timestamp=2007-11-12 06:12:21 GMT
container=global
......
......@@ -5,7 +5,7 @@ product_urn=urn:uuid:5005588c-36f3-11d6-9cec-fc96f718e113
product_parent_urn=urn:uuid:596ffcfa-63d5-11d7-9886-ac816a682f92
product_parent=Solaris Operating System
product_defined_inst_id=
product_vendor=Sun Microsystems
product_vendor=Oracle Corporation
platform_arch=sparc
timestamp=2007-06-20 22:07:11 GMT
container=global
......
......@@ -5,7 +5,7 @@ product_urn=urn:uuid:92d1de8c-1e59-42c6-a280-1c379526bcbc
product_parent_urn=urn:uuid:fdc90b21-018d-4cab-b866-612c7c119ed3
product_parent=Java Platform Standard Edition 6 (Java SE 6)
product_defined_inst_id=id=1.6.0_05-b01 amd64,dir=/myjdk/linux-amd64
product_vendor=Sun Microsystems
product_vendor=Oracle Corporation
platform_arch=x64
timestamp=2007-12-12 05:19:40 GMT
container=global
......
......@@ -5,7 +5,7 @@ product_urn=urn:uuid:92d1de8c-1e59-42c6-a280-1c379526bcbc
product_parent_urn=urn:uuid:fdc90b21-018d-4cab-b866-612c7c119ed3
product_parent=Java Platform Standard Edition 6 (Java SE 6)
product_defined_inst_id=id=1.6.0_06-b06 i386,dir=/w/mchung/bundles/jdk1.6.0_05/jre
product_vendor=Sun Microsystems
product_vendor=Oracle Corporation
platform_arch=x86
timestamp=2007-11-29 17:59:42 GMT
container=global
......
......@@ -1824,6 +1824,64 @@ public class Basic {
}
} catch (Throwable t) { unexpected(t); }
//----------------------------------------------------------------
// Check that subprocesses which create subprocesses of their
// own do not cause parent to hang waiting for file
// descriptors to be closed.
//----------------------------------------------------------------
try {
if (Unix.is()
&& new File("/bin/bash").exists()
&& new File("/bin/sleep").exists()) {
final String[] cmd = { "/bin/bash", "-c", "(/bin/sleep 6666)" };
final ProcessBuilder pb = new ProcessBuilder(cmd);
final Process p = pb.start();
final InputStream stdout = p.getInputStream();
final InputStream stderr = p.getErrorStream();
final OutputStream stdin = p.getOutputStream();
final Thread reader = new Thread() {
public void run() {
try { stdout.read(); }
catch (IOException e) {
// e.printStackTrace();
if (EnglishUnix.is() &&
! (e.getMessage().matches(".*Bad file descriptor.*")))
unexpected(e);
}
catch (Throwable t) { unexpected(t); }}};
reader.setDaemon(true);
reader.start();
Thread.sleep(100);
p.destroy();
// Subprocess is now dead, but file descriptors remain open.
check(p.waitFor() != 0);
check(p.exitValue() != 0);
stdout.close();
stderr.close();
stdin.close();
//----------------------------------------------------------
// There remain unsolved issues with asynchronous close.
// Here's a highly non-portable experiment to demonstrate:
//----------------------------------------------------------
if (Boolean.getBoolean("wakeupJeff!")) {
System.out.println("wakeupJeff!");
// Initialize signal handler for INTERRUPT_SIGNAL.
new FileInputStream("/bin/sleep").getChannel().close();
// Send INTERRUPT_SIGNAL to every thread in this java.
String[] wakeupJeff = {
"/bin/bash", "-c",
"/bin/ps --noheaders -Lfp $PPID | " +
"/usr/bin/perl -nale 'print $F[3]' | " +
// INTERRUPT_SIGNAL == 62 on my machine du jour.
"/usr/bin/xargs kill -62"
};
new ProcessBuilder(wakeupJeff).start().waitFor();
// If wakeupJeff worked, reader probably got EBADF.
reader.join();
}
}
} catch (Throwable t) { unexpected(t); }
//----------------------------------------------------------------
// Attempt to start process with insufficient permissions fails.
//----------------------------------------------------------------
......
......@@ -29,7 +29,9 @@
import java.nio.channels.*;
import java.net.*;
import static java.net.StandardSocketOption.*;
import java.io.IOException;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicReference;
......@@ -39,6 +41,7 @@ public class Basic {
public static void main(String[] args) throws Exception {
testBind();
testAccept();
testSocketOptions();
}
static void testBind() throws Exception {
......@@ -131,4 +134,39 @@ public class Basic {
}
}
static void testSocketOptions() throws Exception {
System.out.println("-- socket options --");
AsynchronousServerSocketChannel ch = AsynchronousServerSocketChannel.open();
try {
// check supported options
Set<SocketOption<?>> options = ch.supportedOptions();
if (!options.contains(SO_REUSEADDR))
throw new RuntimeException("SO_REUSEADDR should be supported");
if (!options.contains(SO_RCVBUF))
throw new RuntimeException("SO_RCVBUF should be supported");
// allowed to change when not bound
ch.setOption(SO_RCVBUF, 256*1024); // can't check
int before = ch.getOption(SO_RCVBUF);
int after = ch.setOption(SO_RCVBUF, Integer.MAX_VALUE).getOption(SO_RCVBUF);
if (after < before)
throw new RuntimeException("setOption caused SO_RCVBUF to decrease");
ch.setOption(SO_REUSEADDR, true);
checkOption(ch, SO_REUSEADDR, true);
ch.setOption(SO_REUSEADDR, false);
checkOption(ch, SO_REUSEADDR, false);
} finally {
ch.close();
}
}
static void checkOption(AsynchronousServerSocketChannel ch,
SocketOption name, Object expectedValue)
throws IOException
{
Object value = ch.getOption(name);
if (!value.equals(expectedValue))
throw new RuntimeException("value not as expected");
}
}
......@@ -121,8 +121,20 @@ public class Basic {
AsynchronousSocketChannel ch = AsynchronousSocketChannel.open()
.setOption(SO_RCVBUF, 128*1024)
.setOption(SO_SNDBUF, 128*1024)
.setOption(SO_REUSEADDR, true)
.bind(new InetSocketAddress(0));
.setOption(SO_REUSEADDR, true);
// check SO_SNDBUF/SO_RCVBUF limits
int before, after;
before = ch.getOption(SO_SNDBUF);
after = ch.setOption(SO_SNDBUF, Integer.MAX_VALUE).getOption(SO_SNDBUF);
if (after < before)
throw new RuntimeException("setOption caused SO_SNDBUF to decrease");
before = ch.getOption(SO_RCVBUF);
after = ch.setOption(SO_RCVBUF, Integer.MAX_VALUE).getOption(SO_RCVBUF);
if (after < before)
throw new RuntimeException("setOption caused SO_RCVBUF to decrease");
ch.bind(new InetSocketAddress(0));
// default values
if ((Boolean)ch.getOption(SO_KEEPALIVE))
......
......@@ -68,8 +68,17 @@ public class SocketOptionTests {
checkOption(dc, SO_BROADCAST, true);
dc.setOption(SO_BROADCAST, false);
checkOption(dc, SO_BROADCAST, false);
dc.setOption(SO_SNDBUF, 16*1024); // can't check
dc.setOption(SO_RCVBUF, 16*1024); // can't check
dc.setOption(SO_SNDBUF, 128*1024); // can't check
dc.setOption(SO_RCVBUF, 128*1024); // can't check
int before, after;
before = dc.getOption(SO_SNDBUF);
after = dc.setOption(SO_SNDBUF, Integer.MAX_VALUE).getOption(SO_SNDBUF);
if (after < before)
throw new RuntimeException("setOption caused SO_SNDBUF to decrease");
before = dc.getOption(SO_RCVBUF);
after = dc.setOption(SO_RCVBUF, Integer.MAX_VALUE).getOption(SO_RCVBUF);
if (after < before)
throw new RuntimeException("setOption caused SO_RCVBUF to decrease");
dc.setOption(SO_REUSEADDR, true);
checkOption(dc, SO_REUSEADDR, true);
dc.setOption(SO_REUSEADDR, false);
......
......@@ -56,6 +56,10 @@ public class SocketOptionTests {
// allowed to change when not bound
ssc.setOption(SO_RCVBUF, 256*1024); // can't check
int before = ssc.getOption(SO_RCVBUF);
int after = ssc.setOption(SO_RCVBUF, Integer.MAX_VALUE).getOption(SO_RCVBUF);
if (after < before)
throw new RuntimeException("setOption caused SO_RCVBUF to decrease");
ssc.setOption(SO_REUSEADDR, true);
checkOption(ssc, SO_REUSEADDR, true);
ssc.setOption(SO_REUSEADDR, false);
......
......@@ -70,6 +70,15 @@ public class SocketOptionTests {
checkOption(sc, SO_KEEPALIVE, false);
sc.setOption(SO_SNDBUF, 128*1024); // can't check
sc.setOption(SO_RCVBUF, 256*1024); // can't check
int before, after;
before = sc.getOption(SO_SNDBUF);
after = sc.setOption(SO_SNDBUF, Integer.MAX_VALUE).getOption(SO_SNDBUF);
if (after < before)
throw new RuntimeException("setOption caused SO_SNDBUF to decrease");
before = sc.getOption(SO_RCVBUF);
after = sc.setOption(SO_RCVBUF, Integer.MAX_VALUE).getOption(SO_RCVBUF);
if (after < before)
throw new RuntimeException("setOption caused SO_RCVBUF to decrease");
sc.setOption(SO_REUSEADDR, true);
checkOption(sc, SO_REUSEADDR, true);
sc.setOption(SO_REUSEADDR, false);
......
......@@ -22,7 +22,7 @@
*/
/* @test
* @bug 4313887 6873621
* @bug 4313887 6873621 6979526
* @summary Unit test for java.nio.file.FileStore
* @library ..
*/
......
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.io.IOException;
import java.util.*;
/**
* Unit test for Files.walkFileTree to test maxDepth parameter
*/
public class MaxDepth {
public static void main(String[] args) throws Exception {
final Path top = Paths.get(args[0]);
for (int i=0; i<5; i++) {
Set<FileVisitOption> opts = Collections.emptySet();
final int maxDepth = i;
Files.walkFileTree(top, opts, maxDepth, new SimpleFileVisitor<Path>() {
// compute depth based on relative path to top directory
private int depth(Path file) {
Path rp = file.relativize(top);
return (rp == null) ? 0 : rp.getNameCount();
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
int d = depth(dir);
if (d == maxDepth)
throw new RuntimeException("Should not open directories at maxDepth");
if (d > maxDepth)
throw new RuntimeException("Too deep");
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
int d = depth(file);
if (d > maxDepth)
throw new RuntimeException("Too deep");
return FileVisitResult.CONTINUE;
}
});
}
}
}
......@@ -30,6 +30,7 @@
import java.nio.file.*;
import java.nio.file.attribute.Attributes;
import java.nio.file.attribute.BasicFileAttributes;
import java.io.IOException;
import java.util.*;
......@@ -117,25 +118,25 @@ public class Misc {
SimpleFileVisitor<Path> visitor = new SimpleFileVisitor<Path>() { };
boolean ranTheGauntlet = false;
try { visitor.preVisitDirectory(null);
BasicFileAttributes attrs = Attributes.readBasicFileAttributes(Paths.get("."));
try { visitor.preVisitDirectory(null, attrs);
} catch (NullPointerException x0) {
try { visitor.preVisitDirectoryFailed(null, new IOException());
try { visitor.preVisitDirectory(dir, null);
} catch (NullPointerException x1) {
try { visitor.preVisitDirectoryFailed(dir, null);
try { visitor.visitFile(null, attrs);
} catch (NullPointerException x2) {
try { visitor.visitFile(null, Attributes.readBasicFileAttributes(Paths.get(".")));
} catch (NullPointerException x3) {
try { visitor.visitFile(dir, null);
} catch (NullPointerException x4) {
} catch (NullPointerException x3) {
try { visitor.visitFileFailed(null, new IOException());
} catch (NullPointerException x5) {
} catch (NullPointerException x4) {
try { visitor.visitFileFailed(dir, null);
} catch (NullPointerException x6) {
} catch (NullPointerException x5) {
try { visitor.postVisitDirectory(null, new IOException());
} catch (NullPointerException x7) {
} catch (NullPointerException x6) {
// if we get here then all visit* methods threw NPE as expected
ranTheGauntlet = true;
}}}}}}}}
}}}}}}}
if (!ranTheGauntlet)
throw new RuntimeException("A visit method did not throw NPE");
}
......
......@@ -56,29 +56,34 @@ public class PrintFileTree {
final boolean reportCycles = printCycles;
Files.walkFileTree(dir, options, Integer.MAX_VALUE, new FileVisitor<FileRef>() {
public FileVisitResult preVisitDirectory(FileRef dir) {
@Override
public FileVisitResult preVisitDirectory(FileRef dir, BasicFileAttributes attrs) {
System.out.println(dir);
return FileVisitResult.CONTINUE;
}
public FileVisitResult preVisitDirectoryFailed(FileRef dir, IOException exc) {
exc.printStackTrace();
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(FileRef file, BasicFileAttributes attrs) {
if (!attrs.isDirectory() || reportCycles)
System.out.println(file);
return FileVisitResult.CONTINUE;
}
public FileVisitResult postVisitDirectory(FileRef dir, IOException exc) {
if (exc != null) {
exc.printStackTrace();
return FileVisitResult.TERMINATE;
@Override
public FileVisitResult postVisitDirectory(FileRef dir, IOException exc)
throws IOException
{
if (exc != null)
throw exc;
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(FileRef file, IOException exc)
throws IOException
{
if (reportCycles && (exc instanceof FileSystemLoopException)) {
System.out.println(file);
return FileVisitResult.CONTINUE;
}
public FileVisitResult visitFileFailed(FileRef file, IOException exc) {
exc.printStackTrace();
return FileVisitResult.TERMINATE;
throw exc;
}
});
}
......
......@@ -54,32 +54,28 @@ public class SkipSiblings {
public static void main(String[] args) throws Exception {
Path dir = Paths.get(args[0]);
Files.walkFileTree(dir, new FileVisitor<Path>() {
public FileVisitResult preVisitDirectory(Path dir) {
Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
check(dir);
if (skip(dir))
return FileVisitResult.SKIP_SIBLINGS;
return FileVisitResult.CONTINUE;
}
public FileVisitResult preVisitDirectoryFailed(Path dir, IOException exc) {
throw new RuntimeException(exc);
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
check(file);
if (skip(file))
return FileVisitResult.SKIP_SIBLINGS;
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException x) {
if (x != null)
throw new RuntimeException(x);
check(dir);
return FileVisitResult.CONTINUE;
}
public FileVisitResult visitFileFailed(Path file, IOException x) {
throw new RuntimeException(x);
}
});
}
}
......@@ -49,22 +49,19 @@ public class TerminateWalk {
public static void main(String[] args) throws Exception {
Path dir = Paths.get(args[0]);
Files.walkFileTree(dir, new FileVisitor<Path>() {
public FileVisitResult preVisitDirectory(Path dir) {
return maybeTerminate();
}
public FileVisitResult preVisitDirectoryFailed(Path dir, IOException exc) {
Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
return maybeTerminate();
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
return maybeTerminate();
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException x) {
return maybeTerminate();
}
public FileVisitResult visitFileFailed(Path file, IOException x) {
return maybeTerminate();
}
});
}
}
......@@ -116,7 +116,7 @@ public class WalkWithSecurity {
}
@Override
public FileVisitResult preVisitDirectory(Path dir) {
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
System.out.println(dir);
count++;
return FileVisitResult.CONTINUE;
......
......@@ -22,9 +22,9 @@
#
# @test
# @bug 4313887
# @bug 4313887 6907737
# @summary Unit test for walkFileTree method
# @build CreateFileTree PrintFileTree SkipSiblings TerminateWalk
# @build CreateFileTree PrintFileTree SkipSiblings TerminateWalk MaxDepth
# @run shell walk_file_tree.sh
# if TESTJAVA isn't set then we assume an interactive run.
......@@ -84,6 +84,10 @@ if [ $? != 0 ]; then failures=`expr $failures + 1`; fi
$JAVA TerminateWalk "$ROOT"
if [ $? != 0 ]; then failures=`expr $failures + 1`; fi
# test maxDepth
$JAVA MaxDepth "$ROOT"
if [ $? != 0 ]; then failures=`expr $failures + 1`; fi
# clean-up
rm -r "$ROOT"
......
......@@ -44,15 +44,10 @@ public class TestUtil {
return createTemporaryDirectory(System.getProperty("java.io.tmpdir"));
}
static void removeAll(Path dir) {
static void removeAll(Path dir) throws IOException {
Files.walkFileTree(dir, new FileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir) {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectoryFailed(Path dir, IOException exc) {
System.err.format("Error occured accessing directory %s\n", dir, exc);
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
return FileVisitResult.CONTINUE;
}
@Override
......
......@@ -173,6 +173,11 @@ public class BiggernYours {
new ConcurrentHashMap() {
public int size() {return randomize(super.size());}});
testCollections(
new ConcurrentLinkedDeque(),
new ConcurrentLinkedDeque() {
public int size() {return randomize(super.size());}});
testCollections(
new ConcurrentLinkedQueue(),
new ConcurrentLinkedQueue() {
......
......@@ -48,6 +48,7 @@ public class IteratorAtEnd {
testCollection(new PriorityQueue());
testCollection(new LinkedBlockingQueue());
testCollection(new ArrayBlockingQueue(100));
testCollection(new ConcurrentLinkedDeque());
testCollection(new ConcurrentLinkedQueue());
testCollection(new LinkedTransferQueue());
......
......@@ -75,6 +75,7 @@ public class MOAT {
testCollection(new ArrayBlockingQueue<Integer>(20));
testCollection(new LinkedBlockingQueue<Integer>(20));
testCollection(new LinkedBlockingDeque<Integer>(20));
testCollection(new ConcurrentLinkedDeque<Integer>());
testCollection(new ConcurrentLinkedQueue<Integer>());
testCollection(new LinkedTransferQueue<Integer>());
testCollection(new ConcurrentSkipListSet<Integer>());
......@@ -433,6 +434,7 @@ public class MOAT {
checkFunctionalInvariants(q);
if ((q instanceof LinkedBlockingQueue) ||
(q instanceof LinkedBlockingDeque) ||
(q instanceof ConcurrentLinkedDeque) ||
(q instanceof ConcurrentLinkedQueue)) {
testQueueIteratorRemove(q);
}
......
......@@ -235,6 +235,7 @@ public class RacingCollections {
new ArrayList<Queue<Integer>>(newConcurrentDeques());
list.add(new LinkedBlockingQueue<Integer>(10));
list.add(new LinkedTransferQueue<Integer>());
list.add(new ConcurrentLinkedQueue<Integer>());
return list;
}
......@@ -248,6 +249,7 @@ public class RacingCollections {
private static List<Deque<Integer>> newConcurrentDeques() {
List<Deque<Integer>> list = new ArrayList<Deque<Integer>>();
list.add(new LinkedBlockingDeque<Integer>(10));
list.add(new ConcurrentLinkedDeque<Integer>());
return list;
}
......
......@@ -129,6 +129,7 @@ public class ChorusLine {
deqs.add(new ArrayDeque<Integer>());
deqs.add(new LinkedList<Integer>());
deqs.add(new LinkedBlockingDeque<Integer>());
deqs.add(new ConcurrentLinkedDeque<Integer>());
equal(deqs);
......
......@@ -55,6 +55,7 @@ public class ConcurrentQueueLoops {
Collection<Queue<Integer>> concurrentQueues() {
List<Queue<Integer>> queues = new ArrayList<Queue<Integer>>();
queues.add(new ConcurrentLinkedDeque<Integer>());
queues.add(new ConcurrentLinkedQueue<Integer>());
queues.add(new ArrayBlockingQueue<Integer>(items, false));
//queues.add(new ArrayBlockingQueue<Integer>(count, true));
......@@ -105,7 +106,7 @@ public class ConcurrentQueueLoops {
final Queue<Integer> queue;
final CyclicBarrier barrier;
int items;
Stage (Queue<Integer> q, CyclicBarrier b, int items) {
Stage(Queue<Integer> q, CyclicBarrier b, int items) {
queue = q;
barrier = b;
this.items = items;
......
......@@ -40,6 +40,7 @@
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.LinkedBlockingQueue;
......@@ -62,6 +63,7 @@ public class GCRetention {
Collection<Queue<Boolean>> queues() {
List<Queue<Boolean>> queues = new ArrayList<Queue<Boolean>>();
queues.add(new ConcurrentLinkedDeque<Boolean>());
queues.add(new ConcurrentLinkedQueue<Boolean>());
queues.add(new ArrayBlockingQueue<Boolean>(count, false));
queues.add(new ArrayBlockingQueue<Boolean>(count, true));
......
......@@ -48,6 +48,7 @@ public class IteratorWeakConsistency {
test(new LinkedBlockingQueue(20));
test(new LinkedBlockingDeque());
test(new LinkedBlockingDeque(20));
test(new ConcurrentLinkedDeque());
test(new ConcurrentLinkedQueue());
test(new LinkedTransferQueue());
// Other concurrent queues (e.g. ArrayBlockingQueue) do not
......
......@@ -55,6 +55,7 @@ public class OfferRemoveLoops {
testQueue(new LinkedBlockingDeque());
testQueue(new ArrayBlockingQueue(10));
testQueue(new PriorityBlockingQueue(10));
testQueue(new ConcurrentLinkedDeque());
testQueue(new ConcurrentLinkedQueue());
testQueue(new LinkedTransferQueue());
}
......
......@@ -41,6 +41,7 @@
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingDeque;
......@@ -62,6 +63,7 @@ public class RemovePollRace {
Collection<Queue<Boolean>> concurrentQueues() {
List<Queue<Boolean>> queues = new ArrayList<Queue<Boolean>>();
queues.add(new ConcurrentLinkedDeque<Boolean>());
queues.add(new ConcurrentLinkedQueue<Boolean>());
queues.add(new ArrayBlockingQueue<Boolean>(count, false));
queues.add(new ArrayBlockingQueue<Boolean>(count, true));
......
#
# Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
# @test
# @bug 6502503
# @run shell/timeout=140 ChunkedCharEncoding.sh
# @summary Http URL connection don't work when default encoding is Cp037: HTTP Transfer-Encoding:chunked
OS=`uname -s`
case "$OS" in
SunOS | Linux )
PS=":"
FS="/"
;;
CYGWIN* )
PS=";"
FS="/"
;;
Windows* )
PS=";"
FS="\\"
;;
* )
echo "Unrecognized system!"
exit 1;
;;
esac
# compile
${TESTJAVA}${FS}bin${FS}javac -d . ${TESTSRC}${FS}TestAvailable.java
# run with CP037 encoding specified.
${TESTJAVA}${FS}bin${FS}java -Dfile.encoding=Cp037 TestAvailable 2>&1
result=$?
if [ "$result" -ne "0" ]; then
exit 1
fi
# no failures, exit.
exit 0
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 6672144
* @summary HttpURLConnection.getInputStream sends POST request after failed chunked send
*/
import java.net.HttpURLConnection;
import java.net.ServerSocket;
import java.net.URL;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class StreamingRetry implements Runnable {
static final int ACCEPT_TIMEOUT = 20 * 1000; // 20 seconds
ServerSocket ss;
public static void main(String[] args) throws IOException {
(new StreamingRetry()).instanceMain();
}
void instanceMain() throws IOException {
test();
if (failed > 0) throw new RuntimeException("Some tests failed");
}
void test() throws IOException {
ss = new ServerSocket(0);
ss.setSoTimeout(ACCEPT_TIMEOUT);
int port = ss.getLocalPort();
(new Thread(this)).start();
try {
URL url = new URL("http://localhost:" + port + "/");
HttpURLConnection uc = (HttpURLConnection) url.openConnection();
uc.setDoOutput(true);
uc.setChunkedStreamingMode(4096);
OutputStream os = uc.getOutputStream();
os.write("Hello there".getBytes());
InputStream is = uc.getInputStream();
is.close();
} catch (IOException expected) {
//expected.printStackTrace();
} finally {
ss.close();
}
}
// Server
public void run() {
try {
(ss.accept()).close();
(ss.accept()).close();
ss.close();
fail("The server shouldn't accept a second connection");
} catch (IOException e) {
//OK, the clien will close the server socket if successfull
}
}
volatile int failed = 0;
void fail() {failed++; Thread.dumpStack();}
void fail(String msg) {System.err.println(msg); fail();}
}
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.net.*;
import java.io.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.PrintStream;
import java.io.InputStream;
import java.io.File;
import java.net.CacheRequest;
import java.net.CacheResponse;
import java.net.ResponseCache;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
import java.util.Iterator;
import java.util.StringTokenizer;
import java.util.jar.JarInputStream;
import java.util.jar.JarFile;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.PrivilegedExceptionAction;
import java.security.PrivilegedActionException;
import java.security.Principal;
import java.security.cert.Certificate;
import javax.net.ssl.SSLPeerUnverifiedException;
public class TestCache extends java.net.ResponseCache {
private boolean inCacheHandler = false;
private boolean _downloading = false;
public static volatile boolean fail = false;
public static void reset() {
// Set system wide cache handler
System.out.println("install deploy cache handler");
ResponseCache.setDefault(new TestCache());
}
public synchronized CacheResponse get(final URI uri, String rqstMethod,
Map requestHeaders) throws IOException {
System.out.println("get: " + uri);
Thread.currentThread().dumpStack();
return null;
}
public synchronized CacheRequest put(URI uri, URLConnection conn)
throws IOException {
System.out.println("put: " + uri);
Thread.currentThread().dumpStack();
URL url = uri.toURL();
return new DeployCacheRequest(url, conn);
}
}
class DeployByteArrayOutputStream extends java.io.ByteArrayOutputStream {
private URL _url;
private URLConnection _conn;
DeployByteArrayOutputStream(URL url, URLConnection conn) {
_url = url;
_conn = conn;
}
public void close() throws IOException {
System.out.println("contentLength: " + _conn.getContentLength());
System.out.println("byte array size: " + size());
if ( _conn.getContentLength() == size()) {
System.out.println("correct content length");
} else {
System.out.println("wrong content length");
System.out.println("TEST FAILED");
TestCache.fail = true;
}
super.close();
}
}
class DeployCacheRequest extends java.net.CacheRequest {
private URL _url;
private URLConnection _conn;
private boolean _downloading = false;
DeployCacheRequest(URL url, URLConnection conn) {
System.out.println("DeployCacheRequest ctor for: " + url);
_url = url;
_conn = conn;
}
public void abort() {
System.out.println("abort called");
}
public OutputStream getBody() throws IOException {
System.out.println("getBody called");
return new DeployByteArrayOutputStream(_url, _conn);
}
}
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 6550798
* @summary Using InputStream.skip with ResponseCache will cause partial data to be cached
* @run main/othervm test
*/
import java.net.*;
import com.sun.net.httpserver.*;
import java.io.*;
public class test {
final static int LEN = 16 * 1024;
public static void main(String[] args) throws Exception {
TestCache.reset();
HttpServer s = HttpServer.create (new InetSocketAddress(0), 10);
s.createContext ("/", new HttpHandler () {
public void handle (HttpExchange e) {
try {
byte[] buf = new byte [LEN];
OutputStream o = e.getResponseBody();
e.sendResponseHeaders(200, LEN);
o.write (buf);
e.close();
} catch (IOException ex) {
ex.printStackTrace();
TestCache.fail = true;
}
}
});
s.start();
System.out.println("http request with cache hander");
URL u = new URL("http://127.0.0.1:"+s.getAddress().getPort()+"/f");
URLConnection conn = u.openConnection();
InputStream is = null;
try {
// this calls into TestCache.get
byte[] buf = new byte[8192];
is = new BufferedInputStream(conn.getInputStream());
is.skip(1000);
while (is.read(buf) != -1) {
}
} finally {
if (is != null) {
// this calls into TestCache.put
// TestCache.put will check if the resource
// should be cached
is.close();
}
s.stop(0);
}
if (TestCache.fail) {
System.out.println ("TEST FAILED");
throw new RuntimeException ();
} else {
System.out.println ("TEST OK");
}
}
}
......@@ -63,7 +63,15 @@ $KT -alias a -gencrl -id 3:3 -id 4:4 -file crl2
$KT -alias b -dname CN=b -keyalg rsa -genkey -validity 300
$KT -alias b -gencrl -id 5:1 -id 6:2 -file crl3
$TESTJAVA${FS}bin${FS}jrunscript -e 'println(new File("crl1").toURI())' > uri
cat > ToURI.java <<EOF
class ToURI {
public static void main(String[] args) throws Exception {
System.out.println(new java.io.File("crl1").toURI());
}
}
EOF
$TESTJAVA${FS}bin${FS}javac ToURI.java
$TESTJAVA${FS}bin${FS}java ToURI > uri
$KT -alias c -dname CN=c -keyalg rsa -genkey -validity 300 \
-ext crl=uri:`cat uri`
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册