--- a/.hgtags Wed Apr 09 15:30:44 2008 +0100
+++ b/.hgtags Tue Apr 15 17:48:22 2008 -0700
@@ -1,1 +1,2 @@
1cc8dd79fd1cd13d36b385196271a29632c67c3b jdk7-b24
+bf2517e15f0c0f950e5b3143c4ca11e2df73dcc1 jdk7-b25
--- a/.hgtags-top-repo Wed Apr 09 15:30:44 2008 +0100
+++ b/.hgtags-top-repo Tue Apr 15 17:48:22 2008 -0700
@@ -1,1 +1,2 @@
cfeea66a3fa8ca3686a7cfa2d0ce8ab0169f168d jdk7-b24
+cbc8ad9dd0e085a607427ea35411990982f19a36 jdk7-b25
--- a/corba/.hgtags Wed Apr 09 15:30:44 2008 +0100
+++ b/corba/.hgtags Tue Apr 15 17:48:22 2008 -0700
@@ -1,1 +1,2 @@
55540e827aef970ecc010b7e06b912d991c8e3ce jdk7-b24
+5e61d5df62586474414d1058e9186441aa908f51 jdk7-b25
--- a/hotspot/.hgtags Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/.hgtags Tue Apr 15 17:48:22 2008 -0700
@@ -1,1 +1,2 @@
a61af66fc99eb5ec9d50c05b0c599757b1289ceb jdk7-b24
+7836be3e92d0a4f9ee7566f602c91f5609534e66 jdk7-b25
--- a/hotspot/agent/src/os/linux/ps_core.c Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/agent/src/os/linux/ps_core.c Tue Apr 15 17:48:22 2008 -0700
@@ -518,10 +518,10 @@
}
static ps_prochandle_ops core_ops = {
- release: core_release,
- p_pread: core_read_data,
- p_pwrite: core_write_data,
- get_lwp_regs: core_get_lwp_regs
+ .release= core_release,
+ .p_pread= core_read_data,
+ .p_pwrite= core_write_data,
+ .get_lwp_regs= core_get_lwp_regs
};
// read regs and create thread from NT_PRSTATUS entries from core file
--- a/hotspot/agent/src/os/linux/ps_proc.c Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/agent/src/os/linux/ps_proc.c Tue Apr 15 17:48:22 2008 -0700
@@ -291,10 +291,10 @@
}
static ps_prochandle_ops process_ops = {
- release: process_cleanup,
- p_pread: process_read_data,
- p_pwrite: process_write_data,
- get_lwp_regs: process_get_lwp_regs
+ .release= process_cleanup,
+ .p_pread= process_read_data,
+ .p_pwrite= process_write_data,
+ .get_lwp_regs= process_get_lwp_regs
};
// attach to the process. One and only one exposed stuff
--- a/hotspot/build/linux/Makefile Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/build/linux/Makefile Tue Apr 15 17:48:22 2008 -0700
@@ -80,6 +80,11 @@
MFLAGS += " LP64=1 "
endif
+# pass USE_SUNCC further, through MFLAGS
+ifdef USE_SUNCC
+ MFLAGS += " USE_SUNCC=1 "
+endif
+
# The following renders pathnames in generated Makefiles valid on
# machines other than the machine containing the build tree.
#
--- a/hotspot/build/linux/makefiles/amd64.make Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/build/linux/makefiles/amd64.make Tue Apr 15 17:48:22 2008 -0700
@@ -35,6 +35,8 @@
CFLAGS += -D_LP64=1
# The serviceability agent relies on frame pointer (%rbp) to walk thread stack
-CFLAGS += -fno-omit-frame-pointer
+ifndef USE_SUNCC
+ CFLAGS += -fno-omit-frame-pointer
+endif
OPT_CFLAGS/compactingPermGenGen.o = -O1
--- a/hotspot/build/linux/makefiles/buildtree.make Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/build/linux/makefiles/buildtree.make Tue Apr 15 17:48:22 2008 -0700
@@ -63,7 +63,11 @@
# For now, until the compiler is less wobbly:
TESTFLAGS = -Xbatch -showversion
-PLATFORM_FILE = $(GAMMADIR)/build/$(OS_FAMILY)/platform_$(BUILDARCH)
+ifdef USE_SUNCC
+PLATFORM_FILE = $(GAMMADIR)/build/$(OS_FAMILY)/platform_$(BUILDARCH).suncc
+else
+PLATFORM_FILE = $(GAMMADIR)/build/$(OS_FAMILY)/platform_$(BUILDARCH)
+endif
ifdef FORCE_TIERED
ifeq ($(VARIANT),tiered)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/build/linux/makefiles/sparcWorks.make Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,93 @@
+#
+# Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+
+#------------------------------------------------------------------------
+# CC, CPP & AS
+
+CPP = CC
+CC = cc
+AS = $(CC) -c
+
+ARCHFLAG = $(ARCHFLAG/$(BUILDARCH))
+ARCHFLAG/i486 = -m32
+ARCHFLAG/amd64 = -m64
+
+CFLAGS += $(ARCHFLAG)
+AOUT_FLAGS += $(ARCHFLAG)
+LFLAGS += $(ARCHFLAG)
+ASFLAGS += $(ARCHFLAG)
+
+#------------------------------------------------------------------------
+# Compiler flags
+
+# position-independent code
+PICFLAG = -KPIC
+
+CFLAGS += $(PICFLAG)
+# no more exceptions
+CFLAGS += -features=no%except
+# Reduce code bloat by reverting back to 5.0 behavior for static initializers
+CFLAGS += -features=no%split_init
+# allow zero sized arrays
+CFLAGS += -features=zla
+
+# Use C++ Interpreter
+ifdef CC_INTERP
+ CFLAGS += -DCC_INTERP
+endif
+
+# We don't need libCstd.so and librwtools7.so, only libCrun.so
+CFLAGS += -library=Crun
+LIBS += -lCrun
+
+CFLAGS += -mt
+LFLAGS += -mt
+
+# Compiler warnings are treated as errors
+#WARNINGS_ARE_ERRORS = -errwarn=%all
+CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS)
+# Special cases
+CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
+
+# The flags to use for an Optimized build
+OPT_CFLAGS+=-xO4
+OPT_CFLAGS/NOOPT=-xO0
+
+#------------------------------------------------------------------------
+# Linker flags
+
+# Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file.
+MAPFLAG = -Wl,--version-script=FILENAME
+
+# Use $(SONAMEFLAG:SONAME=soname) to specify the intrinsic name of a shared obj
+SONAMEFLAG = -h SONAME
+
+# Build shared library
+SHARED_FLAG = -G
+
+#------------------------------------------------------------------------
+# Debug flags
+DEBUG_CFLAGS += -g
+FASTDEBUG_CFLAGS = -g0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/build/linux/platform_amd64.suncc Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,17 @@
+os_family = linux
+
+arch = x86
+
+arch_model = x86_64
+
+os_arch = linux_x86
+
+os_arch_model = linux_x86_64
+
+lib_arch = amd64
+
+compiler = sparcWorks
+
+gnu_dis_arch = amd64
+
+sysdefs = -DLINUX -DSPARC_WORKS -D_GNU_SOURCE -DAMD64
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/build/linux/platform_i486.suncc Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,17 @@
+os_family = linux
+
+arch = x86
+
+arch_model = x86_32
+
+os_arch = linux_x86
+
+os_arch_model = linux_x86_32
+
+lib_arch = i386
+
+compiler = sparcWorks
+
+gnu_dis_arch = i386
+
+sysdefs = -DLINUX -DSPARC_WORKS -D_GNU_SOURCE -DIA32
--- a/hotspot/build/solaris/makefiles/amd64.make Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/build/solaris/makefiles/amd64.make Tue Apr 15 17:48:22 2008 -0700
@@ -19,7 +19,7 @@
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
-#
+#
#
# Must also specify if CPU is little endian
@@ -45,6 +45,10 @@
OPT_CFLAGS/generateOptoStub.o = -xO2
OPT_CFLAGS/thread.o = -xO2
+# Work around for 6624782
+OPT_CFLAGS/instanceKlass.o = -Qoption ube -no_a2lf
+OPT_CFLAGS/objArrayKlass.o = -Qoption ube -no_a2lf
+
else
ifeq ("${Platform_compiler}", "gcc")
@@ -58,6 +62,6 @@
# error
_JUNK2_ := $(shell echo >&2 \
"*** ERROR: this compiler is not yet supported by this code base!")
- @exit 1
+ @exit 1
endif
endif
--- a/hotspot/build/windows/makefiles/compile.make Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/build/windows/makefiles/compile.make Tue Apr 15 17:48:22 2008 -0700
@@ -44,6 +44,10 @@
# /Od Disable all optimizations
#
# NOTE: Normally following any of the above with a '-' will turn off that flag
+#
+# 6655385: For VS2003/2005 we now specify /Oy- (disable frame pointer
+# omission.) This has little to no effect on performance while vastly
+# improving the quality of crash log stack traces involving jvm.dll.
# These are always used in all compiles
CPP_FLAGS=/nologo /W3 /WX
@@ -141,14 +145,14 @@
!endif
!if "$(COMPILER_NAME)" == "VS2003"
-PRODUCT_OPT_OPTION = /O2
-FASTDEBUG_OPT_OPTION = /O2
+PRODUCT_OPT_OPTION = /O2 /Oy-
+FASTDEBUG_OPT_OPTION = /O2 /Oy-
DEBUG_OPT_OPTION = /Od
!endif
!if "$(COMPILER_NAME)" == "VS2005"
-PRODUCT_OPT_OPTION = /O2
-FASTDEBUG_OPT_OPTION = /O2
+PRODUCT_OPT_OPTION = /O2 /Oy-
+FASTDEBUG_OPT_OPTION = /O2 /Oy-
DEBUG_OPT_OPTION = /Od
GX_OPTION = /EHsc
# This VS2005 compiler has /GS as a default and requires bufferoverflowU.lib
@@ -165,8 +169,8 @@
# Compile for space above time.
!if "$(Variant)" == "kernel"
-PRODUCT_OPT_OPTION = /O1
-FASTDEBUG_OPT_OPTION = /O1
+PRODUCT_OPT_OPTION = /O1 /Oy-
+FASTDEBUG_OPT_OPTION = /O1 /Oy-
DEBUG_OPT_OPTION = /Od
!endif
--- a/hotspot/make/hotspot_version Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/make/hotspot_version Tue Apr 15 17:48:22 2008 -0700
@@ -35,7 +35,7 @@
HS_MAJOR_VER=12
HS_MINOR_VER=0
-HS_BUILD_NUMBER=01
+HS_BUILD_NUMBER=03
JDK_MAJOR_VER=1
JDK_MINOR_VER=7
--- a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -2037,7 +2037,7 @@
int LIR_Assembler::shift_amount(BasicType t) {
- int elem_size = type2aelembytes[t];
+ int elem_size = type2aelembytes(t);
switch (elem_size) {
case 1 : return 0;
case 2 : return 1;
@@ -2360,7 +2360,7 @@
op->tmp2()->as_register(),
op->tmp3()->as_register(),
arrayOopDesc::header_size(op->type()),
- type2aelembytes[op->type()],
+ type2aelembytes(op->type()),
op->klass()->as_register(),
*op->stub()->entry());
}
--- a/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -179,7 +179,7 @@
LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_opr,
BasicType type, bool needs_card_mark) {
- int elem_size = type2aelembytes[type];
+ int elem_size = type2aelembytes(type);
int shift = exact_log2(elem_size);
LIR_Opr base_opr;
--- a/hotspot/src/cpu/sparc/vm/sparc.ad Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad Tue Apr 15 17:48:22 2008 -0700
@@ -6023,7 +6023,7 @@
ins_pipe(ialu_imm);
%}
-instruct cmovII_U_reg(cmpOp cmp, flagsRegU icc, iRegI dst, iRegI src) %{
+instruct cmovII_U_reg(cmpOpU cmp, flagsRegU icc, iRegI dst, iRegI src) %{
match(Set dst (CMoveI (Binary cmp icc) (Binary dst src)));
ins_cost(150);
size(4);
@@ -6032,7 +6032,7 @@
ins_pipe(ialu_reg);
%}
-instruct cmovII_U_imm(cmpOp cmp, flagsRegU icc, iRegI dst, immI11 src) %{
+instruct cmovII_U_imm(cmpOpU cmp, flagsRegU icc, iRegI dst, immI11 src) %{
match(Set dst (CMoveI (Binary cmp icc) (Binary dst src)));
ins_cost(140);
size(4);
--- a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -2911,6 +2911,7 @@
// These entry points require SharedInfo::stack0 to be set up in non-core builds
StubRoutines::_throw_AbstractMethodError_entry = generate_throw_exception("AbstractMethodError throw_exception", CAST_FROM_FN_PTR(address, SharedRuntime::throw_AbstractMethodError), false);
+ StubRoutines::_throw_IncompatibleClassChangeError_entry= generate_throw_exception("IncompatibleClassChangeError throw_exception", CAST_FROM_FN_PTR(address, SharedRuntime::throw_IncompatibleClassChangeError), false);
StubRoutines::_throw_ArithmeticException_entry = generate_throw_exception("ArithmeticException throw_exception", CAST_FROM_FN_PTR(address, SharedRuntime::throw_ArithmeticException), true);
StubRoutines::_throw_NullPointerException_entry = generate_throw_exception("NullPointerException throw_exception", CAST_FROM_FN_PTR(address, SharedRuntime::throw_NullPointerException), true);
StubRoutines::_throw_NullPointerException_at_call_entry= generate_throw_exception("NullPointerException at call throw_exception", CAST_FROM_FN_PTR(address, SharedRuntime::throw_NullPointerException_at_call), false);
--- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -28,6 +28,12 @@
int VM_Version::_features = VM_Version::unknown_m;
const char* VM_Version::_features_str = "";
+bool VM_Version::is_niagara1_plus() {
+ // This is a placeholder until the real test is determined.
+ return is_niagara1() &&
+ (os::processor_count() > maximum_niagara1_processor_count());
+}
+
void VM_Version::initialize() {
_features = determine_features();
PrefetchCopyIntervalInBytes = prefetch_copy_interval_in_bytes();
@@ -160,3 +166,13 @@
void VM_Version::revert() {
_features = saved_features;
}
+
+unsigned int VM_Version::calc_parallel_worker_threads() {
+ unsigned int result;
+ if (is_niagara1_plus()) {
+ result = nof_parallel_worker_threads(5, 16, 8);
+ } else {
+ result = nof_parallel_worker_threads(5, 8, 8);
+ }
+ return result;
+}
--- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -64,6 +64,11 @@
static bool is_niagara1(int features) { return (features & niagara1_m) == niagara1_m; }
+ static int maximum_niagara1_processor_count() { return 32; }
+ // Returns true if the platform is in the niagara line and
+ // newer than the niagara1.
+ static bool is_niagara1_plus();
+
public:
// Initialization
static void initialize();
@@ -129,4 +134,7 @@
// Override the Abstract_VM_Version implementation.
static uint page_size_count() { return is_sun4v() ? 4 : 2; }
+
+ // Calculates the number of parallel threads
+ static unsigned int calc_parallel_worker_threads();
};
--- a/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -175,17 +175,12 @@
// %%%% Could load both offset and interface in one ldx, if they were
// in the opposite order. This would save a load.
__ ld_ptr(L0, base + itableOffsetEntry::interface_offset_in_bytes(), L1);
-#ifdef ASSERT
- Label ok;
- // Check that entry is non-null and an Oop
- __ bpr(Assembler::rc_nz, false, Assembler::pt, L1, ok);
- __ delayed()->nop();
- __ stop("null entry point found in itable's offset table");
- __ bind(ok);
- __ verify_oop(L1);
-#endif // ASSERT
- __ cmp(G5_interface, L1);
+ // If the entry is NULL then we've reached the end of the table
+ // without finding the expected interface, so throw an exception
+ Label throw_icce;
+ __ bpr(Assembler::rc_z, false, Assembler::pn, L1, throw_icce);
+ __ delayed()->cmp(G5_interface, L1);
__ brx(Assembler::notEqual, true, Assembler::pn, search);
__ delayed()->add(L0, itableOffsetEntry::size() * wordSize, L0);
@@ -223,24 +218,30 @@
__ JMP(G3_scratch, 0);
__ delayed()->nop();
+ __ bind(throw_icce);
+ Address icce(G3_scratch, StubRoutines::throw_IncompatibleClassChangeError_entry());
+ __ jump_to(icce, 0);
+ __ delayed()->restore();
+
masm->flush();
+
+ guarantee(__ pc() <= s->code_end(), "overflowed buffer");
+
s->set_exception_points(npe_addr, ame_addr);
return s;
}
int VtableStub::pd_code_size_limit(bool is_vtable_stub) {
- if (TraceJumps || DebugVtables || CountCompiledCalls || VerifyOops) return 999;
+ if (TraceJumps || DebugVtables || CountCompiledCalls || VerifyOops) return 1000;
else {
const int slop = 2*BytesPerInstWord; // sethi;add (needed for long offsets)
if (is_vtable_stub) {
const int basic = 5*BytesPerInstWord; // ld;ld;ld,jmp,nop
return basic + slop;
} else {
-#ifdef ASSERT
- return 999;
-#endif // ASSERT
- const int basic = 17*BytesPerInstWord; // save, ld, ld, sll, and, add, add, ld, cmp, br, add, ld, add, ld, ld, jmp, restore
+ // save, ld, ld, sll, and, add, add, ld, cmp, br, add, ld, add, ld, ld, jmp, restore, sethi, jmpl, restore
+ const int basic = (20 LP64_ONLY(+ 6)) * BytesPerInstWord;
return (basic + slop);
}
}
@@ -252,29 +253,3 @@
const unsigned int icache_line_size = 32;
return icache_line_size;
}
-
-
-//Reconciliation History
-// 1.2 97/12/09 17:13:31 vtableStubs_i486.cpp
-// 1.4 98/01/21 19:18:37 vtableStubs_i486.cpp
-// 1.5 98/02/13 16:33:55 vtableStubs_i486.cpp
-// 1.7 98/03/05 17:17:28 vtableStubs_i486.cpp
-// 1.9 98/05/18 09:26:17 vtableStubs_i486.cpp
-// 1.10 98/05/26 16:28:13 vtableStubs_i486.cpp
-// 1.11 98/05/27 08:51:35 vtableStubs_i486.cpp
-// 1.12 98/06/15 15:04:12 vtableStubs_i486.cpp
-// 1.13 98/07/28 18:44:22 vtableStubs_i486.cpp
-// 1.15 98/08/28 11:31:19 vtableStubs_i486.cpp
-// 1.16 98/09/02 12:58:31 vtableStubs_i486.cpp
-// 1.17 98/09/04 12:15:52 vtableStubs_i486.cpp
-// 1.18 98/11/19 11:55:24 vtableStubs_i486.cpp
-// 1.19 99/01/12 14:57:56 vtableStubs_i486.cpp
-// 1.20 99/01/19 17:42:52 vtableStubs_i486.cpp
-// 1.22 99/01/21 10:29:25 vtableStubs_i486.cpp
-// 1.30 99/06/02 15:27:39 vtableStubs_i486.cpp
-// 1.26 99/06/24 14:25:07 vtableStubs_i486.cpp
-// 1.23 99/02/22 14:37:52 vtableStubs_i486.cpp
-// 1.28 99/06/29 18:06:17 vtableStubs_i486.cpp
-// 1.29 99/07/22 17:03:44 vtableStubs_i486.cpp
-// 1.30 99/08/11 09:33:27 vtableStubs_i486.cpp
-//End
--- a/hotspot/src/cpu/x86/vm/assembler_x86_32.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/x86/vm/assembler_x86_32.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -2672,6 +2672,22 @@
emit_sse_operand(dst, src);
}
+void Assembler::cvtdq2pd(XMMRegister dst, XMMRegister src) {
+ assert(VM_Version::supports_sse2(), "");
+
+ emit_byte(0xF3);
+ emit_byte(0x0F);
+ emit_byte(0xE6);
+ emit_sse_operand(dst, src);
+}
+
+void Assembler::cvtdq2ps(XMMRegister dst, XMMRegister src) {
+ assert(VM_Version::supports_sse2(), "");
+
+ emit_byte(0x0F);
+ emit_byte(0x5B);
+ emit_sse_operand(dst, src);
+}
emit_sse_instruction(andps, sse, 0, 0x54, XMMRegister, XMMRegister);
emit_sse_instruction(andpd, sse2, 0x66, 0x54, XMMRegister, XMMRegister);
--- a/hotspot/src/cpu/x86/vm/assembler_x86_32.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/x86/vm/assembler_x86_32.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -901,6 +901,8 @@
void cvtss2sd(XMMRegister dst, XMMRegister src);
void cvtsd2ss(XMMRegister dst, Address src); // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value
void cvtsd2ss(XMMRegister dst, XMMRegister src);
+ void cvtdq2pd(XMMRegister dst, XMMRegister src);
+ void cvtdq2ps(XMMRegister dst, XMMRegister src);
void cvtsi2ss(XMMRegister dst, Address src); // Convert Doubleword Integer to Scalar Single-Precision Floating-Point Value
void cvtsi2ss(XMMRegister dst, Register src);
--- a/hotspot/src/cpu/x86/vm/assembler_x86_64.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/x86/vm/assembler_x86_64.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -1304,7 +1304,7 @@
emit_operand(src, dst);
}
-void Assembler::mov64(Register dst, int64_t imm64) {
+void Assembler::mov64(Register dst, intptr_t imm64) {
InstructionMark im(this);
int encode = prefixq_and_encode(dst->encoding());
emit_byte(0xB8 | encode);
@@ -1331,7 +1331,7 @@
emit_operand(dst, src);
}
-void Assembler::mov64(Address dst, int64_t imm32) {
+void Assembler::mov64(Address dst, intptr_t imm32) {
assert(is_simm32(imm32), "lost bits");
InstructionMark im(this);
prefixq(dst);
@@ -3372,6 +3372,21 @@
emit_byte(0xC0 | encode);
}
+void Assembler::cvtdq2pd(XMMRegister dst, XMMRegister src) {
+ emit_byte(0xF3);
+ int encode = prefix_and_encode(dst->encoding(), src->encoding());
+ emit_byte(0x0F);
+ emit_byte(0xE6);
+ emit_byte(0xC0 | encode);
+}
+
+void Assembler::cvtdq2ps(XMMRegister dst, XMMRegister src) {
+ int encode = prefix_and_encode(dst->encoding(), src->encoding());
+ emit_byte(0x0F);
+ emit_byte(0x5B);
+ emit_byte(0xC0 | encode);
+}
+
void Assembler::cvtsd2ss(XMMRegister dst, XMMRegister src) {
emit_byte(0xF2);
int encode = prefix_and_encode(dst->encoding(), src->encoding());
--- a/hotspot/src/cpu/x86/vm/assembler_x86_64.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/x86/vm/assembler_x86_64.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -922,6 +922,8 @@
void cvttsd2siq(Register dst, XMMRegister src); // truncates
void cvtss2sd(XMMRegister dst, XMMRegister src);
void cvtsd2ss(XMMRegister dst, XMMRegister src);
+ void cvtdq2pd(XMMRegister dst, XMMRegister src);
+ void cvtdq2ps(XMMRegister dst, XMMRegister src);
void pxor(XMMRegister dst, Address src); // Xor Packed Byte Integer Values
void pxor(XMMRegister dst, XMMRegister src); // Xor Packed Byte Integer Values
--- a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -546,8 +546,8 @@
// set rsi.edi to the end of the arrays (arrays have same length)
// negate the index
- __ leal(rsi, Address(rsi, rax, Address::times_2, type2aelembytes[T_CHAR]));
- __ leal(rdi, Address(rdi, rax, Address::times_2, type2aelembytes[T_CHAR]));
+ __ leal(rsi, Address(rsi, rax, Address::times_2, type2aelembytes(T_CHAR)));
+ __ leal(rdi, Address(rdi, rax, Address::times_2, type2aelembytes(T_CHAR)));
__ negl(rax);
// compare the strings in a loop
@@ -1232,7 +1232,7 @@
NEEDS_CLEANUP; // This could be static?
Address::ScaleFactor LIR_Assembler::array_element_size(BasicType type) const {
- int elem_size = type2aelembytes[type];
+ int elem_size = type2aelembytes(type);
switch (elem_size) {
case 1: return Address::times_1;
case 2: return Address::times_2;
@@ -2739,7 +2739,7 @@
assert(default_type != NULL && default_type->is_array_klass() && default_type->is_loaded(), "must be true at this point");
- int elem_size = type2aelembytes[basic_type];
+ int elem_size = type2aelembytes(basic_type);
int shift_amount;
Address::ScaleFactor scale;
--- a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -151,7 +151,7 @@
LIR_Address* addr;
if (index_opr->is_constant()) {
- int elem_size = type2aelembytes[type];
+ int elem_size = type2aelembytes(type);
addr = new LIR_Address(array_opr,
offset_in_bytes + index_opr->as_jint() * elem_size, type);
} else {
--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -1416,8 +1416,8 @@
// ======== end loop ========
// It was a real error; we must depend on the caller to finish the job.
- // Register rdx = -1 * number of *remaining* oops, r14 = *total* oops.
- // Emit GC store barriers for the oops we have copied (r14 + rdx),
+ // Register "count" = -1 * number of *remaining* oops, length_arg = *total* oops.
+ // Emit GC store barriers for the oops we have copied (length_arg + count),
// and report their number to the caller.
__ addl(count, length_arg); // transfers = (length - remaining)
__ movl(rax, count); // save the value
@@ -1430,6 +1430,7 @@
// Come here on success only.
__ BIND(L_do_card_marks);
__ movl(count, length_arg);
+ __ movl(to, to_arg); // reload
gen_write_ref_array_post_barrier(to, count);
__ xorl(rax, rax); // return 0 on success
@@ -2151,6 +2152,7 @@
// These entry points require SharedInfo::stack0 to be set up in non-core builds
// and need to be relocatable, so they each fabricate a RuntimeStub internally.
StubRoutines::_throw_AbstractMethodError_entry = generate_throw_exception("AbstractMethodError throw_exception", CAST_FROM_FN_PTR(address, SharedRuntime::throw_AbstractMethodError), false);
+ StubRoutines::_throw_IncompatibleClassChangeError_entry= generate_throw_exception("IncompatibleClassChangeError throw_exception", CAST_FROM_FN_PTR(address, SharedRuntime::throw_IncompatibleClassChangeError), false);
StubRoutines::_throw_ArithmeticException_entry = generate_throw_exception("ArithmeticException throw_exception", CAST_FROM_FN_PTR(address, SharedRuntime::throw_ArithmeticException), true);
StubRoutines::_throw_NullPointerException_entry = generate_throw_exception("NullPointerException throw_exception", CAST_FROM_FN_PTR(address, SharedRuntime::throw_NullPointerException), true);
StubRoutines::_throw_NullPointerException_at_call_entry= generate_throw_exception("NullPointerException at call throw_exception", CAST_FROM_FN_PTR(address, SharedRuntime::throw_NullPointerException_at_call), false);
--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -2832,6 +2832,13 @@
throw_AbstractMethodError),
false);
+ StubRoutines::_throw_IncompatibleClassChangeError_entry =
+ generate_throw_exception("IncompatibleClassChangeError throw_exception",
+ CAST_FROM_FN_PTR(address,
+ SharedRuntime::
+ throw_IncompatibleClassChangeError),
+ false);
+
StubRoutines::_throw_ArithmeticException_entry =
generate_throw_exception("ArithmeticException throw_exception",
CAST_FROM_FN_PTR(address,
--- a/hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -321,6 +321,20 @@
UseXmmRegToRegMoveAll = false;
}
}
+ if( FLAG_IS_DEFAULT(UseXmmI2F) ) {
+ if( supports_sse4a() ) {
+ UseXmmI2F = true;
+ } else {
+ UseXmmI2F = false;
+ }
+ }
+ if( FLAG_IS_DEFAULT(UseXmmI2D) ) {
+ if( supports_sse4a() ) {
+ UseXmmI2D = true;
+ } else {
+ UseXmmI2D = false;
+ }
+ }
}
if( is_intel() ) { // Intel cpus specific settings
--- a/hotspot/src/cpu/x86/vm/vm_version_x86_64.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/x86/vm/vm_version_x86_64.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -265,6 +265,20 @@
UseXmmRegToRegMoveAll = false;
}
}
+ if( FLAG_IS_DEFAULT(UseXmmI2F) ) {
+ if( supports_sse4a() ) {
+ UseXmmI2F = true;
+ } else {
+ UseXmmI2F = false;
+ }
+ }
+ if( FLAG_IS_DEFAULT(UseXmmI2D) ) {
+ if( supports_sse4a() ) {
+ UseXmmI2D = true;
+ } else {
+ UseXmmI2D = false;
+ }
+ }
}
if( is_intel() ) { // Intel cpus specific settings
--- a/hotspot/src/cpu/x86/vm/vtableStubs_x86_32.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/x86/vm/vtableStubs_x86_32.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -138,29 +138,21 @@
__ round_to(rbx, BytesPerLong);
}
- Label hit, next, entry;
+ Label hit, next, entry, throw_icce;
- __ jmp(entry);
+ __ jmpb(entry);
__ bind(next);
__ addl(rbx, itableOffsetEntry::size() * wordSize);
__ bind(entry);
-#ifdef ASSERT
- // Check that the entry is non-null
- if (DebugVtables) {
- Label L;
- __ pushl(rbx);
- __ movl(rbx, Address(rbx, itableOffsetEntry::interface_offset_in_bytes()));
- __ testl(rbx, rbx);
- __ jcc(Assembler::notZero, L);
- __ stop("null entry point found in itable's offset table");
- __ bind(L);
- __ popl(rbx);
- }
-#endif
- __ cmpl(rax, Address(rbx, itableOffsetEntry::interface_offset_in_bytes()));
+ // If the entry is NULL then we've reached the end of the table
+ // without finding the expected interface, so throw an exception
+ __ movl(rdx, Address(rbx, itableOffsetEntry::interface_offset_in_bytes()));
+ __ testl(rdx, rdx);
+ __ jcc(Assembler::zero, throw_icce);
+ __ cmpl(rax, rdx);
__ jcc(Assembler::notEqual, next);
// We found a hit, move offset into rbx,
@@ -194,7 +186,15 @@
address ame_addr = __ pc();
__ jmp(Address(method, methodOopDesc::from_compiled_offset()));
+ __ bind(throw_icce);
+ // Restore saved register
+ __ popl(rdx);
+ __ jump(RuntimeAddress(StubRoutines::throw_IncompatibleClassChangeError_entry()));
+
masm->flush();
+
+ guarantee(__ pc() <= s->code_end(), "overflowed buffer");
+
s->set_exception_points(npe_addr, ame_addr);
return s;
}
@@ -207,7 +207,7 @@
return (DebugVtables ? 210 : 16) + (CountCompiledCalls ? 6 : 0);
} else {
// Itable stub size
- return (DebugVtables ? 140 : 55) + (CountCompiledCalls ? 6 : 0);
+ return (DebugVtables ? 144 : 64) + (CountCompiledCalls ? 6 : 0);
}
}
--- a/hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -153,7 +153,7 @@
// Round up to align_object_offset boundary
__ round_to_q(rbx, BytesPerLong);
}
- Label hit, next, entry;
+ Label hit, next, entry, throw_icce;
__ jmpb(entry);
@@ -162,22 +162,13 @@
__ bind(entry);
-#ifdef ASSERT
- // Check that the entry is non-null
- if (DebugVtables) {
- Label L;
- __ pushq(rbx);
- __ movq(rbx, Address(rbx, itableOffsetEntry::interface_offset_in_bytes()));
- __ testq(rbx, rbx);
- __ jcc(Assembler::notZero, L);
- __ stop("null entry point found in itable's offset table");
- __ bind(L);
- __ popq(rbx);
- }
-#endif
-
- __ cmpq(rax, Address(rbx, itableOffsetEntry::interface_offset_in_bytes()));
- __ jcc(Assembler::notEqual, next);
+ // If the entry is NULL then we've reached the end of the table
+ // without finding the expected interface, so throw an exception
+ __ movq(j_rarg1, Address(rbx, itableOffsetEntry::interface_offset_in_bytes()));
+ __ testq(j_rarg1, j_rarg1);
+ __ jcc(Assembler::zero, throw_icce);
+ __ cmpq(rax, j_rarg1);
+ __ jccb(Assembler::notEqual, next);
// We found a hit, move offset into j_rarg1
__ movl(j_rarg1, Address(rbx, itableOffsetEntry::offset_offset_in_bytes()));
@@ -203,23 +194,31 @@
#ifdef ASSERT
- if (DebugVtables) {
- Label L2;
- __ cmpq(method, (int)NULL);
- __ jcc(Assembler::equal, L2);
- __ cmpq(Address(method, methodOopDesc::from_compiled_offset()), (int)NULL_WORD);
- __ jcc(Assembler::notZero, L2);
- __ stop("compiler entrypoint is null");
- __ bind(L2);
- }
+ if (DebugVtables) {
+ Label L2;
+ __ cmpq(method, (int)NULL);
+ __ jcc(Assembler::equal, L2);
+ __ cmpq(Address(method, methodOopDesc::from_compiled_offset()), (int)NULL_WORD);
+ __ jcc(Assembler::notZero, L2);
+ __ stop("compiler entrypoint is null");
+ __ bind(L2);
+ }
#endif // ASSERT
- // rbx: methodOop
- // j_rarg0: receiver
- address ame_addr = __ pc();
- __ jmp(Address(method, methodOopDesc::from_compiled_offset()));
+ // rbx: methodOop
+ // j_rarg0: receiver
+ address ame_addr = __ pc();
+ __ jmp(Address(method, methodOopDesc::from_compiled_offset()));
+
+ __ bind(throw_icce);
+ // Restore saved register
+ __ popq(j_rarg1);
+ __ jump(RuntimeAddress(StubRoutines::throw_IncompatibleClassChangeError_entry()));
__ flush();
+
+ guarantee(__ pc() <= s->code_end(), "overflowed buffer");
+
s->set_exception_points(npe_addr, ame_addr);
return s;
}
@@ -230,7 +229,7 @@
return (DebugVtables ? 512 : 24) + (CountCompiledCalls ? 13 : 0);
} else {
// Itable stub size
- return (DebugVtables ? 636 : 64) + (CountCompiledCalls ? 13 : 0);
+ return (DebugVtables ? 636 : 72) + (CountCompiledCalls ? 13 : 0);
}
}
--- a/hotspot/src/cpu/x86/vm/x86_32.ad Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad Tue Apr 15 17:48:22 2008 -0700
@@ -10970,7 +10970,7 @@
%}
instruct convI2XD_reg(regXD dst, eRegI src) %{
- predicate( UseSSE>=2 );
+ predicate( UseSSE>=2 && !UseXmmI2D );
match(Set dst (ConvI2D src));
format %{ "CVTSI2SD $dst,$src" %}
opcode(0xF2, 0x0F, 0x2A);
@@ -10987,6 +10987,20 @@
ins_pipe( pipe_slow );
%}
+instruct convXI2XD_reg(regXD dst, eRegI src)
+%{
+ predicate( UseSSE>=2 && UseXmmI2D );
+ match(Set dst (ConvI2D src));
+
+ format %{ "MOVD $dst,$src\n\t"
+ "CVTDQ2PD $dst,$dst\t# i2d" %}
+ ins_encode %{
+ __ movd($dst$$XMMRegister, $src$$Register);
+ __ cvtdq2pd($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe(pipe_slow); // XXX
+%}
+
instruct convI2D_mem(regD dst, memory mem) %{
predicate( UseSSE<=1 && !Compile::current()->select_24_bit_instr());
match(Set dst (ConvI2D (LoadI mem)));
@@ -11062,7 +11076,7 @@
// Convert an int to a float in xmm; no rounding step needed.
instruct convI2X_reg(regX dst, eRegI src) %{
- predicate(UseSSE>=1);
+ predicate( UseSSE==1 || UseSSE>=2 && !UseXmmI2F );
match(Set dst (ConvI2F src));
format %{ "CVTSI2SS $dst, $src" %}
@@ -11071,6 +11085,20 @@
ins_pipe( pipe_slow );
%}
+ instruct convXI2X_reg(regX dst, eRegI src)
+%{
+ predicate( UseSSE>=2 && UseXmmI2F );
+ match(Set dst (ConvI2F src));
+
+ format %{ "MOVD $dst,$src\n\t"
+ "CVTDQ2PS $dst,$dst\t# i2f" %}
+ ins_encode %{
+ __ movd($dst$$XMMRegister, $src$$Register);
+ __ cvtdq2ps($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe(pipe_slow); // XXX
+%}
+
instruct convI2L_reg( eRegL dst, eRegI src, eFlagsReg cr) %{
match(Set dst (ConvI2L src));
effect(KILL cr);
--- a/hotspot/src/cpu/x86/vm/x86_64.ad Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad Tue Apr 15 17:48:22 2008 -0700
@@ -10098,6 +10098,7 @@
instruct convI2F_reg_reg(regF dst, rRegI src)
%{
+ predicate(!UseXmmI2F);
match(Set dst (ConvI2F src));
format %{ "cvtsi2ssl $dst, $src\t# i2f" %}
@@ -10118,6 +10119,7 @@
instruct convI2D_reg_reg(regD dst, rRegI src)
%{
+ predicate(!UseXmmI2D);
match(Set dst (ConvI2D src));
format %{ "cvtsi2sdl $dst, $src\t# i2d" %}
@@ -10136,6 +10138,34 @@
ins_pipe(pipe_slow); // XXX
%}
+instruct convXI2F_reg(regF dst, rRegI src)
+%{
+ predicate(UseXmmI2F);
+ match(Set dst (ConvI2F src));
+
+ format %{ "movdl $dst, $src\n\t"
+ "cvtdq2psl $dst, $dst\t# i2f" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ cvtdq2ps($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe(pipe_slow); // XXX
+%}
+
+instruct convXI2D_reg(regD dst, rRegI src)
+%{
+ predicate(UseXmmI2D);
+ match(Set dst (ConvI2D src));
+
+ format %{ "movdl $dst, $src\n\t"
+ "cvtdq2pdl $dst, $dst\t# i2d" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ cvtdq2pd($dst$$XMMRegister, $dst$$XMMRegister);
+ %}
+ ins_pipe(pipe_slow); // XXX
+%}
+
instruct convL2F_reg_reg(regF dst, rRegL src)
%{
match(Set dst (ConvL2F src));
--- a/hotspot/src/os/linux/vm/attachListener_linux.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/os/linux/vm/attachListener_linux.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -232,7 +232,7 @@
// where <ver> is the protocol version (1), <cmd> is the command
// name ("load", "datadump", ...), and <arg> is an argument
int expected_str_count = 2 + AttachOperation::arg_count_max;
- int max_len = (strlen(ver_str) + 1) + (AttachOperation::name_length_max + 1) +
+ const int max_len = (sizeof(ver_str) + 1) + (AttachOperation::name_length_max + 1) +
AttachOperation::arg_count_max*(AttachOperation::arg_length_max + 1);
char buf[max_len];
--- a/hotspot/src/os/linux/vm/os_linux.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/os/linux/vm/os_linux.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -116,6 +116,20 @@
return Linux::physical_memory();
}
+julong os::allocatable_physical_memory(julong size) {
+#ifdef _LP64
+ return size;
+#else
+ julong result = MIN2(size, (julong)3800*M);
+ if (!is_allocatable(result)) {
+ // See comments under solaris for alignment considerations
+ julong reasonable_size = (julong)2*G - 2 * os::vm_page_size();
+ result = MIN2(size, reasonable_size);
+ }
+ return result;
+#endif // _LP64
+}
+
////////////////////////////////////////////////////////////////////////////////
// environment support
@@ -1247,19 +1261,13 @@
return (1000 * 1000);
}
-jlong os::timeofday() {
+jlong os::javaTimeMillis() {
timeval time;
int status = gettimeofday(&time, NULL);
assert(status != -1, "linux error");
return jlong(time.tv_sec) * 1000 + jlong(time.tv_usec / 1000);
}
-// Must return millis since Jan 1 1970 for JVM_CurrentTimeMillis
-// _use_global_time is only set if CacheTimeMillis is true
-jlong os::javaTimeMillis() {
- return (_use_global_time ? read_global_time() : timeofday());
-}
-
#ifndef CLOCK_MONOTONIC
#define CLOCK_MONOTONIC (1)
#endif
@@ -2472,6 +2480,10 @@
return false;
}
+bool os::can_execute_large_page_memory() {
+ return false;
+}
+
// Reserve memory at an arbitrary address, only if that area is
// available (and not reserved for something else).
--- a/hotspot/src/os/solaris/vm/os_solaris.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/os/solaris/vm/os_solaris.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -1691,19 +1691,14 @@
return (jlong)(nanotime / NANOSECS_PER_MILLISECS);
}
-jlong os::timeofday() {
+// Must return millis since Jan 1 1970 for JVM_CurrentTimeMillis
+jlong os::javaTimeMillis() {
timeval t;
if (gettimeofday( &t, NULL) == -1)
- fatal1("timeofday: gettimeofday (%s)", strerror(errno));
+ fatal1("os::javaTimeMillis: gettimeofday (%s)", strerror(errno));
return jlong(t.tv_sec) * 1000 + jlong(t.tv_usec) / 1000;
}
-// Must return millis since Jan 1 1970 for JVM_CurrentTimeMillis
-// _use_global_time is only set if CacheTimeMillis is true
-jlong os::javaTimeMillis() {
- return (_use_global_time ? read_global_time() : timeofday());
-}
-
jlong os::javaTimeNanos() {
return (jlong)getTimeNanos();
}
@@ -2785,16 +2780,15 @@
return b;
}
-char*
-os::reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) {
- char* addr = NULL;
- int flags;
-
- flags = MAP_PRIVATE | MAP_NORESERVE;
- if (requested_addr != NULL) {
- flags |= MAP_FIXED;
- addr = requested_addr;
- } else if (has_map_align && alignment_hint > (size_t) vm_page_size()) {
+char* os::Solaris::anon_mmap(char* requested_addr, size_t bytes, size_t alignment_hint, bool fixed) {
+ char* addr = requested_addr;
+ int flags = MAP_PRIVATE | MAP_NORESERVE;
+
+ assert(!(fixed && (alignment_hint > 0)), "alignment hint meaningless with fixed mmap");
+
+ if (fixed) {
+ flags |= MAP_FIXED;
+ } else if (has_map_align && (alignment_hint > (size_t) vm_page_size())) {
flags |= MAP_ALIGN;
addr = (char*) alignment_hint;
}
@@ -2802,11 +2796,14 @@
// Map uncommitted pages PROT_NONE so we fail early if we touch an
// uncommitted page. Otherwise, the read/write might succeed if we
// have enough swap space to back the physical page.
- addr = Solaris::mmap_chunk(addr, bytes, flags, PROT_NONE);
+ return mmap_chunk(addr, bytes, flags, PROT_NONE);
+}
+
+char* os::reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) {
+ char* addr = Solaris::anon_mmap(requested_addr, bytes, alignment_hint, (requested_addr != NULL));
guarantee(requested_addr == NULL || requested_addr == addr,
"OS failed to return requested mmap address.");
-
return addr;
}
@@ -2832,6 +2829,31 @@
// in one of the methods further up the call chain. See bug 5044738.
assert(bytes % os::vm_page_size() == 0, "reserving unexpected size block");
+ // Since snv_84, Solaris attempts to honor the address hint - see 5003415.
+ // Give it a try, if the kernel honors the hint we can return immediately.
+ char* addr = Solaris::anon_mmap(requested_addr, bytes, 0, false);
+ volatile int err = errno;
+ if (addr == requested_addr) {
+ return addr;
+ } else if (addr != NULL) {
+ unmap_memory(addr, bytes);
+ }
+
+ if (PrintMiscellaneous && Verbose) {
+ char buf[256];
+ buf[0] = '\0';
+ if (addr == NULL) {
+ jio_snprintf(buf, sizeof(buf), ": %s", strerror(err));
+ }
+ warning("attempt_reserve_memory_at: couldn't reserve %d bytes at "
+ PTR_FORMAT ": reserve_memory_helper returned " PTR_FORMAT
+ "%s", bytes, requested_addr, addr, buf);
+ }
+
+ // Address hint method didn't work. Fall back to the old method.
+ // In theory, once SNV becomes our oldest supported platform, this
+ // code will no longer be needed.
+ //
// Repeatedly allocate blocks until the block is allocated at the
// right spot. Give up after max_tries.
int i;
@@ -3067,6 +3089,8 @@
if (UseISM) {
// ISM disables MPSS to be compatible with old JDK behavior
UseMPSS = false;
+ _page_sizes[0] = _large_page_size;
+ _page_sizes[1] = vm_page_size();
}
UseMPSS = UseMPSS &&
@@ -3156,6 +3180,10 @@
return UseISM ? false : true;
}
+bool os::can_execute_large_page_memory() {
+ return UseISM ? false : true;
+}
+
static int os_sleep(jlong millis, bool interruptible) {
const jlong limit = INT_MAX;
jlong prevtime;
--- a/hotspot/src/os/solaris/vm/os_solaris.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/os/solaris/vm/os_solaris.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -156,6 +156,7 @@
static int get_dev_zero_fd() { return _dev_zero_fd; }
static void set_dev_zero_fd(int fd) { _dev_zero_fd = fd; }
static char* mmap_chunk(char *addr, size_t size, int flags, int prot);
+ static char* anon_mmap(char* requested_addr, size_t bytes, size_t alignment_hint, bool fixed);
static bool mpss_sanity_check(bool warn, size_t * page_size);
static bool ism_sanity_check (bool warn, size_t * page_size);
--- a/hotspot/src/os/windows/vm/os_windows.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/os/windows/vm/os_windows.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -621,7 +621,12 @@
}
julong os::allocatable_physical_memory(julong size) {
+#ifdef _LP64
+ return size;
+#else
+ // Limit to 1400m because of the 2gb address space wall
return MIN2(size, (julong)1400*M);
+#endif
}
// VC6 lacks DWORD_PTR
@@ -732,20 +737,13 @@
return result;
}
-jlong os::timeofday() {
- FILETIME wt;
- GetSystemTimeAsFileTime(&wt);
- return windows_to_java_time(wt);
-}
-
-
-// Must return millis since Jan 1 1970 for JVM_CurrentTimeMillis
-// _use_global_time is only set if CacheTimeMillis is true
jlong os::javaTimeMillis() {
if (UseFakeTimers) {
return fake_time++;
} else {
- return (_use_global_time ? read_global_time() : timeofday());
+ FILETIME wt;
+ GetSystemTimeAsFileTime(&wt);
+ return windows_to_java_time(wt);
}
}
@@ -2518,9 +2516,13 @@
return false;
}
+bool os::can_execute_large_page_memory() {
+ return true;
+}
+
char* os::reserve_memory_special(size_t bytes) {
DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
- char * res = (char *)VirtualAlloc(NULL, bytes, flag, PAGE_READWRITE);
+ char * res = (char *)VirtualAlloc(NULL, bytes, flag, PAGE_EXECUTE_READWRITE);
return res;
}
--- a/hotspot/src/os_cpu/linux_x86/vm/bytes_linux_x86.inline.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/os_cpu/linux_x86/vm/bytes_linux_x86.inline.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -60,7 +60,18 @@
#ifdef AMD64
inline u8 Bytes::swap_u8(u8 x) {
+#ifdef SPARC_WORKS
+ // workaround for SunStudio12 CR6615391
+ __asm__ __volatile__ (
+ "bswapq %0"
+ :"=r" (x) // output : register 0 => x
+ :"0" (x) // input : x => register 0
+ :"0" // clobbered register
+ );
+ return x;
+#else
return bswap_64(x);
+#endif
}
#else
// Helper function for swap_u8
--- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -62,8 +62,14 @@
#endif // AMD64
address os::current_stack_pointer() {
+#ifdef SPARC_WORKS
+ register void *esp;
+ __asm__("mov %%"SPELL_REG_SP", %0":"=r"(esp));
+ return (address) ((char*)esp + sizeof(long)*2);
+#else
register void *esp __asm__ (SPELL_REG_SP);
return (address) esp;
+#endif
}
char* os::non_memory_address_word() {
@@ -139,7 +145,12 @@
}
intptr_t* _get_previous_fp() {
+#ifdef SPARC_WORKS
+ register intptr_t **ebp;
+ __asm__("mov %%"SPELL_REG_FP", %0":"=r"(ebp));
+#else
register intptr_t **ebp __asm__ (SPELL_REG_FP);
+#endif
return (intptr_t*) *ebp; // we want what it points to.
}
@@ -157,23 +168,8 @@
}
}
-
// Utility functions
-julong os::allocatable_physical_memory(julong size) {
-#ifdef AMD64
- return size;
-#else
- julong result = MIN2(size, (julong)3800*M);
- if (!is_allocatable(result)) {
- // See comments under solaris for alignment considerations
- julong reasonable_size = (julong)2*G - 2 * os::vm_page_size();
- result = MIN2(size, reasonable_size);
- }
- return result;
-#endif // AMD64
-}
-
// From IA32 System Programming Guide
enum {
trap_page_fault = 0xE
@@ -575,7 +571,9 @@
#else
size_t os::Linux::min_stack_allowed = (48 DEBUG_ONLY(+4))*K;
+#ifdef __GNUC__
#define GET_GS() ({int gs; __asm__ volatile("movw %%gs, %w0":"=q"(gs)); gs&0xffff;})
+#endif
// Test if pthread library can support variable thread stack size. LinuxThreads
// in fixed stack mode allocates 2M fixed slot for each thread. LinuxThreads
@@ -606,7 +604,11 @@
// return true and skip _thread_safety_check(), so we may not be able to
// detect stack-heap collisions. But otherwise it's harmless.
//
+#ifdef __GNUC__
return (GET_GS() != 0);
+#else
+ return false;
+#endif
}
}
#endif // AMD64
--- a/hotspot/src/share/vm/c1/c1_LIR.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/c1/c1_LIR.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -105,7 +105,7 @@
LIR_Address::Scale LIR_Address::scale(BasicType type) {
- int elem_size = type2aelembytes[type];
+ int elem_size = type2aelembytes(type);
switch (elem_size) {
case 1: return LIR_Address::times_1;
case 2: return LIR_Address::times_2;
--- a/hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -104,7 +104,7 @@
};
void BCEscapeAnalyzer::set_returned(ArgumentMap vars) {
- for (int i = 0; i <= _arg_size; i++) {
+ for (int i = 0; i < _arg_size; i++) {
if (vars.contains(i))
_arg_returned.set_bit(i);
}
@@ -112,10 +112,9 @@
_return_allocated = _return_allocated && vars.contains_allocated() && !(vars.contains_unknown() || vars.contains_vars());
}
-
// return true if any element of vars is an argument
bool BCEscapeAnalyzer::is_argument(ArgumentMap vars) {
- for (int i = 0; i <= _arg_size; i++) {
+ for (int i = 0; i < _arg_size; i++) {
if (vars.contains(i))
return true;
}
@@ -126,7 +125,7 @@
bool BCEscapeAnalyzer::is_arg_stack(ArgumentMap vars){
if (_conservative)
return true;
- for (int i = 0; i <= _arg_size; i++) {
+ for (int i = 0; i < _arg_size; i++) {
if (vars.contains(i) && _arg_stack.at(i))
return true;
}
@@ -134,12 +133,13 @@
}
void BCEscapeAnalyzer::clear_bits(ArgumentMap vars, BitMap &bm) {
- for (int i = 0; i <= _arg_size; i++) {
+ for (int i = 0; i < _arg_size; i++) {
if (vars.contains(i)) {
bm.clear_bit(i);
}
}
}
+
void BCEscapeAnalyzer::set_method_escape(ArgumentMap vars) {
clear_bits(vars, _arg_local);
}
@@ -155,6 +155,17 @@
clear_bits(vars, _dirty);
}
+void BCEscapeAnalyzer::set_modified(ArgumentMap vars, int offs, int size) {
+
+ for (int i = 0; i < _arg_size; i++) {
+ if (vars.contains(i)) {
+ set_arg_modified(i, offs, size);
+ }
+ }
+ if (vars.contains_unknown())
+ _unknown_modified = true;
+}
+
bool BCEscapeAnalyzer::is_recursive_call(ciMethod* callee) {
for (BCEscapeAnalyzer* scope = this; scope != NULL; scope = scope->_parent) {
if (scope->method() == callee) {
@@ -164,6 +175,40 @@
return false;
}
+bool BCEscapeAnalyzer::is_arg_modified(int arg, int offset, int size_in_bytes) {
+ if (offset == OFFSET_ANY)
+ return _arg_modified[arg] != 0;
+ assert(arg >= 0 && arg < _arg_size, "must be an argument.");
+ bool modified = false;
+ int l = offset / HeapWordSize;
+ int h = round_to(offset + size_in_bytes, HeapWordSize) / HeapWordSize;
+ if (l > ARG_OFFSET_MAX)
+ l = ARG_OFFSET_MAX;
+ if (h > ARG_OFFSET_MAX+1)
+ h = ARG_OFFSET_MAX + 1;
+ for (int i = l; i < h; i++) {
+ modified = modified || (_arg_modified[arg] & (1 << i)) != 0;
+ }
+ return modified;
+}
+
+void BCEscapeAnalyzer::set_arg_modified(int arg, int offset, int size_in_bytes) {
+ if (offset == OFFSET_ANY) {
+ _arg_modified[arg] = (uint) -1;
+ return;
+ }
+ assert(arg >= 0 && arg < _arg_size, "must be an argument.");
+ int l = offset / HeapWordSize;
+ int h = round_to(offset + size_in_bytes, HeapWordSize) / HeapWordSize;
+ if (l > ARG_OFFSET_MAX)
+ l = ARG_OFFSET_MAX;
+ if (h > ARG_OFFSET_MAX+1)
+ h = ARG_OFFSET_MAX + 1;
+ for (int i = l; i < h; i++) {
+ _arg_modified[arg] |= (1 << i);
+ }
+}
+
void BCEscapeAnalyzer::invoke(StateInfo &state, Bytecodes::Code code, ciMethod* target, ciKlass* holder) {
int i;
@@ -197,6 +242,7 @@
for (i = 0; i < arg_size; i++) {
set_method_escape(state.raw_pop());
}
+ _unknown_modified = true; // assume the worst since we don't analyze the called method
return;
}
@@ -224,6 +270,11 @@
ArgumentMap arg = state.raw_pop();
if (!is_argument(arg))
continue;
+ for (int j = 0; j < _arg_size; j++) {
+ if (arg.contains(j)) {
+ _arg_modified[j] |= analyzer._arg_modified[i];
+ }
+ }
if (!is_arg_stack(arg)) {
// arguments have already been recognized as escaping
} else if (analyzer.is_arg_stack(i) && !analyzer.is_arg_returned(i)) {
@@ -233,6 +284,7 @@
set_global_escape(arg);
}
}
+ _unknown_modified = _unknown_modified || analyzer.has_non_arg_side_affects();
// record dependencies if at least one parameter retained stack-allocatable
if (must_record_dependencies) {
@@ -250,8 +302,10 @@
ArgumentMap arg = state.raw_pop();
if (!is_argument(arg))
continue;
+ set_modified(arg, OFFSET_ANY, type2size[T_INT]*HeapWordSize);
set_global_escape(arg);
}
+ _unknown_modified = true; // assume the worst since we don't know the called method
}
}
@@ -421,6 +475,7 @@
state.spop();
ArgumentMap arr = state.apop();
set_method_escape(arr);
+ set_modified(arr, OFFSET_ANY, type2size[T_INT]*HeapWordSize);
break;
}
case Bytecodes::_lastore:
@@ -430,6 +485,7 @@
state.spop();
ArgumentMap arr = state.apop();
set_method_escape(arr);
+ set_modified(arr, OFFSET_ANY, type2size[T_LONG]*HeapWordSize);
break;
}
case Bytecodes::_aastore:
@@ -437,6 +493,7 @@
set_global_escape(state.apop());
state.spop();
ArgumentMap arr = state.apop();
+ set_modified(arr, OFFSET_ANY, type2size[T_OBJECT]*HeapWordSize);
break;
}
case Bytecodes::_pop:
@@ -762,6 +819,7 @@
if (s.cur_bc() != Bytecodes::_putstatic) {
ArgumentMap p = state.apop();
set_method_escape(p);
+ set_modified(p, will_link ? field->offset() : OFFSET_ANY, type2size[field_type]*HeapWordSize);
}
}
break;
@@ -872,7 +930,7 @@
}
void BCEscapeAnalyzer::merge_block_states(StateInfo *blockstates, ciBlock *dest, StateInfo *s_state) {
- StateInfo *d_state = blockstates+dest->index();
+ StateInfo *d_state = blockstates + dest->index();
int nlocals = _method->max_locals();
// exceptions may cause transfer of control to handlers in the middle of a
@@ -916,6 +974,7 @@
}
for (int i = 0; i < s_state->_stack_height; i++) {
ArgumentMap t;
+ //extra_vars |= !d_state->_vars[i] & s_state->_vars[i];
t.clear();
t = s_state->_stack[i];
t.set_difference(d_state->_stack[i]);
@@ -933,7 +992,7 @@
int datacount = (numblocks + 1) * (stkSize + numLocals);
int datasize = datacount * sizeof(ArgumentMap);
- StateInfo *blockstates = (StateInfo *) arena->Amalloc(_methodBlocks->num_blocks() * sizeof(StateInfo));
+ StateInfo *blockstates = (StateInfo *) arena->Amalloc(numblocks * sizeof(StateInfo));
ArgumentMap *statedata = (ArgumentMap *) arena->Amalloc(datasize);
for (int i = 0; i < datacount; i++) ::new ((void*)&statedata[i]) ArgumentMap();
ArgumentMap *dp = statedata;
@@ -961,33 +1020,35 @@
ArgumentMap allVars; // all oop arguments to method
ciSignature* sig = method()->signature();
int j = 0;
+ ciBlock* first_blk = _methodBlocks->block_containing(0);
+ int fb_i = first_blk->index();
if (!method()->is_static()) {
// record information for "this"
- blockstates[0]._vars[j].set(j);
+ blockstates[fb_i]._vars[j].set(j);
allVars.add(j);
j++;
}
for (int i = 0; i < sig->count(); i++) {
ciType* t = sig->type_at(i);
if (!t->is_primitive_type()) {
- blockstates[0]._vars[j].set(j);
+ blockstates[fb_i]._vars[j].set(j);
allVars.add(j);
}
j += t->size();
}
- blockstates[0]._initialized = true;
+ blockstates[fb_i]._initialized = true;
assert(j == _arg_size, "just checking");
ArgumentMap unknown_map;
unknown_map.add_unknown();
- worklist.push(_methodBlocks->block_containing(0));
+ worklist.push(first_blk);
while(worklist.length() > 0) {
ciBlock *blk = worklist.pop();
- StateInfo *blkState = blockstates+blk->index();
+ StateInfo *blkState = blockstates + blk->index();
if (blk->is_handler() || blk->is_ret_target()) {
// for an exception handler or a target of a ret instruction, we assume the worst case,
- // that any variable or stack slot could contain any argument
+ // that any variable could contain any argument
for (int i = 0; i < numLocals; i++) {
state._vars[i] = allVars;
}
@@ -997,6 +1058,7 @@
state._stack_height = blkState->_stack_height;
}
for (int i = 0; i < state._stack_height; i++) {
+// ??? should this be unknown_map ???
state._stack[i] = allVars;
}
} else {
@@ -1053,6 +1115,7 @@
vmIntrinsics::ID iid = method()->intrinsic_id();
if (iid == vmIntrinsics::_getClass ||
+ iid == vmIntrinsics::_fillInStackTrace ||
iid == vmIntrinsics::_hashCode)
return iid;
else
@@ -1060,12 +1123,16 @@
}
bool BCEscapeAnalyzer::compute_escape_for_intrinsic(vmIntrinsics::ID iid) {
- ArgumentMap empty;
- empty.clear();
+ ArgumentMap arg;
+ arg.clear();
switch (iid) {
case vmIntrinsics::_getClass:
_return_local = false;
break;
+ case vmIntrinsics::_fillInStackTrace:
+ arg.set(0); // 'this'
+ set_returned(arg);
+ break;
case vmIntrinsics::_hashCode:
// initialized state is correct
break;
@@ -1109,15 +1176,21 @@
_return_allocated = true;
}
_allocated_escapes = false;
+ _unknown_modified = false;
}
void BCEscapeAnalyzer::clear_escape_info() {
ciSignature* sig = method()->signature();
int arg_count = sig->count();
ArgumentMap var;
+ if (!method()->is_static()) {
+ arg_count++; // allow for "this"
+ }
for (int i = 0; i < arg_count; i++) {
+ set_arg_modified(i, OFFSET_ANY, 4);
var.clear();
var.set(i);
+ set_modified(var, OFFSET_ANY, 4);
set_global_escape(var);
}
_arg_local.clear();
@@ -1126,6 +1199,7 @@
_return_local = false;
_return_allocated = false;
_allocated_escapes = true;
+ _unknown_modified = true;
}
@@ -1173,8 +1247,14 @@
initialize();
- // do not scan method if it has no object parameters
- if (_arg_local.is_empty()) {
+ // Do not scan method if it has no object parameters and
+ // does not returns an object (_return_allocated is set in initialize()).
+ if (_arg_local.is_empty() && !_return_allocated) {
+ // Clear all info since method's bytecode was not analysed and
+ // set pessimistic escape information.
+ clear_escape_info();
+ methodData()->set_eflag(methodDataOopDesc::allocated_escapes);
+ methodData()->set_eflag(methodDataOopDesc::unknown_modified);
methodData()->set_eflag(methodDataOopDesc::estimated);
return;
}
@@ -1185,36 +1265,8 @@
success = do_analysis();
}
- // dump result of bytecode analysis
-#ifndef PRODUCT
- if (BCEATraceLevel >= 3) {
- tty->print("[EA] estimated escape information for");
- if (iid != vmIntrinsics::_none)
- tty->print(" intrinsic");
- method()->print_short_name();
- tty->print_cr(has_dependencies() ? " (not stored)" : "");
- tty->print(" non-escaping args: ");
- _arg_local.print_on(tty);
- tty->print(" stack-allocatable args: ");
- _arg_stack.print_on(tty);
- if (_return_local) {
- tty->print(" returned args: ");
- _arg_returned.print_on(tty);
- } else if (is_return_allocated()) {
- tty->print_cr(" allocated return values");
- } else {
- tty->print_cr(" non-local return values");
- }
- tty->cr();
- tty->print(" flags: ");
- if (_return_allocated)
- tty->print(" return_allocated");
- tty->cr();
- }
-
-#endif
- // don't store interprocedural escape information if it introduces dependencies
- // or if method data is empty
+ // don't store interprocedural escape information if it introduces
+ // dependencies or if method data is empty
//
if (!has_dependencies() && !methodData()->is_empty()) {
for (i = 0; i < _arg_size; i++) {
@@ -1228,10 +1280,20 @@
if (_arg_returned.at(i)) {
methodData()->set_arg_returned(i);
}
+ methodData()->set_arg_modified(i, _arg_modified[i]);
}
if (_return_local) {
methodData()->set_eflag(methodDataOopDesc::return_local);
}
+ if (_return_allocated) {
+ methodData()->set_eflag(methodDataOopDesc::return_allocated);
+ }
+ if (_allocated_escapes) {
+ methodData()->set_eflag(methodDataOopDesc::allocated_escapes);
+ }
+ if (_unknown_modified) {
+ methodData()->set_eflag(methodDataOopDesc::unknown_modified);
+ }
methodData()->set_eflag(methodDataOopDesc::estimated);
}
}
@@ -1244,29 +1306,50 @@
_arg_local.at_put(i, methodData()->is_arg_local(i));
_arg_stack.at_put(i, methodData()->is_arg_stack(i));
_arg_returned.at_put(i, methodData()->is_arg_returned(i));
+ _arg_modified[i] = methodData()->arg_modified(i);
}
_return_local = methodData()->eflag_set(methodDataOopDesc::return_local);
-
- // dump result of loaded escape information
-#ifndef PRODUCT
- if (BCEATraceLevel >= 4) {
- tty->print(" non-escaping args: ");
- _arg_local.print_on(tty);
- tty->print(" stack-allocatable args: ");
- _arg_stack.print_on(tty);
- if (_return_local) {
- tty->print(" returned args: ");
- _arg_returned.print_on(tty);
- } else {
- tty->print_cr(" non-local return values");
- }
- tty->print(" modified args: ");
- tty->cr();
- }
-#endif
+ _return_allocated = methodData()->eflag_set(methodDataOopDesc::return_allocated);
+ _allocated_escapes = methodData()->eflag_set(methodDataOopDesc::allocated_escapes);
+ _unknown_modified = methodData()->eflag_set(methodDataOopDesc::unknown_modified);
}
+#ifndef PRODUCT
+void BCEscapeAnalyzer::dump() {
+ tty->print("[EA] estimated escape information for");
+ method()->print_short_name();
+ tty->print_cr(has_dependencies() ? " (not stored)" : "");
+ tty->print(" non-escaping args: ");
+ _arg_local.print_on(tty);
+ tty->print(" stack-allocatable args: ");
+ _arg_stack.print_on(tty);
+ if (_return_local) {
+ tty->print(" returned args: ");
+ _arg_returned.print_on(tty);
+ } else if (is_return_allocated()) {
+ tty->print_cr(" return allocated value");
+ } else {
+ tty->print_cr(" return non-local value");
+ }
+ tty->print(" modified args: ");
+ for (int i = 0; i < _arg_size; i++) {
+ if (_arg_modified[i] == 0)
+ tty->print(" 0");
+ else
+ tty->print(" 0x%x", _arg_modified[i]);
+ }
+ tty->cr();
+ tty->print(" flags: ");
+ if (_return_allocated)
+ tty->print(" return_allocated");
+ if (_allocated_escapes)
+ tty->print(" allocated_escapes");
+ if (_unknown_modified)
+ tty->print(" unknown_modified");
+ tty->cr();
+}
+#endif
BCEscapeAnalyzer::BCEscapeAnalyzer(ciMethod* method, BCEscapeAnalyzer* parent)
: _conservative(method == NULL || !EstimateArgEscape)
@@ -1281,6 +1364,7 @@
, _return_local(false)
, _return_allocated(false)
, _allocated_escapes(false)
+ , _unknown_modified(false)
, _dependencies()
, _parent(parent)
, _level(parent == NULL ? 0 : parent->level() + 1) {
@@ -1290,6 +1374,8 @@
_arg_returned.clear();
_dirty.clear();
Arena* arena = CURRENT_ENV->arena();
+ _arg_modified = (uint *) arena->Amalloc(_arg_size * sizeof(uint));
+ Copy::zero_to_bytes(_arg_modified, _arg_size * sizeof(uint));
if (methodData() == NULL)
return;
@@ -1307,6 +1393,12 @@
compute_escape_info();
methodData()->update_escape_info();
}
+#ifndef PRODUCT
+ if (BCEATraceLevel >= 3) {
+ // dump escape information
+ dump();
+ }
+#endif
}
}
--- a/hotspot/src/share/vm/ci/bcEscapeAnalyzer.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/ci/bcEscapeAnalyzer.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -46,10 +46,13 @@
BitMap _arg_stack;
BitMap _arg_returned;
BitMap _dirty;
+ enum{ ARG_OFFSET_MAX = 31};
+ uint *_arg_modified;
bool _return_local;
+ bool _return_allocated;
bool _allocated_escapes;
- bool _return_allocated;
+ bool _unknown_modified;
ciObjectList _dependencies;
@@ -80,6 +83,7 @@
void set_method_escape(ArgumentMap vars);
void set_global_escape(ArgumentMap vars);
void set_dirty(ArgumentMap vars);
+ void set_modified(ArgumentMap vars, int offs, int size);
bool is_recursive_call(ciMethod* callee);
void add_dependence(ciKlass *klass, ciMethod *meth);
@@ -140,6 +144,18 @@
return !_conservative && _return_allocated && !_allocated_escapes;
}
+ // Tracking of argument modification
+
+ enum {OFFSET_ANY = -1};
+ bool is_arg_modified(int arg, int offset, int size_in_bytes);
+ void set_arg_modified(int arg, int offset, int size_in_bytes);
+ bool has_non_arg_side_affects() { return _unknown_modified; }
+
// Copy dependencies from this analysis into "deps"
void copy_dependencies(Dependencies *deps);
+
+#ifndef PRODUCT
+ // dump escape information
+ void dump();
+#endif
};
--- a/hotspot/src/share/vm/ci/ciField.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/ci/ciField.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -102,7 +102,7 @@
BasicType layout_type() { return type2field[(_type == NULL) ? T_OBJECT : _type->basic_type()]; }
// How big is this field in memory?
- int size_in_bytes() { return type2aelembytes[layout_type()]; }
+ int size_in_bytes() { return type2aelembytes(layout_type()); }
// What is the offset of this field?
int offset() {
--- a/hotspot/src/share/vm/ci/ciInstanceKlass.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/ci/ciInstanceKlass.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -34,7 +34,9 @@
// ciInstanceKlass::ciInstanceKlass
//
// Loaded instance klass.
-ciInstanceKlass::ciInstanceKlass(KlassHandle h_k) : ciKlass(h_k) {
+ciInstanceKlass::ciInstanceKlass(KlassHandle h_k) :
+ ciKlass(h_k), _non_static_fields(NULL)
+{
assert(get_Klass()->oop_is_instance(), "wrong type");
instanceKlass* ik = get_instanceKlass();
@@ -335,6 +337,37 @@
return field;
}
+// ------------------------------------------------------------------
+// ciInstanceKlass::non_static_fields.
+
+class NonStaticFieldFiller: public FieldClosure {
+ GrowableArray<ciField*>* _arr;
+ ciEnv* _curEnv;
+public:
+ NonStaticFieldFiller(ciEnv* curEnv, GrowableArray<ciField*>* arr) :
+ _curEnv(curEnv), _arr(arr)
+ {}
+ void do_field(fieldDescriptor* fd) {
+ ciField* field = new (_curEnv->arena()) ciField(fd);
+ _arr->append(field);
+ }
+};
+
+GrowableArray<ciField*>* ciInstanceKlass::non_static_fields() {
+ if (_non_static_fields == NULL) {
+ VM_ENTRY_MARK;
+ ciEnv* curEnv = ciEnv::current();
+ instanceKlass* ik = get_instanceKlass();
+ int max_n_fields = ik->fields()->length()/instanceKlass::next_offset;
+
+ _non_static_fields =
+ new (curEnv->arena()) GrowableArray<ciField*>(max_n_fields);
+ NonStaticFieldFiller filler(curEnv, _non_static_fields);
+ ik->do_nonstatic_fields(&filler);
+ }
+ return _non_static_fields;
+}
+
static int sort_field_by_offset(ciField** a, ciField** b) {
return (*a)->offset_in_bytes() - (*b)->offset_in_bytes();
// (no worries about 32-bit overflow...)
--- a/hotspot/src/share/vm/ci/ciInstanceKlass.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/ci/ciInstanceKlass.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -46,6 +46,7 @@
bool _has_subklass;
ciFlags _flags;
jint _nonstatic_field_size;
+ jint _nonstatic_oop_map_size;
// Lazy fields get filled in only upon request.
ciInstanceKlass* _super;
@@ -58,6 +59,8 @@
ciInstanceKlass* _implementors[implementors_limit];
jint _nof_implementors;
+ GrowableArray<ciField*>* _non_static_fields;
+
protected:
ciInstanceKlass(KlassHandle h_k);
ciInstanceKlass(ciSymbol* name, jobject loader, jobject protection_domain);
@@ -129,6 +132,9 @@
jint nonstatic_field_size() {
assert(is_loaded(), "must be loaded");
return _nonstatic_field_size; }
+ jint nonstatic_oop_map_size() {
+ assert(is_loaded(), "must be loaded");
+ return _nonstatic_oop_map_size; }
ciInstanceKlass* super();
jint nof_implementors() {
assert(is_loaded(), "must be loaded");
@@ -138,6 +144,9 @@
ciInstanceKlass* get_canonical_holder(int offset);
ciField* get_field_by_offset(int field_offset, bool is_static);
+
+ GrowableArray<ciField*>* non_static_fields();
+
// total number of nonstatic fields (including inherited):
int nof_nonstatic_fields() {
if (_nonstatic_fields == NULL)
--- a/hotspot/src/share/vm/ci/ciMethod.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/ci/ciMethod.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -146,7 +146,7 @@
memcpy(_code, me->code_base(), code_size());
// Revert any breakpoint bytecodes in ci's copy
- if (_is_compilable && me->number_of_breakpoints() > 0) {
+ if (me->number_of_breakpoints() > 0) {
BreakpointInfo* bp = instanceKlass::cast(me->method_holder())->breakpoints();
for (; bp != NULL; bp = bp->next()) {
if (bp->match(me)) {
--- a/hotspot/src/share/vm/ci/ciMethodBlocks.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/ci/ciMethodBlocks.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -67,6 +67,14 @@
break;
}
}
+ // Move an exception handler information if needed.
+ if (former_block->is_handler()) {
+ int ex_start = former_block->ex_start_bci();
+ int ex_end = former_block->ex_limit_bci();
+ new_block->set_exception_range(ex_start, ex_end);
+ // Clear information in former_block.
+ former_block->clear_exception_handler();
+ }
return former_block;
}
@@ -102,7 +110,7 @@
// one and end the old one.
assert(cur_block != NULL, "must always have a current block");
ciBlock *new_block = block_containing(bci);
- if (new_block == NULL) {
+ if (new_block == NULL || new_block == cur_block) {
// We have not marked this bci as the start of a new block.
// Keep interpreting the current_range.
_bci_to_block[bci] = cur_block;
@@ -254,9 +262,33 @@
for(ciExceptionHandlerStream str(meth); !str.is_done(); str.next()) {
ciExceptionHandler* handler = str.handler();
ciBlock *eb = make_block_at(handler->handler_bci());
- eb->set_handler();
+ //
+ // Several exception handlers can have the same handler_bci:
+ //
+ // try {
+ // if (a.foo(b) < 0) {
+ // return a.error();
+ // }
+ // return CoderResult.UNDERFLOW;
+ // } finally {
+ // a.position(b);
+ // }
+ //
+ // The try block above is divided into 2 exception blocks
+ // separated by 'areturn' bci.
+ //
int ex_start = handler->start();
int ex_end = handler->limit();
+ if (eb->is_handler()) {
+ // Extend old handler exception range to cover additional range.
+ int old_ex_start = eb->ex_start_bci();
+ int old_ex_end = eb->ex_limit_bci();
+ if (ex_start > old_ex_start)
+ ex_start = old_ex_start;
+ if (ex_end < old_ex_end)
+ ex_end = old_ex_end;
+ eb->clear_exception_handler(); // Reset exception information
+ }
eb->set_exception_range(ex_start, ex_end);
// ensure a block at the start of exception range and start of following code
(void) make_block_at(ex_start);
@@ -312,9 +344,10 @@
void ciBlock::set_exception_range(int start_bci, int limit_bci) {
assert(limit_bci >= start_bci, "valid range");
- assert(is_handler(), "must be handler");
+ assert(!is_handler() && _ex_start_bci == -1 && _ex_limit_bci == -1, "must not be handler");
_ex_start_bci = start_bci;
_ex_limit_bci = limit_bci;
+ set_handler();
}
#ifndef PRODUCT
--- a/hotspot/src/share/vm/ci/ciMethodBlocks.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/ci/ciMethodBlocks.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -110,9 +110,10 @@
void set_does_jsr() { _flags |= DoesJsr; }
void clear_does_jsr() { _flags &= ~DoesJsr; }
void set_does_ret() { _flags |= DoesRet; }
- void clear_does_ret() { _flags |= DoesRet; }
+ void clear_does_ret() { _flags &= ~DoesRet; }
void set_is_ret_target() { _flags |= RetTarget; }
void set_has_handler() { _flags |= HasHandler; }
+ void clear_exception_handler() { _flags &= ~Handler; _ex_start_bci = -1; _ex_limit_bci = -1; }
#ifndef PRODUCT
ciMethod *method() const { return _method; }
void dump();
--- a/hotspot/src/share/vm/ci/ciMethodData.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/ci/ciMethodData.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -42,6 +42,8 @@
// Set an initial hint. Don't use set_hint_di() because
// first_di() may be out of bounds if data_size is 0.
_hint_di = first_di();
+ // Initialize the escape information (to "don't know.");
+ _eflags = _arg_local = _arg_stack = _arg_returned = 0;
}
// ------------------------------------------------------------------
@@ -59,6 +61,8 @@
// Set an initial hint. Don't use set_hint_di() because
// first_di() may be out of bounds if data_size is 0.
_hint_di = first_di();
+ // Initialize the escape information (to "don't know.");
+ _eflags = _arg_local = _arg_stack = _arg_returned = 0;
}
void ciMethodData::load_data() {
@@ -142,6 +146,8 @@
return new ciBranchData(data_layout);
case DataLayout::multi_branch_data_tag:
return new ciMultiBranchData(data_layout);
+ case DataLayout::arg_info_data_tag:
+ return new ciArgInfoData(data_layout);
};
}
@@ -172,6 +178,9 @@
_saw_free_extra_data = true; // observed an empty slot (common case)
return NULL;
}
+ if (dp->tag() == DataLayout::arg_info_data_tag) {
+ break; // ArgInfoData is at the end of extra data section.
+ }
if (dp->bci() == bci) {
assert(dp->tag() == DataLayout::bit_data_tag, "sane");
return new ciBitData(dp);
@@ -217,8 +226,14 @@
void ciMethodData::clear_escape_info() {
VM_ENTRY_MARK;
methodDataOop mdo = get_methodDataOop();
- if (mdo != NULL)
+ if (mdo != NULL) {
mdo->clear_escape_info();
+ ArgInfoData *aid = arg_info();
+ int arg_count = (aid == NULL) ? 0 : aid->number_of_args();
+ for (int i = 0; i < arg_count; i++) {
+ set_arg_modified(i, 0);
+ }
+ }
_eflags = _arg_local = _arg_stack = _arg_returned = 0;
}
@@ -231,6 +246,10 @@
mdo->set_arg_local(_arg_local);
mdo->set_arg_stack(_arg_stack);
mdo->set_arg_returned(_arg_returned);
+ int arg_count = mdo->method()->size_of_parameters();
+ for (int i = 0; i < arg_count; i++) {
+ mdo->set_arg_modified(i, arg_modified(i));
+ }
}
}
@@ -262,6 +281,14 @@
set_nth_bit(_arg_returned, i);
}
+void ciMethodData::set_arg_modified(int arg, uint val) {
+ ArgInfoData *aid = arg_info();
+ if (aid == NULL)
+ return;
+ assert(arg >= 0 && arg < aid->number_of_args(), "valid argument number");
+ aid->set_arg_modified(arg, val);
+}
+
bool ciMethodData::is_arg_local(int i) const {
return is_set_nth_bit(_arg_local, i);
}
@@ -274,6 +301,14 @@
return is_set_nth_bit(_arg_returned, i);
}
+uint ciMethodData::arg_modified(int arg) const {
+ ArgInfoData *aid = arg_info();
+ if (aid == NULL)
+ return 0;
+ assert(arg >= 0 && arg < aid->number_of_args(), "valid argument number");
+ return aid->arg_modified(arg);
+}
+
ByteSize ciMethodData::offset_of_slot(ciProfileData* data, ByteSize slot_offset_in_data) {
// Get offset within methodDataOop of the data array
ByteSize data_offset = methodDataOopDesc::data_offset();
@@ -287,6 +322,18 @@
return in_ByteSize(offset);
}
+ciArgInfoData *ciMethodData::arg_info() const {
+ // Should be last, have to skip all traps.
+ DataLayout* dp = data_layout_at(data_size());
+ DataLayout* end = data_layout_at(data_size() + extra_data_size());
+ for (; dp < end; dp = methodDataOopDesc::next_extra(dp)) {
+ if (dp->tag() == DataLayout::arg_info_data_tag)
+ return new ciArgInfoData(dp);
+ }
+ return NULL;
+}
+
+
// Implementation of the print method.
void ciMethodData::print_impl(outputStream* st) {
ciObject::print_impl(st);
@@ -305,6 +352,22 @@
st->fill_to(6);
data->print_data_on(st);
}
+ st->print_cr("--- Extra data:");
+ DataLayout* dp = data_layout_at(data_size());
+ DataLayout* end = data_layout_at(data_size() + extra_data_size());
+ for (; dp < end; dp = methodDataOopDesc::next_extra(dp)) {
+ if (dp->tag() == DataLayout::no_tag) continue;
+ if (dp->tag() == DataLayout::bit_data_tag) {
+ data = new BitData(dp);
+ } else {
+ assert(dp->tag() == DataLayout::arg_info_data_tag, "must be BitData or ArgInfo");
+ data = new ciArgInfoData(dp);
+ dp = end; // ArgInfoData is at the end of extra data section.
+ }
+ st->print("%d", dp_to_di(data->dp()));
+ st->fill_to(6);
+ data->print_data_on(st);
+ }
}
void ciReceiverTypeData::print_receiver_data_on(outputStream* st) {
--- a/hotspot/src/share/vm/ci/ciMethodData.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/ci/ciMethodData.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -30,6 +30,7 @@
class ciBranchData;
class ciArrayData;
class ciMultiBranchData;
+class ciArgInfoData;
typedef ProfileData ciProfileData;
@@ -121,6 +122,11 @@
ciMultiBranchData(DataLayout* layout) : MultiBranchData(layout) {};
};
+class ciArgInfoData : public ArgInfoData {
+public:
+ ciArgInfoData(DataLayout* layout) : ArgInfoData(layout) {};
+};
+
// ciMethodData
//
// This class represents a methodDataOop in the HotSpot virtual
@@ -163,9 +169,9 @@
ciMethodData();
// Accessors
- int data_size() { return _data_size; }
- int extra_data_size() { return _extra_data_size; }
- intptr_t * data() { return _data; }
+ int data_size() const { return _data_size; }
+ int extra_data_size() const { return _extra_data_size; }
+ intptr_t * data() const { return _data; }
methodDataOop get_methodDataOop() const {
if (handle() == NULL) return NULL;
@@ -178,7 +184,7 @@
void print_impl(outputStream* st);
- DataLayout* data_layout_at(int data_index) {
+ DataLayout* data_layout_at(int data_index) const {
assert(data_index % sizeof(intptr_t) == 0, "unaligned");
return (DataLayout*) (((address)_data) + data_index);
}
@@ -207,6 +213,8 @@
// What is the index of the first data entry?
int first_di() { return 0; }
+ ciArgInfoData *arg_info() const;
+
public:
bool is_method_data() { return true; }
bool is_empty() { return _state == empty_state; }
@@ -270,10 +278,12 @@
void set_arg_local(int i);
void set_arg_stack(int i);
void set_arg_returned(int i);
+ void set_arg_modified(int arg, uint val);
bool is_arg_local(int i) const;
bool is_arg_stack(int i) const;
bool is_arg_returned(int i) const;
+ uint arg_modified(int arg) const;
// Code generation helper
ByteSize offset_of_slot(ciProfileData* data, ByteSize slot_offset_in_data);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/ci/ciObjArray.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,43 @@
+/*
+ * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_ciObjArray.cpp.incl"
+
+// ciObjArray
+//
+// This class represents an objArrayOop in the HotSpot virtual
+// machine.
+
+ciObject* ciObjArray::obj_at(int index) {
+ VM_ENTRY_MARK;
+ objArrayOop array = get_objArrayOop();
+ if (index < 0 || index >= array->length()) return NULL;
+ oop o = array->obj_at(index);
+ if (o == NULL) {
+ return ciNullObject::make();
+ } else {
+ return CURRENT_ENV->get_object(o);
+ }
+}
--- a/hotspot/src/share/vm/ci/ciObjArray.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/ci/ciObjArray.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -43,4 +43,6 @@
public:
// What kind of ciObject is this?
bool is_obj_array() { return true; }
+
+ ciObject* obj_at(int index);
};
--- a/hotspot/src/share/vm/classfile/dictionary.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/classfile/dictionary.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -155,8 +155,8 @@
for (int i = ik->previous_versions()->length() - 1; i >= 0; i--) {
// check the previous versions array for GC'ed weak refs
PreviousVersionNode * pv_node = ik->previous_versions()->at(i);
- jweak cp_ref = pv_node->prev_constant_pool();
- assert(cp_ref != NULL, "weak cp ref was unexpectedly cleared");
+ jobject cp_ref = pv_node->prev_constant_pool();
+ assert(cp_ref != NULL, "cp ref was unexpectedly cleared");
if (cp_ref == NULL) {
delete pv_node;
ik->previous_versions()->remove_at(i);
--- a/hotspot/src/share/vm/classfile/javaClasses.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/classfile/javaClasses.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -143,13 +143,43 @@
jstring js = NULL;
{ JavaThread* thread = (JavaThread*)THREAD;
assert(thread->is_Java_thread(), "must be java thread");
+ HandleMark hm(thread);
ThreadToNativeFromVM ttn(thread);
- HandleMark hm(thread);
js = (_to_java_string_fn)(thread->jni_environment(), str);
}
return Handle(THREAD, JNIHandles::resolve(js));
}
+// Converts a Java String to a native C string that can be used for
+// native OS calls.
+char* java_lang_String::as_platform_dependent_str(Handle java_string, TRAPS) {
+
+ typedef char* (*to_platform_string_fn_t)(JNIEnv*, jstring, bool*);
+ static to_platform_string_fn_t _to_platform_string_fn = NULL;
+
+ if (_to_platform_string_fn == NULL) {
+ void *lib_handle = os::native_java_library();
+ _to_platform_string_fn = CAST_TO_FN_PTR(to_platform_string_fn_t, hpi::dll_lookup(lib_handle, "GetStringPlatformChars"));
+ if (_to_platform_string_fn == NULL) {
+ fatal("GetStringPlatformChars missing");
+ }
+ }
+
+ char *native_platform_string;
+ { JavaThread* thread = (JavaThread*)THREAD;
+ assert(thread->is_Java_thread(), "must be java thread");
+ JNIEnv *env = thread->jni_environment();
+ jstring js = (jstring) JNIHandles::make_local(env, java_string());
+ bool is_copy;
+ HandleMark hm(thread);
+ ThreadToNativeFromVM ttn(thread);
+ native_platform_string = (_to_platform_string_fn)(env, js, &is_copy);
+ assert(is_copy == JNI_TRUE, "is_copy value changed");
+ JNIHandles::destroy_local(js);
+ }
+ return native_platform_string;
+}
+
Handle java_lang_String::char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS) {
oop obj = java_string();
// Typical usage is to convert all '/' to '.' in string.
--- a/hotspot/src/share/vm/classfile/javaClasses.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/classfile/javaClasses.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -96,6 +96,7 @@
// String converters
static char* as_utf8_string(oop java_string);
static char* as_utf8_string(oop java_string, int start, int len);
+ static char* as_platform_dependent_str(Handle java_string, TRAPS);
static jchar* as_unicode_string(oop java_string, int& length);
static bool equals(oop java_string, jchar* chars, int len);
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -1242,7 +1242,9 @@
oop obj = (oop) result.get_jobject();
if (obj == NULL) { return nk; }
- char* new_class_name = java_lang_String::as_utf8_string(obj);
+ Handle h_obj(THREAD, obj);
+ char* new_class_name = java_lang_String::as_platform_dependent_str(h_obj,
+ CHECK_(nk));
// lock the loader
// we use this lock because JVMTI does.
--- a/hotspot/src/share/vm/classfile/vmSymbols.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/classfile/vmSymbols.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -318,6 +318,11 @@
const int neg = JVM_ACC_SYNCHRONIZED;
return (flags & (req | neg)) == req;
}
+inline bool match_F_RNY(jshort flags) {
+ const int req = JVM_ACC_NATIVE | JVM_ACC_SYNCHRONIZED;
+ const int neg = JVM_ACC_STATIC;
+ return (flags & (req | neg)) == req;
+}
// These are for forming case labels:
#define ID3(x, y, z) (( jint)(z) + \
@@ -359,6 +364,7 @@
case F_RN: fname = "native "; break;
case F_SN: fname = "native static "; break;
case F_S: fname = "static "; break;
+ case F_RNY:fname = "native synchronized "; break;
}
const char* kptr = strrchr(kname, '/');
if (kptr != NULL) kname = kptr + 1;
@@ -485,7 +491,7 @@
if (PrintMiscellaneous && (WizardMode || Verbose)) {
tty->print_cr("*** misidentified method; %s(%d) should be %s(%d):",
declared_name, declared_id, actual_name, actual_id);
- m->print_short_name(tty);
+ mh()->print_short_name(tty);
tty->cr();
}
}
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -58,12 +58,17 @@
template(java_lang_ThreadDeath, "java/lang/ThreadDeath") \
template(java_lang_Boolean, "java/lang/Boolean") \
template(java_lang_Character, "java/lang/Character") \
+ template(java_lang_Character_CharacterCache, "java/lang/Character$CharacterCache") \
template(java_lang_Float, "java/lang/Float") \
template(java_lang_Double, "java/lang/Double") \
template(java_lang_Byte, "java/lang/Byte") \
+ template(java_lang_Byte_Cache, "java/lang/Byte$ByteCache") \
template(java_lang_Short, "java/lang/Short") \
+ template(java_lang_Short_ShortCache, "java/lang/Short$ShortCache") \
template(java_lang_Integer, "java/lang/Integer") \
+ template(java_lang_Integer_IntegerCache, "java/lang/Integer$IntegerCache") \
template(java_lang_Long, "java/lang/Long") \
+ template(java_lang_Long_LongCache, "java/lang/Long$LongCache") \
template(java_lang_Shutdown, "java/lang/Shutdown") \
template(java_lang_ref_Reference, "java/lang/ref/Reference") \
template(java_lang_ref_SoftReference, "java/lang/ref/SoftReference") \
@@ -91,10 +96,11 @@
template(java_util_Vector, "java/util/Vector") \
template(java_util_AbstractList, "java/util/AbstractList") \
template(java_util_Hashtable, "java/util/Hashtable") \
+ template(java_util_HashMap, "java/util/HashMap") \
template(java_lang_Compiler, "java/lang/Compiler") \
template(sun_misc_Signal, "sun/misc/Signal") \
template(java_lang_AssertionStatusDirectives, "java/lang/AssertionStatusDirectives") \
- template(sun_jkernel_DownloadManager, "sun/jkernel/DownloadManager") \
+ template(sun_jkernel_DownloadManager, "sun/jkernel/DownloadManager") \
template(getBootClassPathEntryForClass_name, "getBootClassPathEntryForClass") \
\
/* class file format tags */ \
@@ -274,7 +280,9 @@
template(exclusive_owner_thread_name, "exclusiveOwnerThread") \
template(park_blocker_name, "parkBlocker") \
template(park_event_name, "nativeParkEventPointer") \
+ template(cache_field_name, "cache") \
template(value_name, "value") \
+ template(frontCacheEnabled_name, "frontCacheEnabled") \
\
/* non-intrinsic name/signature pairs: */ \
template(register_method_name, "register") \
@@ -576,6 +584,8 @@
do_name( attemptUpdate_name, "attemptUpdate") \
do_signature(attemptUpdate_signature, "(JJ)Z") \
\
+ do_intrinsic(_fillInStackTrace, java_lang_Throwable, fillInStackTrace_name, void_throwable_signature, F_RNY) \
+ \
/* support for sun.misc.Unsafe */ \
do_class(sun_misc_Unsafe, "sun/misc/Unsafe") \
\
@@ -863,7 +873,8 @@
F_R, // !static !synchronized (R="regular")
F_S, // static !synchronized
F_RN, // !static native !synchronized
- F_SN // static native !synchronized
+ F_SN, // static native !synchronized
+ F_RNY // !static native synchronized
};
public:
--- a/hotspot/src/share/vm/code/debugInfo.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/code/debugInfo.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -47,7 +47,8 @@
}
#endif
ObjectValue* result = new ObjectValue(id);
- _obj_pool->append(result);
+ // Cache the object since an object field could reference it.
+ _obj_pool->push(result);
result->read_object(this);
return result;
}
@@ -56,9 +57,9 @@
int id = read_int();
assert(_obj_pool != NULL, "object pool does not exist");
for (int i = _obj_pool->length() - 1; i >= 0; i--) {
- ObjectValue* sv = (ObjectValue*) _obj_pool->at(i);
- if (sv->id() == id) {
- return sv;
+ ObjectValue* ov = (ObjectValue*) _obj_pool->at(i);
+ if (ov->id() == id) {
+ return ov;
}
}
ShouldNotReachHere();
--- a/hotspot/src/share/vm/code/dependencies.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/code/dependencies.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -882,6 +882,14 @@
// Must not move the class hierarchy during this check:
assert_locked_or_safepoint(Compile_lock);
+ int nof_impls = instanceKlass::cast(context_type)->nof_implementors();
+ if (nof_impls > 1) {
+ // Avoid this case: *I.m > { A.m, C }; B.m > C
+ // %%% Until this is fixed more systematically, bail out.
+ // See corresponding comment in find_witness_anywhere.
+ return context_type;
+ }
+
assert(!is_participant(new_type), "only old classes are participants");
if (participants_hide_witnesses) {
// If the new type is a subtype of a participant, we are done.
@@ -1491,9 +1499,12 @@
// fall through:
_change_type = Change_new_sub;
case Change_new_sub:
- _klass = instanceKlass::cast(_klass)->super();
- if (_klass != NULL) {
- return true;
+ // 6598190: brackets workaround Sun Studio C++ compiler bug 6629277
+ {
+ _klass = instanceKlass::cast(_klass)->super();
+ if (_klass != NULL) {
+ return true;
+ }
}
// else set up _ti_limit and fall through:
_ti_limit = (_ti_base == NULL) ? 0 : _ti_base->length();
--- a/hotspot/src/share/vm/code/nmethod.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/code/nmethod.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -1971,7 +1971,7 @@
if (ctxk != NULL) {
Klass* k = Klass::cast(ctxk);
if (k->oop_is_instance() && ((instanceKlass*)k)->is_dependent_nmethod(this)) {
- tty->print(" [nmethod<=klass]%s", k->external_name());
+ tty->print_cr(" [nmethod<=klass]%s", k->external_name());
}
}
deps.log_dependency(); // put it into the xml log also
--- a/hotspot/src/share/vm/code/scopeDesc.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/code/scopeDesc.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -91,7 +91,9 @@
DebugInfoReadStream* stream = new DebugInfoReadStream(_code, decode_offset, result);
int length = stream->read_int();
for (int index = 0; index < length; index++) {
- result->push(ScopeValue::read_from(stream));
+ // Objects values are pushed to 'result' array during read so that
+ // object's fields could reference it (OBJECT_ID_CODE).
+ (void)ScopeValue::read_from(stream);
}
assert(result->length() == length, "inconsistent debug information");
return result;
--- a/hotspot/src/share/vm/code/vmreg.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/code/vmreg.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -36,16 +36,16 @@
// Register names
const char *VMRegImpl::regName[ConcreteRegisterImpl::number_of_registers];
-void VMRegImpl::print() {
#ifndef PRODUCT
+void VMRegImpl::print_on(outputStream* st) const {
if( is_reg() ) {
assert( VMRegImpl::regName[value()], "" );
- tty->print("%s",VMRegImpl::regName[value()]);
+ st->print("%s",VMRegImpl::regName[value()]);
} else if (is_stack()) {
int stk = value() - stack0->value();
- tty->print("[%d]", stk*4);
+ st->print("[%d]", stk*4);
} else {
- tty->print("BAD!");
+ st->print("BAD!");
}
+}
#endif // PRODUCT
-}
--- a/hotspot/src/share/vm/code/vmreg.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/code/vmreg.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -66,9 +66,9 @@
}
}
static VMReg Bad() { return (VMReg) (intptr_t) BAD; }
- bool is_valid() { return ((intptr_t) this) != BAD; }
- bool is_stack() { return (intptr_t) this >= (intptr_t) stack0; }
- bool is_reg() { return is_valid() && !is_stack(); }
+ bool is_valid() const { return ((intptr_t) this) != BAD; }
+ bool is_stack() const { return (intptr_t) this >= (intptr_t) stack0; }
+ bool is_reg() const { return is_valid() && !is_stack(); }
// A concrete register is a value that returns true for is_reg() and is
// also a register you could use in the assembler. On machines with
@@ -96,7 +96,8 @@
intptr_t value() const {return (intptr_t) this; }
- void print();
+ void print_on(outputStream* st) const PRODUCT_RETURN;
+ void print() const { print_on(tty); }
// bias a stack slot.
// Typically used to adjust a virtual frame slots by amounts that are offset by
--- a/hotspot/src/share/vm/compiler/oopMap.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/compiler/oopMap.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -506,27 +506,27 @@
}
-void print_register_type(OopMapValue::oop_types x, VMReg optional) {
+static void print_register_type(OopMapValue::oop_types x, VMReg optional, outputStream* st) {
switch( x ) {
case OopMapValue::oop_value:
- tty->print("Oop");
+ st->print("Oop");
break;
case OopMapValue::value_value:
- tty->print("Value" );
+ st->print("Value" );
break;
case OopMapValue::dead_value:
- tty->print("Dead" );
+ st->print("Dead" );
break;
case OopMapValue::callee_saved_value:
- tty->print("Callers_" );
- optional->print();
+ st->print("Callers_" );
+ optional->print_on(st);
break;
case OopMapValue::derived_oop_value:
- tty->print("Derived_oop_" );
- optional->print();
+ st->print("Derived_oop_" );
+ optional->print_on(st);
break;
case OopMapValue::stack_obj:
- tty->print("Stack");
+ st->print("Stack");
break;
default:
ShouldNotReachHere();
@@ -534,11 +534,11 @@
}
-void OopMapValue::print() const {
- reg()->print();
- tty->print("=");
- print_register_type(type(),content_reg());
- tty->print(" ");
+void OopMapValue::print_on(outputStream* st) const {
+ reg()->print_on(st);
+ st->print("=");
+ print_register_type(type(),content_reg(),st);
+ st->print(" ");
}
--- a/hotspot/src/share/vm/compiler/oopMap.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/compiler/oopMap.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -129,7 +129,8 @@
return reg()->reg2stack();
}
- void print( ) const PRODUCT_RETURN;
+ void print_on(outputStream* st) const PRODUCT_RETURN;
+ void print() const { print_on(tty); }
};
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/binaryTreeDictionary.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/binaryTreeDictionary.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -1071,85 +1071,56 @@
// for each list in the tree. Also print some summary
// information.
class printTreeCensusClosure : public AscendTreeCensusClosure {
+ int _print_line;
size_t _totalFree;
- AllocationStats _totals;
- size_t _count;
+ FreeList _total;
public:
printTreeCensusClosure() {
+ _print_line = 0;
_totalFree = 0;
- _count = 0;
- _totals.initialize();
}
- AllocationStats* totals() { return &_totals; }
- size_t count() { return _count; }
- void increment_count_by(size_t v) { _count += v; }
+ FreeList* total() { return &_total; }
size_t totalFree() { return _totalFree; }
- void increment_totalFree_by(size_t v) { _totalFree += v; }
void do_list(FreeList* fl) {
- bool nl = false; // "maybe this is not needed" isNearLargestChunk(fl->head());
-
- gclog_or_tty->print("%c %4d\t\t" "%7d\t" "%7d\t"
- "%7d\t" "%7d\t" "%7d\t" "%7d\t"
- "%7d\t" "%7d\t" "%7d\t"
- "%7d\t" "\n",
- " n"[nl], fl->size(), fl->bfrSurp(), fl->surplus(),
- fl->desired(), fl->prevSweep(), fl->beforeSweep(), fl->count(),
- fl->coalBirths(), fl->coalDeaths(), fl->splitBirths(),
- fl->splitDeaths());
-
- increment_totalFree_by(fl->count() * fl->size());
- increment_count_by(fl->count());
- totals()->set_bfrSurp(totals()->bfrSurp() + fl->bfrSurp());
- totals()->set_surplus(totals()->splitDeaths() + fl->surplus());
- totals()->set_prevSweep(totals()->prevSweep() + fl->prevSweep());
- totals()->set_beforeSweep(totals()->beforeSweep() + fl->beforeSweep());
- totals()->set_coalBirths(totals()->coalBirths() + fl->coalBirths());
- totals()->set_coalDeaths(totals()->coalDeaths() + fl->coalDeaths());
- totals()->set_splitBirths(totals()->splitBirths() + fl->splitBirths());
- totals()->set_splitDeaths(totals()->splitDeaths() + fl->splitDeaths());
+ if (++_print_line >= 40) {
+ FreeList::print_labels_on(gclog_or_tty, "size");
+ _print_line = 0;
+ }
+ fl->print_on(gclog_or_tty);
+ _totalFree += fl->count() * fl->size() ;
+ total()->set_count( total()->count() + fl->count() );
+ total()->set_bfrSurp( total()->bfrSurp() + fl->bfrSurp() );
+ total()->set_surplus( total()->splitDeaths() + fl->surplus() );
+ total()->set_desired( total()->desired() + fl->desired() );
+ total()->set_prevSweep( total()->prevSweep() + fl->prevSweep() );
+ total()->set_beforeSweep(total()->beforeSweep() + fl->beforeSweep());
+ total()->set_coalBirths( total()->coalBirths() + fl->coalBirths() );
+ total()->set_coalDeaths( total()->coalDeaths() + fl->coalDeaths() );
+ total()->set_splitBirths(total()->splitBirths() + fl->splitBirths());
+ total()->set_splitDeaths(total()->splitDeaths() + fl->splitDeaths());
}
};
void BinaryTreeDictionary::printDictCensus(void) const {
gclog_or_tty->print("\nBinaryTree\n");
- gclog_or_tty->print(
- "%4s\t\t" "%7s\t" "%7s\t" "%7s\t" "%7s\t" "%7s\t"
- "%7s\t" "%7s\t" "%7s\t" "%7s\t" "%7s\t" "\n",
- "size", "bfrsurp", "surplus", "desired", "prvSwep", "bfrSwep",
- "count", "cBirths", "cDeaths", "sBirths", "sDeaths");
-
+ FreeList::print_labels_on(gclog_or_tty, "size");
printTreeCensusClosure ptc;
ptc.do_tree(root());
- gclog_or_tty->print(
- "\t\t" "%7s\t" "%7s\t" "%7s\t" "%7s\t"
- "%7s\t" "%7s\t" "%7s\t" "%7s\t" "%7s\t" "\n",
- "bfrsurp", "surplus", "prvSwep", "bfrSwep",
- "count", "cBirths", "cDeaths", "sBirths", "sDeaths");
+ FreeList* total = ptc.total();
+ FreeList::print_labels_on(gclog_or_tty, " ");
+ total->print_on(gclog_or_tty, "TOTAL\t");
gclog_or_tty->print(
- "%s\t\t" "%7d\t" "%7d\t" "%7d\t" "%7d\t"
- "%7d\t" "%7d\t" "%7d\t" "%7d\t" "%7d\t" "\n",
- "totl",
- ptc.totals()->bfrSurp(),
- ptc.totals()->surplus(),
- ptc.totals()->prevSweep(),
- ptc.totals()->beforeSweep(),
- ptc.count(),
- ptc.totals()->coalBirths(),
- ptc.totals()->coalDeaths(),
- ptc.totals()->splitBirths(),
- ptc.totals()->splitDeaths());
- gclog_or_tty->print("totalFree(words): %7d growth: %8.5f deficit: %8.5f\n",
+ "totalFree(words): " SIZE_FORMAT_W(16)
+ " growth: %8.5f deficit: %8.5f\n",
ptc.totalFree(),
- (double)(ptc.totals()->splitBirths()+ptc.totals()->coalBirths()
- -ptc.totals()->splitDeaths()-ptc.totals()->coalDeaths())
- /(ptc.totals()->prevSweep() != 0 ?
- (double)ptc.totals()->prevSweep() : 1.0),
- (double)(ptc.totals()->desired() - ptc.count())
- /(ptc.totals()->desired() != 0 ?
- (double)ptc.totals()->desired() : 1.0));
+ (double)(total->splitBirths() + total->coalBirths()
+ - total->splitDeaths() - total->coalDeaths())
+ /(total->prevSweep() != 0 ? (double)total->prevSweep() : 1.0),
+ (double)(total->desired() - total->count())
+ /(total->desired() != 0 ? (double)total->desired() : 1.0));
}
// Verify the following tree invariants:
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -1835,7 +1835,7 @@
guarantee(false, "NYI");
}
-bool CompactibleFreeListSpace::linearAllocationWouldFail() {
+bool CompactibleFreeListSpace::linearAllocationWouldFail() const {
return _smallLinearAllocBlock._word_size == 0;
}
@@ -1906,6 +1906,13 @@
}
}
+// Support for concurrent collection policy decisions.
+bool CompactibleFreeListSpace::should_concurrent_collect() const {
+ // In the future we might want to add in frgamentation stats --
+ // including erosion of the "mountain" into this decision as well.
+ return !adaptive_freelists() && linearAllocationWouldFail();
+}
+
// Support for compaction
void CompactibleFreeListSpace::prepare_for_compaction(CompactPoint* cp) {
@@ -2013,11 +2020,11 @@
}
}
-void CompactibleFreeListSpace::endSweepFLCensus(int sweepCt) {
+void CompactibleFreeListSpace::endSweepFLCensus(size_t sweep_count) {
setFLSurplus();
setFLHints();
if (PrintGC && PrintFLSCensus > 0) {
- printFLCensus(sweepCt);
+ printFLCensus(sweep_count);
}
clearFLCensus();
assert_locked();
@@ -2293,59 +2300,37 @@
}
#endif
-void CompactibleFreeListSpace::printFLCensus(int sweepCt) const {
+void CompactibleFreeListSpace::printFLCensus(size_t sweep_count) const {
assert_lock_strong(&_freelistLock);
- ssize_t bfrSurp = 0;
- ssize_t surplus = 0;
- ssize_t desired = 0;
- ssize_t prevSweep = 0;
- ssize_t beforeSweep = 0;
- ssize_t count = 0;
- ssize_t coalBirths = 0;
- ssize_t coalDeaths = 0;
- ssize_t splitBirths = 0;
- ssize_t splitDeaths = 0;
- gclog_or_tty->print("end sweep# %d\n", sweepCt);
- gclog_or_tty->print("%4s\t" "%7s\t" "%7s\t" "%7s\t" "%7s\t"
- "%7s\t" "%7s\t" "%7s\t" "%7s\t" "%7s\t"
- "%7s\t" "\n",
- "size", "bfrsurp", "surplus", "desired", "prvSwep",
- "bfrSwep", "count", "cBirths", "cDeaths", "sBirths",
- "sDeaths");
-
+ FreeList total;
+ gclog_or_tty->print("end sweep# " SIZE_FORMAT "\n", sweep_count);
+ FreeList::print_labels_on(gclog_or_tty, "size");
size_t totalFree = 0;
for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) {
const FreeList *fl = &_indexedFreeList[i];
- totalFree += fl->count() * fl->size();
-
- gclog_or_tty->print("%4d\t" "%7d\t" "%7d\t" "%7d\t"
- "%7d\t" "%7d\t" "%7d\t" "%7d\t"
- "%7d\t" "%7d\t" "%7d\t" "\n",
- fl->size(), fl->bfrSurp(), fl->surplus(), fl->desired(),
- fl->prevSweep(), fl->beforeSweep(), fl->count(), fl->coalBirths(),
- fl->coalDeaths(), fl->splitBirths(), fl->splitDeaths());
- bfrSurp += fl->bfrSurp();
- surplus += fl->surplus();
- desired += fl->desired();
- prevSweep += fl->prevSweep();
- beforeSweep += fl->beforeSweep();
- count += fl->count();
- coalBirths += fl->coalBirths();
- coalDeaths += fl->coalDeaths();
- splitBirths += fl->splitBirths();
- splitDeaths += fl->splitDeaths();
+ totalFree += fl->count() * fl->size();
+ if (i % (40*IndexSetStride) == 0) {
+ FreeList::print_labels_on(gclog_or_tty, "size");
+ }
+ fl->print_on(gclog_or_tty);
+ total.set_bfrSurp( total.bfrSurp() + fl->bfrSurp() );
+ total.set_surplus( total.surplus() + fl->surplus() );
+ total.set_desired( total.desired() + fl->desired() );
+ total.set_prevSweep( total.prevSweep() + fl->prevSweep() );
+ total.set_beforeSweep(total.beforeSweep() + fl->beforeSweep());
+ total.set_count( total.count() + fl->count() );
+ total.set_coalBirths( total.coalBirths() + fl->coalBirths() );
+ total.set_coalDeaths( total.coalDeaths() + fl->coalDeaths() );
+ total.set_splitBirths(total.splitBirths() + fl->splitBirths());
+ total.set_splitDeaths(total.splitDeaths() + fl->splitDeaths());
}
- gclog_or_tty->print("%4s\t"
- "%7d\t" "%7d\t" "%7d\t" "%7d\t" "%7d\t"
- "%7d\t" "%7d\t" "%7d\t" "%7d\t" "%7d\t" "\n",
- "totl",
- bfrSurp, surplus, desired, prevSweep, beforeSweep,
- count, coalBirths, coalDeaths, splitBirths, splitDeaths);
- gclog_or_tty->print_cr("Total free in indexed lists %d words", totalFree);
+ total.print_on(gclog_or_tty, "TOTAL");
+ gclog_or_tty->print_cr("Total free in indexed lists "
+ SIZE_FORMAT " words", totalFree);
gclog_or_tty->print("growth: %8.5f deficit: %8.5f\n",
- (double)(splitBirths+coalBirths-splitDeaths-coalDeaths)/
- (prevSweep != 0 ? (double)prevSweep : 1.0),
- (double)(desired - count)/(desired != 0 ? (double)desired : 1.0));
+ (double)(total.splitBirths()+total.coalBirths()-total.splitDeaths()-total.coalDeaths())/
+ (total.prevSweep() != 0 ? (double)total.prevSweep() : 1.0),
+ (double)(total.desired() - total.count())/(total.desired() != 0 ? (double)total.desired() : 1.0));
_dictionary->printDictCensus();
}
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -418,7 +418,7 @@
// chunk exists, return NULL.
FreeChunk* find_chunk_at_end();
- bool adaptive_freelists() { return _adaptive_freelists; }
+ bool adaptive_freelists() const { return _adaptive_freelists; }
void set_collector(CMSCollector* collector) { _collector = collector; }
@@ -566,7 +566,7 @@
FreeChunk* allocateScratch(size_t size);
// returns true if either the small or large linear allocation buffer is empty.
- bool linearAllocationWouldFail();
+ bool linearAllocationWouldFail() const;
// Adjust the chunk for the minimum size. This version is called in
// most cases in CompactibleFreeListSpace methods.
@@ -585,6 +585,9 @@
void addChunkAndRepairOffsetTable(HeapWord* chunk, size_t size,
bool coalesced);
+ // Support for decisions regarding concurrent collection policy
+ bool should_concurrent_collect() const;
+
// Support for compaction
void prepare_for_compaction(CompactPoint* cp);
void adjust_pointers();
@@ -622,7 +625,7 @@
// coalescing of chunks during the sweep of garbage.
// Print the statistics for the free lists.
- void printFLCensus(int sweepCt) const;
+ void printFLCensus(size_t sweep_count) const;
// Statistics functions
// Initialize census for lists before the sweep.
@@ -635,12 +638,11 @@
// Clear the census for each of the free lists.
void clearFLCensus();
// Perform functions for the census after the end of the sweep.
- void endSweepFLCensus(int sweepCt);
+ void endSweepFLCensus(size_t sweep_count);
// Return true if the count of free chunks is greater
// than the desired number of free chunks.
bool coalOverPopulated(size_t size);
-
// Record (for each size):
//
// split-births = #chunks added due to splits in (prev-sweep-end,
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -3121,12 +3121,7 @@
if (GCExpandToAllocateDelayMillis > 0) {
os::sleep(Thread::current(), GCExpandToAllocateDelayMillis, false);
}
- size_t adj_word_sz = CompactibleFreeListSpace::adjustObjectSize(word_size);
- if (parallel) {
- return cmsSpace()->par_allocate(adj_word_sz);
- } else {
- return cmsSpace()->allocate(adj_word_sz);
- }
+ return have_lock_and_allocate(word_size, tlab);
}
// YSR: All of this generation expansion/shrinking stuff is an exact copy of
@@ -5732,13 +5727,19 @@
// in the perm_gen_verify_bit_map. In order to do that we traverse
// all blocks in perm gen and mark all dead objects.
if (verifying() && !cms_should_unload_classes()) {
- CMSTokenSyncWithLocks ts(true, _permGen->freelistLock(),
- bitMapLock());
assert(perm_gen_verify_bit_map()->sizeInBits() != 0,
"Should have already been allocated");
MarkDeadObjectsClosure mdo(this, _permGen->cmsSpace(),
markBitMap(), perm_gen_verify_bit_map());
- _permGen->cmsSpace()->blk_iterate(&mdo);
+ if (asynch) {
+ CMSTokenSyncWithLocks ts(true, _permGen->freelistLock(),
+ bitMapLock());
+ _permGen->cmsSpace()->blk_iterate(&mdo);
+ } else {
+ // In the case of synchronous sweep, we already have
+ // the requisite locks/tokens.
+ _permGen->cmsSpace()->blk_iterate(&mdo);
+ }
}
if (asynch) {
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeList.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeList.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -302,3 +302,29 @@
#endif
}
#endif
+
+// Print the "label line" for free list stats.
+void FreeList::print_labels_on(outputStream* st, const char* c) {
+ st->print("%16s\t", c);
+ st->print("%14s\t" "%14s\t" "%14s\t" "%14s\t" "%14s\t"
+ "%14s\t" "%14s\t" "%14s\t" "%14s\t" "%14s\t" "\n",
+ "bfrsurp", "surplus", "desired", "prvSwep", "bfrSwep",
+ "count", "cBirths", "cDeaths", "sBirths", "sDeaths");
+}
+
+// Print the AllocationStats for the given free list. If the second argument
+// to the call is a non-null string, it is printed in the first column;
+// otherwise, if the argument is null (the default), then the size of the
+// (free list) block is printed in the first column.
+void FreeList::print_on(outputStream* st, const char* c) const {
+ if (c != NULL) {
+ st->print("%16s", c);
+ } else {
+ st->print(SIZE_FORMAT_W(16), size());
+ }
+ st->print("\t"
+ SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t"
+ SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\n",
+ bfrSurp(), surplus(), desired(), prevSweep(), beforeSweep(),
+ count(), coalBirths(), coalDeaths(), splitBirths(), splitDeaths());
+}
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeList.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeList.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -38,6 +38,7 @@
class FreeList VALUE_OBJ_CLASS_SPEC {
friend class CompactibleFreeListSpace;
+ friend class printTreeCensusClosure;
FreeChunk* _head; // List of free chunks
FreeChunk* _tail; // Tail of list of free chunks
size_t _size; // Size in Heap words of each chunks
@@ -63,10 +64,11 @@
protected:
void init_statistics();
void set_count(ssize_t v) { _count = v;}
- void increment_count() { _count++; }
+ void increment_count() { _count++; }
void decrement_count() {
_count--;
- assert(_count >= 0, "Count should not be negative"); }
+ assert(_count >= 0, "Count should not be negative");
+ }
public:
// Constructor
@@ -159,6 +161,10 @@
ssize_t desired() const {
return _allocation_stats.desired();
}
+ void set_desired(ssize_t v) {
+ assert_proper_lock_protection();
+ _allocation_stats.set_desired(v);
+ }
void compute_desired(float inter_sweep_current,
float inter_sweep_estimate) {
assert_proper_lock_protection();
@@ -298,4 +304,8 @@
// Verify that the chunk is in the list.
// found. Return NULL if "fc" is not found.
bool verifyChunkInFreeLists(FreeChunk* fc) const;
+
+ // Printing support
+ static void print_labels_on(outputStream* st, const char* c);
+ void print_on(outputStream* st, const char* c = NULL) const;
};
--- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_shared Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_shared Tue Apr 15 17:48:22 2008 -0700
@@ -19,15 +19,22 @@
// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
// CA 95054 USA or visit www.sun.com if you need additional information or
// have any questions.
-//
+//
//
// NOTE: DO NOT CHANGE THIS COPYRIGHT TO NEW STYLE - IT WILL BREAK makeDeps!
-gcAdaptivePolicyCounters.hpp adaptiveSizePolicy.hpp
-gcAdaptivePolicyCounters.hpp gcPolicyCounters.hpp
+allocationStats.cpp allocationStats.hpp
+allocationStats.cpp ostream.hpp
-gcAdaptivePolicyCounters.cpp resourceArea.hpp
+allocationStats.hpp allocation.hpp
+allocationStats.hpp gcUtil.hpp
+allocationStats.hpp globalDefinitions.hpp
+
+gcAdaptivePolicyCounters.hpp adaptiveSizePolicy.hpp
+gcAdaptivePolicyCounters.hpp gcPolicyCounters.hpp
+
+gcAdaptivePolicyCounters.cpp resourceArea.hpp
gcAdaptivePolicyCounters.cpp gcAdaptivePolicyCounters.hpp
gSpaceCounters.cpp generation.hpp
@@ -44,7 +51,7 @@
isGCActiveMark.hpp parallelScavengeHeap.hpp
-markSweep.inline.hpp psParallelCompact.hpp
+markSweep.inline.hpp psParallelCompact.hpp
mutableNUMASpace.cpp mutableNUMASpace.hpp
mutableNUMASpace.cpp sharedHeap.hpp
--- a/hotspot/src/share/vm/gc_implementation/parNew/asParNewGeneration.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parNew/asParNewGeneration.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -74,8 +74,8 @@
#ifdef SHRINKS_AT_END_OF_EDEN
size_t delta_in_survivor = 0;
ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
- const size_t space_alignment = heap->intra_generation_alignment();
- const size_t gen_alignment = heap->generation_alignment();
+ const size_t space_alignment = heap->intra_heap_alignment();
+ const size_t gen_alignment = heap->object_heap_alignment();
MutableSpace* space_shrinking = NULL;
if (from_space()->end() > to_space()->end()) {
--- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -785,6 +785,9 @@
swap_spaces(); // Make life simpler for CMS || rescan; see 6483690.
from()->set_next_compaction_space(to());
gch->set_incremental_collection_will_fail();
+
+ // Reset the PromotionFailureALot counters.
+ NOT_PRODUCT(Universe::heap()->reset_promotion_should_fail();)
}
// set new iteration safe limit for the survivor spaces
from()->set_concurrent_iteration_safe_limit(from()->top());
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/asPSYoungGen.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/asPSYoungGen.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -86,7 +86,7 @@
if (eden_space()->is_empty()) {
// Respect the minimum size for eden and for the young gen as a whole.
ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
- const size_t eden_alignment = heap->intra_generation_alignment();
+ const size_t eden_alignment = heap->intra_heap_alignment();
const size_t gen_alignment = heap->young_gen_alignment();
assert(eden_space()->capacity_in_bytes() >= eden_alignment,
@@ -124,7 +124,7 @@
// to_space can be.
size_t ASPSYoungGen::available_to_live() {
ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
- const size_t alignment = heap->intra_generation_alignment();
+ const size_t alignment = heap->intra_heap_alignment();
// Include any space that is committed but is not in eden.
size_t available = pointer_delta(eden_space()->bottom(),
@@ -275,7 +275,7 @@
assert(eden_start < from_start, "Cannot push into from_space");
ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
- const size_t alignment = heap->intra_generation_alignment();
+ const size_t alignment = heap->intra_heap_alignment();
// Check whether from space is below to space
if (from_start < to_start) {
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -39,10 +39,10 @@
// If the user hasn't explicitly set the number of worker
// threads, set the count.
- if (ParallelGCThreads == 0) {
- assert(UseParallelGC, "Setting ParallelGCThreads without UseParallelGC");
- ParallelGCThreads = os::active_processor_count();
- }
+ assert(UseSerialGC ||
+ !FLAG_IS_DEFAULT(ParallelGCThreads) ||
+ (ParallelGCThreads > 0),
+ "ParallelGCThreads should be set before flag initialization");
// The survivor ratio's are calculated "raw", unlike the
// default gc, which adds 2 to the ratio value. We need to
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -41,7 +41,7 @@
const size_t rs_align = page_sz == (size_t) os::vm_page_size() ? 0 :
MAX2(page_sz, granularity);
- ReservedSpace rs(bytes, rs_align, false);
+ ReservedSpace rs(bytes, rs_align, rs_align > 0);
os::trace_page_sizes("par bitmap", raw_bytes, raw_bytes, page_sz,
rs.base(), rs.size());
_virtual_space = new PSVirtualSpace(rs, page_sz);
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -173,7 +173,7 @@
new PSAdaptiveSizePolicy(eden_capacity,
initial_promo_size,
young_gen()->to_space()->capacity_in_bytes(),
- intra_generation_alignment(),
+ intra_heap_alignment(),
max_gc_pause_sec,
max_gc_minor_pause_sec,
GCTimeRatio
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -58,9 +58,9 @@
public:
ParallelScavengeHeap() : CollectedHeap() {
- set_alignment(_perm_gen_alignment, intra_generation_alignment());
- set_alignment(_young_gen_alignment, intra_generation_alignment());
- set_alignment(_old_gen_alignment, intra_generation_alignment());
+ set_alignment(_perm_gen_alignment, intra_heap_alignment());
+ set_alignment(_young_gen_alignment, intra_heap_alignment());
+ set_alignment(_old_gen_alignment, intra_heap_alignment());
}
// For use by VM operations
@@ -92,14 +92,14 @@
void post_initialize();
void update_counters();
-
// The alignment used for the various generations.
size_t perm_gen_alignment() const { return _perm_gen_alignment; }
size_t young_gen_alignment() const { return _young_gen_alignment; }
size_t old_gen_alignment() const { return _old_gen_alignment; }
- // The alignment used for eden and survivors within the young gen.
- size_t intra_generation_alignment() const { return 64 * K; }
+ // The alignment used for eden and survivors within the young gen
+ // and for boundary between young gen and old gen.
+ size_t intra_heap_alignment() const { return 64 * K; }
size_t capacity() const;
size_t used() const;
@@ -217,6 +217,6 @@
inline size_t ParallelScavengeHeap::set_alignment(size_t& var, size_t val)
{
assert(is_power_of_2((intptr_t)val), "must be a power of 2");
- var = round_to(val, intra_generation_alignment());
+ var = round_to(val, intra_heap_alignment());
return var;
}
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -413,7 +413,7 @@
const size_t rs_align = page_sz == (size_t) os::vm_page_size() ? 0 :
MAX2(page_sz, granularity);
- ReservedSpace rs(bytes, rs_align, false);
+ ReservedSpace rs(bytes, rs_align, rs_align > 0);
os::trace_page_sizes("par compact", raw_bytes, raw_bytes, page_sz, rs.base(),
rs.size());
PSVirtualSpace* vspace = new PSVirtualSpace(rs, page_sz);
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -88,7 +88,7 @@
// Compute maximum space sizes for performance counters
ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
- size_t alignment = heap->intra_generation_alignment();
+ size_t alignment = heap->intra_heap_alignment();
size_t size = _virtual_space->reserved_size();
size_t max_survivor_size;
@@ -141,7 +141,7 @@
assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
// Compute sizes
- size_t alignment = heap->intra_generation_alignment();
+ size_t alignment = heap->intra_heap_alignment();
size_t size = _virtual_space->committed_size();
size_t survivor_size = size / InitialSurvivorRatio;
@@ -192,7 +192,7 @@
#ifndef PRODUCT
void PSYoungGen::space_invariants() {
ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
- const size_t alignment = heap->intra_generation_alignment();
+ const size_t alignment = heap->intra_heap_alignment();
// Currently, our eden size cannot shrink to zero
guarantee(eden_space()->capacity_in_bytes() >= alignment, "eden too small");
@@ -392,7 +392,7 @@
char* to_end = (char*)to_space()->end();
ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
- const size_t alignment = heap->intra_generation_alignment();
+ const size_t alignment = heap->intra_heap_alignment();
const bool maintain_minimum =
(requested_eden_size + 2 * requested_survivor_size) <= min_gen_size();
@@ -708,7 +708,7 @@
size_t PSYoungGen::available_to_live() {
size_t delta_in_survivor = 0;
ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
- const size_t space_alignment = heap->intra_generation_alignment();
+ const size_t space_alignment = heap->intra_heap_alignment();
const size_t gen_alignment = heap->young_gen_alignment();
MutableSpace* space_shrinking = NULL;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/shared/allocationStats.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+# include "incls/_precompiled.incl"
+# include "incls/_allocationStats.cpp.incl"
+
+// Technically this should be derived from machine speed, and
+// ideally it would be dynamically adjusted.
+float AllocationStats::_threshold = ((float)CMS_SweepTimerThresholdMillis)/1000;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/shared/allocationStats.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2001-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+class AllocationStats VALUE_OBJ_CLASS_SPEC {
+ // A duration threshold (in ms) used to filter
+ // possibly unreliable samples.
+ static float _threshold;
+
+ // We measure the demand between the end of the previous sweep and
+ // beginning of this sweep:
+ // Count(end_last_sweep) - Count(start_this_sweep)
+ // + splitBirths(between) - splitDeaths(between)
+ // The above number divided by the time since the start [END???] of the
+ // previous sweep gives us a time rate of demand for blocks
+ // of this size. We compute a padded average of this rate as
+ // our current estimate for the time rate of demand for blocks
+ // of this size. Similarly, we keep a padded average for the time
+ // between sweeps. Our current estimate for demand for blocks of
+ // this size is then simply computed as the product of these two
+ // estimates.
+ AdaptivePaddedAverage _demand_rate_estimate;
+
+ ssize_t _desired; // Estimate computed as described above
+ ssize_t _coalDesired; // desired +/- small-percent for tuning coalescing
+
+ ssize_t _surplus; // count - (desired +/- small-percent),
+ // used to tune splitting in best fit
+ ssize_t _bfrSurp; // surplus at start of current sweep
+ ssize_t _prevSweep; // count from end of previous sweep
+ ssize_t _beforeSweep; // count from before current sweep
+ ssize_t _coalBirths; // additional chunks from coalescing
+ ssize_t _coalDeaths; // loss from coalescing
+ ssize_t _splitBirths; // additional chunks from splitting
+ ssize_t _splitDeaths; // loss from splitting
+ size_t _returnedBytes; // number of bytes returned to list.
+ public:
+ void initialize() {
+ AdaptivePaddedAverage* dummy =
+ new (&_demand_rate_estimate) AdaptivePaddedAverage(CMS_FLSWeight,
+ CMS_FLSPadding);
+ _desired = 0;
+ _coalDesired = 0;
+ _surplus = 0;
+ _bfrSurp = 0;
+ _prevSweep = 0;
+ _beforeSweep = 0;
+ _coalBirths = 0;
+ _coalDeaths = 0;
+ _splitBirths = 0;
+ _splitDeaths = 0;
+ _returnedBytes = 0;
+ }
+
+ AllocationStats() {
+ initialize();
+ }
+ // The rate estimate is in blocks per second.
+ void compute_desired(size_t count,
+ float inter_sweep_current,
+ float inter_sweep_estimate) {
+ // If the latest inter-sweep time is below our granularity
+ // of measurement, we may call in here with
+ // inter_sweep_current == 0. However, even for suitably small
+ // but non-zero inter-sweep durations, we may not trust the accuracy
+ // of accumulated data, since it has not been "integrated"
+ // (read "low-pass-filtered") long enough, and would be
+ // vulnerable to noisy glitches. In such cases, we
+ // ignore the current sample and use currently available
+ // historical estimates.
+ if (inter_sweep_current > _threshold) {
+ ssize_t demand = prevSweep() - count + splitBirths() - splitDeaths();
+ float rate = ((float)demand)/inter_sweep_current;
+ _demand_rate_estimate.sample(rate);
+ _desired = (ssize_t)(_demand_rate_estimate.padded_average()
+ *inter_sweep_estimate);
+ }
+ }
+
+ ssize_t desired() const { return _desired; }
+ void set_desired(ssize_t v) { _desired = v; }
+
+ ssize_t coalDesired() const { return _coalDesired; }
+ void set_coalDesired(ssize_t v) { _coalDesired = v; }
+
+ ssize_t surplus() const { return _surplus; }
+ void set_surplus(ssize_t v) { _surplus = v; }
+ void increment_surplus() { _surplus++; }
+ void decrement_surplus() { _surplus--; }
+
+ ssize_t bfrSurp() const { return _bfrSurp; }
+ void set_bfrSurp(ssize_t v) { _bfrSurp = v; }
+ ssize_t prevSweep() const { return _prevSweep; }
+ void set_prevSweep(ssize_t v) { _prevSweep = v; }
+ ssize_t beforeSweep() const { return _beforeSweep; }
+ void set_beforeSweep(ssize_t v) { _beforeSweep = v; }
+
+ ssize_t coalBirths() const { return _coalBirths; }
+ void set_coalBirths(ssize_t v) { _coalBirths = v; }
+ void increment_coalBirths() { _coalBirths++; }
+
+ ssize_t coalDeaths() const { return _coalDeaths; }
+ void set_coalDeaths(ssize_t v) { _coalDeaths = v; }
+ void increment_coalDeaths() { _coalDeaths++; }
+
+ ssize_t splitBirths() const { return _splitBirths; }
+ void set_splitBirths(ssize_t v) { _splitBirths = v; }
+ void increment_splitBirths() { _splitBirths++; }
+
+ ssize_t splitDeaths() const { return _splitDeaths; }
+ void set_splitDeaths(ssize_t v) { _splitDeaths = v; }
+ void increment_splitDeaths() { _splitDeaths++; }
+
+ NOT_PRODUCT(
+ size_t returnedBytes() const { return _returnedBytes; }
+ void set_returnedBytes(size_t v) { _returnedBytes = v; }
+ )
+};
--- a/hotspot/src/share/vm/includeDB_compiler2 Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/includeDB_compiler2 Tue Apr 15 17:48:22 2008 -0700
@@ -19,7 +19,7 @@
// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
// CA 95054 USA or visit www.sun.com if you need additional information or
// have any questions.
-//
+//
//
ad_<arch_model>.cpp adGlobals_<arch_model>.hpp
@@ -164,6 +164,7 @@
callGenerator.hpp type.hpp
callnode.cpp callnode.hpp
+callnode.cpp bcEscapeAnalyzer.hpp
callnode.cpp escape.hpp
callnode.cpp locknode.hpp
callnode.cpp machnode.hpp
@@ -176,7 +177,6 @@
callnode.cpp runtime.hpp
callnode.hpp connode.hpp
-callnode.hpp escape.hpp
callnode.hpp mulnode.hpp
callnode.hpp multnode.hpp
callnode.hpp opcodes.hpp
@@ -347,7 +347,6 @@
connode.cpp allocation.inline.hpp
connode.cpp compile.hpp
connode.cpp connode.hpp
-connode.cpp escape.hpp
connode.cpp machnode.hpp
connode.cpp matcher.hpp
connode.cpp memnode.hpp
@@ -410,6 +409,7 @@
escape.cpp allocation.hpp
escape.cpp bcEscapeAnalyzer.hpp
+escape.cpp c2compiler.hpp
escape.cpp callnode.hpp
escape.cpp cfgnode.hpp
escape.cpp compile.hpp
@@ -843,7 +843,6 @@
phaseX.cpp callnode.hpp
phaseX.cpp cfgnode.hpp
phaseX.cpp connode.hpp
-phaseX.cpp escape.hpp
phaseX.cpp loopnode.hpp
phaseX.cpp machnode.hpp
phaseX.cpp opcodes.hpp
@@ -990,6 +989,7 @@
subnode.cpp addnode.hpp
subnode.cpp allocation.inline.hpp
+subnode.cpp callnode.hpp
subnode.cpp cfgnode.hpp
subnode.cpp compileLog.hpp
subnode.cpp connode.hpp
@@ -1086,7 +1086,7 @@
idealGraphPrinter.hpp ostream.hpp
idealGraphPrinter.cpp idealGraphPrinter.hpp
-idealGraphPrinter.cpp chaitin.hpp
+idealGraphPrinter.cpp chaitin.hpp
idealGraphPrinter.cpp machnode.hpp
idealGraphPrinter.cpp parse.hpp
idealGraphPrinter.cpp threadCritical.hpp
@@ -1098,4 +1098,4 @@
parse1.cpp idealGraphPrinter.hpp
matcher.cpp idealGraphPrinter.hpp
loopnode.cpp idealGraphPrinter.hpp
-chaitin.cpp idealGraphPrinter.hpp
+chaitin.cpp idealGraphPrinter.hpp
--- a/hotspot/src/share/vm/includeDB_core Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/includeDB_core Tue Apr 15 17:48:22 2008 -0700
@@ -19,7 +19,7 @@
// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
// CA 95054 USA or visit www.sun.com if you need additional information or
// have any questions.
-//
+//
//
// NOTE: DO NOT CHANGE THIS COPYRIGHT TO NEW STYLE - IT WILL BREAK makeDeps!
@@ -46,13 +46,13 @@
// as dependencies. Header files named H.inline.hpp generally contain
// bodies for inline functions declared in H.hpp.
//
-// NOTE: Files that use the token "generate_platform_dependent_include"
+// NOTE: Files that use the token "generate_platform_dependent_include"
// are expected to contain macro references like <os>, <arch_model>, ... and
// makedeps has a dependency on these platform files looking like:
-// foo_<macro>.trailing_string
+// foo_<macro>.trailing_string
// (where "trailing_string" can be any legal filename strings but typically
// is "hpp" or "inline.hpp").
-//
+//
// The dependency in makedeps (and enforced) is that an underscore
// will precedure the macro invocation. Note that this restriction
// is only enforced on filenames that have the dependency token
@@ -148,12 +148,6 @@
allocation.inline.hpp os.hpp
-allocationStats.cpp allocationStats.hpp
-
-allocationStats.hpp allocation.hpp
-allocationStats.hpp gcUtil.hpp
-allocationStats.hpp globalDefinitions.hpp
-
aprofiler.cpp aprofiler.hpp
aprofiler.cpp collectedHeap.inline.hpp
aprofiler.cpp oop.inline.hpp
@@ -720,6 +714,11 @@
ciObjArray.hpp ciClassList.hpp
ciObjArray.hpp objArrayOop.hpp
+ciObjArray.cpp ciObjArray.hpp
+ciObjArray.cpp ciNullObject.hpp
+ciObjArray.cpp ciUtilities.hpp
+ciObjArray.cpp objArrayOop.hpp
+
ciObjArrayKlass.cpp ciInstanceKlass.hpp
ciObjArrayKlass.cpp ciObjArrayKlass.hpp
ciObjArrayKlass.cpp ciObjArrayKlassKlass.hpp
@@ -1935,7 +1934,7 @@
init.cpp bytecodes.hpp
init.cpp collectedHeap.hpp
-init.cpp handles.inline.hpp
+init.cpp handles.inline.hpp
init.cpp icBuffer.hpp
init.cpp icache.hpp
init.cpp init.hpp
@@ -3068,6 +3067,7 @@
oopMapCache.cpp allocation.inline.hpp
oopMapCache.cpp handles.inline.hpp
+oopMapCache.cpp jvmtiRedefineClassesTrace.hpp
oopMapCache.cpp oop.inline.hpp
oopMapCache.cpp oopMapCache.hpp
oopMapCache.cpp resourceArea.hpp
--- a/hotspot/src/share/vm/interpreter/oopMapCache.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/interpreter/oopMapCache.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -532,6 +532,10 @@
if (!_array[i].is_empty() && _array[i].method()->is_old()) {
// Cache entry is occupied by an old redefined method and we don't want
// to pin it down so flush the entry.
+ RC_TRACE(0x08000000, ("flush: %s(%s): cached entry @%d",
+ _array[i].method()->name()->as_C_string(),
+ _array[i].method()->signature()->as_C_string(), i));
+
_array[i].flush();
}
}
@@ -577,6 +581,15 @@
// Entry is not in hashtable.
// Compute entry and return it
+ if (method->should_not_be_cached()) {
+ // It is either not safe or not a good idea to cache this methodOop
+ // at this time. We give the caller of lookup() a copy of the
+ // interesting info via parameter entry_for, but we don't add it to
+ // the cache. See the gory details in methodOop.cpp.
+ compute_one_oop_map(method, bci, entry_for);
+ return;
+ }
+
// First search for an empty slot
for(i = 0; i < _probe_depth; i++) {
entry = entry_at(probe + i);
@@ -584,12 +597,6 @@
entry->fill(method, bci);
entry_for->resource_copy(entry);
assert(!entry_for->is_empty(), "A non-empty oop map should be returned");
- if (method->is_old()) {
- // The caller of lookup() will receive a copy of the interesting
- // info via entry_for, but we don't keep an old redefined method in
- // the cache to avoid pinning down the method.
- entry->flush();
- }
return;
}
}
@@ -623,13 +630,6 @@
}
assert(!entry_for->is_empty(), "A non-empty oop map should be returned");
- if (method->is_old()) {
- // The caller of lookup() will receive a copy of the interesting
- // info via entry_for, but we don't keep an old redefined method in
- // the cache to avoid pinning down the method.
- entry->flush();
- }
-
return;
}
--- a/hotspot/src/share/vm/memory/allocationStats.cpp Wed Apr 09 15:30:44 2008 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-/*
- * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- */
-
-# include "incls/_precompiled.incl"
-# include "incls/_allocationStats.cpp.incl"
-
-// Technically this should be derived from machine speed, and
-// ideally it would be dynamically adjusted.
-float AllocationStats::_threshold = ((float)CMS_SweepTimerThresholdMillis)/1000;
--- a/hotspot/src/share/vm/memory/allocationStats.hpp Wed Apr 09 15:30:44 2008 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,136 +0,0 @@
-/*
- * Copyright 2001-2005 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- */
-
-class AllocationStats VALUE_OBJ_CLASS_SPEC {
- // A duration threshold (in ms) used to filter
- // possibly unreliable samples.
- static float _threshold;
-
- // We measure the demand between the end of the previous sweep and
- // beginning of this sweep:
- // Count(end_last_sweep) - Count(start_this_sweep)
- // + splitBirths(between) - splitDeaths(between)
- // The above number divided by the time since the start [END???] of the
- // previous sweep gives us a time rate of demand for blocks
- // of this size. We compute a padded average of this rate as
- // our current estimate for the time rate of demand for blocks
- // of this size. Similarly, we keep a padded average for the time
- // between sweeps. Our current estimate for demand for blocks of
- // this size is then simply computed as the product of these two
- // estimates.
- AdaptivePaddedAverage _demand_rate_estimate;
-
- ssize_t _desired; // Estimate computed as described above
- ssize_t _coalDesired; // desired +/- small-percent for tuning coalescing
-
- ssize_t _surplus; // count - (desired +/- small-percent),
- // used to tune splitting in best fit
- ssize_t _bfrSurp; // surplus at start of current sweep
- ssize_t _prevSweep; // count from end of previous sweep
- ssize_t _beforeSweep; // count from before current sweep
- ssize_t _coalBirths; // additional chunks from coalescing
- ssize_t _coalDeaths; // loss from coalescing
- ssize_t _splitBirths; // additional chunks from splitting
- ssize_t _splitDeaths; // loss from splitting
- size_t _returnedBytes; // number of bytes returned to list.
- public:
- void initialize() {
- AdaptivePaddedAverage* dummy =
- new (&_demand_rate_estimate) AdaptivePaddedAverage(CMS_FLSWeight,
- CMS_FLSPadding);
- _desired = 0;
- _coalDesired = 0;
- _surplus = 0;
- _bfrSurp = 0;
- _prevSweep = 0;
- _beforeSweep = 0;
- _coalBirths = 0;
- _coalDeaths = 0;
- _splitBirths = 0;
- _splitDeaths = 0;
- _returnedBytes = 0;
- }
-
- AllocationStats() {
- initialize();
- }
- // The rate estimate is in blocks per second.
- void compute_desired(size_t count,
- float inter_sweep_current,
- float inter_sweep_estimate) {
- // If the latest inter-sweep time is below our granularity
- // of measurement, we may call in here with
- // inter_sweep_current == 0. However, even for suitably small
- // but non-zero inter-sweep durations, we may not trust the accuracy
- // of accumulated data, since it has not been "integrated"
- // (read "low-pass-filtered") long enough, and would be
- // vulnerable to noisy glitches. In such cases, we
- // ignore the current sample and use currently available
- // historical estimates.
- if (inter_sweep_current > _threshold) {
- ssize_t demand = prevSweep() - count + splitBirths() - splitDeaths();
- float rate = ((float)demand)/inter_sweep_current;
- _demand_rate_estimate.sample(rate);
- _desired = (ssize_t)(_demand_rate_estimate.padded_average()
- *inter_sweep_estimate);
- }
- }
-
- ssize_t desired() const { return _desired; }
- ssize_t coalDesired() const { return _coalDesired; }
- void set_coalDesired(ssize_t v) { _coalDesired = v; }
-
- ssize_t surplus() const { return _surplus; }
- void set_surplus(ssize_t v) { _surplus = v; }
- void increment_surplus() { _surplus++; }
- void decrement_surplus() { _surplus--; }
-
- ssize_t bfrSurp() const { return _bfrSurp; }
- void set_bfrSurp(ssize_t v) { _bfrSurp = v; }
- ssize_t prevSweep() const { return _prevSweep; }
- void set_prevSweep(ssize_t v) { _prevSweep = v; }
- ssize_t beforeSweep() const { return _beforeSweep; }
- void set_beforeSweep(ssize_t v) { _beforeSweep = v; }
-
- ssize_t coalBirths() const { return _coalBirths; }
- void set_coalBirths(ssize_t v) { _coalBirths = v; }
- void increment_coalBirths() { _coalBirths++; }
-
- ssize_t coalDeaths() const { return _coalDeaths; }
- void set_coalDeaths(ssize_t v) { _coalDeaths = v; }
- void increment_coalDeaths() { _coalDeaths++; }
-
- ssize_t splitBirths() const { return _splitBirths; }
- void set_splitBirths(ssize_t v) { _splitBirths = v; }
- void increment_splitBirths() { _splitBirths++; }
-
- ssize_t splitDeaths() const { return _splitDeaths; }
- void set_splitDeaths(ssize_t v) { _splitDeaths = v; }
- void increment_splitDeaths() { _splitDeaths++; }
-
- NOT_PRODUCT(
- size_t returnedBytes() const { return _returnedBytes; }
- void set_returnedBytes(size_t v) { _returnedBytes = v; }
- )
-};
--- a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -51,7 +51,7 @@
_whole_heap(whole_heap),
_guard_index(cards_required(whole_heap.word_size()) - 1),
_last_valid_index(_guard_index - 1),
- _page_size(os::page_size_for_region(_guard_index + 1, _guard_index + 1, 1)),
+ _page_size(os::vm_page_size()),
_byte_map_size(compute_byte_map_size())
{
_kind = BarrierSet::CardTableModRef;
@@ -196,8 +196,8 @@
assert(_whole_heap.contains(new_region),
"attempt to cover area not in reserved area");
debug_only(verify_guard();)
- int ind = find_covering_region_by_base(new_region.start());
- MemRegion old_region = _covered[ind];
+ int const ind = find_covering_region_by_base(new_region.start());
+ MemRegion const old_region = _covered[ind];
assert(old_region.start() == new_region.start(), "just checking");
if (new_region.word_size() != old_region.word_size()) {
// Commit new or uncommit old pages, if necessary.
@@ -205,21 +205,21 @@
// Extend the end of this _commited region
// to cover the end of any lower _committed regions.
// This forms overlapping regions, but never interior regions.
- HeapWord* max_prev_end = largest_prev_committed_end(ind);
+ HeapWord* const max_prev_end = largest_prev_committed_end(ind);
if (max_prev_end > cur_committed.end()) {
cur_committed.set_end(max_prev_end);
}
// Align the end up to a page size (starts are already aligned).
- jbyte* new_end = byte_after(new_region.last());
- HeapWord* new_end_aligned =
- (HeapWord*)align_size_up((uintptr_t)new_end, _page_size);
+ jbyte* const new_end = byte_after(new_region.last());
+ HeapWord* const new_end_aligned =
+ (HeapWord*) align_size_up((uintptr_t)new_end, _page_size);
assert(new_end_aligned >= (HeapWord*) new_end,
"align up, but less");
// The guard page is always committed and should not be committed over.
- HeapWord* new_end_for_commit = MIN2(new_end_aligned, _guard_region.start());
+ HeapWord* const new_end_for_commit = MIN2(new_end_aligned, _guard_region.start());
if (new_end_for_commit > cur_committed.end()) {
// Must commit new pages.
- MemRegion new_committed =
+ MemRegion const new_committed =
MemRegion(cur_committed.end(), new_end_for_commit);
assert(!new_committed.is_empty(), "Region should not be empty here");
@@ -233,7 +233,7 @@
// the cur_committed region may include the guard region.
} else if (new_end_aligned < cur_committed.end()) {
// Must uncommit pages.
- MemRegion uncommit_region =
+ MemRegion const uncommit_region =
committed_unique_to_self(ind, MemRegion(new_end_aligned,
cur_committed.end()));
if (!uncommit_region.is_empty()) {
@@ -257,7 +257,7 @@
}
assert(index_for(new_region.last()) < (int) _guard_index,
"The guard card will be overwritten");
- jbyte* end = byte_after(new_region.last());
+ jbyte* const end = byte_after(new_region.last());
// do nothing if we resized downward.
if (entry < end) {
memset(entry, clean_card, pointer_delta(end, entry, sizeof(jbyte)));
--- a/hotspot/src/share/vm/memory/cardTableRS.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/memory/cardTableRS.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -556,10 +556,16 @@
}
-void CardTableRS::verify_empty(MemRegion mr) {
+void CardTableRS::verify_aligned_region_empty(MemRegion mr) {
if (!mr.is_empty()) {
jbyte* cur_entry = byte_for(mr.start());
jbyte* limit = byte_after(mr.last());
+ // The region mr may not start on a card boundary so
+ // the first card may reflect a write to the space
+ // just prior to mr.
+ if (!is_aligned(mr.start())) {
+ cur_entry++;
+ }
for (;cur_entry < limit; cur_entry++) {
guarantee(*cur_entry == CardTableModRefBS::clean_card,
"Unexpected dirty card found");
--- a/hotspot/src/share/vm/memory/cardTableRS.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/memory/cardTableRS.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -126,7 +126,7 @@
}
void verify();
- void verify_empty(MemRegion mr);
+ void verify_aligned_region_empty(MemRegion mr);
void clear(MemRegion mr) { _ct_bs.clear(mr); }
void clear_into_younger(Generation* gen, bool clear_perm);
--- a/hotspot/src/share/vm/memory/collectorPolicy.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/memory/collectorPolicy.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -57,45 +57,51 @@
// User inputs from -mx and ms are aligned
_initial_heap_byte_size = align_size_up(Arguments::initial_heap_size(),
min_alignment());
- _min_heap_byte_size = align_size_up(Arguments::min_heap_size(),
- min_alignment());
- _max_heap_byte_size = align_size_up(MaxHeapSize, max_alignment());
+ set_min_heap_byte_size(align_size_up(Arguments::min_heap_size(),
+ min_alignment()));
+ set_max_heap_byte_size(align_size_up(MaxHeapSize, max_alignment()));
// Check validity of heap parameters from launcher
- if (_initial_heap_byte_size == 0) {
- _initial_heap_byte_size = NewSize + OldSize;
+ if (initial_heap_byte_size() == 0) {
+ set_initial_heap_byte_size(NewSize + OldSize);
} else {
- Universe::check_alignment(_initial_heap_byte_size, min_alignment(),
+ Universe::check_alignment(initial_heap_byte_size(), min_alignment(),
"initial heap");
}
- if (_min_heap_byte_size == 0) {
- _min_heap_byte_size = NewSize + OldSize;
+ if (min_heap_byte_size() == 0) {
+ set_min_heap_byte_size(NewSize + OldSize);
} else {
- Universe::check_alignment(_min_heap_byte_size, min_alignment(),
+ Universe::check_alignment(min_heap_byte_size(), min_alignment(),
"initial heap");
}
// Check heap parameter properties
- if (_initial_heap_byte_size < M) {
+ if (initial_heap_byte_size() < M) {
vm_exit_during_initialization("Too small initial heap");
}
// Check heap parameter properties
- if (_min_heap_byte_size < M) {
+ if (min_heap_byte_size() < M) {
vm_exit_during_initialization("Too small minimum heap");
}
- if (_initial_heap_byte_size <= NewSize) {
+ if (initial_heap_byte_size() <= NewSize) {
// make sure there is at least some room in old space
vm_exit_during_initialization("Too small initial heap for new size specified");
}
- if (_max_heap_byte_size < _min_heap_byte_size) {
+ if (max_heap_byte_size() < min_heap_byte_size()) {
vm_exit_during_initialization("Incompatible minimum and maximum heap sizes specified");
}
- if (_initial_heap_byte_size < _min_heap_byte_size) {
+ if (initial_heap_byte_size() < min_heap_byte_size()) {
vm_exit_during_initialization("Incompatible minimum and initial heap sizes specified");
}
- if (_max_heap_byte_size < _initial_heap_byte_size) {
+ if (max_heap_byte_size() < initial_heap_byte_size()) {
vm_exit_during_initialization("Incompatible initial and maximum heap sizes specified");
}
+
+ if (PrintGCDetails && Verbose) {
+ gclog_or_tty->print_cr("Minimum heap " SIZE_FORMAT " Initial heap "
+ SIZE_FORMAT " Maximum heap " SIZE_FORMAT,
+ min_heap_byte_size(), initial_heap_byte_size(), max_heap_byte_size());
+ }
}
void CollectorPolicy::initialize_perm_generation(PermGen::Name pgnm) {
@@ -128,10 +134,26 @@
// GenCollectorPolicy methods.
+size_t GenCollectorPolicy::scale_by_NewRatio_aligned(size_t base_size) {
+ size_t x = base_size / (NewRatio+1);
+ size_t new_gen_size = x > min_alignment() ?
+ align_size_down(x, min_alignment()) :
+ min_alignment();
+ return new_gen_size;
+}
+
+size_t GenCollectorPolicy::bound_minus_alignment(size_t desired_size,
+ size_t maximum_size) {
+ size_t alignment = min_alignment();
+ size_t max_minus = maximum_size - alignment;
+ return desired_size < max_minus ? desired_size : max_minus;
+}
+
+
void GenCollectorPolicy::initialize_size_policy(size_t init_eden_size,
size_t init_promo_size,
size_t init_survivor_size) {
- double max_gc_minor_pause_sec = ((double) MaxGCMinorPauseMillis)/1000.0;
+ const double max_gc_minor_pause_sec = ((double) MaxGCMinorPauseMillis)/1000.0;
_size_policy = new AdaptiveSizePolicy(init_eden_size,
init_promo_size,
init_survivor_size,
@@ -210,74 +232,260 @@
assert(MaxHeapSize % max_alignment() == 0, "maximum heap alignment");
}
+// Values set on the command line win over any ergonomically
+// set command line parameters.
+// Ergonomic choice of parameters are done before this
+// method is called. Values for command line parameters such as NewSize
+// and MaxNewSize feed those ergonomic choices into this method.
+// This method makes the final generation sizings consistent with
+// themselves and with overall heap sizings.
+// In the absence of explicitly set command line flags, policies
+// such as the use of NewRatio are used to size the generation.
void GenCollectorPolicy::initialize_size_info() {
CollectorPolicy::initialize_size_info();
- // Minimum sizes of the generations may be different than
- // the initial sizes.
- if (!FLAG_IS_DEFAULT(NewSize)) {
- _min_gen0_size = NewSize;
+ // min_alignment() is used for alignment within a generation.
+ // There is additional alignment done down stream for some
+ // collectors that sometimes causes unwanted rounding up of
+ // generations sizes.
+
+ // Determine maximum size of gen0
+
+ size_t max_new_size = 0;
+ if (FLAG_IS_CMDLINE(MaxNewSize)) {
+ if (MaxNewSize < min_alignment()) {
+ max_new_size = min_alignment();
+ } else if (MaxNewSize >= max_heap_byte_size()) {
+ max_new_size = align_size_down(max_heap_byte_size() - min_alignment(),
+ min_alignment());
+ warning("MaxNewSize (" SIZE_FORMAT "k) is equal to or "
+ "greater than the entire heap (" SIZE_FORMAT "k). A "
+ "new generation size of " SIZE_FORMAT "k will be used.",
+ MaxNewSize/K, max_heap_byte_size()/K, max_new_size/K);
+ } else {
+ max_new_size = align_size_down(MaxNewSize, min_alignment());
+ }
+
+ // The case for FLAG_IS_ERGO(MaxNewSize) could be treated
+ // specially at this point to just use an ergonomically set
+ // MaxNewSize to set max_new_size. For cases with small
+ // heaps such a policy often did not work because the MaxNewSize
+ // was larger than the entire heap. The interpretation given
+ // to ergonomically set flags is that the flags are set
+ // by different collectors for their own special needs but
+ // are not allowed to badly shape the heap. This allows the
+ // different collectors to decide what's best for themselves
+ // without having to factor in the overall heap shape. It
+ // can be the case in the future that the collectors would
+ // only make "wise" ergonomics choices and this policy could
+ // just accept those choices. The choices currently made are
+ // not always "wise".
} else {
- _min_gen0_size = align_size_down(_min_heap_byte_size / (NewRatio+1),
- min_alignment());
- // We bound the minimum size by NewSize below (since it historically
+ max_new_size = scale_by_NewRatio_aligned(max_heap_byte_size());
+ // Bound the maximum size by NewSize below (since it historically
// would have been NewSize and because the NewRatio calculation could
// yield a size that is too small) and bound it by MaxNewSize above.
- // This is not always best. The NewSize calculated by CMS (which has
- // a fixed minimum of 16m) can sometimes be "too" large. Consider
- // the case where -Xmx32m. The CMS calculated NewSize would be about
- // half the entire heap which seems too large. But the counter
- // example is seen when the client defaults for NewRatio are used.
- // An initial young generation size of 640k was observed
- // with -Xmx128m -XX:MaxNewSize=32m when NewSize was not used
- // as a lower bound as with
- // _min_gen0_size = MIN2(_min_gen0_size, MaxNewSize);
- // and 640k seemed too small a young generation.
- _min_gen0_size = MIN2(MAX2(_min_gen0_size, NewSize), MaxNewSize);
+ // Ergonomics plays here by previously calculating the desired
+ // NewSize and MaxNewSize.
+ max_new_size = MIN2(MAX2(max_new_size, NewSize), MaxNewSize);
+ }
+ assert(max_new_size > 0, "All paths should set max_new_size");
+
+ // Given the maximum gen0 size, determine the initial and
+ // minimum sizes.
+
+ if (max_heap_byte_size() == min_heap_byte_size()) {
+ // The maximum and minimum heap sizes are the same so
+ // the generations minimum and initial must be the
+ // same as its maximum.
+ set_min_gen0_size(max_new_size);
+ set_initial_gen0_size(max_new_size);
+ set_max_gen0_size(max_new_size);
+ } else {
+ size_t desired_new_size = 0;
+ if (!FLAG_IS_DEFAULT(NewSize)) {
+ // If NewSize is set ergonomically (for example by cms), it
+ // would make sense to use it. If it is used, also use it
+ // to set the initial size. Although there is no reason
+ // the minimum size and the initial size have to be the same,
+ // the current implementation gets into trouble during the calculation
+ // of the tenured generation sizes if they are different.
+ // Note that this makes the initial size and the minimum size
+ // generally small compared to the NewRatio calculation.
+ _min_gen0_size = NewSize;
+ desired_new_size = NewSize;
+ max_new_size = MAX2(max_new_size, NewSize);
+ } else {
+ // For the case where NewSize is the default, use NewRatio
+ // to size the minimum and initial generation sizes.
+ // Use the default NewSize as the floor for these values. If
+ // NewRatio is overly large, the resulting sizes can be too
+ // small.
+ _min_gen0_size = MAX2(scale_by_NewRatio_aligned(min_heap_byte_size()),
+ NewSize);
+ desired_new_size =
+ MAX2(scale_by_NewRatio_aligned(initial_heap_byte_size()),
+ NewSize);
+ }
+
+ assert(_min_gen0_size > 0, "Sanity check");
+ set_initial_gen0_size(desired_new_size);
+ set_max_gen0_size(max_new_size);
+
+ // At this point the desirable initial and minimum sizes have been
+ // determined without regard to the maximum sizes.
+
+ // Bound the sizes by the corresponding overall heap sizes.
+ set_min_gen0_size(
+ bound_minus_alignment(_min_gen0_size, min_heap_byte_size()));
+ set_initial_gen0_size(
+ bound_minus_alignment(_initial_gen0_size, initial_heap_byte_size()));
+ set_max_gen0_size(
+ bound_minus_alignment(_max_gen0_size, max_heap_byte_size()));
+
+ // At this point all three sizes have been checked against the
+ // maximum sizes but have not been checked for consistency
+ // amoung the three.
+
+ // Final check min <= initial <= max
+ set_min_gen0_size(MIN2(_min_gen0_size, _max_gen0_size));
+ set_initial_gen0_size(
+ MAX2(MIN2(_initial_gen0_size, _max_gen0_size), _min_gen0_size));
+ set_min_gen0_size(MIN2(_min_gen0_size, _initial_gen0_size));
}
- // Parameters are valid, compute area sizes.
- size_t max_new_size = align_size_down(_max_heap_byte_size / (NewRatio+1),
- min_alignment());
- max_new_size = MIN2(MAX2(max_new_size, _min_gen0_size), MaxNewSize);
+ if (PrintGCDetails && Verbose) {
+ gclog_or_tty->print_cr("Minimum gen0 " SIZE_FORMAT " Initial gen0 "
+ SIZE_FORMAT " Maximum gen0 " SIZE_FORMAT,
+ min_gen0_size(), initial_gen0_size(), max_gen0_size());
+ }
+}
- // desired_new_size is used to set the initial size. The
- // initial size must be greater than the minimum size.
- size_t desired_new_size =
- align_size_down(_initial_heap_byte_size / (NewRatio+1),
- min_alignment());
+// Call this method during the sizing of the gen1 to make
+// adjustments to gen0 because of gen1 sizing policy. gen0 initially has
+// the most freedom in sizing because it is done before the
+// policy for gen1 is applied. Once gen1 policies have been applied,
+// there may be conflicts in the shape of the heap and this method
+// is used to make the needed adjustments. The application of the
+// policies could be more sophisticated (iterative for example) but
+// keeping it simple also seems a worthwhile goal.
+bool TwoGenerationCollectorPolicy::adjust_gen0_sizes(size_t* gen0_size_ptr,
+ size_t* gen1_size_ptr,
+ size_t heap_size,
+ size_t min_gen0_size) {
+ bool result = false;
+ if ((*gen1_size_ptr + *gen0_size_ptr) > heap_size) {
+ if (((*gen0_size_ptr + OldSize) > heap_size) &&
+ (heap_size - min_gen0_size) >= min_alignment()) {
+ // Adjust gen0 down to accomodate OldSize
+ *gen0_size_ptr = heap_size - min_gen0_size;
+ *gen0_size_ptr =
+ MAX2((uintx)align_size_down(*gen0_size_ptr, min_alignment()),
+ min_alignment());
+ assert(*gen0_size_ptr > 0, "Min gen0 is too large");
+ result = true;
+ } else {
+ *gen1_size_ptr = heap_size - *gen0_size_ptr;
+ *gen1_size_ptr =
+ MAX2((uintx)align_size_down(*gen1_size_ptr, min_alignment()),
+ min_alignment());
+ }
+ }
+ return result;
+}
- size_t new_size = MIN2(MAX2(desired_new_size, _min_gen0_size), max_new_size);
-
- _initial_gen0_size = new_size;
- _max_gen0_size = max_new_size;
-}
+// Minimum sizes of the generations may be different than
+// the initial sizes. An inconsistently is permitted here
+// in the total size that can be specified explicitly by
+// command line specification of OldSize and NewSize and
+// also a command line specification of -Xms. Issue a warning
+// but allow the values to pass.
void TwoGenerationCollectorPolicy::initialize_size_info() {
GenCollectorPolicy::initialize_size_info();
- // Minimum sizes of the generations may be different than
- // the initial sizes. An inconsistently is permitted here
- // in the total size that can be specified explicitly by
- // command line specification of OldSize and NewSize and
- // also a command line specification of -Xms. Issue a warning
- // but allow the values to pass.
- if (!FLAG_IS_DEFAULT(OldSize)) {
- _min_gen1_size = OldSize;
+ // At this point the minimum, initial and maximum sizes
+ // of the overall heap and of gen0 have been determined.
+ // The maximum gen1 size can be determined from the maximum gen0
+ // and maximum heap size since not explicit flags exits
+ // for setting the gen1 maximum.
+ _max_gen1_size = max_heap_byte_size() - _max_gen0_size;
+ _max_gen1_size =
+ MAX2((uintx)align_size_down(_max_gen1_size, min_alignment()),
+ min_alignment());
+ // If no explicit command line flag has been set for the
+ // gen1 size, use what is left for gen1.
+ if (FLAG_IS_DEFAULT(OldSize) || FLAG_IS_ERGO(OldSize)) {
+ // The user has not specified any value or ergonomics
+ // has chosen a value (which may or may not be consistent
+ // with the overall heap size). In either case make
+ // the minimum, maximum and initial sizes consistent
+ // with the gen0 sizes and the overall heap sizes.
+ assert(min_heap_byte_size() > _min_gen0_size,
+ "gen0 has an unexpected minimum size");
+ set_min_gen1_size(min_heap_byte_size() - min_gen0_size());
+ set_min_gen1_size(
+ MAX2((uintx)align_size_down(_min_gen1_size, min_alignment()),
+ min_alignment()));
+ set_initial_gen1_size(initial_heap_byte_size() - initial_gen0_size());
+ set_initial_gen1_size(
+ MAX2((uintx)align_size_down(_initial_gen1_size, min_alignment()),
+ min_alignment()));
+
+ } else {
+ // It's been explicitly set on the command line. Use the
+ // OldSize and then determine the consequences.
+ set_min_gen1_size(OldSize);
+ set_initial_gen1_size(OldSize);
+
+ // If the user has explicitly set an OldSize that is inconsistent
+ // with other command line flags, issue a warning.
// The generation minimums and the overall heap mimimum should
// be within one heap alignment.
- if ((_min_gen1_size + _min_gen0_size + max_alignment()) <
- _min_heap_byte_size) {
+ if ((_min_gen1_size + _min_gen0_size + min_alignment()) <
+ min_heap_byte_size()) {
warning("Inconsistency between minimum heap size and minimum "
- "generation sizes: using min heap = " SIZE_FORMAT,
- _min_heap_byte_size);
+ "generation sizes: using minimum heap = " SIZE_FORMAT,
+ min_heap_byte_size());
+ }
+ if ((OldSize > _max_gen1_size)) {
+ warning("Inconsistency between maximum heap size and maximum "
+ "generation sizes: using maximum heap = " SIZE_FORMAT
+ " -XX:OldSize flag is being ignored",
+ max_heap_byte_size());
+ }
+ // If there is an inconsistency between the OldSize and the minimum and/or
+ // initial size of gen0, since OldSize was explicitly set, OldSize wins.
+ if (adjust_gen0_sizes(&_min_gen0_size, &_min_gen1_size,
+ min_heap_byte_size(), OldSize)) {
+ if (PrintGCDetails && Verbose) {
+ gclog_or_tty->print_cr("Minimum gen0 " SIZE_FORMAT " Initial gen0 "
+ SIZE_FORMAT " Maximum gen0 " SIZE_FORMAT,
+ min_gen0_size(), initial_gen0_size(), max_gen0_size());
+ }
}
- } else {
- _min_gen1_size = _min_heap_byte_size - _min_gen0_size;
+ // Initial size
+ if (adjust_gen0_sizes(&_initial_gen0_size, &_initial_gen1_size,
+ initial_heap_byte_size(), OldSize)) {
+ if (PrintGCDetails && Verbose) {
+ gclog_or_tty->print_cr("Minimum gen0 " SIZE_FORMAT " Initial gen0 "
+ SIZE_FORMAT " Maximum gen0 " SIZE_FORMAT,
+ min_gen0_size(), initial_gen0_size(), max_gen0_size());
+ }
+ }
}
+ // Enforce the maximum gen1 size.
+ set_min_gen1_size(MIN2(_min_gen1_size, _max_gen1_size));
- _initial_gen1_size = _initial_heap_byte_size - _initial_gen0_size;
- _max_gen1_size = _max_heap_byte_size - _max_gen0_size;
+ // Check that min gen1 <= initial gen1 <= max gen1
+ set_initial_gen1_size(MAX2(_initial_gen1_size, _min_gen1_size));
+ set_initial_gen1_size(MIN2(_initial_gen1_size, _max_gen1_size));
+
+ if (PrintGCDetails && Verbose) {
+ gclog_or_tty->print_cr("Minimum gen1 " SIZE_FORMAT " Initial gen1 "
+ SIZE_FORMAT " Maximum gen1 " SIZE_FORMAT,
+ min_gen1_size(), initial_gen1_size(), max_gen1_size());
+ }
}
HeapWord* GenCollectorPolicy::mem_allocate_work(size_t size,
--- a/hotspot/src/share/vm/memory/collectorPolicy.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/memory/collectorPolicy.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -82,8 +82,11 @@
size_t max_alignment() { return _max_alignment; }
size_t initial_heap_byte_size() { return _initial_heap_byte_size; }
+ void set_initial_heap_byte_size(size_t v) { _initial_heap_byte_size = v; }
size_t max_heap_byte_size() { return _max_heap_byte_size; }
+ void set_max_heap_byte_size(size_t v) { _max_heap_byte_size = v; }
size_t min_heap_byte_size() { return _min_heap_byte_size; }
+ void set_min_heap_byte_size(size_t v) { _min_heap_byte_size = v; }
enum Name {
CollectorPolicyKind,
@@ -182,8 +185,24 @@
// compute max heap alignment
size_t compute_max_alignment();
+ // Scale the base_size by NewRation according to
+ // result = base_size / (NewRatio + 1)
+ // and align by min_alignment()
+ size_t scale_by_NewRatio_aligned(size_t base_size);
+
+ // Bound the value by the given maximum minus the
+ // min_alignment.
+ size_t bound_minus_alignment(size_t desired_size, size_t maximum_size);
public:
+ // Accessors
+ size_t min_gen0_size() { return _min_gen0_size; }
+ void set_min_gen0_size(size_t v) { _min_gen0_size = v; }
+ size_t initial_gen0_size() { return _initial_gen0_size; }
+ void set_initial_gen0_size(size_t v) { _initial_gen0_size = v; }
+ size_t max_gen0_size() { return _max_gen0_size; }
+ void set_max_gen0_size(size_t v) { _max_gen0_size = v; }
+
virtual int number_of_generations() = 0;
virtual GenerationSpec **generations() {
@@ -236,6 +255,14 @@
void initialize_generations() { ShouldNotReachHere(); }
public:
+ // Accessors
+ size_t min_gen1_size() { return _min_gen1_size; }
+ void set_min_gen1_size(size_t v) { _min_gen1_size = v; }
+ size_t initial_gen1_size() { return _initial_gen1_size; }
+ void set_initial_gen1_size(size_t v) { _initial_gen1_size = v; }
+ size_t max_gen1_size() { return _max_gen1_size; }
+ void set_max_gen1_size(size_t v) { _max_gen1_size = v; }
+
// Inherited methods
TwoGenerationCollectorPolicy* as_two_generation_policy() { return this; }
@@ -246,6 +273,10 @@
virtual CollectorPolicy::Name kind() {
return CollectorPolicy::TwoGenerationCollectorPolicyKind;
}
+
+ // Returns true is gen0 sizes were adjusted
+ bool adjust_gen0_sizes(size_t* gen0_size_ptr, size_t* gen1_size_ptr,
+ size_t heap_size, size_t min_gen1_size);
};
class MarkSweepPolicy : public TwoGenerationCollectorPolicy {
--- a/hotspot/src/share/vm/memory/compactingPermGenGen.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/memory/compactingPermGenGen.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -26,9 +26,27 @@
#include "incls/_compactingPermGenGen.cpp.incl"
-// Recursively adjust all pointers in an object and all objects by
-// referenced it. Clear marks on objects in order to prevent visiting
-// any object twice.
+// An ObjectClosure helper: Recursively adjust all pointers in an object
+// and all objects by referenced it. Clear marks on objects in order to
+// prevent visiting any object twice. This helper is used when the
+// RedefineClasses() API has been called.
+
+class AdjustSharedObjectClosure : public ObjectClosure {
+public:
+ void do_object(oop obj) {
+ if (obj->is_shared_readwrite()) {
+ if (obj->mark()->is_marked()) {
+ obj->init_mark(); // Don't revisit this object.
+ obj->adjust_pointers(); // Adjust this object's references.
+ }
+ }
+ }
+};
+
+
+// An OopClosure helper: Recursively adjust all pointers in an object
+// and all objects by referenced it. Clear marks on objects in order
+// to prevent visiting any object twice.
class RecursiveAdjustSharedObjectClosure : public OopClosure {
public:
@@ -274,15 +292,34 @@
// objects in the space will page in more objects than we need.
// Instead, use the system dictionary as strong roots into the read
// write space.
+//
+// If a RedefineClasses() call has been made, then we have to iterate
+// over the entire shared read-write space in order to find all the
+// objects that need to be forwarded. For example, it is possible for
+// an nmethod to be found and marked in GC phase-1 only for the nmethod
+// to be freed by the time we reach GC phase-3. The underlying method
+// is still marked, but we can't (easily) find it in GC phase-3 so we
+// blow up in GC phase-4. With RedefineClasses() we want replaced code
+// (EMCP or obsolete) to go away (i.e., be collectible) once it is no
+// longer being executed by any thread so we keep minimal attachments
+// to the replaced code. However, we can't guarantee when those EMCP
+// or obsolete methods will be collected so they may still be out there
+// even after we've severed our minimal attachments.
void CompactingPermGenGen::pre_adjust_pointers() {
if (spec()->enable_shared_spaces()) {
- RecursiveAdjustSharedObjectClosure blk;
- Universe::oops_do(&blk);
- StringTable::oops_do(&blk);
- SystemDictionary::always_strong_classes_do(&blk);
- TraversePlaceholdersClosure tpc;
- SystemDictionary::placeholders_do(&tpc);
+ if (JvmtiExport::has_redefined_a_class()) {
+ // RedefineClasses() requires a brute force approach
+ AdjustSharedObjectClosure blk;
+ rw_space()->object_iterate(&blk);
+ } else {
+ RecursiveAdjustSharedObjectClosure blk;
+ Universe::oops_do(&blk);
+ StringTable::oops_do(&blk);
+ SystemDictionary::always_strong_classes_do(&blk);
+ TraversePlaceholdersClosure tpc;
+ SystemDictionary::placeholders_do(&tpc);
+ }
}
}
--- a/hotspot/src/share/vm/memory/genRemSet.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/memory/genRemSet.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -91,8 +91,15 @@
virtual void verify() = 0;
// Verify that the remembered set has no entries for
- // the heap interval denoted by mr.
- virtual void verify_empty(MemRegion mr) = 0;
+ // the heap interval denoted by mr. If there are any
+ // alignment constraints on the remembered set, only the
+ // part of the region that is aligned is checked.
+ //
+ // alignment boundaries
+ // +--------+-------+--------+-------+
+ // [ region mr )
+ // [ part checked )
+ virtual void verify_aligned_region_empty(MemRegion mr) = 0;
// If appropriate, print some information about the remset on "tty".
virtual void print() {}
--- a/hotspot/src/share/vm/memory/heap.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/memory/heap.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -102,8 +102,9 @@
_log2_segment_size = exact_log2(segment_size);
// Reserve and initialize space for _memory.
- const size_t page_size = os::page_size_for_region(committed_size,
- reserved_size, 8);
+ const size_t page_size = os::can_execute_large_page_memory() ?
+ os::page_size_for_region(committed_size, reserved_size, 8) :
+ os::vm_page_size();
const size_t granularity = os::vm_allocation_granularity();
const size_t r_align = MAX2(page_size, granularity);
const size_t r_size = align_size_up(reserved_size, r_align);
@@ -111,7 +112,7 @@
const size_t rs_align = page_size == (size_t) os::vm_page_size() ? 0 :
MAX2(page_size, granularity);
- ReservedSpace rs(r_size, rs_align, false);
+ ReservedSpace rs(r_size, rs_align, rs_align > 0);
os::trace_page_sizes("code heap", committed_size, reserved_size, page_size,
rs.base(), rs.size());
if (!_memory.initialize(rs, c_size)) {
--- a/hotspot/src/share/vm/memory/heapInspection.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/memory/heapInspection.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -65,7 +65,7 @@
name = "<no name>";
}
// simplify the formatting (ILP32 vs LP64) - always cast the numbers to 64-bit
- st->print_cr("%13" FORMAT64_MODIFIER "d %13" FORMAT64_MODIFIER "u %s",
+ st->print_cr(INT64_FORMAT_W(13) " " UINT64_FORMAT_W(13) " %s",
(jlong) _instance_count,
(julong) _instance_words * HeapWordSize,
name);
@@ -80,7 +80,10 @@
elt = elt->next();
}
elt = new KlassInfoEntry(k, list());
- set_list(elt);
+ // We may be out of space to allocate the new entry.
+ if (elt != NULL) {
+ set_list(elt);
+ }
return elt;
}
@@ -103,21 +106,25 @@
}
KlassInfoTable::KlassInfoTable(int size, HeapWord* ref) {
- _size = size;
+ _size = 0;
_ref = ref;
- _buckets = NEW_C_HEAP_ARRAY(KlassInfoBucket, _size);
-
- for (int index = 0; index < _size; index++) {
- _buckets[index].initialize();
+ _buckets = NEW_C_HEAP_ARRAY(KlassInfoBucket, size);
+ if (_buckets != NULL) {
+ _size = size;
+ for (int index = 0; index < _size; index++) {
+ _buckets[index].initialize();
+ }
}
}
KlassInfoTable::~KlassInfoTable() {
- for (int index = 0; index < _size; index++) {
- _buckets[index].empty();
+ if (_buckets != NULL) {
+ for (int index = 0; index < _size; index++) {
+ _buckets[index].empty();
+ }
+ FREE_C_HEAP_ARRAY(KlassInfoBucket, _buckets);
+ _size = 0;
}
- FREE_C_HEAP_ARRAY(KlassInfoBucket, _buckets);
- _size = 0;
}
uint KlassInfoTable::hash(klassOop p) {
@@ -127,19 +134,32 @@
KlassInfoEntry* KlassInfoTable::lookup(const klassOop k) {
uint idx = hash(k) % _size;
+ assert(_buckets != NULL, "Allocation failure should have been caught");
KlassInfoEntry* e = _buckets[idx].lookup(k);
- assert(k == e->klass(), "must be equal");
+ // Lookup may fail if this is a new klass for which we
+ // could not allocate space for an new entry.
+ assert(e == NULL || k == e->klass(), "must be equal");
return e;
}
-void KlassInfoTable::record_instance(const oop obj) {
+// Return false if the entry could not be recorded on account
+// of running out of space required to create a new entry.
+bool KlassInfoTable::record_instance(const oop obj) {
klassOop k = obj->klass();
KlassInfoEntry* elt = lookup(k);
- elt->set_count(elt->count() + 1);
- elt->set_words(elt->words() + obj->size());
+ // elt may be NULL if it's a new klass for which we
+ // could not allocate space for a new entry in the hashtable.
+ if (elt != NULL) {
+ elt->set_count(elt->count() + 1);
+ elt->set_words(elt->words() + obj->size());
+ return true;
+ } else {
+ return false;
+ }
}
void KlassInfoTable::iterate(KlassInfoClosure* cic) {
+ assert(_size == 0 || _buckets != NULL, "Allocation failure should have been caught");
for (int index = 0; index < _size; index++) {
_buckets[index].iterate(cic);
}
@@ -176,7 +196,7 @@
total += elements()->at(i)->count();
totalw += elements()->at(i)->words();
}
- st->print_cr("Total %13" FORMAT64_MODIFIER "d %13" FORMAT64_MODIFIER "u",
+ st->print_cr("Total " INT64_FORMAT_W(13) " " UINT64_FORMAT_W(13),
total, totalw * HeapWordSize);
}
@@ -199,12 +219,18 @@
class RecordInstanceClosure : public ObjectClosure {
private:
KlassInfoTable* _cit;
+ size_t _missed_count;
public:
- RecordInstanceClosure(KlassInfoTable* cit) : _cit(cit) {}
+ RecordInstanceClosure(KlassInfoTable* cit) :
+ _cit(cit), _missed_count(0) {}
void do_object(oop obj) {
- _cit->record_instance(obj);
+ if (!_cit->record_instance(obj)) {
+ _missed_count++;
+ }
}
+
+ size_t missed_count() { return _missed_count; }
};
void HeapInspection::heap_inspection(outputStream* st) {
@@ -230,21 +256,32 @@
ShouldNotReachHere(); // Unexpected heap kind for this op
}
// Collect klass instance info
-
- // Iterate over objects in the heap
KlassInfoTable cit(KlassInfoTable::cit_size, ref);
- RecordInstanceClosure ric(&cit);
- Universe::heap()->object_iterate(&ric);
+ if (!cit.allocation_failed()) {
+ // Iterate over objects in the heap
+ RecordInstanceClosure ric(&cit);
+ Universe::heap()->object_iterate(&ric);
- // Sort and print klass instance info
- KlassInfoHisto histo("\n"
- " num #instances #bytes class name\n"
- "----------------------------------------------",
- KlassInfoHisto::histo_initial_size);
- HistoClosure hc(&histo);
- cit.iterate(&hc);
- histo.sort();
- histo.print_on(st);
+ // Report if certain classes are not counted because of
+ // running out of C-heap for the histogram.
+ size_t missed_count = ric.missed_count();
+ if (missed_count != 0) {
+ st->print_cr("WARNING: Ran out of C-heap; undercounted " SIZE_FORMAT
+ " total instances in data below",
+ missed_count);
+ }
+ // Sort and print klass instance info
+ KlassInfoHisto histo("\n"
+ " num #instances #bytes class name\n"
+ "----------------------------------------------",
+ KlassInfoHisto::histo_initial_size);
+ HistoClosure hc(&histo);
+ cit.iterate(&hc);
+ histo.sort();
+ histo.print_on(st);
+ } else {
+ st->print_cr("WARNING: Ran out of C-heap; histogram not generated");
+ }
st->flush();
if (Universe::heap()->kind() == CollectedHeap::GenCollectedHeap) {
--- a/hotspot/src/share/vm/memory/heapInspection.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/memory/heapInspection.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -98,8 +98,9 @@
};
KlassInfoTable(int size, HeapWord* ref);
~KlassInfoTable();
- void record_instance(const oop obj);
+ bool record_instance(const oop obj);
void iterate(KlassInfoClosure* cic);
+ bool allocation_failed() { return _buckets == NULL; }
};
class KlassInfoHisto : public StackObj {
--- a/hotspot/src/share/vm/memory/referenceProcessor.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/memory/referenceProcessor.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -85,7 +85,7 @@
ReferenceProcessor* rp =
new ReferenceProcessor(span, atomic_discovery,
mt_discovery, mt_degree,
- mt_processing);
+ mt_processing && (parallel_gc_threads > 0));
if (rp == NULL) {
vm_exit_during_initialization("Could not allocate ReferenceProcessor object");
}
--- a/hotspot/src/share/vm/memory/tenuredGeneration.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/memory/tenuredGeneration.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -409,10 +409,11 @@
void TenuredGeneration::verify_alloc_buffers_clean() {
if (UseParNewGC) {
for (uint i = 0; i < ParallelGCThreads; i++) {
- _rs->verify_empty(_alloc_buffers[i]->range());
+ _rs->verify_aligned_region_empty(_alloc_buffers[i]->range());
}
}
}
+
#else // SERIALGC
void TenuredGeneration::retire_alloc_buffers_before_full_gc() {}
void TenuredGeneration::verify_alloc_buffers_clean() {}
--- a/hotspot/src/share/vm/oops/arrayOop.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/oops/arrayOop.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -58,11 +58,11 @@
// alignments. It gets the scale from the type2aelembytes array.
static int32_t max_array_length(BasicType type) {
assert(type >= 0 && type < T_CONFLICT, "wrong type");
- assert(type2aelembytes[type] != 0, "wrong type");
+ assert(type2aelembytes(type) != 0, "wrong type");
// We use max_jint, since object_size is internally represented by an 'int'
// This gives us an upper bound of max_jint words for the size of the oop.
int32_t max_words = (max_jint - header_size(type) - 2);
- int elembytes = (type == T_OBJECT) ? T_OBJECT_aelem_bytes : type2aelembytes[type];
+ int elembytes = (type == T_OBJECT) ? T_OBJECT_aelem_bytes : type2aelembytes(type);
jlong len = ((jlong)max_words * HeapWordSize) / elembytes;
return (len > max_jint) ? max_jint : (int32_t)len;
}
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -791,17 +791,39 @@
}
+static int compare_fields_by_offset(int* a, int* b) {
+ return a[0] - b[0];
+}
+
void instanceKlass::do_nonstatic_fields(FieldClosure* cl) {
- fieldDescriptor fd;
instanceKlass* super = superklass();
if (super != NULL) {
super->do_nonstatic_fields(cl);
}
+ fieldDescriptor fd;
int length = fields()->length();
+ // In DebugInfo nonstatic fields are sorted by offset.
+ int* fields_sorted = NEW_C_HEAP_ARRAY(int, 2*(length+1));
+ int j = 0;
for (int i = 0; i < length; i += next_offset) {
fd.initialize(as_klassOop(), i);
- if (!(fd.is_static())) cl->do_field(&fd);
+ if (!fd.is_static()) {
+ fields_sorted[j + 0] = fd.offset();
+ fields_sorted[j + 1] = i;
+ j += 2;
+ }
}
+ if (j > 0) {
+ length = j;
+ // _sort_Fn is defined in growableArray.hpp.
+ qsort(fields_sorted, length/2, 2*sizeof(int), (_sort_Fn)compare_fields_by_offset);
+ for (int i = 0; i < length; i += 2) {
+ fd.initialize(as_klassOop(), fields_sorted[i + 1]);
+ assert(!fd.is_static() && fd.offset() == fields_sorted[i], "only nonstatic fields");
+ cl->do_field(&fd);
+ }
+ }
+ FREE_C_HEAP_ARRAY(int, fields_sorted);
}
@@ -950,7 +972,6 @@
// These allocations will have to be freed if they are unused.
// Allocate a new array of methods.
- jmethodID* to_dealloc_jmeths = NULL;
jmethodID* new_jmeths = NULL;
if (length <= idnum) {
// A new array will be needed (unless some other thread beats us to it)
@@ -961,7 +982,6 @@
}
// Allocate a new method ID.
- jmethodID to_dealloc_id = NULL;
jmethodID new_id = NULL;
if (method_h->is_old() && !method_h->is_obsolete()) {
// The method passed in is old (but not obsolete), we need to use the current version
@@ -975,40 +995,51 @@
new_id = JNIHandles::make_jmethod_id(method_h);
}
- {
+ if (Threads::number_of_threads() == 0 || SafepointSynchronize::is_at_safepoint()) {
+ // No need and unsafe to lock the JmethodIdCreation_lock at safepoint.
+ id = get_jmethod_id(ik_h, idnum, new_id, new_jmeths);
+ } else {
MutexLocker ml(JmethodIdCreation_lock);
+ id = get_jmethod_id(ik_h, idnum, new_id, new_jmeths);
+ }
+ }
+ return id;
+}
- // We must not go to a safepoint while holding this lock.
- debug_only(No_Safepoint_Verifier nosafepoints;)
+
+jmethodID instanceKlass::get_jmethod_id(instanceKlassHandle ik_h, size_t idnum,
+ jmethodID new_id, jmethodID* new_jmeths) {
+ // Retry lookup after we got the lock or ensured we are at safepoint
+ jmethodID* jmeths = ik_h->methods_jmethod_ids_acquire();
+ jmethodID id = NULL;
+ jmethodID to_dealloc_id = NULL;
+ jmethodID* to_dealloc_jmeths = NULL;
+ size_t length;
- // Retry lookup after we got the lock
- jmeths = ik_h->methods_jmethod_ids_acquire();
- if (jmeths == NULL || (length = (size_t)jmeths[0]) <= idnum) {
- if (jmeths != NULL) {
- // We have grown the array: copy the existing entries, and delete the old array
- for (size_t index = 0; index < length; index++) {
- new_jmeths[index+1] = jmeths[index+1];
- }
- to_dealloc_jmeths = jmeths; // using the new jmeths, deallocate the old one
- }
- ik_h->release_set_methods_jmethod_ids(jmeths = new_jmeths);
- } else {
- id = jmeths[idnum+1];
- to_dealloc_jmeths = new_jmeths; // using the old jmeths, deallocate the new one
+ if (jmeths == NULL || (length = (size_t)jmeths[0]) <= idnum) {
+ if (jmeths != NULL) {
+ // We have grown the array: copy the existing entries, and delete the old array
+ for (size_t index = 0; index < length; index++) {
+ new_jmeths[index+1] = jmeths[index+1];
}
- if (id == NULL) {
- id = new_id;
- jmeths[idnum+1] = id; // install the new method ID
- } else {
- to_dealloc_id = new_id; // the new id wasn't used, mark it for deallocation
- }
+ to_dealloc_jmeths = jmeths; // using the new jmeths, deallocate the old one
}
+ ik_h->release_set_methods_jmethod_ids(jmeths = new_jmeths);
+ } else {
+ id = jmeths[idnum+1];
+ to_dealloc_jmeths = new_jmeths; // using the old jmeths, deallocate the new one
+ }
+ if (id == NULL) {
+ id = new_id;
+ jmeths[idnum+1] = id; // install the new method ID
+ } else {
+ to_dealloc_id = new_id; // the new id wasn't used, mark it for deallocation
+ }
- // Free up unneeded or no longer needed resources
- FreeHeap(to_dealloc_jmeths);
- if (to_dealloc_id != NULL) {
- JNIHandles::destroy_jmethod_id(to_dealloc_id);
- }
+ // Free up unneeded or no longer needed resources
+ FreeHeap(to_dealloc_jmeths);
+ if (to_dealloc_id != NULL) {
+ JNIHandles::destroy_jmethod_id(to_dealloc_id);
}
return id;
}
@@ -2165,12 +2196,20 @@
RC_TRACE(0x00000100, ("adding previous version ref for %s @%d, EMCP_cnt=%d",
ikh->external_name(), _previous_versions->length(), emcp_method_count));
constantPoolHandle cp_h(ikh->constants());
- jweak cp_ref = JNIHandles::make_weak_global(cp_h);
+ jobject cp_ref;
+ if (cp_h->is_shared()) {
+ // a shared ConstantPool requires a regular reference; a weak
+ // reference would be collectible
+ cp_ref = JNIHandles::make_global(cp_h);
+ } else {
+ cp_ref = JNIHandles::make_weak_global(cp_h);
+ }
PreviousVersionNode * pv_node = NULL;
objArrayOop old_methods = ikh->methods();
if (emcp_method_count == 0) {
- pv_node = new PreviousVersionNode(cp_ref, NULL);
+ // non-shared ConstantPool gets a weak reference
+ pv_node = new PreviousVersionNode(cp_ref, !cp_h->is_shared(), NULL);
RC_TRACE(0x00000400,
("add: all methods are obsolete; flushing any EMCP weak refs"));
} else {
@@ -2190,7 +2229,8 @@
}
}
}
- pv_node = new PreviousVersionNode(cp_ref, method_refs);
+ // non-shared ConstantPool gets a weak reference
+ pv_node = new PreviousVersionNode(cp_ref, !cp_h->is_shared(), method_refs);
}
_previous_versions->append(pv_node);
@@ -2208,7 +2248,7 @@
// check the previous versions array for a GC'ed weak refs
pv_node = _previous_versions->at(i);
cp_ref = pv_node->prev_constant_pool();
- assert(cp_ref != NULL, "weak cp ref was unexpectedly cleared");
+ assert(cp_ref != NULL, "cp ref was unexpectedly cleared");
if (cp_ref == NULL) {
delete pv_node;
_previous_versions->remove_at(i);
@@ -2281,7 +2321,7 @@
// check the previous versions array for a GC'ed weak refs
pv_node = _previous_versions->at(j);
cp_ref = pv_node->prev_constant_pool();
- assert(cp_ref != NULL, "weak cp ref was unexpectedly cleared");
+ assert(cp_ref != NULL, "cp ref was unexpectedly cleared");
if (cp_ref == NULL) {
delete pv_node;
_previous_versions->remove_at(j);
@@ -2379,8 +2419,8 @@
// been GC'ed
PreviousVersionNode * pv_node = _previous_versions->at(i);
- jweak cp_ref = pv_node->prev_constant_pool();
- assert(cp_ref != NULL, "weak reference was unexpectedly cleared");
+ jobject cp_ref = pv_node->prev_constant_pool();
+ assert(cp_ref != NULL, "cp reference was unexpectedly cleared");
if (cp_ref == NULL) {
continue; // robustness
}
@@ -2440,10 +2480,11 @@
// Construct a PreviousVersionNode entry for the array hung off
// the instanceKlass.
-PreviousVersionNode::PreviousVersionNode(jweak prev_constant_pool,
- GrowableArray<jweak>* prev_EMCP_methods) {
+PreviousVersionNode::PreviousVersionNode(jobject prev_constant_pool,
+ bool prev_cp_is_weak, GrowableArray<jweak>* prev_EMCP_methods) {
_prev_constant_pool = prev_constant_pool;
+ _prev_cp_is_weak = prev_cp_is_weak;
_prev_EMCP_methods = prev_EMCP_methods;
}
@@ -2451,7 +2492,11 @@
// Destroy a PreviousVersionNode
PreviousVersionNode::~PreviousVersionNode() {
if (_prev_constant_pool != NULL) {
- JNIHandles::destroy_weak_global(_prev_constant_pool);
+ if (_prev_cp_is_weak) {
+ JNIHandles::destroy_weak_global(_prev_constant_pool);
+ } else {
+ JNIHandles::destroy_global(_prev_constant_pool);
+ }
}
if (_prev_EMCP_methods != NULL) {
@@ -2471,8 +2516,8 @@
_prev_constant_pool_handle = constantPoolHandle(); // NULL handle
_prev_EMCP_method_handles = NULL;
- jweak cp_ref = pv_node->prev_constant_pool();
- assert(cp_ref != NULL, "weak constant pool ref was unexpectedly cleared");
+ jobject cp_ref = pv_node->prev_constant_pool();
+ assert(cp_ref != NULL, "constant pool ref was unexpectedly cleared");
if (cp_ref == NULL) {
return; // robustness
}
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -432,6 +432,8 @@
_enclosing_method_method_index = method_index; }
// jmethodID support
+ static jmethodID get_jmethod_id(instanceKlassHandle ik_h, size_t idnum,
+ jmethodID new_id, jmethodID* new_jmeths);
static jmethodID jmethod_id_for_impl(instanceKlassHandle ik_h, methodHandle method_h);
jmethodID jmethod_id_or_null(methodOop method);
@@ -838,11 +840,20 @@
// A collection point for interesting information about the previous
// version(s) of an instanceKlass. This class uses weak references to
// the information so that the information may be collected as needed
-// by the system. A GrowableArray of PreviousVersionNodes is attached
+// by the system. If the information is shared, then a regular
+// reference must be used because a weak reference would be seen as
+// collectible. A GrowableArray of PreviousVersionNodes is attached
// to the instanceKlass as needed. See PreviousVersionWalker below.
class PreviousVersionNode : public CHeapObj {
private:
- jweak _prev_constant_pool;
+ // A shared ConstantPool is never collected so we'll always have
+ // a reference to it so we can update items in the cache. We'll
+ // have a weak reference to a non-shared ConstantPool until all
+ // of the methods (EMCP or obsolete) have been collected; the
+ // non-shared ConstantPool becomes collectible at that point.
+ jobject _prev_constant_pool; // regular or weak reference
+ bool _prev_cp_is_weak; // true if not a shared ConstantPool
+
// If the previous version of the instanceKlass doesn't have any
// EMCP methods, then _prev_EMCP_methods will be NULL. If all the
// EMCP methods have been collected, then _prev_EMCP_methods can
@@ -850,10 +861,10 @@
GrowableArray<jweak>* _prev_EMCP_methods;
public:
- PreviousVersionNode(jweak prev_constant_pool,
+ PreviousVersionNode(jobject prev_constant_pool, bool prev_cp_is_weak,
GrowableArray<jweak>* prev_EMCP_methods);
~PreviousVersionNode();
- jweak prev_constant_pool() const {
+ jobject prev_constant_pool() const {
return _prev_constant_pool;
}
GrowableArray<jweak>* prev_EMCP_methods() const {
--- a/hotspot/src/share/vm/oops/klass.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/oops/klass.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -182,7 +182,7 @@
assert(etype >= T_BOOLEAN && etype <= T_OBJECT, "valid etype");
// Note that T_ARRAY is not allowed here.
int hsize = arrayOopDesc::base_offset_in_bytes(etype);
- int esize = type2aelembytes[etype];
+ int esize = type2aelembytes(etype);
bool isobj = (etype == T_OBJECT);
int tag = isobj ? _lh_array_tag_obj_value : _lh_array_tag_type_value;
int lh = array_layout_helper(tag, hsize, etype, exact_log2(esize));
--- a/hotspot/src/share/vm/oops/klassVtable.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/oops/klassVtable.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -735,7 +735,7 @@
}
}
- // This lenght of the itable was either zero, or it has not yet been initialized.
+ // The length of the itable was either zero, or it has not yet been initialized.
_table_offset = 0;
_size_offset_table = 0;
_size_method_table = 0;
@@ -870,16 +870,19 @@
// Initialization
void klassItable::initialize_itable(bool checkconstraints, TRAPS) {
- // Cannot be setup doing bootstrapping
- if (Universe::is_bootstrapping()) return;
+ // Cannot be setup doing bootstrapping, interfaces don't have
+ // itables, and klass with only ones entry have empty itables
+ if (Universe::is_bootstrapping() ||
+ _klass->is_interface() ||
+ _klass->itable_length() == itableOffsetEntry::size()) return;
- int num_interfaces = nof_interfaces();
+ // There's alway an extra itable entry so we can null-terminate it.
+ guarantee(size_offset_table() >= 1, "too small");
+ int num_interfaces = size_offset_table() - 1;
if (num_interfaces > 0) {
- if (TraceItables) tty->print_cr("%3d: Initializing itables for %s", ++initialize_count, _klass->name()->as_C_string());
+ if (TraceItables) tty->print_cr("%3d: Initializing itables for %s", ++initialize_count,
+ _klass->name()->as_C_string());
- // In debug mode, we got an extra NULL/NULL entry
- debug_only(num_interfaces--);
- assert(num_interfaces > 0, "to few interfaces in offset itable");
// Interate through all interfaces
int i;
@@ -890,12 +893,10 @@
initialize_itable_for_interface(ioe->offset(), interf_h, checkconstraints, CHECK);
}
-#ifdef ASSERT
- // Check that the last entry is empty
- itableOffsetEntry* ioe = offset_entry(i);
- assert(ioe->interface_klass() == NULL && ioe->offset() == 0, "terminator entry missing");
-#endif
}
+ // Check that the last entry is empty
+ itableOffsetEntry* ioe = offset_entry(size_offset_table() - 1);
+ guarantee(ioe->interface_klass() == NULL && ioe->offset() == 0, "terminator entry missing");
}
@@ -972,7 +973,7 @@
}
}
-// Update entry for specic methodOop
+// Update entry for specific methodOop
void klassItable::initialize_with_method(methodOop m) {
itableMethodEntry* ime = method_entry(0);
for(int i = 0; i < _size_method_table; i++) {
@@ -1085,12 +1086,8 @@
CountInterfacesClosure cic;
visit_all_interfaces(transitive_interfaces(), &cic);
- // Add one extra entry in debug mode, so we can null-terminate the table
- int nof_methods = cic.nof_methods();
- int nof_interfaces = cic.nof_interfaces();
- debug_only(if (nof_interfaces > 0) nof_interfaces++);
-
- int itable_size = calc_itable_size(nof_interfaces, nof_methods);
+ // There's alway an extra itable entry so we can null-terminate it.
+ int itable_size = calc_itable_size(cic.nof_interfaces() + 1, cic.nof_methods());
// Statistics
update_stats(itable_size * HeapWordSize);
@@ -1110,8 +1107,8 @@
int nof_methods = cic.nof_methods();
int nof_interfaces = cic.nof_interfaces();
- // Add one extra entry in debug mode, so we can null-terminate the table
- debug_only(if (nof_interfaces > 0) nof_interfaces++);
+ // Add one extra entry so we can null-terminate the table
+ nof_interfaces++;
assert(compute_itable_size(objArrayHandle(klass->transitive_interfaces())) ==
calc_itable_size(nof_interfaces, nof_methods),
--- a/hotspot/src/share/vm/oops/klassVtable.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/oops/klassVtable.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -259,7 +259,7 @@
itableMethodEntry* method_entry(int i) { assert(0 <= i && i <= _size_method_table, "index out of bounds");
return &((itableMethodEntry*)method_start())[i]; }
- int nof_interfaces() { return _size_offset_table; }
+ int size_offset_table() { return _size_offset_table; }
// Initialization
void initialize_itable(bool checkconstraints, TRAPS);
--- a/hotspot/src/share/vm/oops/markOop.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/oops/markOop.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -37,3 +37,32 @@
st->print("age %d)", age());
}
}
+
+
+// Give advice about whether the oop that contains this markOop
+// should be cached or not.
+bool markOopDesc::should_not_be_cached() const {
+ // the cast is because decode_pointer() isn't marked const
+ if (is_marked() && ((markOopDesc *)this)->decode_pointer() != NULL) {
+ // If the oop containing this markOop is being forwarded, then
+ // we are in the middle of GC and we do not want the containing
+ // oop to be added to a cache. We have no way of knowing whether
+ // the cache has already been visited by the current GC phase so
+ // we don't know whether the forwarded oop will be properly
+ // processed in this phase. If the forwarded oop is not properly
+ // processed, then we'll see strange crashes or asserts during
+ // the next GC run because the markOop will contain an unexpected
+ // value.
+ //
+ // This situation has been seen when we are GC'ing a methodOop
+ // because we use the methodOop while we're GC'ing it. Scary
+ // stuff. Some of the uses the methodOop cause the methodOop to
+ // be added to the OopMapCache in the instanceKlass as a side
+ // effect. This check lets the cache maintainer know when a
+ // cache addition would not be safe.
+ return true;
+ }
+
+ // caching the containing oop should be just fine
+ return false;
+}
--- a/hotspot/src/share/vm/oops/markOop.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/oops/markOop.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -357,4 +357,7 @@
// Recover address of oop from encoded form used in mark
inline void* decode_pointer() { if (UseBiasedLocking && has_bias_pattern()) return NULL; return clear_lock_bits(); }
+
+ // see the definition in markOop.cpp for the gory details
+ bool should_not_be_cached() const;
};
--- a/hotspot/src/share/vm/oops/methodDataOop.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/oops/methodDataOop.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -32,7 +32,7 @@
// Some types of data layouts need a length field.
bool DataLayout::needs_array_len(u1 tag) {
- return (tag == multi_branch_data_tag);
+ return (tag == multi_branch_data_tag) || (tag == arg_info_data_tag);
}
// Perform generic initialization of the data. More specific
@@ -404,6 +404,17 @@
}
#endif
+#ifndef PRODUCT
+void ArgInfoData::print_data_on(outputStream* st) {
+ print_shared(st, "ArgInfoData");
+ int nargs = number_of_args();
+ for (int i = 0; i < nargs; i++) {
+ st->print(" 0x%x", arg_modified(i));
+ }
+ st->cr();
+}
+
+#endif
// ==================================================================
// methodDataOop
//
@@ -508,6 +519,9 @@
int extra_data_count = compute_extra_data_count(data_size, empty_bc_count);
object_size += extra_data_count * DataLayout::compute_size_in_bytes(0);
+ // Add a cell to record information about modified arguments.
+ int arg_size = method->size_of_parameters();
+ object_size += DataLayout::compute_size_in_bytes(arg_size+1);
return object_size;
}
@@ -626,6 +640,8 @@
return new BranchData(data_layout);
case DataLayout::multi_branch_data_tag:
return new MultiBranchData(data_layout);
+ case DataLayout::arg_info_data_tag:
+ return new ArgInfoData(data_layout);
};
}
@@ -681,7 +697,17 @@
// Add some extra DataLayout cells (at least one) to track stray traps.
int extra_data_count = compute_extra_data_count(data_size, empty_bc_count);
- object_size += extra_data_count * DataLayout::compute_size_in_bytes(0);
+ int extra_size = extra_data_count * DataLayout::compute_size_in_bytes(0);
+
+ // Add a cell to record information about modified arguments.
+ // Set up _args_modified array after traps cells so that
+ // the code for traps cells works.
+ DataLayout *dp = data_layout_at(data_size + extra_size);
+
+ int arg_size = method->size_of_parameters();
+ dp->initialize(DataLayout::arg_info_data_tag, 0, arg_size+1);
+
+ object_size += extra_size + DataLayout::compute_size_in_bytes(arg_size+1);
// Set an initial hint. Don't use set_hint_di() because
// first_di() may be out of bounds if data_size is 0.
@@ -764,6 +790,10 @@
// No need for "OrderAccess::load_acquire" ops,
// since the data structure is monotonic.
if (dp->tag() == DataLayout::no_tag) break;
+ if (dp->tag() == DataLayout::arg_info_data_tag) {
+ dp = end; // ArgInfoData is at the end of extra data section.
+ break;
+ }
if (dp->bci() == bci) {
assert(dp->tag() == DataLayout::bit_data_tag, "sane");
return new BitData(dp);
@@ -785,6 +815,16 @@
return NULL;
}
+ArgInfoData *methodDataOopDesc::arg_info() {
+ DataLayout* dp = extra_data_base();
+ DataLayout* end = extra_data_limit();
+ for (; dp < end; dp = next_extra(dp)) {
+ if (dp->tag() == DataLayout::arg_info_data_tag)
+ return new ArgInfoData(dp);
+ }
+ return NULL;
+}
+
#ifndef PRODUCT
void methodDataOopDesc::print_data_on(outputStream* st) {
ResourceMark rm;
@@ -794,15 +834,20 @@
st->fill_to(6);
data->print_data_on(st);
}
+ st->print_cr("--- Extra data:");
DataLayout* dp = extra_data_base();
DataLayout* end = extra_data_limit();
for (; dp < end; dp = next_extra(dp)) {
// No need for "OrderAccess::load_acquire" ops,
// since the data structure is monotonic.
- if (dp->tag() == DataLayout::no_tag) break;
- if (dp == extra_data_base())
- st->print_cr("--- Extra data:");
- data = new BitData(dp);
+ if (dp->tag() == DataLayout::no_tag) continue;
+ if (dp->tag() == DataLayout::bit_data_tag) {
+ data = new BitData(dp);
+ } else {
+ assert(dp->tag() == DataLayout::arg_info_data_tag, "must be BitData or ArgInfo");
+ data = new ArgInfoData(dp);
+ dp = end; // ArgInfoData is at the end of extra data section.
+ }
st->print("%d", dp_to_di(data->dp()));
st->fill_to(6);
data->print_data_on(st);
--- a/hotspot/src/share/vm/oops/methodDataOop.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/oops/methodDataOop.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -101,7 +101,8 @@
virtual_call_data_tag,
ret_data_tag,
branch_data_tag,
- multi_branch_data_tag
+ multi_branch_data_tag,
+ arg_info_data_tag
};
enum {
@@ -245,6 +246,7 @@
class BranchData;
class ArrayData;
class MultiBranchData;
+class ArgInfoData;
// ProfileData
@@ -376,6 +378,8 @@
virtual bool is_BranchData() { return false; }
virtual bool is_ArrayData() { return false; }
virtual bool is_MultiBranchData() { return false; }
+ virtual bool is_ArgInfoData() { return false; }
+
BitData* as_BitData() {
assert(is_BitData(), "wrong type");
@@ -413,6 +417,10 @@
assert(is_MultiBranchData(), "wrong type");
return is_MultiBranchData() ? (MultiBranchData*)this : NULL;
}
+ ArgInfoData* as_ArgInfoData() {
+ assert(is_ArgInfoData(), "wrong type");
+ return is_ArgInfoData() ? (ArgInfoData*)this : NULL;
+ }
// Subclass specific initialization
@@ -1047,6 +1055,33 @@
#endif
};
+class ArgInfoData : public ArrayData {
+
+public:
+ ArgInfoData(DataLayout* layout) : ArrayData(layout) {
+ assert(layout->tag() == DataLayout::arg_info_data_tag, "wrong type");
+ }
+
+ virtual bool is_ArgInfoData() { return true; }
+
+
+ int number_of_args() {
+ return array_len();
+ }
+
+ uint arg_modified(int arg) {
+ return array_uint_at(arg);
+ }
+
+ void set_arg_modified(int arg, uint val) {
+ array_set_int_at(arg, val);
+ }
+
+#ifndef PRODUCT
+ void print_data_on(outputStream* st);
+#endif
+};
+
// methodDataOop
//
// A methodDataOop holds information which has been collected about
@@ -1183,6 +1218,9 @@
// Find or create an extra ProfileData:
ProfileData* bci_to_extra_data(int bci, bool create_if_missing);
+ // return the argument info cell
+ ArgInfoData *arg_info();
+
public:
static int header_size() {
return sizeof(methodDataOopDesc)/wordSize;
@@ -1215,18 +1253,28 @@
// Support for interprocedural escape analysis, from Thomas Kotzmann.
enum EscapeFlag {
estimated = 1 << 0,
- return_local = 1 << 1
+ return_local = 1 << 1,
+ return_allocated = 1 << 2,
+ allocated_escapes = 1 << 3,
+ unknown_modified = 1 << 4
};
intx eflags() { return _eflags; }
intx arg_local() { return _arg_local; }
intx arg_stack() { return _arg_stack; }
intx arg_returned() { return _arg_returned; }
+ uint arg_modified(int a) { ArgInfoData *aid = arg_info();
+ assert(a >= 0 && a < aid->number_of_args(), "valid argument number");
+ return aid->arg_modified(a); }
void set_eflags(intx v) { _eflags = v; }
void set_arg_local(intx v) { _arg_local = v; }
void set_arg_stack(intx v) { _arg_stack = v; }
void set_arg_returned(intx v) { _arg_returned = v; }
+ void set_arg_modified(int a, uint v) { ArgInfoData *aid = arg_info();
+ assert(a >= 0 && a < aid->number_of_args(), "valid argument number");
+
+ aid->set_arg_modified(a, v); }
void clear_escape_info() { _eflags = _arg_local = _arg_stack = _arg_returned = 0; }
--- a/hotspot/src/share/vm/oops/methodOop.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/oops/methodOop.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -765,6 +765,28 @@
}
+// give advice about whether this methodOop should be cached or not
+bool methodOopDesc::should_not_be_cached() const {
+ if (is_old()) {
+ // This method has been redefined. It is either EMCP or obsolete
+ // and we don't want to cache it because that would pin the method
+ // down and prevent it from being collectible if and when it
+ // finishes executing.
+ return true;
+ }
+
+ if (mark()->should_not_be_cached()) {
+ // It is either not safe or not a good idea to cache this
+ // method at this time because of the state of the embedded
+ // markOop. See markOop.cpp for the gory details.
+ return true;
+ }
+
+ // caching this method should be just fine
+ return false;
+}
+
+
methodHandle methodOopDesc:: clone_with_new_data(methodHandle m, u_char* new_code, int new_code_length,
u_char* new_compressed_linenumber_table, int new_compressed_linenumber_size, TRAPS) {
// Code below does not work for native methods - they should never get rewritten anyway
--- a/hotspot/src/share/vm/oops/methodOop.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/oops/methodOop.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -524,6 +524,8 @@
void set_is_old() { _access_flags.set_is_old(); }
bool is_obsolete() const { return access_flags().is_obsolete(); }
void set_is_obsolete() { _access_flags.set_is_obsolete(); }
+ // see the definition in methodOop.cpp for the gory details
+ bool should_not_be_cached() const;
// JVMTI Native method prefixing support:
bool is_prefixed_native() const { return access_flags().is_prefixed_native(); }
--- a/hotspot/src/share/vm/opto/addnode.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/addnode.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -505,15 +505,25 @@
const Type *temp_t2 = phase->type( in(Offset) );
if( temp_t2 == Type::TOP ) return NULL;
const TypeX *t2 = temp_t2->is_intptr_t();
+ Node* address;
+ Node* offset;
if( t2->is_con() ) {
// The Add of the flattened expression
- set_req(Address, addp->in(Address));
- set_req(Offset , phase->MakeConX(t2->get_con() + t12->get_con()));
- return this; // Made progress
+ address = addp->in(Address);
+ offset = phase->MakeConX(t2->get_con() + t12->get_con());
+ } else {
+ // Else move the constant to the right. ((A+con)+B) into ((A+B)+con)
+ address = phase->transform(new (phase->C, 4) AddPNode(in(Base),addp->in(Address),in(Offset)));
+ offset = addp->in(Offset);
}
- // Else move the constant to the right. ((A+con)+B) into ((A+B)+con)
- set_req(Address, phase->transform(new (phase->C, 4) AddPNode(in(Base),addp->in(Address),in(Offset))));
- set_req(Offset , addp->in(Offset));
+ PhaseIterGVN *igvn = phase->is_IterGVN();
+ if( igvn ) {
+ set_req_X(Address,address,igvn);
+ set_req_X(Offset,offset,igvn);
+ } else {
+ set_req(Address,address);
+ set_req(Offset,offset);
+ }
return this;
}
}
@@ -608,6 +618,28 @@
return NULL;
}
+//------------------------------unpack_offsets----------------------------------
+// Collect the AddP offset values into the elements array, giving up
+// if there are more than length.
+int AddPNode::unpack_offsets(Node* elements[], int length) {
+ int count = 0;
+ Node* addr = this;
+ Node* base = addr->in(AddPNode::Base);
+ while (addr->is_AddP()) {
+ if (addr->in(AddPNode::Base) != base) {
+ // give up
+ return -1;
+ }
+ elements[count++] = addr->in(AddPNode::Offset);
+ if (count == length) {
+ // give up
+ return -1;
+ }
+ addr = addr->in(AddPNode::Address);
+ }
+ return count;
+}
+
//------------------------------match_edge-------------------------------------
// Do we Match on this edge index or not? Do not match base pointer edge
uint AddPNode::match_edge(uint idx) const {
--- a/hotspot/src/share/vm/opto/addnode.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/addnode.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -144,6 +144,11 @@
static Node* Ideal_base_and_offset(Node* ptr, PhaseTransform* phase,
// second return value:
intptr_t& offset);
+
+ // Collect the AddP offset values into the elements array, giving up
+ // if there are more than length.
+ int unpack_offsets(Node* elements[], int length);
+
// Do not match base-ptr edge
virtual uint match_edge(uint idx) const;
static const Type *mach_bottom_type(const MachNode* n); // used by ad_<arch>.hpp
--- a/hotspot/src/share/vm/opto/bytecodeInfo.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/bytecodeInfo.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -79,8 +79,20 @@
for (int i = depth; i != 0; --i) tty->print(" ");
}
+static bool is_init_with_ea(ciMethod* callee_method,
+ ciMethod* caller_method, Compile* C) {
+ // True when EA is ON and a java constructor is called or
+ // a super constructor is called from an inlined java constructor.
+ return DoEscapeAnalysis && EliminateAllocations &&
+ ( callee_method->is_initializer() ||
+ (caller_method->is_initializer() &&
+ caller_method != C->method() &&
+ caller_method->holder()->is_subclass_of(callee_method->holder()))
+ );
+}
+
// positive filter: should send be inlined? returns NULL, if yes, or rejection msg
-const char* InlineTree::shouldInline(ciMethod* callee_method, int caller_bci, ciCallProfile& profile, WarmCallInfo* wci_result) const {
+const char* InlineTree::shouldInline(ciMethod* callee_method, ciMethod* caller_method, int caller_bci, ciCallProfile& profile, WarmCallInfo* wci_result) const {
// Allows targeted inlining
if(callee_method->should_inline()) {
*wci_result = *(WarmCallInfo::always_hot());
@@ -97,7 +109,8 @@
int size = callee_method->code_size();
// Check for too many throws (and not too huge)
- if(callee_method->interpreter_throwout_count() > InlineThrowCount && size < InlineThrowMaxSize ) {
+ if(callee_method->interpreter_throwout_count() > InlineThrowCount &&
+ size < InlineThrowMaxSize ) {
wci_result->set_profit(wci_result->profit() * 100);
if (PrintInlining && Verbose) {
print_indent(inline_depth());
@@ -114,8 +127,12 @@
int invoke_count = method()->interpreter_invocation_count();
assert( invoke_count != 0, "Require invokation count greater than zero");
int freq = call_site_count/invoke_count;
+
// bump the max size if the call is frequent
- if ((freq >= InlineFrequencyRatio) || (call_site_count >= InlineFrequencyCount)) {
+ if ((freq >= InlineFrequencyRatio) ||
+ (call_site_count >= InlineFrequencyCount) ||
+ is_init_with_ea(callee_method, caller_method, C)) {
+
max_size = C->freq_inline_size();
if (size <= max_size && TraceFrequencyInlining) {
print_indent(inline_depth());
@@ -126,7 +143,8 @@
}
} else {
// Not hot. Check for medium-sized pre-existing nmethod at cold sites.
- if (callee_method->has_compiled_code() && callee_method->instructions_size() > InlineSmallCode/4)
+ if (callee_method->has_compiled_code() &&
+ callee_method->instructions_size() > InlineSmallCode/4)
return "already compiled into a medium method";
}
if (size > max_size) {
@@ -139,7 +157,7 @@
// negative filter: should send NOT be inlined? returns NULL, ok to inline, or rejection msg
-const char* InlineTree::shouldNotInline(ciMethod *callee_method, WarmCallInfo* wci_result) const {
+const char* InlineTree::shouldNotInline(ciMethod *callee_method, ciMethod* caller_method, WarmCallInfo* wci_result) const {
// negative filter: should send NOT be inlined? returns NULL (--> inline) or rejection msg
if (!UseOldInlining) {
const char* fail = NULL;
@@ -204,9 +222,23 @@
// use frequency-based objections only for non-trivial methods
if (callee_method->code_size() <= MaxTrivialSize) return NULL;
- if (UseInterpreter && !CompileTheWorld) { // don't use counts with -Xcomp or CTW
- if (!callee_method->has_compiled_code() && !callee_method->was_executed_more_than(0)) return "never executed";
- if (!callee_method->was_executed_more_than(MIN2(MinInliningThreshold, CompileThreshold >> 1))) return "executed < MinInliningThreshold times";
+
+ // don't use counts with -Xcomp or CTW
+ if (UseInterpreter && !CompileTheWorld) {
+
+ if (!callee_method->has_compiled_code() &&
+ !callee_method->was_executed_more_than(0)) {
+ return "never executed";
+ }
+
+ if (is_init_with_ea(callee_method, caller_method, C)) {
+
+ // Escape Analysis: inline all executed constructors
+
+ } else if (!callee_method->was_executed_more_than(MIN2(MinInliningThreshold,
+ CompileThreshold >> 1))) {
+ return "executed < MinInliningThreshold times";
+ }
}
if (callee_method->should_not_inline()) {
@@ -219,8 +251,7 @@
//-----------------------------try_to_inline-----------------------------------
// return NULL if ok, reason for not inlining otherwise
// Relocated from "InliningClosure::try_to_inline"
-const char* InlineTree::try_to_inline(ciMethod* callee_method, int caller_bci, ciCallProfile& profile, WarmCallInfo* wci_result) {
- ciMethod* caller_method = method();
+const char* InlineTree::try_to_inline(ciMethod* callee_method, ciMethod* caller_method, int caller_bci, ciCallProfile& profile, WarmCallInfo* wci_result) {
// Old algorithm had funny accumulating BC-size counters
if (UseOldInlining && ClipInlining
@@ -229,25 +260,47 @@
}
const char *msg = NULL;
- if ((msg = shouldInline(callee_method, caller_bci, profile, wci_result)) != NULL) return msg;
- if ((msg = shouldNotInline(callee_method, wci_result)) != NULL) return msg;
+ if ((msg = shouldInline(callee_method, caller_method, caller_bci,
+ profile, wci_result)) != NULL) {
+ return msg;
+ }
+ if ((msg = shouldNotInline(callee_method, caller_method,
+ wci_result)) != NULL) {
+ return msg;
+ }
bool is_accessor = InlineAccessors && callee_method->is_accessor();
// suppress a few checks for accessors and trivial methods
if (!is_accessor && callee_method->code_size() > MaxTrivialSize) {
+
// don't inline into giant methods
- if (C->unique() > (uint)NodeCountInliningCutoff) return "NodeCountInliningCutoff";
+ if (C->unique() > (uint)NodeCountInliningCutoff) {
+ return "NodeCountInliningCutoff";
+ }
- // don't inline unreached call sites
- if (profile.count() == 0) return "call site not reached";
+ if ((!UseInterpreter || CompileTheWorld) &&
+ is_init_with_ea(callee_method, caller_method, C)) {
+
+ // Escape Analysis stress testing when running Xcomp or CTW:
+ // inline constructors even if they are not reached.
+
+ } else if (profile.count() == 0) {
+ // don't inline unreached call sites
+ return "call site not reached";
+ }
}
- if (!C->do_inlining() && InlineAccessors && !is_accessor) return "not an accessor";
-
- if( inline_depth() > MaxInlineLevel ) return "inlining too deep";
+ if (!C->do_inlining() && InlineAccessors && !is_accessor) {
+ return "not an accessor";
+ }
+ if( inline_depth() > MaxInlineLevel ) {
+ return "inlining too deep";
+ }
if( method() == callee_method &&
- inline_depth() > MaxRecursiveInlineLevel ) return "recursively inlining too deep";
+ inline_depth() > MaxRecursiveInlineLevel ) {
+ return "recursively inlining too deep";
+ }
int size = callee_method->code_size();
@@ -336,7 +389,7 @@
// Check if inlining policy says no.
WarmCallInfo wci = *(initial_wci);
- failure_msg = try_to_inline(callee_method, caller_bci, profile, &wci);
+ failure_msg = try_to_inline(callee_method, caller_method, caller_bci, profile, &wci);
if (failure_msg != NULL && C->log() != NULL) {
C->log()->begin_elem("inline_fail reason='");
C->log()->text("%s", failure_msg);
--- a/hotspot/src/share/vm/opto/c2_globals.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/c2_globals.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -367,6 +367,12 @@
notproduct(bool, PrintEliminateLocks, false, \
"Print out when locks are eliminated") \
\
+ diagnostic(bool, EliminateAutoBox, false, \
+ "Private flag to control optimizations for autobox elimination") \
+ \
+ product(intx, AutoBoxCacheMax, 128, \
+ "Sets max value cached by the java.lang.Integer autobox cache") \
+ \
product(bool, DoEscapeAnalysis, false, \
"Perform escape analysis") \
\
@@ -376,6 +382,12 @@
product(bool, EliminateAllocations, true, \
"Use escape analysis to eliminate allocations") \
\
+ notproduct(bool, PrintEliminateAllocations, false, \
+ "Print out when allocations are eliminated") \
+ \
+ product(intx, EliminateAllocationArraySizeLimit, 64, \
+ "Array size (number of elements) limit for scalar replacement") \
+ \
product(intx, MaxLabelRootDepth, 1100, \
"Maximum times call Label_Root to prevent stack overflow") \
--- a/hotspot/src/share/vm/opto/c2compiler.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/c2compiler.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -35,6 +35,9 @@
const char* C2Compiler::retry_no_subsuming_loads() {
return "retry without subsuming loads";
}
+const char* C2Compiler::retry_no_escape_analysis() {
+ return "retry without escape analysis";
+}
void C2Compiler::initialize_runtime() {
// Check assumptions used while running ADLC
@@ -101,17 +104,23 @@
initialize();
}
bool subsume_loads = true;
+ bool do_escape_analysis = DoEscapeAnalysis;
while (!env->failing()) {
// Attempt to compile while subsuming loads into machine instructions.
- Compile C(env, this, target, entry_bci, subsume_loads);
+ Compile C(env, this, target, entry_bci, subsume_loads, do_escape_analysis);
// Check result and retry if appropriate.
if (C.failure_reason() != NULL) {
- if (C.failure_reason_is(retry_no_subsuming_loads())) {
+ if (C.failure_reason_is(retry_no_subsuming_loads())) {
assert(subsume_loads, "must make progress");
subsume_loads = false;
continue; // retry
}
+ if (C.failure_reason_is(retry_no_escape_analysis())) {
+ assert(do_escape_analysis, "must make progress");
+ do_escape_analysis = false;
+ continue; // retry
+ }
// Pass any other failure reason up to the ciEnv.
// Note that serious, irreversible failures are already logged
// on the ciEnv via env->record_method_not_compilable().
--- a/hotspot/src/share/vm/opto/c2compiler.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/c2compiler.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -50,6 +50,7 @@
// sentinel value used to trigger backtracking in compile_method().
static const char* retry_no_subsuming_loads();
+ static const char* retry_no_escape_analysis();
// Print compilation timers and statistics
void print_timers();
--- a/hotspot/src/share/vm/opto/callnode.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/callnode.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -230,6 +230,7 @@
_locoff = TypeFunc::Parms;
_stkoff = _locoff + _method->max_locals();
_monoff = _stkoff + _method->max_stack();
+ _scloff = _monoff;
_endoff = _monoff;
_sp = 0;
}
@@ -242,6 +243,7 @@
_locoff = TypeFunc::Parms;
_stkoff = _locoff;
_monoff = _stkoff + stack_size;
+ _scloff = _monoff;
_endoff = _monoff;
_sp = 0;
}
@@ -297,12 +299,22 @@
return total;
}
+#ifndef PRODUCT
+
//------------------------------format_helper----------------------------------
// Given an allocation (a Chaitin object) and a Node decide if the Node carries
// any defined value or not. If it does, print out the register or constant.
-#ifndef PRODUCT
-static void format_helper( PhaseRegAlloc *regalloc, outputStream* st, Node *n, const char *msg, uint i ) {
+static void format_helper( PhaseRegAlloc *regalloc, outputStream* st, Node *n, const char *msg, uint i, GrowableArray<SafePointScalarObjectNode*> *scobjs ) {
if (n == NULL) { st->print(" NULL"); return; }
+ if (n->is_SafePointScalarObject()) {
+ // Scalar replacement.
+ SafePointScalarObjectNode* spobj = n->as_SafePointScalarObject();
+ scobjs->append_if_missing(spobj);
+ int sco_n = scobjs->find(spobj);
+ assert(sco_n >= 0, "");
+ st->print(" %s%d]=#ScObj" INT32_FORMAT, msg, i, sco_n);
+ return;
+ }
if( OptoReg::is_valid(regalloc->get_reg_first(n))) { // Check for undefined
char buf[50];
regalloc->dump_register(n,buf);
@@ -342,10 +354,8 @@
}
}
}
-#endif
//------------------------------format-----------------------------------------
-#ifndef PRODUCT
void JVMState::format(PhaseRegAlloc *regalloc, const Node *n, outputStream* st) const {
st->print(" #");
if( _method ) {
@@ -356,24 +366,25 @@
return;
}
if (n->is_MachSafePoint()) {
+ GrowableArray<SafePointScalarObjectNode*> scobjs;
MachSafePointNode *mcall = n->as_MachSafePoint();
uint i;
// Print locals
for( i = 0; i < (uint)loc_size(); i++ )
- format_helper( regalloc, st, mcall->local(this, i), "L[", i );
+ format_helper( regalloc, st, mcall->local(this, i), "L[", i, &scobjs );
// Print stack
for (i = 0; i < (uint)stk_size(); i++) {
if ((uint)(_stkoff + i) >= mcall->len())
st->print(" oob ");
else
- format_helper( regalloc, st, mcall->stack(this, i), "STK[", i );
+ format_helper( regalloc, st, mcall->stack(this, i), "STK[", i, &scobjs );
}
for (i = 0; (int)i < nof_monitors(); i++) {
Node *box = mcall->monitor_box(this, i);
Node *obj = mcall->monitor_obj(this, i);
if ( OptoReg::is_valid(regalloc->get_reg_first(box)) ) {
while( !box->is_BoxLock() ) box = box->in(1);
- format_helper( regalloc, st, box, "MON-BOX[", i );
+ format_helper( regalloc, st, box, "MON-BOX[", i, &scobjs );
} else {
OptoReg::Name box_reg = BoxLockNode::stack_slot(box);
st->print(" MON-BOX%d=%s+%d",
@@ -381,15 +392,71 @@
OptoReg::regname(OptoReg::c_frame_pointer),
regalloc->reg2offset(box_reg));
}
- format_helper( regalloc, st, obj, "MON-OBJ[", i );
+ format_helper( regalloc, st, obj, "MON-OBJ[", i, &scobjs );
+ }
+
+ for (i = 0; i < (uint)scobjs.length(); i++) {
+ // Scalar replaced objects.
+ st->print_cr("");
+ st->print(" # ScObj" INT32_FORMAT " ", i);
+ SafePointScalarObjectNode* spobj = scobjs.at(i);
+ ciKlass* cik = spobj->bottom_type()->is_oopptr()->klass();
+ assert(cik->is_instance_klass() ||
+ cik->is_array_klass(), "Not supported allocation.");
+ ciInstanceKlass *iklass = NULL;
+ if (cik->is_instance_klass()) {
+ cik->print_name_on(st);
+ iklass = cik->as_instance_klass();
+ } else if (cik->is_type_array_klass()) {
+ cik->as_array_klass()->base_element_type()->print_name_on(st);
+ st->print("[%d]=", spobj->n_fields());
+ } else if (cik->is_obj_array_klass()) {
+ ciType* cie = cik->as_array_klass()->base_element_type();
+ int ndim = 1;
+ while (cie->is_obj_array_klass()) {
+ ndim += 1;
+ cie = cie->as_array_klass()->base_element_type();
+ }
+ cie->print_name_on(st);
+ while (ndim-- > 0) {
+ st->print("[]");
+ }
+ st->print("[%d]=", spobj->n_fields());
+ }
+ st->print("{");
+ uint nf = spobj->n_fields();
+ if (nf > 0) {
+ uint first_ind = spobj->first_index();
+ Node* fld_node = mcall->in(first_ind);
+ ciField* cifield;
+ if (iklass != NULL) {
+ st->print(" [");
+ cifield = iklass->nonstatic_field_at(0);
+ cifield->print_name_on(st);
+ format_helper( regalloc, st, fld_node, ":", 0, &scobjs );
+ } else {
+ format_helper( regalloc, st, fld_node, "[", 0, &scobjs );
+ }
+ for (uint j = 1; j < nf; j++) {
+ fld_node = mcall->in(first_ind+j);
+ if (iklass != NULL) {
+ st->print(", [");
+ cifield = iklass->nonstatic_field_at(j);
+ cifield->print_name_on(st);
+ format_helper( regalloc, st, fld_node, ":", j, &scobjs );
+ } else {
+ format_helper( regalloc, st, fld_node, ", [", j, &scobjs );
+ }
+ }
+ }
+ st->print(" }");
}
}
st->print_cr("");
if (caller() != NULL) caller()->format(regalloc, n, st);
}
-#endif
-#ifndef PRODUCT
+
void JVMState::dump_spec(outputStream *st) const {
if (_method != NULL) {
bool printed = false;
@@ -419,9 +486,8 @@
}
if (caller() != NULL) caller()->dump_spec(st);
}
-#endif
-#ifndef PRODUCT
+
void JVMState::dump_on(outputStream* st) const {
if (_map && !((uintptr_t)_map & 1)) {
if (_map->len() > _map->req()) { // _map->has_exceptions()
@@ -434,8 +500,8 @@
}
_map->dump(2);
}
- st->print("JVMS depth=%d loc=%d stk=%d mon=%d end=%d mondepth=%d sp=%d bci=%d method=",
- depth(), locoff(), stkoff(), monoff(), endoff(), monitor_depth(), sp(), bci());
+ st->print("JVMS depth=%d loc=%d stk=%d mon=%d scalar=%d end=%d mondepth=%d sp=%d bci=%d method=",
+ depth(), locoff(), stkoff(), monoff(), scloff(), endoff(), monitor_depth(), sp(), bci());
if (_method == NULL) {
st->print_cr("(none)");
} else {
@@ -465,6 +531,7 @@
n->set_locoff(_locoff);
n->set_stkoff(_stkoff);
n->set_monoff(_monoff);
+ n->set_scloff(_scloff);
n->set_endoff(_endoff);
n->set_sp(_sp);
n->set_map(_map);
@@ -557,6 +624,107 @@
return 0;
}
+//
+// Determine whether the call could modify the field of the specified
+// instance at the specified offset.
+//
+bool CallNode::may_modify(const TypePtr *addr_t, PhaseTransform *phase) {
+ const TypeOopPtr *adrInst_t = addr_t->isa_oopptr();
+
+ // if not an InstPtr or not an instance type, assume the worst
+ if (adrInst_t == NULL || !adrInst_t->is_instance_field()) {
+ return true;
+ }
+ Compile *C = phase->C;
+ int offset = adrInst_t->offset();
+ assert(offset >= 0, "should be valid offset");
+ ciKlass* adr_k = adrInst_t->klass();
+ assert(adr_k->is_loaded() &&
+ adr_k->is_java_klass() &&
+ !adr_k->is_interface(),
+ "only non-abstract classes are expected");
+
+ int base_idx = C->get_alias_index(adrInst_t);
+ int size = BytesPerLong; // If we don't know the size, assume largest.
+ if (adrInst_t->isa_instptr()) {
+ ciField* field = C->alias_type(base_idx)->field();
+ if (field != NULL) {
+ size = field->size_in_bytes();
+ }
+ } else {
+ assert(adrInst_t->isa_aryptr(), "only arrays are expected");
+ size = type2aelembytes(adr_k->as_array_klass()->element_type()->basic_type());
+ }
+
+ ciMethod * meth = is_CallStaticJava() ? as_CallStaticJava()->method() : NULL;
+ BCEscapeAnalyzer *bcea = (meth != NULL) ? meth->get_bcea() : NULL;
+
+ const TypeTuple * d = tf()->domain();
+ for (uint i = TypeFunc::Parms; i < d->cnt(); i++) {
+ const Type* t = d->field_at(i);
+ Node *arg = in(i);
+ const Type *at = phase->type(arg);
+ if (at == TypePtr::NULL_PTR || at == Type::TOP)
+ continue; // null can't affect anything
+
+ const TypeOopPtr *at_ptr = at->isa_oopptr();
+ if (!arg->is_top() && (t->isa_oopptr() != NULL ||
+ t->isa_ptr() && at_ptr != NULL)) {
+ assert(at_ptr != NULL, "expecting an OopPtr");
+ ciKlass* at_k = at_ptr->klass();
+ if ((adrInst_t->base() == at_ptr->base()) &&
+ at_k->is_loaded() &&
+ at_k->is_java_klass() &&
+ !at_k->is_interface()) {
+ // If we have found an argument matching addr_t, check if the field
+ // at the specified offset is modified.
+ int at_idx = C->get_alias_index(at_ptr->add_offset(offset)->isa_oopptr());
+ if (base_idx == at_idx &&
+ (bcea == NULL ||
+ bcea->is_arg_modified(i - TypeFunc::Parms, offset, size))) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+// Does this call have a direct reference to n other than debug information?
+bool CallNode::has_non_debug_use(Node *n) {
+ const TypeTuple * d = tf()->domain();
+ for (uint i = TypeFunc::Parms; i < d->cnt(); i++) {
+ Node *arg = in(i);
+ if (arg == n) {
+ return true;
+ }
+ }
+ return false;
+}
+
+// Returns the unique CheckCastPP of a call
+// or 'this' if there are several CheckCastPP
+// or returns NULL if there is no one.
+Node *CallNode::result_cast() {
+ Node *cast = NULL;
+
+ Node *p = proj_out(TypeFunc::Parms);
+ if (p == NULL)
+ return NULL;
+
+ for (DUIterator_Fast imax, i = p->fast_outs(imax); i < imax; i++) {
+ Node *use = p->fast_out(i);
+ if (use->is_CheckCastPP()) {
+ if (cast != NULL) {
+ return this; // more than 1 CheckCastPP
+ }
+ cast = use;
+ }
+ }
+ return cast;
+}
+
+
//=============================================================================
uint CallJavaNode::size_of() const { return sizeof(*this); }
uint CallJavaNode::cmp( const Node &n ) const {
@@ -765,6 +933,7 @@
void SafePointNode::grow_stack(JVMState* jvms, uint grow_by) {
assert((int)grow_by > 0, "sanity");
int monoff = jvms->monoff();
+ int scloff = jvms->scloff();
int endoff = jvms->endoff();
assert(endoff == (int)req(), "no other states or debug info after me");
Node* top = Compile::current()->top();
@@ -772,6 +941,7 @@
ins_req(monoff, top);
}
jvms->set_monoff(monoff + grow_by);
+ jvms->set_scloff(scloff + grow_by);
jvms->set_endoff(endoff + grow_by);
}
@@ -781,6 +951,7 @@
const int MonitorEdges = 2;
assert(JVMState::logMonitorEdges == exact_log2(MonitorEdges), "correct MonitorEdges");
assert(req() == jvms()->endoff(), "correct sizing");
+ int nextmon = jvms()->scloff();
if (GenerateSynchronizationCode) {
add_req(lock->box_node());
add_req(lock->obj_node());
@@ -788,6 +959,7 @@
add_req(NULL);
add_req(NULL);
}
+ jvms()->set_scloff(nextmon+MonitorEdges);
jvms()->set_endoff(req());
}
@@ -795,10 +967,13 @@
// Delete last monitor from debug info
debug_only(int num_before_pop = jvms()->nof_monitors());
const int MonitorEdges = (1<<JVMState::logMonitorEdges);
+ int scloff = jvms()->scloff();
int endoff = jvms()->endoff();
+ int new_scloff = scloff - MonitorEdges;
int new_endoff = endoff - MonitorEdges;
+ jvms()->set_scloff(new_scloff);
jvms()->set_endoff(new_endoff);
- while (endoff > new_endoff) del_req(--endoff);
+ while (scloff > new_scloff) del_req(--scloff);
assert(jvms()->nof_monitors() == num_before_pop-1, "");
}
@@ -822,6 +997,63 @@
return (TypeFunc::Parms == idx);
}
+//============== SafePointScalarObjectNode ==============
+
+SafePointScalarObjectNode::SafePointScalarObjectNode(const TypeOopPtr* tp,
+#ifdef ASSERT
+ AllocateNode* alloc,
+#endif
+ uint first_index,
+ uint n_fields) :
+ TypeNode(tp, 1), // 1 control input -- seems required. Get from root.
+#ifdef ASSERT
+ _alloc(alloc),
+#endif
+ _first_index(first_index),
+ _n_fields(n_fields)
+{
+ init_class_id(Class_SafePointScalarObject);
+}
+
+
+uint SafePointScalarObjectNode::ideal_reg() const {
+ return 0; // No matching to machine instruction
+}
+
+const RegMask &SafePointScalarObjectNode::in_RegMask(uint idx) const {
+ return *(Compile::current()->matcher()->idealreg2debugmask[in(idx)->ideal_reg()]);
+}
+
+const RegMask &SafePointScalarObjectNode::out_RegMask() const {
+ return RegMask::Empty;
+}
+
+uint SafePointScalarObjectNode::match_edge(uint idx) const {
+ return 0;
+}
+
+SafePointScalarObjectNode*
+SafePointScalarObjectNode::clone(int jvms_adj, Dict* sosn_map) const {
+ void* cached = (*sosn_map)[(void*)this];
+ if (cached != NULL) {
+ return (SafePointScalarObjectNode*)cached;
+ }
+ Compile* C = Compile::current();
+ SafePointScalarObjectNode* res = (SafePointScalarObjectNode*)Node::clone();
+ res->_first_index += jvms_adj;
+ sosn_map->Insert((void*)this, (void*)res);
+ return res;
+}
+
+
+#ifndef PRODUCT
+void SafePointScalarObjectNode::dump_spec(outputStream *st) const {
+ st->print(" # fields@[%d..%d]", first_index(),
+ first_index() + n_fields() - 1);
+}
+
+#endif
+
//=============================================================================
uint AllocateNode::size_of() const { return sizeof(*this); }
@@ -832,6 +1064,7 @@
{
init_class_id(Class_Allocate);
init_flags(Flag_is_macro);
+ _is_scalar_replaceable = false;
Node *topnode = C->top();
init_req( TypeFunc::Control , ctrl );
@@ -1151,7 +1384,7 @@
//=============================================================================
Node *LockNode::Ideal(PhaseGVN *phase, bool can_reshape) {
- // perform any generic optimizations first
+ // perform any generic optimizations first (returns 'this' or NULL)
Node *result = SafePointNode::Ideal(phase, can_reshape);
// Now see if we can optimize away this lock. We don't actually
@@ -1159,7 +1392,20 @@
// prevents macro expansion from expanding the lock. Since we don't
// modify the graph, the value returned from this function is the
// one computed above.
- if (EliminateLocks && !is_eliminated()) {
+ if (result == NULL && can_reshape && EliminateLocks && !is_eliminated()) {
+ //
+ // If we are locking an unescaped object, the lock/unlock is unnecessary
+ //
+ ConnectionGraph *cgr = Compile::current()->congraph();
+ PointsToNode::EscapeState es = PointsToNode::GlobalEscape;
+ if (cgr != NULL)
+ es = cgr->escape_state(obj_node(), phase);
+ if (es != PointsToNode::UnknownEscape && es != PointsToNode::GlobalEscape) {
+ // Mark it eliminated to update any counters
+ this->set_eliminated();
+ return result;
+ }
+
//
// Try lock coarsening
//
@@ -1199,8 +1445,10 @@
int unlocks = 0;
for (int i = 0; i < lock_ops.length(); i++) {
AbstractLockNode* lock = lock_ops.at(i);
- if (lock->Opcode() == Op_Lock) locks++;
- else unlocks++;
+ if (lock->Opcode() == Op_Lock)
+ locks++;
+ else
+ unlocks++;
if (Verbose) {
lock->dump(1);
}
@@ -1237,7 +1485,7 @@
//=============================================================================
Node *UnlockNode::Ideal(PhaseGVN *phase, bool can_reshape) {
- // perform any generic optimizations first
+ // perform any generic optimizations first (returns 'this' or NULL)
Node * result = SafePointNode::Ideal(phase, can_reshape);
// Now see if we can optimize away this unlock. We don't actually
@@ -1245,66 +1493,18 @@
// prevents macro expansion from expanding the unlock. Since we don't
// modify the graph, the value returned from this function is the
// one computed above.
- if (EliminateLocks && !is_eliminated()) {
+ // Escape state is defined after Parse phase.
+ if (result == NULL && can_reshape && EliminateLocks && !is_eliminated()) {
//
- // If we are unlocking an unescaped object, the lock/unlock is unnecessary
- // We can eliminate them if there are no safepoints in the locked region.
+ // If we are unlocking an unescaped object, the lock/unlock is unnecessary.
//
ConnectionGraph *cgr = Compile::current()->congraph();
- if (cgr != NULL && cgr->escape_state(obj_node(), phase) == PointsToNode::NoEscape) {
- GrowableArray<AbstractLockNode*> lock_ops;
- LockNode *lock = find_matching_lock(this);
- if (lock != NULL) {
- lock_ops.append(this);
- lock_ops.append(lock);
- // find other unlocks which pair with the lock we found and add them
- // to the list
- Node * box = box_node();
-
- for (DUIterator_Fast imax, i = box->fast_outs(imax); i < imax; i++) {
- Node *use = box->fast_out(i);
- if (use->is_Unlock() && use != this) {
- UnlockNode *unlock1 = use->as_Unlock();
- if (!unlock1->is_eliminated()) {
- LockNode *lock1 = find_matching_lock(unlock1);
- if (lock == lock1)
- lock_ops.append(unlock1);
- else if (lock1 == NULL) {
- // we can't find a matching lock, we must assume the worst
- lock_ops.trunc_to(0);
- break;
- }
- }
- }
- }
- if (lock_ops.length() > 0) {
-
- #ifndef PRODUCT
- if (PrintEliminateLocks) {
- int locks = 0;
- int unlocks = 0;
- for (int i = 0; i < lock_ops.length(); i++) {
- AbstractLockNode* lock = lock_ops.at(i);
- if (lock->Opcode() == Op_Lock) locks++;
- else unlocks++;
- if (Verbose) {
- lock->dump(1);
- }
- }
- tty->print_cr("***Eliminated %d unescaped unlocks and %d unescaped locks", unlocks, locks);
- }
- #endif
-
- // for each of the identified locks, mark them
- // as eliminatable
- for (int i = 0; i < lock_ops.length(); i++) {
- AbstractLockNode* lock = lock_ops.at(i);
-
- // Mark it eliminated to update any counters
- lock->set_eliminated();
- }
- }
- }
+ PointsToNode::EscapeState es = PointsToNode::GlobalEscape;
+ if (cgr != NULL)
+ es = cgr->escape_state(obj_node(), phase);
+ if (es != PointsToNode::UnknownEscape && es != PointsToNode::GlobalEscape) {
+ // Mark it eliminated to update any counters
+ this->set_eliminated();
}
}
return result;
--- a/hotspot/src/share/vm/opto/callnode.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/callnode.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -38,7 +38,7 @@
class CallLeafNode;
class CallLeafNoFPNode;
class AllocateNode;
-class AllocateArrayNode;
+class AllocateArrayNode;
class LockNode;
class UnlockNode;
class JVMState;
@@ -91,7 +91,9 @@
class ParmNode : public ProjNode {
static const char * const names[TypeFunc::Parms+1];
public:
- ParmNode( StartNode *src, uint con ) : ProjNode(src,con) {}
+ ParmNode( StartNode *src, uint con ) : ProjNode(src,con) {
+ init_class_id(Class_Parm);
+ }
virtual int Opcode() const;
virtual bool is_CFG() const { return (_con == TypeFunc::Control); }
virtual uint ideal_reg() const;
@@ -182,6 +184,7 @@
uint _locoff; // Offset to locals in input edge mapping
uint _stkoff; // Offset to stack in input edge mapping
uint _monoff; // Offset to monitors in input edge mapping
+ uint _scloff; // Offset to fields of scalar objs in input edge mapping
uint _endoff; // Offset to end of input edge mapping
uint _sp; // Jave Expression Stack Pointer for this state
int _bci; // Byte Code Index of this JVM point
@@ -205,16 +208,19 @@
uint stkoff() const { return _stkoff; }
uint argoff() const { return _stkoff + _sp; }
uint monoff() const { return _monoff; }
+ uint scloff() const { return _scloff; }
uint endoff() const { return _endoff; }
uint oopoff() const { return debug_end(); }
int loc_size() const { return _stkoff - _locoff; }
int stk_size() const { return _monoff - _stkoff; }
- int mon_size() const { return _endoff - _monoff; }
+ int mon_size() const { return _scloff - _monoff; }
+ int scl_size() const { return _endoff - _scloff; }
bool is_loc(uint i) const { return i >= _locoff && i < _stkoff; }
bool is_stk(uint i) const { return i >= _stkoff && i < _monoff; }
- bool is_mon(uint i) const { return i >= _monoff && i < _endoff; }
+ bool is_mon(uint i) const { return i >= _monoff && i < _scloff; }
+ bool is_scl(uint i) const { return i >= _scloff && i < _endoff; }
uint sp() const { return _sp; }
int bci() const { return _bci; }
@@ -225,7 +231,9 @@
uint depth() const { return _depth; }
uint debug_start() const; // returns locoff of root caller
uint debug_end() const; // returns endoff of self
- uint debug_size() const { return loc_size() + sp() + mon_size(); }
+ uint debug_size() const {
+ return loc_size() + sp() + mon_size() + scl_size();
+ }
uint debug_depth() const; // returns sum of debug_size values at all depths
// Returns the JVM state at the desired depth (1 == root).
@@ -252,8 +260,11 @@
void set_locoff(uint off) { _locoff = off; }
void set_stkoff(uint off) { _stkoff = off; }
void set_monoff(uint off) { _monoff = off; }
+ void set_scloff(uint off) { _scloff = off; }
void set_endoff(uint off) { _endoff = off; }
- void set_offsets(uint off) { _locoff = _stkoff = _monoff = _endoff = off; }
+ void set_offsets(uint off) {
+ _locoff = _stkoff = _monoff = _scloff = _endoff = off;
+ }
void set_map(SafePointNode *map) { _map = map; }
void set_sp(uint sp) { _sp = sp; }
void set_bci(int bci) { _bci = bci; }
@@ -377,6 +388,9 @@
void set_next_exception(SafePointNode* n);
bool has_exceptions() const { return next_exception() != NULL; }
+ // Does this node have a use of n other than in debug information?
+ virtual bool has_non_debug_use(Node *n) {return false; }
+
// Standard Node stuff
virtual int Opcode() const;
virtual bool pinned() const { return true; }
@@ -397,6 +411,47 @@
#endif
};
+//------------------------------SafePointScalarObjectNode----------------------
+// A SafePointScalarObjectNode represents the state of a scalarized object
+// at a safepoint.
+
+class SafePointScalarObjectNode: public TypeNode {
+ uint _first_index; // First input edge index of a SafePoint node where
+ // states of the scalarized object fields are collected.
+ uint _n_fields; // Number of non-static fields of the scalarized object.
+ DEBUG_ONLY(AllocateNode* _alloc;)
+public:
+ SafePointScalarObjectNode(const TypeOopPtr* tp,
+#ifdef ASSERT
+ AllocateNode* alloc,
+#endif
+ uint first_index, uint n_fields);
+ virtual int Opcode() const;
+ virtual uint ideal_reg() const;
+ virtual const RegMask &in_RegMask(uint) const;
+ virtual const RegMask &out_RegMask() const;
+ virtual uint match_edge(uint idx) const;
+
+ uint first_index() const { return _first_index; }
+ uint n_fields() const { return _n_fields; }
+ DEBUG_ONLY(AllocateNode* alloc() const { return _alloc; })
+
+ virtual uint size_of() const { return sizeof(*this); }
+
+ // Assumes that "this" is an argument to a safepoint node "s", and that
+ // "new_call" is being created to correspond to "s". But the difference
+ // between the start index of the jvmstates of "new_call" and "s" is
+ // "jvms_adj". Produce and return a SafePointScalarObjectNode that
+ // corresponds appropriately to "this" in "new_call". Assumes that
+ // "sosn_map" is a map, specific to the translation of "s" to "new_call",
+ // mapping old SafePointScalarObjectNodes to new, to avoid multiple copies.
+ SafePointScalarObjectNode* clone(int jvms_adj, Dict* sosn_map) const;
+
+#ifndef PRODUCT
+ virtual void dump_spec(outputStream *st) const;
+#endif
+};
+
//------------------------------CallNode---------------------------------------
// Call nodes now subsume the function of debug nodes at callsites, so they
// contain the functionality of a full scope chain of debug nodes.
@@ -405,7 +460,6 @@
const TypeFunc *_tf; // Function type
address _entry_point; // Address of method being called
float _cnt; // Estimate of number of times called
- PointsToNode::EscapeState _escape_state;
CallNode(const TypeFunc* tf, address addr, const TypePtr* adr_type)
: SafePointNode(tf->domain()->cnt(), NULL, adr_type),
@@ -415,7 +469,6 @@
{
init_class_id(Class_Call);
init_flags(Flag_is_Call);
- _escape_state = PointsToNode::UnknownEscape;
}
const TypeFunc* tf() const { return _tf; }
@@ -441,6 +494,15 @@
// the node the JVMState must be cloned.
virtual void clone_jvms() { } // default is not to clone
+ // Returns true if the call may modify n
+ virtual bool may_modify(const TypePtr *addr_t, PhaseTransform *phase);
+ // Does this node have a use of n other than in debug information?
+ virtual bool has_non_debug_use(Node *n);
+ // Returns the unique CheckCastPP of a call
+ // or result projection is there are several CheckCastPP
+ // or returns NULL if there is no one.
+ Node *result_cast();
+
virtual uint match_edge(uint idx) const;
#ifndef PRODUCT
@@ -624,6 +686,8 @@
return TypeFunc::make(domain, range);
}
+ bool _is_scalar_replaceable; // Result of Escape Analysis
+
virtual uint size_of() const; // Size is bigger
AllocateNode(Compile* C, const TypeFunc *atype, Node *ctrl, Node *mem, Node *abio,
Node *size, Node *klass_node, Node *initial_test);
@@ -635,6 +699,9 @@
virtual uint ideal_reg() const { return Op_RegP; }
virtual bool guaranteed_safepoint() { return false; }
+ // allocations do not modify their arguments
+ virtual bool may_modify(const TypePtr *addr_t, PhaseTransform *phase) { return false;}
+
// Pattern-match a possible usage of AllocateNode.
// Return null if no allocation is recognized.
// The operand is the pointer produced by the (possible) allocation.
@@ -747,6 +814,9 @@
// mark node as eliminated and update the counter if there is one
void set_eliminated();
+ // locking does not modify its arguments
+ virtual bool may_modify(const TypePtr *addr_t, PhaseTransform *phase){ return false;}
+
#ifndef PRODUCT
void create_lock_counter(JVMState* s);
NamedCounter* counter() const { return _counter; }
--- a/hotspot/src/share/vm/opto/cfgnode.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/cfgnode.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -704,6 +704,61 @@
return mem;
}
+//------------------------split_out_instance-----------------------------------
+// Split out an instance type from a bottom phi.
+PhiNode* PhiNode::split_out_instance(const TypePtr* at, PhaseIterGVN *igvn) const {
+ assert(type() == Type::MEMORY && (adr_type() == TypePtr::BOTTOM ||
+ adr_type() == TypeRawPtr::BOTTOM) , "bottom or raw memory required");
+
+ // Check if an appropriate node already exists.
+ Node *region = in(0);
+ for (DUIterator_Fast kmax, k = region->fast_outs(kmax); k < kmax; k++) {
+ Node* use = region->fast_out(k);
+ if( use->is_Phi()) {
+ PhiNode *phi2 = use->as_Phi();
+ if (phi2->type() == Type::MEMORY && phi2->adr_type() == at) {
+ return phi2;
+ }
+ }
+ }
+ Compile *C = igvn->C;
+ Arena *a = Thread::current()->resource_area();
+ Node_Array node_map = new Node_Array(a);
+ Node_Stack stack(a, C->unique() >> 4);
+ PhiNode *nphi = slice_memory(at);
+ igvn->register_new_node_with_optimizer( nphi );
+ node_map.map(_idx, nphi);
+ stack.push((Node *)this, 1);
+ while(!stack.is_empty()) {
+ PhiNode *ophi = stack.node()->as_Phi();
+ uint i = stack.index();
+ assert(i >= 1, "not control edge");
+ stack.pop();
+ nphi = node_map[ophi->_idx]->as_Phi();
+ for (; i < ophi->req(); i++) {
+ Node *in = ophi->in(i);
+ if (in == NULL || igvn->type(in) == Type::TOP)
+ continue;
+ Node *opt = MemNode::optimize_simple_memory_chain(in, at, igvn);
+ PhiNode *optphi = opt->is_Phi() ? opt->as_Phi() : NULL;
+ if (optphi != NULL && optphi->adr_type() == TypePtr::BOTTOM) {
+ opt = node_map[optphi->_idx];
+ if (opt == NULL) {
+ stack.push(ophi, i);
+ nphi = optphi->slice_memory(at);
+ igvn->register_new_node_with_optimizer( nphi );
+ node_map.map(optphi->_idx, nphi);
+ ophi = optphi;
+ i = 0; // will get incremented at top of loop
+ continue;
+ }
+ }
+ nphi->set_req(i, opt);
+ }
+ }
+ return nphi;
+}
+
//------------------------verify_adr_type--------------------------------------
#ifdef ASSERT
void PhiNode::verify_adr_type(VectorSet& visited, const TypePtr* at) const {
@@ -1736,6 +1791,18 @@
return result;
}
}
+ //
+ // Other optimizations on the memory chain
+ //
+ const TypePtr* at = adr_type();
+ for( uint i=1; i<req(); ++i ) {// For all paths in
+ Node *ii = in(i);
+ Node *new_in = MemNode::optimize_memory_chain(ii, at, phase);
+ if (ii != new_in ) {
+ set_req(i, new_in);
+ progress = this;
+ }
+ }
}
return progress; // Return any progress
--- a/hotspot/src/share/vm/opto/cfgnode.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/cfgnode.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -110,14 +110,15 @@
// input in slot 0.
class PhiNode : public TypeNode {
const TypePtr* const _adr_type; // non-null only for Type::MEMORY nodes.
+ const int _inst_id; // Instance id of the memory slice.
+ const int _inst_index; // Alias index of the instance memory slice.
+ // Array elements references have the same alias_idx but different offset.
+ const int _inst_offset; // Offset of the instance memory slice.
// Size is bigger to hold the _adr_type field.
virtual uint hash() const; // Check the type
virtual uint cmp( const Node &n ) const;
virtual uint size_of() const { return sizeof(*this); }
- // Determine a unique non-trivial input, if any.
- // Ignore casts if it helps. Return NULL on failure.
- Node* unique_input(PhaseTransform *phase);
// Determine if CMoveNode::is_cmove_id can be used at this join point.
Node* is_cmove_id(PhaseTransform* phase, int true_path);
@@ -127,8 +128,16 @@
Input // Input values are [1..len)
};
- PhiNode( Node *r, const Type *t, const TypePtr* at = NULL )
- : TypeNode(t,r->req()), _adr_type(at) {
+ PhiNode( Node *r, const Type *t, const TypePtr* at = NULL,
+ const int iid = TypeOopPtr::UNKNOWN_INSTANCE,
+ const int iidx = Compile::AliasIdxTop,
+ const int ioffs = Type::OffsetTop )
+ : TypeNode(t,r->req()),
+ _adr_type(at),
+ _inst_id(iid),
+ _inst_index(iidx),
+ _inst_offset(ioffs)
+ {
init_class_id(Class_Phi);
init_req(0, r);
verify_adr_type();
@@ -139,6 +148,7 @@
static PhiNode* make( Node* r, Node* x, const Type *t, const TypePtr* at = NULL );
// create a new phi with narrowed memory type
PhiNode* slice_memory(const TypePtr* adr_type) const;
+ PhiNode* split_out_instance(const TypePtr* at, PhaseIterGVN *igvn) const;
// like make(r, x), but does not initialize the in edges to x
static PhiNode* make_blank( Node* r, Node* x );
@@ -152,6 +162,10 @@
return NULL; // not a copy!
}
+ // Determine a unique non-trivial input, if any.
+ // Ignore casts if it helps. Return NULL on failure.
+ Node* unique_input(PhaseTransform *phase);
+
// Check for a simple dead loop.
enum LoopSafety { Safe = 0, Unsafe, UnsafeLoop };
LoopSafety simple_data_loop_check(Node *in) const;
@@ -161,6 +175,18 @@
virtual int Opcode() const;
virtual bool pinned() const { return in(0) != 0; }
virtual const TypePtr *adr_type() const { verify_adr_type(true); return _adr_type; }
+
+ const int inst_id() const { return _inst_id; }
+ const int inst_index() const { return _inst_index; }
+ const int inst_offset() const { return _inst_offset; }
+ bool is_same_inst_field(const Type* tp, int id, int index, int offset) {
+ return type()->basic_type() == tp->basic_type() &&
+ inst_id() == id &&
+ inst_index() == index &&
+ inst_offset() == offset &&
+ type()->higher_equal(tp);
+ }
+
virtual const Type *Value( PhaseTransform *phase ) const;
virtual Node *Identity( PhaseTransform *phase );
virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
@@ -310,8 +336,14 @@
virtual const RegMask &out_RegMask() const;
void dominated_by(Node* prev_dom, PhaseIterGVN* igvn);
int is_range_check(Node* &range, Node* &index, jint &offset);
+ Node* fold_compares(PhaseGVN* phase);
static Node* up_one_dom(Node* curr, bool linear_only = false);
+ // Takes the type of val and filters it through the test represented
+ // by if_proj and returns a more refined type if one is produced.
+ // Returns NULL is it couldn't improve the type.
+ static const TypeInt* filtered_int_type(PhaseGVN* phase, Node* val, Node* if_proj);
+
#ifndef PRODUCT
virtual void dump_spec(outputStream *st) const;
#endif
--- a/hotspot/src/share/vm/opto/chaitin.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/chaitin.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -457,7 +457,8 @@
bool may_be_copy_of_callee( Node *def ) const;
// If nreg already contains the same constant as val then eliminate it
- bool eliminate_copy_of_constant(Node* val, Block *current_block, Node_List& value, Node_List ®nd,
+ bool eliminate_copy_of_constant(Node* val, Node* n,
+ Block *current_block, Node_List& value, Node_List ®nd,
OptoReg::Name nreg, OptoReg::Name nreg2);
// Extend the node to LRG mapping
void add_reference( const Node *node, const Node *old_node);
--- a/hotspot/src/share/vm/opto/classes.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/classes.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -185,6 +185,7 @@
macro(RoundDouble)
macro(RoundFloat)
macro(SafePoint)
+macro(SafePointScalarObject)
macro(SCMemProj)
macro(SinD)
macro(SqrtD)
--- a/hotspot/src/share/vm/opto/compile.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/compile.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -333,6 +333,12 @@
tty->print_cr("** Bailout: Recompile without subsuming loads **");
tty->print_cr("*********************************************************");
}
+ if (_do_escape_analysis != DoEscapeAnalysis && PrintOpto) {
+ // Recompiling without escape analysis
+ tty->print_cr("*********************************************************");
+ tty->print_cr("** Bailout: Recompile without escape analysis **");
+ tty->print_cr("*********************************************************");
+ }
if (env()->break_at_compile()) {
// Open the debugger when compiing this method.
tty->print("### Breaking when compiling: ");
@@ -401,11 +407,6 @@
return buf.code_size();
}
-void Compile::record_for_escape_analysis(Node* n) {
- if (_congraph != NULL)
- _congraph->record_for_escape_analysis(n);
-}
-
// ============================================================================
//------------------------------Compile standard-------------------------------
@@ -415,7 +416,7 @@
// the continuation bci for on stack replacement.
-Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr_bci, bool subsume_loads )
+Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr_bci, bool subsume_loads, bool do_escape_analysis )
: Phase(Compiler),
_env(ci_env),
_log(ci_env->log()),
@@ -430,6 +431,7 @@
_for_igvn(NULL),
_warm_calls(NULL),
_subsume_loads(subsume_loads),
+ _do_escape_analysis(do_escape_analysis),
_failure_reason(NULL),
_code_buffer("Compile::Fill_buffer"),
_orig_pc_slot(0),
@@ -487,9 +489,6 @@
PhaseGVN gvn(node_arena(), estimated_size);
set_initial_gvn(&gvn);
- if (DoEscapeAnalysis)
- _congraph = new ConnectionGraph(this);
-
{ // Scope for timing the parser
TracePhase t3("parse", &_t_parser, true);
@@ -574,9 +573,13 @@
NOT_PRODUCT( verify_graph_edges(); )
// Perform escape analysis
+ if (_do_escape_analysis)
+ _congraph = new ConnectionGraph(this);
if (_congraph != NULL) {
NOT_PRODUCT( TracePhase t2("escapeAnalysis", &_t_escapeAnalysis, TimeCompiler); )
_congraph->compute_escape();
+ if (failing()) return;
+
#ifndef PRODUCT
if (PrintEscapeAnalysis) {
_congraph->dump();
@@ -675,6 +678,7 @@
_orig_pc_slot(0),
_orig_pc_slot_offset_in_bytes(0),
_subsume_loads(true),
+ _do_escape_analysis(false),
_failure_reason(NULL),
_code_buffer("Compile::Fill_buffer"),
_node_bundling_limit(0),
@@ -822,7 +826,7 @@
// Type::update_loaded_types(_method, _method->constants());
// Init alias_type map.
- if (!DoEscapeAnalysis && aliaslevel == 3)
+ if (!_do_escape_analysis && aliaslevel == 3)
aliaslevel = 2; // No unique types without escape analysis
_AliasLevel = aliaslevel;
const int grow_ats = 16;
--- a/hotspot/src/share/vm/opto/compile.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/compile.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -31,6 +31,7 @@
class Int_Array;
class Matcher;
class MachNode;
+class MachSafePointNode;
class Node;
class Node_Array;
class Node_Notes;
@@ -52,9 +53,6 @@
class Unique_Node_List;
class nmethod;
class WarmCallInfo;
-#ifdef ENABLE_ZAP_DEAD_LOCALS
-class MachSafePointNode;
-#endif
//------------------------------Compile----------------------------------------
// This class defines a top-level Compiler invocation.
@@ -127,6 +125,7 @@
const int _compile_id;
const bool _save_argument_registers; // save/restore arg regs for trampolines
const bool _subsume_loads; // Load can be matched as part of a larger op.
+ const bool _do_escape_analysis; // Do escape analysis.
ciMethod* _method; // The method being compiled.
int _entry_bci; // entry bci for osr methods.
const TypeFunc* _tf; // My kind of signature
@@ -260,6 +259,8 @@
// instructions that subsume a load may result in an unschedulable
// instruction sequence.
bool subsume_loads() const { return _subsume_loads; }
+ // Do escape analysis.
+ bool do_escape_analysis() const { return _do_escape_analysis; }
bool save_argument_registers() const { return _save_argument_registers; }
@@ -484,7 +485,6 @@
PhaseGVN* initial_gvn() { return _initial_gvn; }
Unique_Node_List* for_igvn() { return _for_igvn; }
inline void record_for_igvn(Node* n); // Body is after class Unique_Node_List.
- void record_for_escape_analysis(Node* n);
void set_initial_gvn(PhaseGVN *gvn) { _initial_gvn = gvn; }
void set_for_igvn(Unique_Node_List *for_igvn) { _for_igvn = for_igvn; }
@@ -560,7 +560,7 @@
// replacement, entry_bci indicates the bytecode for which to compile a
// continuation.
Compile(ciEnv* ci_env, C2Compiler* compiler, ciMethod* target,
- int entry_bci, bool subsume_loads);
+ int entry_bci, bool subsume_loads, bool do_escape_analysis);
// Second major entry point. From the TypeFunc signature, generate code
// to pass arguments from the Java calling convention to the C calling
@@ -605,8 +605,20 @@
// Build OopMaps for each GC point
void BuildOopMaps();
- // Append debug info for the node to the array
- void FillLocArray( int idx, Node *local, GrowableArray<ScopeValue*> *array );
+
+ // Append debug info for the node "local" at safepoint node "sfpt" to the
+ // "array", May also consult and add to "objs", which describes the
+ // scalar-replaced objects.
+ void FillLocArray( int idx, MachSafePointNode* sfpt,
+ Node *local, GrowableArray<ScopeValue*> *array,
+ GrowableArray<ScopeValue*> *objs );
+
+ // If "objs" contains an ObjectValue whose id is "id", returns it, else NULL.
+ static ObjectValue* sv_for_node_id(GrowableArray<ScopeValue*> *objs, int id);
+ // Requres that "objs" does not contains an ObjectValue whose id matches
+ // that of "sv. Appends "sv".
+ static void set_sv_for_object_node(GrowableArray<ScopeValue*> *objs,
+ ObjectValue* sv );
// Process an OopMap Element while emitting nodes
void Process_OopMap_Node(MachNode *mach, int code_offset);
--- a/hotspot/src/share/vm/opto/connode.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/connode.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -982,34 +982,9 @@
return new (phase->C, 3) AddINode(add1,add2);
}
- // Fold up with a prior LoadL: LoadL->ConvL2I ==> LoadI
- // Requires we understand the 'endianess' of Longs.
- if( andl_op == Op_LoadL ) {
- Node *adr = andl->in(MemNode::Address);
- // VM_LITTLE_ENDIAN is #defined appropriately in the Makefiles
-#ifndef VM_LITTLE_ENDIAN
- // The transformation can cause problems on BIG_ENDIAN architectures
- // where the jint is not the same address as the jlong. Specifically, we
- // will fail to insert an anti-dependence in GCM between the LoadI and a
- // subsequent StoreL because different memory offsets provoke
- // flatten_alias_type() into indicating two different types. See bug
- // 4755222.
-
- // Node *base = adr->is_AddP() ? adr->in(AddPNode::Base) : adr;
- // adr = phase->transform( new (phase->C, 4) AddPNode(base,adr,phase->MakeConX(sizeof(jint))));
- return NULL;
-#else
- if (phase->C->alias_type(andl->adr_type())->is_volatile()) {
- // Picking up the low half by itself bypasses the atomic load and we could
- // end up with more than one non-atomic load. See bugs 4432655 and 4526490.
- // We could go to the trouble of iterating over andl's output edges and
- // punting only if there's more than one real use, but we don't bother.
- return NULL;
- }
- return new (phase->C, 3) LoadINode(andl->in(MemNode::Control),andl->in(MemNode::Memory),adr,((LoadLNode*)andl)->raw_adr_type());
-#endif
- }
-
+ // Disable optimization: LoadL->ConvL2I ==> LoadI.
+ // It causes problems (sizes of Load and Store nodes do not match)
+ // in objects initialization code and Escape Analysis.
return NULL;
}
--- a/hotspot/src/share/vm/opto/doCall.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/doCall.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -390,6 +390,8 @@
}
if (cg->is_inline()) {
+ // Accumulate has_loops estimate
+ C->set_has_loops(C->has_loops() || call_method->has_loops());
C->env()->notice_inlined_method(call_method);
}
--- a/hotspot/src/share/vm/opto/escape.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/escape.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -51,21 +51,21 @@
}
#ifndef PRODUCT
-static char *node_type_names[] = {
+static const char *node_type_names[] = {
"UnknownType",
"JavaObject",
"LocalVar",
"Field"
};
-static char *esc_names[] = {
+static const char *esc_names[] = {
"UnknownEscape",
- "NoEscape ",
- "ArgEscape ",
- "GlobalEscape "
+ "NoEscape",
+ "ArgEscape",
+ "GlobalEscape"
};
-static char *edge_type_suffix[] = {
+static const char *edge_type_suffix[] = {
"?", // UnknownEdge
"P", // PointsToEdge
"D", // DeferredEdge
@@ -75,7 +75,7 @@
void PointsToNode::dump() const {
NodeType nt = node_type();
EscapeState es = escape_state();
- tty->print("%s %s [[", node_type_names[(int) nt], esc_names[(int) es]);
+ tty->print("%s %s %s [[", node_type_names[(int) nt], esc_names[(int) es], _scalar_replaceable ? "" : "NSR");
for (uint i = 0; i < edge_count(); i++) {
tty->print(" %d%s", edge_target(i), edge_type_suffix[(int) edge_type(i)]);
}
@@ -91,9 +91,11 @@
_collecting = true;
this->_compile = C;
const PointsToNode &dummy = PointsToNode();
- _nodes = new(C->comp_arena()) GrowableArray<PointsToNode>(C->comp_arena(), (int) INITIAL_NODE_COUNT, 0, dummy);
+ int sz = C->unique();
+ _nodes = new(C->comp_arena()) GrowableArray<PointsToNode>(C->comp_arena(), sz, sz, dummy);
_phantom_object = C->top()->_idx;
PointsToNode *phn = ptnode_adr(_phantom_object);
+ phn->_node = C->top();
phn->set_node_type(PointsToNode::JavaObject);
phn->set_escape_state(PointsToNode::GlobalEscape);
}
@@ -121,8 +123,20 @@
f->add_edge(to_i, PointsToNode::DeferredEdge);
}
-int ConnectionGraph::type_to_offset(const Type *t) {
- const TypePtr *t_ptr = t->isa_ptr();
+int ConnectionGraph::address_offset(Node* adr, PhaseTransform *phase) {
+ const Type *adr_type = phase->type(adr);
+ if (adr->is_AddP() && adr_type->isa_oopptr() == NULL &&
+ adr->in(AddPNode::Address)->is_Proj() &&
+ adr->in(AddPNode::Address)->in(0)->is_Allocate()) {
+ // We are computing a raw address for a store captured by an Initialize
+ // compute an appropriate address type. AddP cases #3 and #5 (see below).
+ int offs = (int)phase->find_intptr_t_con(adr->in(AddPNode::Offset), Type::OffsetBot);
+ assert(offs != Type::OffsetBot ||
+ adr->in(AddPNode::Address)->in(0)->is_AllocateArray(),
+ "offset must be a constant or it is initialization of array");
+ return offs;
+ }
+ const TypePtr *t_ptr = adr_type->isa_ptr();
assert(t_ptr != NULL, "must be a pointer type");
return t_ptr->offset();
}
@@ -147,12 +161,28 @@
npt->set_escape_state(es);
}
+void ConnectionGraph::add_node(Node *n, PointsToNode::NodeType nt,
+ PointsToNode::EscapeState es, bool done) {
+ PointsToNode* ptadr = ptnode_adr(n->_idx);
+ ptadr->_node = n;
+ ptadr->set_node_type(nt);
+
+ // inline set_escape_state(idx, es);
+ PointsToNode::EscapeState old_es = ptadr->escape_state();
+ if (es > old_es)
+ ptadr->set_escape_state(es);
+
+ if (done)
+ _processed.set(n->_idx);
+}
+
PointsToNode::EscapeState ConnectionGraph::escape_state(Node *n, PhaseTransform *phase) {
uint idx = n->_idx;
PointsToNode::EscapeState es;
- // If we are still collecting we don't know the answer yet
- if (_collecting)
+ // If we are still collecting or there were no non-escaping allocations
+ // we don't know the answer yet
+ if (_collecting || !_has_allocations)
return PointsToNode::UnknownEscape;
// if the node was created after the escape computation, return
@@ -169,9 +199,9 @@
// compute max escape state of anything this node could point to
VectorSet ptset(Thread::current()->resource_area());
PointsTo(ptset, n, phase);
- for( VectorSetI i(&ptset); i.test() && es != PointsToNode::GlobalEscape; ++i ) {
+ for(VectorSetI i(&ptset); i.test() && es != PointsToNode::GlobalEscape; ++i) {
uint pt = i.elem;
- PointsToNode::EscapeState pes = _nodes->at(pt).escape_state();
+ PointsToNode::EscapeState pes = _nodes->adr_at(pt)->escape_state();
if (pes > es)
es = pes;
}
@@ -185,7 +215,7 @@
VectorSet visited(Thread::current()->resource_area());
GrowableArray<uint> worklist;
- n = skip_casts(n);
+ n = n->uncast();
PointsToNode npt = _nodes->at_grow(n->_idx);
// If we have a JavaObject, return just that object
@@ -193,39 +223,33 @@
ptset.set(n->_idx);
return;
}
- // we may have a Phi which has not been processed
- if (npt._node == NULL) {
- assert(n->is_Phi(), "unprocessed node must be a Phi");
- record_for_escape_analysis(n);
- npt = _nodes->at(n->_idx);
- }
+ assert(npt._node != NULL, "unregistered node");
+
worklist.push(n->_idx);
while(worklist.length() > 0) {
int ni = worklist.pop();
PointsToNode pn = _nodes->at_grow(ni);
- if (!visited.test(ni)) {
- visited.set(ni);
-
+ if (!visited.test_set(ni)) {
// ensure that all inputs of a Phi have been processed
- if (_collecting && pn._node->is_Phi()) {
- PhiNode *phi = pn._node->as_Phi();
- process_phi_escape(phi, phase);
- }
+ assert(!_collecting || !pn._node->is_Phi() || _processed.test(ni),"");
int edges_processed = 0;
for (uint e = 0; e < pn.edge_count(); e++) {
+ uint etgt = pn.edge_target(e);
PointsToNode::EdgeType et = pn.edge_type(e);
if (et == PointsToNode::PointsToEdge) {
- ptset.set(pn.edge_target(e));
+ ptset.set(etgt);
edges_processed++;
} else if (et == PointsToNode::DeferredEdge) {
- worklist.push(pn.edge_target(e));
+ worklist.push(etgt);
edges_processed++;
+ } else {
+ assert(false,"neither PointsToEdge or DeferredEdge");
}
}
if (edges_processed == 0) {
- // no deferred or pointsto edges found. Assume the value was set outside
- // this method. Add the phantom object to the pointsto set.
+ // no deferred or pointsto edges found. Assume the value was set
+ // outside this method. Add the phantom object to the pointsto set.
ptset.set(_phantom_object);
}
}
@@ -239,20 +263,23 @@
PointsToNode *ptn = ptnode_adr(ni);
while(i < ptn->edge_count()) {
+ uint t = ptn->edge_target(i);
+ PointsToNode *ptt = ptnode_adr(t);
if (ptn->edge_type(i) != PointsToNode::DeferredEdge) {
i++;
} else {
- uint t = ptn->edge_target(i);
- PointsToNode *ptt = ptnode_adr(t);
ptn->remove_edge(t, PointsToNode::DeferredEdge);
- if(!visited.test(t)) {
- visited.set(t);
+ if(!visited.test_set(t)) {
for (uint j = 0; j < ptt->edge_count(); j++) {
uint n1 = ptt->edge_target(j);
PointsToNode *pt1 = ptnode_adr(n1);
switch(ptt->edge_type(j)) {
case PointsToNode::PointsToEdge:
- add_pointsto_edge(ni, n1);
+ add_pointsto_edge(ni, n1);
+ if(n1 == _phantom_object) {
+ // Special case - field set outside (globally escaping).
+ ptn->set_escape_state(PointsToNode::GlobalEscape);
+ }
break;
case PointsToNode::DeferredEdge:
add_deferred_edge(ni, n1);
@@ -291,8 +318,8 @@
}
}
-// Add a deferred edge from node given by "from_i" to any field of adr_i whose offset
-// matches "offset"
+// Add a deferred edge from node given by "from_i" to any field of adr_i
+// whose offset matches "offset".
void ConnectionGraph::add_deferred_edge_to_fields(uint from_i, uint adr_i, int offs) {
PointsToNode an = _nodes->at_grow(adr_i);
for (uint fe = 0; fe < an.edge_count(); fe++) {
@@ -310,25 +337,115 @@
}
}
-//
-// Search memory chain of "mem" to find a MemNode whose address
-// is the specified alias index. Returns the MemNode found or the
-// first non-MemNode encountered.
-//
-Node *ConnectionGraph::find_mem(Node *mem, int alias_idx, PhaseGVN *igvn) {
- if (mem == NULL)
- return mem;
- while (mem->is_Mem()) {
- const Type *at = igvn->type(mem->in(MemNode::Address));
- if (at != Type::TOP) {
- assert (at->isa_ptr() != NULL, "pointer type required.");
- int idx = _compile->get_alias_index(at->is_ptr());
- if (idx == alias_idx)
- break;
- }
- mem = mem->in(MemNode::Memory);
+// Helper functions
+
+static Node* get_addp_base(Node *addp) {
+ assert(addp->is_AddP(), "must be AddP");
+ //
+ // AddP cases for Base and Address inputs:
+ // case #1. Direct object's field reference:
+ // Allocate
+ // |
+ // Proj #5 ( oop result )
+ // |
+ // CheckCastPP (cast to instance type)
+ // | |
+ // AddP ( base == address )
+ //
+ // case #2. Indirect object's field reference:
+ // Phi
+ // |
+ // CastPP (cast to instance type)
+ // | |
+ // AddP ( base == address )
+ //
+ // case #3. Raw object's field reference for Initialize node:
+ // Allocate
+ // |
+ // Proj #5 ( oop result )
+ // top |
+ // \ |
+ // AddP ( base == top )
+ //
+ // case #4. Array's element reference:
+ // {CheckCastPP | CastPP}
+ // | | |
+ // | AddP ( array's element offset )
+ // | |
+ // AddP ( array's offset )
+ //
+ // case #5. Raw object's field reference for arraycopy stub call:
+ // The inline_native_clone() case when the arraycopy stub is called
+ // after the allocation before Initialize and CheckCastPP nodes.
+ // Allocate
+ // |
+ // Proj #5 ( oop result )
+ // | |
+ // AddP ( base == address )
+ //
+ // case #6. Constant Pool, ThreadLocal, CastX2P or
+ // Raw object's field reference:
+ // {ConP, ThreadLocal, CastX2P, raw Load}
+ // top |
+ // \ |
+ // AddP ( base == top )
+ //
+ // case #7. Klass's field reference.
+ // LoadKlass
+ // | |
+ // AddP ( base == address )
+ //
+ Node *base = addp->in(AddPNode::Base)->uncast();
+ if (base->is_top()) { // The AddP case #3 and #6.
+ base = addp->in(AddPNode::Address)->uncast();
+ assert(base->Opcode() == Op_ConP || base->Opcode() == Op_ThreadLocal ||
+ base->Opcode() == Op_CastX2P ||
+ (base->is_Mem() && base->bottom_type() == TypeRawPtr::NOTNULL) ||
+ (base->is_Proj() && base->in(0)->is_Allocate()), "sanity");
}
- return mem;
+ return base;
+}
+
+static Node* find_second_addp(Node* addp, Node* n) {
+ assert(addp->is_AddP() && addp->outcnt() > 0, "Don't process dead nodes");
+
+ Node* addp2 = addp->raw_out(0);
+ if (addp->outcnt() == 1 && addp2->is_AddP() &&
+ addp2->in(AddPNode::Base) == n &&
+ addp2->in(AddPNode::Address) == addp) {
+
+ assert(addp->in(AddPNode::Base) == n, "expecting the same base");
+ //
+ // Find array's offset to push it on worklist first and
+ // as result process an array's element offset first (pushed second)
+ // to avoid CastPP for the array's offset.
+ // Otherwise the inserted CastPP (LocalVar) will point to what
+ // the AddP (Field) points to. Which would be wrong since
+ // the algorithm expects the CastPP has the same point as
+ // as AddP's base CheckCastPP (LocalVar).
+ //
+ // ArrayAllocation
+ // |
+ // CheckCastPP
+ // |
+ // memProj (from ArrayAllocation CheckCastPP)
+ // | ||
+ // | || Int (element index)
+ // | || | ConI (log(element size))
+ // | || | /
+ // | || LShift
+ // | || /
+ // | AddP (array's element offset)
+ // | |
+ // | | ConI (array's offset: #12(32-bits) or #24(64-bits))
+ // | / /
+ // AddP (array's offset)
+ // |
+ // Load/Store (memory operation on array's element)
+ //
+ return addp2;
+ }
+ return NULL;
}
//
@@ -336,24 +453,33 @@
// address of a field of an instance
//
void ConnectionGraph::split_AddP(Node *addp, Node *base, PhaseGVN *igvn) {
+ const TypeOopPtr *base_t = igvn->type(base)->isa_oopptr();
+ assert(base_t != NULL && base_t->is_instance(), "expecting instance oopptr");
const TypeOopPtr *t = igvn->type(addp)->isa_oopptr();
- const TypeOopPtr *base_t = igvn->type(base)->isa_oopptr();
- assert(t != NULL, "expecting oopptr");
- assert(base_t != NULL && base_t->is_instance(), "expecting instance oopptr");
+ if (t == NULL) {
+ // We are computing a raw address for a store captured by an Initialize
+ // compute an appropriate address type.
+ assert(igvn->type(addp) == TypeRawPtr::NOTNULL, "must be raw pointer");
+ assert(addp->in(AddPNode::Address)->is_Proj(), "base of raw address must be result projection from allocation");
+ int offs = (int)igvn->find_intptr_t_con(addp->in(AddPNode::Offset), Type::OffsetBot);
+ assert(offs != Type::OffsetBot, "offset must be a constant");
+ t = base_t->add_offset(offs)->is_oopptr();
+ }
uint inst_id = base_t->instance_id();
assert(!t->is_instance() || t->instance_id() == inst_id,
"old type must be non-instance or match new type");
const TypeOopPtr *tinst = base_t->add_offset(t->offset())->is_oopptr();
- // ensure an alias index is allocated for the instance type
+ // Do NOT remove the next call: ensure an new alias index is allocated
+ // for the instance type
int alias_idx = _compile->get_alias_index(tinst);
igvn->set_type(addp, tinst);
// record the allocation in the node map
set_map(addp->_idx, get_map(base->_idx));
- // if the Address input is not the appropriate instance type (due to intervening
- // casts,) insert a cast
+ // if the Address input is not the appropriate instance type
+ // (due to intervening casts,) insert a cast
Node *adr = addp->in(AddPNode::Address);
const TypeOopPtr *atype = igvn->type(adr)->isa_oopptr();
- if (atype->instance_id() != inst_id) {
+ if (atype != NULL && atype->instance_id() != inst_id) {
assert(!atype->is_instance(), "no conflicting instances");
const TypeOopPtr *new_atype = base_t->add_offset(atype->offset())->isa_oopptr();
Node *acast = new (_compile, 2) CastPPNode(adr, new_atype);
@@ -372,8 +498,9 @@
addp->set_req(AddPNode::Base, bcast);
addp->set_req(AddPNode::Address, acast);
igvn->hash_insert(addp);
- record_for_optimizer(addp);
}
+ // Put on IGVN worklist since at least addp's type was changed above.
+ record_for_optimizer(addp);
}
//
@@ -386,17 +513,25 @@
new_created = false;
int phi_alias_idx = C->get_alias_index(orig_phi->adr_type());
// nothing to do if orig_phi is bottom memory or matches alias_idx
- if (phi_alias_idx == Compile::AliasIdxBot || phi_alias_idx == alias_idx) {
+ if (phi_alias_idx == alias_idx) {
return orig_phi;
}
// have we already created a Phi for this alias index?
PhiNode *result = get_map_phi(orig_phi->_idx);
- const TypePtr *atype = C->get_adr_type(alias_idx);
if (result != NULL && C->get_alias_index(result->adr_type()) == alias_idx) {
return result;
}
-
+ if ((int)C->unique() + 2*NodeLimitFudgeFactor > MaxNodeLimit) {
+ if (C->do_escape_analysis() == true && !C->failing()) {
+ // Retry compilation without escape analysis.
+ // If this is the first failure, the sentinel string will "stick"
+ // to the Compile object, and the C2Compiler will see it and retry.
+ C->record_failure(C2Compiler::retry_no_escape_analysis());
+ }
+ return NULL;
+ }
orig_phi_worklist.append_if_missing(orig_phi);
+ const TypePtr *atype = C->get_adr_type(alias_idx);
result = PhiNode::make(orig_phi->in(0), NULL, Type::MEMORY, atype);
set_map_phi(orig_phi->_idx, result);
igvn->set_type(result, result->bottom_type());
@@ -414,7 +549,7 @@
assert(alias_idx != Compile::AliasIdxBot, "can't split out bottom memory");
Compile *C = _compile;
bool new_phi_created;
- PhiNode *result = create_split_phi(orig_phi, alias_idx, orig_phi_worklist, igvn, new_phi_created);
+ PhiNode *result = create_split_phi(orig_phi, alias_idx, orig_phi_worklist, igvn, new_phi_created);
if (!new_phi_created) {
return result;
}
@@ -427,45 +562,149 @@
bool finished = false;
while(!finished) {
while (idx < phi->req()) {
- Node *mem = find_mem(phi->in(idx), alias_idx, igvn);
+ Node *mem = find_inst_mem(phi->in(idx), alias_idx, orig_phi_worklist, igvn);
if (mem != NULL && mem->is_Phi()) {
- PhiNode *nphi = create_split_phi(mem->as_Phi(), alias_idx, orig_phi_worklist, igvn, new_phi_created);
+ PhiNode *newphi = create_split_phi(mem->as_Phi(), alias_idx, orig_phi_worklist, igvn, new_phi_created);
if (new_phi_created) {
// found an phi for which we created a new split, push current one on worklist and begin
// processing new one
phi_list.push(phi);
cur_input.push(idx);
phi = mem->as_Phi();
- result = nphi;
+ result = newphi;
idx = 1;
continue;
} else {
- mem = nphi;
+ mem = newphi;
}
}
+ if (C->failing()) {
+ return NULL;
+ }
result->set_req(idx++, mem);
}
#ifdef ASSERT
// verify that the new Phi has an input for each input of the original
assert( phi->req() == result->req(), "must have same number of inputs.");
assert( result->in(0) != NULL && result->in(0) == phi->in(0), "regions must match");
+#endif
+ // Check if all new phi's inputs have specified alias index.
+ // Otherwise use old phi.
for (uint i = 1; i < phi->req(); i++) {
- assert((phi->in(i) == NULL) == (result->in(i) == NULL), "inputs must correspond.");
+ Node* in = result->in(i);
+ assert((phi->in(i) == NULL) == (in == NULL), "inputs must correspond.");
}
-#endif
// we have finished processing a Phi, see if there are any more to do
finished = (phi_list.length() == 0 );
if (!finished) {
phi = phi_list.pop();
idx = cur_input.pop();
- PhiNode *prev_phi = get_map_phi(phi->_idx);
- prev_phi->set_req(idx++, result);
- result = prev_phi;
+ PhiNode *prev_result = get_map_phi(phi->_idx);
+ prev_result->set_req(idx++, result);
+ result = prev_result;
}
}
return result;
}
+
+//
+// The next methods are derived from methods in MemNode.
+//
+static Node *step_through_mergemem(MergeMemNode *mmem, int alias_idx, const TypeOopPtr *tinst) {
+ Node *mem = mmem;
+ // TypeInstPtr::NOTNULL+any is an OOP with unknown offset - generally
+ // means an array I have not precisely typed yet. Do not do any
+ // alias stuff with it any time soon.
+ if( tinst->base() != Type::AnyPtr &&
+ !(tinst->klass()->is_java_lang_Object() &&
+ tinst->offset() == Type::OffsetBot) ) {
+ mem = mmem->memory_at(alias_idx);
+ // Update input if it is progress over what we have now
+ }
+ return mem;
+}
+
+//
+// Search memory chain of "mem" to find a MemNode whose address
+// is the specified alias index.
+//
+Node* ConnectionGraph::find_inst_mem(Node *orig_mem, int alias_idx, GrowableArray<PhiNode *> &orig_phis, PhaseGVN *phase) {
+ if (orig_mem == NULL)
+ return orig_mem;
+ Compile* C = phase->C;
+ const TypeOopPtr *tinst = C->get_adr_type(alias_idx)->isa_oopptr();
+ bool is_instance = (tinst != NULL) && tinst->is_instance();
+ Node *prev = NULL;
+ Node *result = orig_mem;
+ while (prev != result) {
+ prev = result;
+ if (result->is_Mem()) {
+ MemNode *mem = result->as_Mem();
+ const Type *at = phase->type(mem->in(MemNode::Address));
+ if (at != Type::TOP) {
+ assert (at->isa_ptr() != NULL, "pointer type required.");
+ int idx = C->get_alias_index(at->is_ptr());
+ if (idx == alias_idx)
+ break;
+ }
+ result = mem->in(MemNode::Memory);
+ }
+ if (!is_instance)
+ continue; // don't search further for non-instance types
+ // skip over a call which does not affect this memory slice
+ if (result->is_Proj() && result->as_Proj()->_con == TypeFunc::Memory) {
+ Node *proj_in = result->in(0);
+ if (proj_in->is_Call()) {
+ CallNode *call = proj_in->as_Call();
+ if (!call->may_modify(tinst, phase)) {
+ result = call->in(TypeFunc::Memory);
+ }
+ } else if (proj_in->is_Initialize()) {
+ AllocateNode* alloc = proj_in->as_Initialize()->allocation();
+ // Stop if this is the initialization for the object instance which
+ // which contains this memory slice, otherwise skip over it.
+ if (alloc == NULL || alloc->_idx != tinst->instance_id()) {
+ result = proj_in->in(TypeFunc::Memory);
+ }
+ } else if (proj_in->is_MemBar()) {
+ result = proj_in->in(TypeFunc::Memory);
+ }
+ } else if (result->is_MergeMem()) {
+ MergeMemNode *mmem = result->as_MergeMem();
+ result = step_through_mergemem(mmem, alias_idx, tinst);
+ if (result == mmem->base_memory()) {
+ // Didn't find instance memory, search through general slice recursively.
+ result = mmem->memory_at(C->get_general_index(alias_idx));
+ result = find_inst_mem(result, alias_idx, orig_phis, phase);
+ if (C->failing()) {
+ return NULL;
+ }
+ mmem->set_memory_at(alias_idx, result);
+ }
+ } else if (result->is_Phi() &&
+ C->get_alias_index(result->as_Phi()->adr_type()) != alias_idx) {
+ Node *un = result->as_Phi()->unique_input(phase);
+ if (un != NULL) {
+ result = un;
+ } else {
+ break;
+ }
+ }
+ }
+ if (is_instance && result->is_Phi()) {
+ PhiNode *mphi = result->as_Phi();
+ assert(mphi->bottom_type() == Type::MEMORY, "memory phi required");
+ const TypePtr *t = mphi->adr_type();
+ if (C->get_alias_index(t) != alias_idx) {
+ result = split_memory_phi(mphi, alias_idx, orig_phis, phase);
+ }
+ }
+ // the result is either MemNode, PhiNode, InitializeNode.
+ return result;
+}
+
+
//
// Convert the types of unescaped object to instance types where possible,
// propagate the new type information through the graph, and update memory
@@ -564,51 +803,101 @@
VectorSet visited(Thread::current()->resource_area());
VectorSet ptset(Thread::current()->resource_area());
- // Phase 1: Process possible allocations from alloc_worklist. Create instance
- // types for the CheckCastPP for allocations where possible.
+
+ // Phase 1: Process possible allocations from alloc_worklist.
+ // Create instance types for the CheckCastPP for allocations where possible.
while (alloc_worklist.length() != 0) {
Node *n = alloc_worklist.pop();
uint ni = n->_idx;
+ const TypeOopPtr* tinst = NULL;
if (n->is_Call()) {
CallNode *alloc = n->as_Call();
// copy escape information to call node
- PointsToNode ptn = _nodes->at(alloc->_idx);
+ PointsToNode* ptn = _nodes->adr_at(alloc->_idx);
PointsToNode::EscapeState es = escape_state(alloc, igvn);
- alloc->_escape_state = es;
+ // We have an allocation or call which returns a Java object,
+ // see if it is unescaped.
+ if (es != PointsToNode::NoEscape || !ptn->_scalar_replaceable)
+ continue;
+ if (alloc->is_Allocate()) {
+ // Set the scalar_replaceable flag before the next check.
+ alloc->as_Allocate()->_is_scalar_replaceable = true;
+ }
// find CheckCastPP of call return value
- n = alloc->proj_out(TypeFunc::Parms);
- if (n != NULL && n->outcnt() == 1) {
- n = n->unique_out();
- if (n->Opcode() != Op_CheckCastPP) {
+ n = alloc->result_cast();
+ if (n == NULL || // No uses accept Initialize or
+ !n->is_CheckCastPP()) // not unique CheckCastPP.
+ continue;
+ // The inline code for Object.clone() casts the allocation result to
+ // java.lang.Object and then to the the actual type of the allocated
+ // object. Detect this case and use the second cast.
+ if (alloc->is_Allocate() && n->as_Type()->type() == TypeInstPtr::NOTNULL
+ && igvn->type(alloc->in(AllocateNode::KlassNode)) != TypeKlassPtr::OBJECT) {
+ Node *cast2 = NULL;
+ for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) {
+ Node *use = n->fast_out(i);
+ if (use->is_CheckCastPP()) {
+ cast2 = use;
+ break;
+ }
+ }
+ if (cast2 != NULL) {
+ n = cast2;
+ } else {
continue;
}
- } else {
- continue;
}
- // we have an allocation or call which returns a Java object, see if it is unescaped
- if (es != PointsToNode::NoEscape || !ptn._unique_type) {
- continue; // can't make a unique type
- }
+ set_escape_state(n->_idx, es);
+ // in order for an object to be stackallocatable, it must be:
+ // - a direct allocation (not a call returning an object)
+ // - non-escaping
+ // - eligible to be a unique type
+ // - not determined to be ineligible by escape analysis
set_map(alloc->_idx, n);
set_map(n->_idx, alloc);
- const TypeInstPtr *t = igvn->type(n)->isa_instptr();
- // Unique types which are arrays are not currently supported.
- // The check for AllocateArray is needed in case an array
- // allocation is immediately cast to Object
- if (t == NULL || alloc->is_AllocateArray())
+ const TypeOopPtr *t = igvn->type(n)->isa_oopptr();
+ if (t == NULL)
continue; // not a TypeInstPtr
- const TypeOopPtr *tinst = t->cast_to_instance(ni);
+ tinst = t->cast_to_instance(ni);
igvn->hash_delete(n);
igvn->set_type(n, tinst);
n->raise_bottom_type(tinst);
igvn->hash_insert(n);
+ record_for_optimizer(n);
+ if (alloc->is_Allocate() && ptn->_scalar_replaceable &&
+ (t->isa_instptr() || t->isa_aryptr())) {
+ // An allocation may have an Initialize which has raw stores. Scan
+ // the users of the raw allocation result and push AddP users
+ // on alloc_worklist.
+ Node *raw_result = alloc->proj_out(TypeFunc::Parms);
+ assert (raw_result != NULL, "must have an allocation result");
+ for (DUIterator_Fast imax, i = raw_result->fast_outs(imax); i < imax; i++) {
+ Node *use = raw_result->fast_out(i);
+ if (use->is_AddP() && use->outcnt() > 0) { // Don't process dead nodes
+ Node* addp2 = find_second_addp(use, raw_result);
+ if (addp2 != NULL) {
+ assert(alloc->is_AllocateArray(),"array allocation was expected");
+ alloc_worklist.append_if_missing(addp2);
+ }
+ alloc_worklist.append_if_missing(use);
+ } else if (use->is_Initialize()) {
+ memnode_worklist.append_if_missing(use);
+ }
+ }
+ }
} else if (n->is_AddP()) {
ptset.Clear();
- PointsTo(ptset, n->in(AddPNode::Address), igvn);
+ PointsTo(ptset, get_addp_base(n), igvn);
assert(ptset.Size() == 1, "AddP address is unique");
- Node *base = get_map(ptset.getelem());
+ uint elem = ptset.getelem(); // Allocation node's index
+ if (elem == _phantom_object)
+ continue; // Assume the value was set outside this method.
+ Node *base = get_map(elem); // CheckCastPP node
split_AddP(n, base, igvn);
- } else if (n->is_Phi() || n->Opcode() == Op_CastPP || n->Opcode() == Op_CheckCastPP) {
+ tinst = igvn->type(base)->isa_oopptr();
+ } else if (n->is_Phi() ||
+ n->is_CheckCastPP() ||
+ (n->is_ConstraintCast() && n->Opcode() == Op_CastPP)) {
if (visited.test_set(n->_idx)) {
assert(n->is_Phi(), "loops only through Phi's");
continue; // already processed
@@ -616,17 +905,23 @@
ptset.Clear();
PointsTo(ptset, n, igvn);
if (ptset.Size() == 1) {
+ uint elem = ptset.getelem(); // Allocation node's index
+ if (elem == _phantom_object)
+ continue; // Assume the value was set outside this method.
+ Node *val = get_map(elem); // CheckCastPP node
TypeNode *tn = n->as_Type();
- Node *val = get_map(ptset.getelem());
- const TypeInstPtr *val_t = igvn->type(val)->isa_instptr();;
- assert(val_t != NULL && val_t->is_instance(), "instance type expected.");
- const TypeInstPtr *tn_t = igvn->type(tn)->isa_instptr();;
+ tinst = igvn->type(val)->isa_oopptr();
+ assert(tinst != NULL && tinst->is_instance() &&
+ tinst->instance_id() == elem , "instance type expected.");
+ const TypeOopPtr *tn_t = igvn->type(tn)->isa_oopptr();
- if (tn_t != NULL && val_t->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE)->higher_equal(tn_t)) {
+ if (tn_t != NULL &&
+ tinst->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE)->higher_equal(tn_t)) {
igvn->hash_delete(tn);
- igvn->set_type(tn, val_t);
- tn->set_type(val_t);
+ igvn->set_type(tn, tinst);
+ tn->set_type(tinst);
igvn->hash_insert(tn);
+ record_for_optimizer(n);
}
}
} else {
@@ -636,13 +931,38 @@
for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) {
Node *use = n->fast_out(i);
if(use->is_Mem() && use->in(MemNode::Address) == n) {
- memnode_worklist.push(use);
- } else if (use->is_AddP() || use->is_Phi() || use->Opcode() == Op_CastPP || use->Opcode() == Op_CheckCastPP) {
- alloc_worklist.push(use);
+ memnode_worklist.append_if_missing(use);
+ } else if (use->is_Initialize()) {
+ memnode_worklist.append_if_missing(use);
+ } else if (use->is_MergeMem()) {
+ mergemem_worklist.append_if_missing(use);
+ } else if (use->is_Call() && tinst != NULL) {
+ // Look for MergeMem nodes for calls which reference unique allocation
+ // (through CheckCastPP nodes) even for debug info.
+ Node* m = use->in(TypeFunc::Memory);
+ uint iid = tinst->instance_id();
+ while (m->is_Proj() && m->in(0)->is_Call() &&
+ m->in(0) != use && !m->in(0)->_idx != iid) {
+ m = m->in(0)->in(TypeFunc::Memory);
+ }
+ if (m->is_MergeMem()) {
+ mergemem_worklist.append_if_missing(m);
+ }
+ } else if (use->is_AddP() && use->outcnt() > 0) { // No dead nodes
+ Node* addp2 = find_second_addp(use, n);
+ if (addp2 != NULL) {
+ alloc_worklist.append_if_missing(addp2);
+ }
+ alloc_worklist.append_if_missing(use);
+ } else if (use->is_Phi() ||
+ use->is_CheckCastPP() ||
+ (use->is_ConstraintCast() && use->Opcode() == Op_CastPP)) {
+ alloc_worklist.append_if_missing(use);
}
}
}
+ // New alias types were created in split_AddP().
uint new_index_end = (uint) _compile->num_alias_types();
// Phase 2: Process MemNode's from memnode_worklist. compute new address type and
@@ -651,29 +971,37 @@
if (memnode_worklist.length() == 0)
return; // nothing to do
-
while (memnode_worklist.length() != 0) {
Node *n = memnode_worklist.pop();
+ if (visited.test_set(n->_idx))
+ continue;
if (n->is_Phi()) {
assert(n->as_Phi()->adr_type() != TypePtr::BOTTOM, "narrow memory slice required");
// we don't need to do anything, but the users must be pushed if we haven't processed
// this Phi before
- if (visited.test_set(n->_idx))
+ } else if (n->is_Initialize()) {
+ // we don't need to do anything, but the users of the memory projection must be pushed
+ n = n->as_Initialize()->proj_out(TypeFunc::Memory);
+ if (n == NULL)
continue;
} else {
assert(n->is_Mem(), "memory node required.");
Node *addr = n->in(MemNode::Address);
+ assert(addr->is_AddP(), "AddP required");
const Type *addr_t = igvn->type(addr);
if (addr_t == Type::TOP)
continue;
assert (addr_t->isa_ptr() != NULL, "pointer type required.");
int alias_idx = _compile->get_alias_index(addr_t->is_ptr());
- Node *mem = find_mem(n->in(MemNode::Memory), alias_idx, igvn);
- if (mem->is_Phi()) {
- mem = split_memory_phi(mem->as_Phi(), alias_idx, orig_phis, igvn);
+ assert ((uint)alias_idx < new_index_end, "wrong alias index");
+ Node *mem = find_inst_mem(n->in(MemNode::Memory), alias_idx, orig_phis, igvn);
+ if (_compile->failing()) {
+ return;
}
- if (mem != n->in(MemNode::Memory))
+ if (mem != n->in(MemNode::Memory)) {
set_map(n->_idx, mem);
+ _nodes->adr_at(n->_idx)->_node = n;
+ }
if (n->is_Load()) {
continue; // don't push users
} else if (n->is_LoadStore()) {
@@ -692,29 +1020,33 @@
for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) {
Node *use = n->fast_out(i);
if (use->is_Phi()) {
- memnode_worklist.push(use);
+ memnode_worklist.append_if_missing(use);
} else if(use->is_Mem() && use->in(MemNode::Memory) == n) {
- memnode_worklist.push(use);
+ memnode_worklist.append_if_missing(use);
+ } else if (use->is_Initialize()) {
+ memnode_worklist.append_if_missing(use);
} else if (use->is_MergeMem()) {
- mergemem_worklist.push(use);
+ mergemem_worklist.append_if_missing(use);
}
}
}
- // Phase 3: Process MergeMem nodes from mergemem_worklist. Walk each memory slice
- // moving the first node encountered of each instance type to the
- // the input corresponding to its alias index.
+ // Phase 3: Process MergeMem nodes from mergemem_worklist.
+ // Walk each memory moving the first node encountered of each
+ // instance type to the the input corresponding to its alias index.
while (mergemem_worklist.length() != 0) {
Node *n = mergemem_worklist.pop();
assert(n->is_MergeMem(), "MergeMem node required.");
+ if (visited.test_set(n->_idx))
+ continue;
MergeMemNode *nmm = n->as_MergeMem();
// Note: we don't want to use MergeMemStream here because we only want to
- // scan inputs which exist at the start, not ones we add during processing
+ // scan inputs which exist at the start, not ones we add during processing.
uint nslices = nmm->req();
igvn->hash_delete(nmm);
for (uint i = Compile::AliasIdxRaw+1; i < nslices; i++) {
- Node * mem = nmm->in(i);
- Node * cur = NULL;
+ Node* mem = nmm->in(i);
+ Node* cur = NULL;
if (mem == NULL || mem->is_top())
continue;
while (mem->is_Mem()) {
@@ -734,26 +1066,76 @@
mem = mem->in(MemNode::Memory);
}
nmm->set_memory_at(i, (cur != NULL) ? cur : mem);
- if (mem->is_Phi()) {
- // We have encountered a Phi, we need to split the Phi for
- // any instance of the current type if we haven't encountered
- // a value of the instance along the chain.
- for (uint ni = new_index_start; ni < new_index_end; ni++) {
- if((uint)_compile->get_general_index(ni) == i) {
- Node *m = (ni >= nmm->req()) ? nmm->empty_memory() : nmm->in(ni);
- if (nmm->is_empty_memory(m)) {
- nmm->set_memory_at(ni, split_memory_phi(mem->as_Phi(), ni, orig_phis, igvn));
+ // Find any instance of the current type if we haven't encountered
+ // a value of the instance along the chain.
+ for (uint ni = new_index_start; ni < new_index_end; ni++) {
+ if((uint)_compile->get_general_index(ni) == i) {
+ Node *m = (ni >= nmm->req()) ? nmm->empty_memory() : nmm->in(ni);
+ if (nmm->is_empty_memory(m)) {
+ Node* result = find_inst_mem(mem, ni, orig_phis, igvn);
+ if (_compile->failing()) {
+ return;
+ }
+ nmm->set_memory_at(ni, result);
+ }
+ }
+ }
+ }
+ // Find the rest of instances values
+ for (uint ni = new_index_start; ni < new_index_end; ni++) {
+ const TypeOopPtr *tinst = igvn->C->get_adr_type(ni)->isa_oopptr();
+ Node* result = step_through_mergemem(nmm, ni, tinst);
+ if (result == nmm->base_memory()) {
+ // Didn't find instance memory, search through general slice recursively.
+ result = nmm->memory_at(igvn->C->get_general_index(ni));
+ result = find_inst_mem(result, ni, orig_phis, igvn);
+ if (_compile->failing()) {
+ return;
+ }
+ nmm->set_memory_at(ni, result);
+ }
+ }
+ igvn->hash_insert(nmm);
+ record_for_optimizer(nmm);
+
+ // Propagate new memory slices to following MergeMem nodes.
+ for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) {
+ Node *use = n->fast_out(i);
+ if (use->is_Call()) {
+ CallNode* in = use->as_Call();
+ if (in->proj_out(TypeFunc::Memory) != NULL) {
+ Node* m = in->proj_out(TypeFunc::Memory);
+ for (DUIterator_Fast jmax, j = m->fast_outs(jmax); j < jmax; j++) {
+ Node* mm = m->fast_out(j);
+ if (mm->is_MergeMem()) {
+ mergemem_worklist.append_if_missing(mm);
+ }
+ }
+ }
+ if (use->is_Allocate()) {
+ use = use->as_Allocate()->initialization();
+ if (use == NULL) {
+ continue;
+ }
+ }
+ }
+ if (use->is_Initialize()) {
+ InitializeNode* in = use->as_Initialize();
+ if (in->proj_out(TypeFunc::Memory) != NULL) {
+ Node* m = in->proj_out(TypeFunc::Memory);
+ for (DUIterator_Fast jmax, j = m->fast_outs(jmax); j < jmax; j++) {
+ Node* mm = m->fast_out(j);
+ if (mm->is_MergeMem()) {
+ mergemem_worklist.append_if_missing(mm);
}
}
}
}
}
- igvn->hash_insert(nmm);
- record_for_optimizer(nmm);
}
- // Phase 4: Update the inputs of non-instance memory Phis and the Memory input of memnodes
- //
+ // Phase 4: Update the inputs of non-instance memory Phis and
+ // the Memory input of memnodes
// First update the inputs of any non-instance Phi's from
// which we split out an instance Phi. Note we don't have
// to recursively process Phi's encounted on the input memory
@@ -765,7 +1147,10 @@
igvn->hash_delete(phi);
for (uint i = 1; i < phi->req(); i++) {
Node *mem = phi->in(i);
- Node *new_mem = find_mem(mem, alias_idx, igvn);
+ Node *new_mem = find_inst_mem(mem, alias_idx, orig_phis, igvn);
+ if (_compile->failing()) {
+ return;
+ }
if (mem != new_mem) {
phi->set_req(i, new_mem);
}
@@ -779,7 +1164,7 @@
for (int i = 0; i < _nodes->length(); i++) {
Node *nmem = get_map(i);
if (nmem != NULL) {
- Node *n = _nodes->at(i)._node;
+ Node *n = _nodes->adr_at(i)->_node;
if (n != NULL && n->is_Mem()) {
igvn->hash_delete(n);
n->set_req(MemNode::Memory, nmem);
@@ -791,59 +1176,110 @@
}
void ConnectionGraph::compute_escape() {
- GrowableArray<int> worklist;
- GrowableArray<Node *> alloc_worklist;
- VectorSet visited(Thread::current()->resource_area());
- PhaseGVN *igvn = _compile->initial_gvn();
+
+ // 1. Populate Connection Graph with Ideal nodes.
+
+ Unique_Node_List worklist_init;
+ worklist_init.map(_compile->unique(), NULL); // preallocate space
+
+ // Initialize worklist
+ if (_compile->root() != NULL) {
+ worklist_init.push(_compile->root());
+ }
+
+ GrowableArray<int> cg_worklist;
+ PhaseGVN* igvn = _compile->initial_gvn();
+ bool has_allocations = false;
+
+ // Push all useful nodes onto CG list and set their type.
+ for( uint next = 0; next < worklist_init.size(); ++next ) {
+ Node* n = worklist_init.at(next);
+ record_for_escape_analysis(n, igvn);
+ if (n->is_Call() &&
+ _nodes->adr_at(n->_idx)->node_type() == PointsToNode::JavaObject) {
+ has_allocations = true;
+ }
+ if(n->is_AddP())
+ cg_worklist.append(n->_idx);
+ for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) {
+ Node* m = n->fast_out(i); // Get user
+ worklist_init.push(m);
+ }
+ }
- // process Phi nodes from the deferred list, they may not have
- while(_deferred.size() > 0) {
- Node * n = _deferred.pop();
- PhiNode * phi = n->as_Phi();
+ if (has_allocations) {
+ _has_allocations = true;
+ } else {
+ _has_allocations = false;
+ _collecting = false;
+ return; // Nothing to do.
+ }
+
+ // 2. First pass to create simple CG edges (doesn't require to walk CG).
+ for( uint next = 0; next < _delayed_worklist.size(); ++next ) {
+ Node* n = _delayed_worklist.at(next);
+ build_connection_graph(n, igvn);
+ }
- process_phi_escape(phi, igvn);
+ // 3. Pass to create fields edges (Allocate -F-> AddP).
+ for( int next = 0; next < cg_worklist.length(); ++next ) {
+ int ni = cg_worklist.at(next);
+ build_connection_graph(_nodes->adr_at(ni)->_node, igvn);
+ }
+
+ cg_worklist.clear();
+ cg_worklist.append(_phantom_object);
+
+ // 4. Build Connection Graph which need
+ // to walk the connection graph.
+ for (uint ni = 0; ni < (uint)_nodes->length(); ni++) {
+ PointsToNode* ptn = _nodes->adr_at(ni);
+ Node *n = ptn->_node;
+ if (n != NULL) { // Call, AddP, LoadP, StoreP
+ build_connection_graph(n, igvn);
+ if (ptn->node_type() != PointsToNode::UnknownType)
+ cg_worklist.append(n->_idx); // Collect CG nodes
+ }
}
VectorSet ptset(Thread::current()->resource_area());
+ GrowableArray<Node*> alloc_worklist;
+ GrowableArray<int> worklist;
// remove deferred edges from the graph and collect
// information we will need for type splitting
- for (uint ni = 0; ni < (uint)_nodes->length(); ni++) {
- PointsToNode * ptn = _nodes->adr_at(ni);
+ for( int next = 0; next < cg_worklist.length(); ++next ) {
+ int ni = cg_worklist.at(next);
+ PointsToNode* ptn = _nodes->adr_at(ni);
PointsToNode::NodeType nt = ptn->node_type();
-
- if (nt == PointsToNode::UnknownType) {
- continue; // not a node we are interested in
- }
Node *n = ptn->_node;
if (nt == PointsToNode::LocalVar || nt == PointsToNode::Field) {
remove_deferred(ni);
if (n->is_AddP()) {
- // if this AddP computes an address which may point to more that one
- // object, nothing the address points to can be a unique type.
- Node *base = n->in(AddPNode::Base);
+ // If this AddP computes an address which may point to more that one
+ // object, nothing the address points to can be scalar replaceable.
+ Node *base = get_addp_base(n);
ptset.Clear();
PointsTo(ptset, base, igvn);
if (ptset.Size() > 1) {
for( VectorSetI j(&ptset); j.test(); ++j ) {
- PointsToNode *ptaddr = _nodes->adr_at(j.elem);
- ptaddr->_unique_type = false;
+ uint pt = j.elem;
+ ptnode_adr(pt)->_scalar_replaceable = false;
}
}
}
- } else if (n->is_Call()) {
- // initialize _escape_state of calls to GlobalEscape
- n->as_Call()->_escape_state = PointsToNode::GlobalEscape;
- // push call on alloc_worlist (alocations are calls)
- // for processing by split_unique_types()
- alloc_worklist.push(n);
+ } else if (nt == PointsToNode::JavaObject && n->is_Call()) {
+ // Push call on alloc_worlist (alocations are calls)
+ // for processing by split_unique_types().
+ alloc_worklist.append(n);
}
}
+
// push all GlobalEscape nodes on the worklist
- for (uint nj = 0; nj < (uint)_nodes->length(); nj++) {
- if (_nodes->at(nj).escape_state() == PointsToNode::GlobalEscape) {
- worklist.append(nj);
- }
+ for( int next = 0; next < cg_worklist.length(); ++next ) {
+ int nk = cg_worklist.at(next);
+ if (_nodes->adr_at(nk)->escape_state() == PointsToNode::GlobalEscape)
+ worklist.append(nk);
}
// mark all node reachable from GlobalEscape nodes
while(worklist.length() > 0) {
@@ -851,7 +1287,7 @@
for (uint ei = 0; ei < n.edge_count(); ei++) {
uint npi = n.edge_target(ei);
PointsToNode *np = ptnode_adr(npi);
- if (np->escape_state() != PointsToNode::GlobalEscape) {
+ if (np->escape_state() < PointsToNode::GlobalEscape) {
np->set_escape_state(PointsToNode::GlobalEscape);
worklist.append_if_missing(npi);
}
@@ -859,128 +1295,191 @@
}
// push all ArgEscape nodes on the worklist
- for (uint nk = 0; nk < (uint)_nodes->length(); nk++) {
- if (_nodes->at(nk).escape_state() == PointsToNode::ArgEscape)
+ for( int next = 0; next < cg_worklist.length(); ++next ) {
+ int nk = cg_worklist.at(next);
+ if (_nodes->adr_at(nk)->escape_state() == PointsToNode::ArgEscape)
worklist.push(nk);
}
// mark all node reachable from ArgEscape nodes
while(worklist.length() > 0) {
PointsToNode n = _nodes->at(worklist.pop());
-
for (uint ei = 0; ei < n.edge_count(); ei++) {
uint npi = n.edge_target(ei);
PointsToNode *np = ptnode_adr(npi);
- if (np->escape_state() != PointsToNode::ArgEscape) {
+ if (np->escape_state() < PointsToNode::ArgEscape) {
np->set_escape_state(PointsToNode::ArgEscape);
worklist.append_if_missing(npi);
}
}
}
+
+ // push all NoEscape nodes on the worklist
+ for( int next = 0; next < cg_worklist.length(); ++next ) {
+ int nk = cg_worklist.at(next);
+ if (_nodes->adr_at(nk)->escape_state() == PointsToNode::NoEscape)
+ worklist.push(nk);
+ }
+ // mark all node reachable from NoEscape nodes
+ while(worklist.length() > 0) {
+ PointsToNode n = _nodes->at(worklist.pop());
+ for (uint ei = 0; ei < n.edge_count(); ei++) {
+ uint npi = n.edge_target(ei);
+ PointsToNode *np = ptnode_adr(npi);
+ if (np->escape_state() < PointsToNode::NoEscape) {
+ np->set_escape_state(PointsToNode::NoEscape);
+ worklist.append_if_missing(npi);
+ }
+ }
+ }
+
_collecting = false;
- // Now use the escape information to create unique types for
- // unescaped objects
- split_unique_types(alloc_worklist);
-}
+ has_allocations = false; // Are there scalar replaceable allocations?
-Node * ConnectionGraph::skip_casts(Node *n) {
- while(n->Opcode() == Op_CastPP || n->Opcode() == Op_CheckCastPP) {
- n = n->in(1);
+ for( int next = 0; next < alloc_worklist.length(); ++next ) {
+ Node* n = alloc_worklist.at(next);
+ uint ni = n->_idx;
+ PointsToNode* ptn = _nodes->adr_at(ni);
+ PointsToNode::EscapeState es = ptn->escape_state();
+ if (ptn->escape_state() == PointsToNode::NoEscape &&
+ ptn->_scalar_replaceable) {
+ has_allocations = true;
+ break;
+ }
}
- return n;
-}
-
-void ConnectionGraph::process_phi_escape(PhiNode *phi, PhaseTransform *phase) {
-
- if (phi->type()->isa_oopptr() == NULL)
- return; // nothing to do if not an oop
-
- PointsToNode *ptadr = ptnode_adr(phi->_idx);
- int incount = phi->req();
- int non_null_inputs = 0;
+ if (!has_allocations) {
+ return; // Nothing to do.
+ }
- for (int i = 1; i < incount ; i++) {
- if (phi->in(i) != NULL)
- non_null_inputs++;
- }
- if (non_null_inputs == ptadr->_inputs_processed)
- return; // no new inputs since the last time this node was processed,
- // the current information is valid
+ if(_compile->AliasLevel() >= 3 && EliminateAllocations) {
+ // Now use the escape information to create unique types for
+ // unescaped objects
+ split_unique_types(alloc_worklist);
+ if (_compile->failing()) return;
+
+ // Clean up after split unique types.
+ ResourceMark rm;
+ PhaseRemoveUseless pru(_compile->initial_gvn(), _compile->for_igvn());
- ptadr->_inputs_processed = non_null_inputs; // prevent recursive processing of this node
- for (int j = 1; j < incount ; j++) {
- Node * n = phi->in(j);
- if (n == NULL)
- continue; // ignore NULL
- n = skip_casts(n);
- if (n->is_top() || n == phi)
- continue; // ignore top or inputs which go back this node
- int nopc = n->Opcode();
- PointsToNode npt = _nodes->at(n->_idx);
- if (_nodes->at(n->_idx).node_type() == PointsToNode::JavaObject) {
- add_pointsto_edge(phi->_idx, n->_idx);
- } else {
- add_deferred_edge(phi->_idx, n->_idx);
+#ifdef ASSERT
+ } else if (PrintEscapeAnalysis || PrintEliminateAllocations) {
+ tty->print("=== No allocations eliminated for ");
+ C()->method()->print_short_name();
+ if(!EliminateAllocations) {
+ tty->print(" since EliminateAllocations is off ===");
+ } else if(_compile->AliasLevel() < 3) {
+ tty->print(" since AliasLevel < 3 ===");
}
+ tty->cr();
+#endif
}
}
void ConnectionGraph::process_call_arguments(CallNode *call, PhaseTransform *phase) {
- _processed.set(call->_idx);
switch (call->Opcode()) {
-
- // arguments to allocation and locking don't escape
+#ifdef ASSERT
case Op_Allocate:
case Op_AllocateArray:
case Op_Lock:
case Op_Unlock:
+ assert(false, "should be done already");
break;
+#endif
+ case Op_CallLeafNoFP:
+ {
+ // Stub calls, objects do not escape but they are not scale replaceable.
+ // Adjust escape state for outgoing arguments.
+ const TypeTuple * d = call->tf()->domain();
+ VectorSet ptset(Thread::current()->resource_area());
+ for (uint i = TypeFunc::Parms; i < d->cnt(); i++) {
+ const Type* at = d->field_at(i);
+ Node *arg = call->in(i)->uncast();
+ const Type *aat = phase->type(arg);
+ if (!arg->is_top() && at->isa_ptr() && aat->isa_ptr()) {
+ assert(aat == Type::TOP || aat == TypePtr::NULL_PTR ||
+ aat->isa_ptr() != NULL, "expecting an Ptr");
+ set_escape_state(arg->_idx, PointsToNode::ArgEscape);
+ if (arg->is_AddP()) {
+ //
+ // The inline_native_clone() case when the arraycopy stub is called
+ // after the allocation before Initialize and CheckCastPP nodes.
+ //
+ // Set AddP's base (Allocate) as not scalar replaceable since
+ // pointer to the base (with offset) is passed as argument.
+ //
+ arg = get_addp_base(arg);
+ }
+ ptset.Clear();
+ PointsTo(ptset, arg, phase);
+ for( VectorSetI j(&ptset); j.test(); ++j ) {
+ uint pt = j.elem;
+ set_escape_state(pt, PointsToNode::ArgEscape);
+ }
+ }
+ }
+ break;
+ }
case Op_CallStaticJava:
// For a static call, we know exactly what method is being called.
// Use bytecode estimator to record the call's escape affects
{
ciMethod *meth = call->as_CallJava()->method();
- if (meth != NULL) {
+ BCEscapeAnalyzer *call_analyzer = (meth !=NULL) ? meth->get_bcea() : NULL;
+ // fall-through if not a Java method or no analyzer information
+ if (call_analyzer != NULL) {
const TypeTuple * d = call->tf()->domain();
- BCEscapeAnalyzer call_analyzer(meth);
VectorSet ptset(Thread::current()->resource_area());
+ bool copy_dependencies = false;
for (uint i = TypeFunc::Parms; i < d->cnt(); i++) {
const Type* at = d->field_at(i);
int k = i - TypeFunc::Parms;
if (at->isa_oopptr() != NULL) {
- Node *arg = skip_casts(call->in(i));
-
- if (!call_analyzer.is_arg_stack(k)) {
- // The argument global escapes, mark everything it could point to
- ptset.Clear();
- PointsTo(ptset, arg, phase);
- for( VectorSetI j(&ptset); j.test(); ++j ) {
- uint pt = j.elem;
+ Node *arg = call->in(i)->uncast();
- set_escape_state(pt, PointsToNode::GlobalEscape);
+ bool global_escapes = false;
+ bool fields_escapes = false;
+ if (!call_analyzer->is_arg_stack(k)) {
+ // The argument global escapes, mark everything it could point to
+ set_escape_state(arg->_idx, PointsToNode::GlobalEscape);
+ global_escapes = true;
+ } else {
+ if (!call_analyzer->is_arg_local(k)) {
+ // The argument itself doesn't escape, but any fields might
+ fields_escapes = true;
}
- } else if (!call_analyzer.is_arg_local(k)) {
- // The argument itself doesn't escape, but any fields might
- ptset.Clear();
- PointsTo(ptset, arg, phase);
- for( VectorSetI j(&ptset); j.test(); ++j ) {
- uint pt = j.elem;
- add_edge_from_fields(pt, _phantom_object, Type::OffsetBot);
+ set_escape_state(arg->_idx, PointsToNode::ArgEscape);
+ copy_dependencies = true;
+ }
+
+ ptset.Clear();
+ PointsTo(ptset, arg, phase);
+ for( VectorSetI j(&ptset); j.test(); ++j ) {
+ uint pt = j.elem;
+ if (global_escapes) {
+ //The argument global escapes, mark everything it could point to
+ set_escape_state(pt, PointsToNode::GlobalEscape);
+ } else {
+ if (fields_escapes) {
+ // The argument itself doesn't escape, but any fields might
+ add_edge_from_fields(pt, _phantom_object, Type::OffsetBot);
+ }
+ set_escape_state(pt, PointsToNode::ArgEscape);
}
}
}
}
- call_analyzer.copy_dependencies(C()->dependencies());
+ if (copy_dependencies)
+ call_analyzer->copy_dependencies(C()->dependencies());
break;
}
- // fall-through if not a Java method
}
default:
- // Some other type of call, assume the worst case: all arguments
+ // Fall-through here if not a Java method or no analyzer information
+ // or some other type of call, assume the worst case: all arguments
// globally escape.
{
// adjust escape state for outgoing arguments
@@ -988,15 +1487,15 @@
VectorSet ptset(Thread::current()->resource_area());
for (uint i = TypeFunc::Parms; i < d->cnt(); i++) {
const Type* at = d->field_at(i);
-
if (at->isa_oopptr() != NULL) {
- Node *arg = skip_casts(call->in(i));
+ Node *arg = call->in(i)->uncast();
+ set_escape_state(arg->_idx, PointsToNode::GlobalEscape);
ptset.Clear();
PointsTo(ptset, arg, phase);
for( VectorSetI j(&ptset); j.test(); ++j ) {
uint pt = j.elem;
-
set_escape_state(pt, PointsToNode::GlobalEscape);
+ PointsToNode *ptadr = ptnode_adr(pt);
}
}
}
@@ -1004,15 +1503,9 @@
}
}
void ConnectionGraph::process_call_result(ProjNode *resproj, PhaseTransform *phase) {
- CallNode *call = resproj->in(0)->as_Call();
-
PointsToNode *ptadr = ptnode_adr(resproj->_idx);
- ptadr->_node = resproj;
- ptadr->set_node_type(PointsToNode::LocalVar);
- set_escape_state(resproj->_idx, PointsToNode::UnknownEscape);
- _processed.set(resproj->_idx);
-
+ CallNode *call = resproj->in(0)->as_Call();
switch (call->Opcode()) {
case Op_Allocate:
{
@@ -1028,36 +1521,40 @@
ciInstanceKlass* ciik = cik->as_instance_klass();
PointsToNode *ptadr = ptnode_adr(call->_idx);
- ptadr->set_node_type(PointsToNode::JavaObject);
+ PointsToNode::EscapeState es;
+ uint edge_to;
if (cik->is_subclass_of(_compile->env()->Thread_klass()) || ciik->has_finalizer()) {
- set_escape_state(call->_idx, PointsToNode::GlobalEscape);
- add_pointsto_edge(resproj->_idx, _phantom_object);
+ es = PointsToNode::GlobalEscape;
+ edge_to = _phantom_object; // Could not be worse
} else {
- set_escape_state(call->_idx, PointsToNode::NoEscape);
- add_pointsto_edge(resproj->_idx, call->_idx);
+ es = PointsToNode::NoEscape;
+ edge_to = call->_idx;
}
- _processed.set(call->_idx);
+ set_escape_state(call->_idx, es);
+ add_pointsto_edge(resproj->_idx, edge_to);
+ _processed.set(resproj->_idx);
break;
}
case Op_AllocateArray:
{
PointsToNode *ptadr = ptnode_adr(call->_idx);
- ptadr->set_node_type(PointsToNode::JavaObject);
+ int length = call->in(AllocateNode::ALength)->find_int_con(-1);
+ if (length < 0 || length > EliminateAllocationArraySizeLimit) {
+ // Not scalar replaceable if the length is not constant or too big.
+ ptadr->_scalar_replaceable = false;
+ }
set_escape_state(call->_idx, PointsToNode::NoEscape);
- _processed.set(call->_idx);
add_pointsto_edge(resproj->_idx, call->_idx);
+ _processed.set(resproj->_idx);
break;
}
- case Op_Lock:
- case Op_Unlock:
- break;
-
case Op_CallStaticJava:
// For a static call, we know exactly what method is being called.
// Use bytecode estimator to record whether the call's return value escapes
{
+ bool done = true;
const TypeTuple *r = call->tf()->range();
const Type* ret_type = NULL;
@@ -1066,32 +1563,45 @@
// Note: we use isa_ptr() instead of isa_oopptr() here because the
// _multianewarray functions return a TypeRawPtr.
- if (ret_type == NULL || ret_type->isa_ptr() == NULL)
+ if (ret_type == NULL || ret_type->isa_ptr() == NULL) {
+ _processed.set(resproj->_idx);
break; // doesn't return a pointer type
-
+ }
ciMethod *meth = call->as_CallJava()->method();
+ const TypeTuple * d = call->tf()->domain();
if (meth == NULL) {
// not a Java method, assume global escape
set_escape_state(call->_idx, PointsToNode::GlobalEscape);
if (resproj != NULL)
add_pointsto_edge(resproj->_idx, _phantom_object);
} else {
- BCEscapeAnalyzer call_analyzer(meth);
+ BCEscapeAnalyzer *call_analyzer = meth->get_bcea();
VectorSet ptset(Thread::current()->resource_area());
+ bool copy_dependencies = false;
- if (call_analyzer.is_return_local() && resproj != NULL) {
+ if (call_analyzer->is_return_allocated()) {
+ // Returns a newly allocated unescaped object, simply
+ // update dependency information.
+ // Mark it as NoEscape so that objects referenced by
+ // it's fields will be marked as NoEscape at least.
+ set_escape_state(call->_idx, PointsToNode::NoEscape);
+ if (resproj != NULL)
+ add_pointsto_edge(resproj->_idx, call->_idx);
+ copy_dependencies = true;
+ } else if (call_analyzer->is_return_local() && resproj != NULL) {
// determine whether any arguments are returned
- const TypeTuple * d = call->tf()->domain();
set_escape_state(call->_idx, PointsToNode::NoEscape);
for (uint i = TypeFunc::Parms; i < d->cnt(); i++) {
const Type* at = d->field_at(i);
if (at->isa_oopptr() != NULL) {
- Node *arg = skip_casts(call->in(i));
+ Node *arg = call->in(i)->uncast();
- if (call_analyzer.is_arg_returned(i - TypeFunc::Parms)) {
+ if (call_analyzer->is_arg_returned(i - TypeFunc::Parms)) {
PointsToNode *arg_esp = _nodes->adr_at(arg->_idx);
- if (arg_esp->node_type() == PointsToNode::JavaObject)
+ if (arg_esp->node_type() == PointsToNode::UnknownType)
+ done = false;
+ else if (arg_esp->node_type() == PointsToNode::JavaObject)
add_pointsto_edge(resproj->_idx, arg->_idx);
else
add_deferred_edge(resproj->_idx, arg->_idx);
@@ -1099,13 +1609,25 @@
}
}
}
+ copy_dependencies = true;
} else {
set_escape_state(call->_idx, PointsToNode::GlobalEscape);
if (resproj != NULL)
add_pointsto_edge(resproj->_idx, _phantom_object);
+ for (uint i = TypeFunc::Parms; i < d->cnt(); i++) {
+ const Type* at = d->field_at(i);
+ if (at->isa_oopptr() != NULL) {
+ Node *arg = call->in(i)->uncast();
+ PointsToNode *arg_esp = _nodes->adr_at(arg->_idx);
+ arg_esp->_hidden_alias = true;
+ }
+ }
}
- call_analyzer.copy_dependencies(C()->dependencies());
+ if (copy_dependencies)
+ call_analyzer->copy_dependencies(C()->dependencies());
}
+ if (done)
+ _processed.set(resproj->_idx);
break;
}
@@ -1114,7 +1636,6 @@
// returned value, if any, globally escapes.
{
const TypeTuple *r = call->tf()->range();
-
if (r->cnt() > TypeFunc::Parms) {
const Type* ret_type = r->field_at(TypeFunc::Parms);
@@ -1122,142 +1643,385 @@
// _multianewarray functions return a TypeRawPtr.
if (ret_type->isa_ptr() != NULL) {
PointsToNode *ptadr = ptnode_adr(call->_idx);
- ptadr->set_node_type(PointsToNode::JavaObject);
set_escape_state(call->_idx, PointsToNode::GlobalEscape);
if (resproj != NULL)
add_pointsto_edge(resproj->_idx, _phantom_object);
}
}
- }
- }
-}
-
-void ConnectionGraph::record_for_escape_analysis(Node *n) {
- if (_collecting) {
- if (n->is_Phi()) {
- PhiNode *phi = n->as_Phi();
- const Type *pt = phi->type();
- if ((pt->isa_oopptr() != NULL) || pt == TypePtr::NULL_PTR) {
- PointsToNode *ptn = ptnode_adr(phi->_idx);
- ptn->set_node_type(PointsToNode::LocalVar);
- ptn->_node = n;
- _deferred.push(n);
- }
+ _processed.set(resproj->_idx);
}
}
}
-void ConnectionGraph::record_escape_work(Node *n, PhaseTransform *phase) {
+// Populate Connection Graph with Ideal nodes and create simple
+// connection graph edges (do not need to check the node_type of inputs
+// or to call PointsTo() to walk the connection graph).
+void ConnectionGraph::record_for_escape_analysis(Node *n, PhaseTransform *phase) {
+ if (_processed.test(n->_idx))
+ return; // No need to redefine node's state.
+
+ if (n->is_Call()) {
+ // Arguments to allocation and locking don't escape.
+ if (n->is_Allocate()) {
+ add_node(n, PointsToNode::JavaObject, PointsToNode::UnknownEscape, true);
+ record_for_optimizer(n);
+ } else if (n->is_Lock() || n->is_Unlock()) {
+ // Put Lock and Unlock nodes on IGVN worklist to process them during
+ // the first IGVN optimization when escape information is still available.
+ record_for_optimizer(n);
+ _processed.set(n->_idx);
+ } else {
+ // Have to process call's arguments first.
+ PointsToNode::NodeType nt = PointsToNode::UnknownType;
+
+ // Check if a call returns an object.
+ const TypeTuple *r = n->as_Call()->tf()->range();
+ if (r->cnt() > TypeFunc::Parms &&
+ n->as_Call()->proj_out(TypeFunc::Parms) != NULL) {
+ // Note: use isa_ptr() instead of isa_oopptr() here because
+ // the _multianewarray functions return a TypeRawPtr.
+ if (r->field_at(TypeFunc::Parms)->isa_ptr() != NULL) {
+ nt = PointsToNode::JavaObject;
+ }
+ }
+ add_node(n, nt, PointsToNode::UnknownEscape, false);
+ }
+ return;
+ }
+
+ // Using isa_ptr() instead of isa_oopptr() for LoadP and Phi because
+ // ThreadLocal has RawPrt type.
+ switch (n->Opcode()) {
+ case Op_AddP:
+ {
+ add_node(n, PointsToNode::Field, PointsToNode::UnknownEscape, false);
+ break;
+ }
+ case Op_CastX2P:
+ { // "Unsafe" memory access.
+ add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true);
+ break;
+ }
+ case Op_CastPP:
+ case Op_CheckCastPP:
+ {
+ add_node(n, PointsToNode::LocalVar, PointsToNode::UnknownEscape, false);
+ int ti = n->in(1)->_idx;
+ PointsToNode::NodeType nt = _nodes->adr_at(ti)->node_type();
+ if (nt == PointsToNode::UnknownType) {
+ _delayed_worklist.push(n); // Process it later.
+ break;
+ } else if (nt == PointsToNode::JavaObject) {
+ add_pointsto_edge(n->_idx, ti);
+ } else {
+ add_deferred_edge(n->_idx, ti);
+ }
+ _processed.set(n->_idx);
+ break;
+ }
+ case Op_ConP:
+ {
+ // assume all pointer constants globally escape except for null
+ PointsToNode::EscapeState es;
+ if (phase->type(n) == TypePtr::NULL_PTR)
+ es = PointsToNode::NoEscape;
+ else
+ es = PointsToNode::GlobalEscape;
- int opc = n->Opcode();
+ add_node(n, PointsToNode::JavaObject, es, true);
+ break;
+ }
+ case Op_CreateEx:
+ {
+ // assume that all exception objects globally escape
+ add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true);
+ break;
+ }
+ case Op_LoadKlass:
+ {
+ add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true);
+ break;
+ }
+ case Op_LoadP:
+ {
+ const Type *t = phase->type(n);
+ if (t->isa_ptr() == NULL) {
+ _processed.set(n->_idx);
+ return;
+ }
+ add_node(n, PointsToNode::LocalVar, PointsToNode::UnknownEscape, false);
+ break;
+ }
+ case Op_Parm:
+ {
+ _processed.set(n->_idx); // No need to redefine it state.
+ uint con = n->as_Proj()->_con;
+ if (con < TypeFunc::Parms)
+ return;
+ const Type *t = n->in(0)->as_Start()->_domain->field_at(con);
+ if (t->isa_ptr() == NULL)
+ return;
+ // We have to assume all input parameters globally escape
+ // (Note: passing 'false' since _processed is already set).
+ add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, false);
+ break;
+ }
+ case Op_Phi:
+ {
+ if (n->as_Phi()->type()->isa_ptr() == NULL) {
+ // nothing to do if not an oop
+ _processed.set(n->_idx);
+ return;
+ }
+ add_node(n, PointsToNode::LocalVar, PointsToNode::UnknownEscape, false);
+ uint i;
+ for (i = 1; i < n->req() ; i++) {
+ Node* in = n->in(i);
+ if (in == NULL)
+ continue; // ignore NULL
+ in = in->uncast();
+ if (in->is_top() || in == n)
+ continue; // ignore top or inputs which go back this node
+ int ti = in->_idx;
+ PointsToNode::NodeType nt = _nodes->adr_at(ti)->node_type();
+ if (nt == PointsToNode::UnknownType) {
+ break;
+ } else if (nt == PointsToNode::JavaObject) {
+ add_pointsto_edge(n->_idx, ti);
+ } else {
+ add_deferred_edge(n->_idx, ti);
+ }
+ }
+ if (i >= n->req())
+ _processed.set(n->_idx);
+ else
+ _delayed_worklist.push(n);
+ break;
+ }
+ case Op_Proj:
+ {
+ // we are only interested in the result projection from a call
+ if (n->as_Proj()->_con == TypeFunc::Parms && n->in(0)->is_Call() ) {
+ add_node(n, PointsToNode::LocalVar, PointsToNode::UnknownEscape, false);
+ process_call_result(n->as_Proj(), phase);
+ if (!_processed.test(n->_idx)) {
+ // The call's result may need to be processed later if the call
+ // returns it's argument and the argument is not processed yet.
+ _delayed_worklist.push(n);
+ }
+ } else {
+ _processed.set(n->_idx);
+ }
+ break;
+ }
+ case Op_Return:
+ {
+ if( n->req() > TypeFunc::Parms &&
+ phase->type(n->in(TypeFunc::Parms))->isa_oopptr() ) {
+ // Treat Return value as LocalVar with GlobalEscape escape state.
+ add_node(n, PointsToNode::LocalVar, PointsToNode::GlobalEscape, false);
+ int ti = n->in(TypeFunc::Parms)->_idx;
+ PointsToNode::NodeType nt = _nodes->adr_at(ti)->node_type();
+ if (nt == PointsToNode::UnknownType) {
+ _delayed_worklist.push(n); // Process it later.
+ break;
+ } else if (nt == PointsToNode::JavaObject) {
+ add_pointsto_edge(n->_idx, ti);
+ } else {
+ add_deferred_edge(n->_idx, ti);
+ }
+ }
+ _processed.set(n->_idx);
+ break;
+ }
+ case Op_StoreP:
+ {
+ const Type *adr_type = phase->type(n->in(MemNode::Address));
+ if (adr_type->isa_oopptr()) {
+ add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false);
+ } else {
+ Node* adr = n->in(MemNode::Address);
+ if (adr->is_AddP() && phase->type(adr) == TypeRawPtr::NOTNULL &&
+ adr->in(AddPNode::Address)->is_Proj() &&
+ adr->in(AddPNode::Address)->in(0)->is_Allocate()) {
+ add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false);
+ // We are computing a raw address for a store captured
+ // by an Initialize compute an appropriate address type.
+ int offs = (int)phase->find_intptr_t_con(adr->in(AddPNode::Offset), Type::OffsetBot);
+ assert(offs != Type::OffsetBot, "offset must be a constant");
+ } else {
+ _processed.set(n->_idx);
+ return;
+ }
+ }
+ break;
+ }
+ case Op_StorePConditional:
+ case Op_CompareAndSwapP:
+ {
+ const Type *adr_type = phase->type(n->in(MemNode::Address));
+ if (adr_type->isa_oopptr()) {
+ add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false);
+ } else {
+ _processed.set(n->_idx);
+ return;
+ }
+ break;
+ }
+ case Op_ThreadLocal:
+ {
+ add_node(n, PointsToNode::JavaObject, PointsToNode::ArgEscape, true);
+ break;
+ }
+ default:
+ ;
+ // nothing to do
+ }
+ return;
+}
+
+void ConnectionGraph::build_connection_graph(Node *n, PhaseTransform *phase) {
+ // Don't set processed bit for AddP, LoadP, StoreP since
+ // they may need more then one pass to process.
+ if (_processed.test(n->_idx))
+ return; // No need to redefine node's state.
+
PointsToNode *ptadr = ptnode_adr(n->_idx);
- if (_processed.test(n->_idx))
- return;
-
- ptadr->_node = n;
if (n->is_Call()) {
CallNode *call = n->as_Call();
process_call_arguments(call, phase);
+ _processed.set(n->_idx);
return;
}
- switch (opc) {
+ switch (n->Opcode()) {
case Op_AddP:
{
- Node *base = skip_casts(n->in(AddPNode::Base));
- ptadr->set_node_type(PointsToNode::Field);
-
- // create a field edge to this node from everything adr could point to
+ Node *base = get_addp_base(n);
+ // Create a field edge to this node from everything base could point to.
VectorSet ptset(Thread::current()->resource_area());
PointsTo(ptset, base, phase);
for( VectorSetI i(&ptset); i.test(); ++i ) {
uint pt = i.elem;
- add_field_edge(pt, n->_idx, type_to_offset(phase->type(n)));
+ add_field_edge(pt, n->_idx, address_offset(n, phase));
+ }
+ break;
+ }
+ case Op_CastX2P:
+ {
+ assert(false, "Op_CastX2P");
+ break;
+ }
+ case Op_CastPP:
+ case Op_CheckCastPP:
+ {
+ int ti = n->in(1)->_idx;
+ if (_nodes->adr_at(ti)->node_type() == PointsToNode::JavaObject) {
+ add_pointsto_edge(n->_idx, ti);
+ } else {
+ add_deferred_edge(n->_idx, ti);
+ }
+ _processed.set(n->_idx);
+ break;
+ }
+ case Op_ConP:
+ {
+ assert(false, "Op_ConP");
+ break;
+ }
+ case Op_CreateEx:
+ {
+ assert(false, "Op_CreateEx");
+ break;
+ }
+ case Op_LoadKlass:
+ {
+ assert(false, "Op_LoadKlass");
+ break;
+ }
+ case Op_LoadP:
+ {
+ const Type *t = phase->type(n);
+#ifdef ASSERT
+ if (t->isa_ptr() == NULL)
+ assert(false, "Op_LoadP");
+#endif
+
+ Node* adr = n->in(MemNode::Address)->uncast();
+ const Type *adr_type = phase->type(adr);
+ Node* adr_base;
+ if (adr->is_AddP()) {
+ adr_base = get_addp_base(adr);
+ } else {
+ adr_base = adr;
+ }
+
+ // For everything "adr_base" could point to, create a deferred edge from
+ // this node to each field with the same offset.
+ VectorSet ptset(Thread::current()->resource_area());
+ PointsTo(ptset, adr_base, phase);
+ int offset = address_offset(adr, phase);
+ for( VectorSetI i(&ptset); i.test(); ++i ) {
+ uint pt = i.elem;
+ add_deferred_edge_to_fields(n->_idx, pt, offset);
}
break;
}
case Op_Parm:
{
- ProjNode *nproj = n->as_Proj();
- uint con = nproj->_con;
- if (con < TypeFunc::Parms)
- return;
- const Type *t = nproj->in(0)->as_Start()->_domain->field_at(con);
- if (t->isa_ptr() == NULL)
- return;
- ptadr->set_node_type(PointsToNode::JavaObject);
- if (t->isa_oopptr() != NULL) {
- set_escape_state(n->_idx, PointsToNode::ArgEscape);
- } else {
- // this must be the incoming state of an OSR compile, we have to assume anything
- // passed in globally escapes
- assert(_compile->is_osr_compilation(), "bad argument type for non-osr compilation");
- set_escape_state(n->_idx, PointsToNode::GlobalEscape);
- }
- _processed.set(n->_idx);
+ assert(false, "Op_Parm");
break;
}
case Op_Phi:
{
- PhiNode *phi = n->as_Phi();
- if (phi->type()->isa_oopptr() == NULL)
- return; // nothing to do if not an oop
- ptadr->set_node_type(PointsToNode::LocalVar);
- process_phi_escape(phi, phase);
- break;
- }
- case Op_CreateEx:
- {
- // assume that all exception objects globally escape
- ptadr->set_node_type(PointsToNode::JavaObject);
- set_escape_state(n->_idx, PointsToNode::GlobalEscape);
- _processed.set(n->_idx);
- break;
- }
- case Op_ConP:
- {
- const Type *t = phase->type(n);
- ptadr->set_node_type(PointsToNode::JavaObject);
- // assume all pointer constants globally escape except for null
- if (t == TypePtr::NULL_PTR)
- set_escape_state(n->_idx, PointsToNode::NoEscape);
- else
- set_escape_state(n->_idx, PointsToNode::GlobalEscape);
+#ifdef ASSERT
+ if (n->as_Phi()->type()->isa_ptr() == NULL)
+ assert(false, "Op_Phi");
+#endif
+ for (uint i = 1; i < n->req() ; i++) {
+ Node* in = n->in(i);
+ if (in == NULL)
+ continue; // ignore NULL
+ in = in->uncast();
+ if (in->is_top() || in == n)
+ continue; // ignore top or inputs which go back this node
+ int ti = in->_idx;
+ if (_nodes->adr_at(in->_idx)->node_type() == PointsToNode::JavaObject) {
+ add_pointsto_edge(n->_idx, ti);
+ } else {
+ add_deferred_edge(n->_idx, ti);
+ }
+ }
_processed.set(n->_idx);
break;
}
- case Op_LoadKlass:
+ case Op_Proj:
{
- ptadr->set_node_type(PointsToNode::JavaObject);
- set_escape_state(n->_idx, PointsToNode::GlobalEscape);
- _processed.set(n->_idx);
+ // we are only interested in the result projection from a call
+ if (n->as_Proj()->_con == TypeFunc::Parms && n->in(0)->is_Call() ) {
+ process_call_result(n->as_Proj(), phase);
+ assert(_processed.test(n->_idx), "all call results should be processed");
+ } else {
+ assert(false, "Op_Proj");
+ }
break;
}
- case Op_LoadP:
+ case Op_Return:
{
- const Type *t = phase->type(n);
- if (!t->isa_oopptr())
- return;
- ptadr->set_node_type(PointsToNode::LocalVar);
- set_escape_state(n->_idx, PointsToNode::UnknownEscape);
-
- Node *adr = skip_casts(n->in(MemNode::Address));
- const Type *adr_type = phase->type(adr);
- Node *adr_base = skip_casts((adr->Opcode() == Op_AddP) ? adr->in(AddPNode::Base) : adr);
-
- // For everything "adr" could point to, create a deferred edge from
- // this node to each field with the same offset as "adr_type"
- VectorSet ptset(Thread::current()->resource_area());
- PointsTo(ptset, adr_base, phase);
- // If ptset is empty, then this value must have been set outside
- // this method, so we add the phantom node
- if (ptset.Size() == 0)
- ptset.set(_phantom_object);
- for( VectorSetI i(&ptset); i.test(); ++i ) {
- uint pt = i.elem;
- add_deferred_edge_to_fields(n->_idx, pt, type_to_offset(adr_type));
+#ifdef ASSERT
+ if( n->req() <= TypeFunc::Parms ||
+ !phase->type(n->in(TypeFunc::Parms))->isa_oopptr() ) {
+ assert(false, "Op_Return");
}
+#endif
+ int ti = n->in(TypeFunc::Parms)->_idx;
+ if (_nodes->adr_at(ti)->node_type() == PointsToNode::JavaObject) {
+ add_pointsto_edge(n->_idx, ti);
+ } else {
+ add_deferred_edge(n->_idx, ti);
+ }
+ _processed.set(n->_idx);
break;
}
case Op_StoreP:
@@ -1265,45 +2029,28 @@
case Op_CompareAndSwapP:
{
Node *adr = n->in(MemNode::Address);
- Node *val = skip_casts(n->in(MemNode::ValueIn));
const Type *adr_type = phase->type(adr);
+#ifdef ASSERT
if (!adr_type->isa_oopptr())
- return;
+ assert(phase->type(adr) == TypeRawPtr::NOTNULL, "Op_StoreP");
+#endif
- assert(adr->Opcode() == Op_AddP, "expecting an AddP");
- Node *adr_base = adr->in(AddPNode::Base);
-
- // For everything "adr_base" could point to, create a deferred edge to "val" from each field
- // with the same offset as "adr_type"
+ assert(adr->is_AddP(), "expecting an AddP");
+ Node *adr_base = get_addp_base(adr);
+ Node *val = n->in(MemNode::ValueIn)->uncast();
+ // For everything "adr_base" could point to, create a deferred edge
+ // to "val" from each field with the same offset.
VectorSet ptset(Thread::current()->resource_area());
PointsTo(ptset, adr_base, phase);
for( VectorSetI i(&ptset); i.test(); ++i ) {
uint pt = i.elem;
- add_edge_from_fields(pt, val->_idx, type_to_offset(adr_type));
+ add_edge_from_fields(pt, val->_idx, address_offset(adr, phase));
}
break;
}
- case Op_Proj:
+ case Op_ThreadLocal:
{
- ProjNode *nproj = n->as_Proj();
- Node *n0 = nproj->in(0);
- // we are only interested in the result projection from a call
- if (nproj->_con == TypeFunc::Parms && n0->is_Call() ) {
- process_call_result(nproj, phase);
- }
-
- break;
- }
- case Op_CastPP:
- case Op_CheckCastPP:
- {
- ptadr->set_node_type(PointsToNode::LocalVar);
- int ti = n->in(1)->_idx;
- if (_nodes->at(ti).node_type() == PointsToNode::JavaObject) {
- add_pointsto_edge(n->_idx, ti);
- } else {
- add_deferred_edge(n->_idx, ti);
- }
+ assert(false, "Op_ThreadLocal");
break;
}
default:
@@ -1312,34 +2059,48 @@
}
}
-void ConnectionGraph::record_escape(Node *n, PhaseTransform *phase) {
- if (_collecting)
- record_escape_work(n, phase);
-}
-
#ifndef PRODUCT
void ConnectionGraph::dump() {
PhaseGVN *igvn = _compile->initial_gvn();
bool first = true;
- for (uint ni = 0; ni < (uint)_nodes->length(); ni++) {
- PointsToNode *esp = _nodes->adr_at(ni);
- if (esp->node_type() == PointsToNode::UnknownType || esp->_node == NULL)
+ uint size = (uint)_nodes->length();
+ for (uint ni = 0; ni < size; ni++) {
+ PointsToNode *ptn = _nodes->adr_at(ni);
+ PointsToNode::NodeType ptn_type = ptn->node_type();
+
+ if (ptn_type != PointsToNode::JavaObject || ptn->_node == NULL)
continue;
- PointsToNode::EscapeState es = escape_state(esp->_node, igvn);
- if (es == PointsToNode::NoEscape || (Verbose &&
- (es != PointsToNode::UnknownEscape || esp->edge_count() != 0))) {
- // don't print null pointer node which almost every method has
- if (esp->_node->Opcode() != Op_ConP || igvn->type(esp->_node) != TypePtr::NULL_PTR) {
- if (first) {
- tty->print("======== Connection graph for ");
- C()->method()->print_short_name();
- tty->cr();
- first = false;
+ PointsToNode::EscapeState es = escape_state(ptn->_node, igvn);
+ if (ptn->_node->is_Allocate() && (es == PointsToNode::NoEscape || Verbose)) {
+ if (first) {
+ tty->cr();
+ tty->print("======== Connection graph for ");
+ C()->method()->print_short_name();
+ tty->cr();
+ first = false;
+ }
+ tty->print("%6d ", ni);
+ ptn->dump();
+ // Print all locals which reference this allocation
+ for (uint li = ni; li < size; li++) {
+ PointsToNode *ptn_loc = _nodes->adr_at(li);
+ PointsToNode::NodeType ptn_loc_type = ptn_loc->node_type();
+ if ( ptn_loc_type == PointsToNode::LocalVar && ptn_loc->_node != NULL &&
+ ptn_loc->edge_count() == 1 && ptn_loc->edge_target(0) == ni ) {
+ tty->print("%6d LocalVar [[%d]]", li, ni);
+ _nodes->adr_at(li)->_node->dump();
}
- tty->print("%4d ", ni);
- esp->dump();
}
+ if (Verbose) {
+ // Print all fields which reference this allocation
+ for (uint i = 0; i < ptn->edge_count(); i++) {
+ uint ei = ptn->edge_target(i);
+ tty->print("%6d Field [[%d]]", ei, ni);
+ _nodes->adr_at(ei)->_node->dump();
+ }
+ }
+ tty->cr();
}
}
}
--- a/hotspot/src/share/vm/opto/escape.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/escape.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -25,14 +25,15 @@
//
// Adaptation for C2 of the escape analysis algorithm described in:
//
-// [Choi99] Jong-Deok Shoi, Manish Gupta, Mauricio Seffano, Vugranam C. Sreedhar,
-// Sam Midkiff, "Escape Analysis for Java", Procedings of ACM SIGPLAN
-// OOPSLA Conference, November 1, 1999
+// [Choi99] Jong-Deok Shoi, Manish Gupta, Mauricio Seffano,
+// Vugranam C. Sreedhar, Sam Midkiff,
+// "Escape Analysis for Java", Procedings of ACM SIGPLAN
+// OOPSLA Conference, November 1, 1999
//
// The flow-insensitive analysis described in the paper has been implemented.
//
-// The analysis requires construction of a "connection graph" (CG) for the method being
-// analyzed. The nodes of the connection graph are:
+// The analysis requires construction of a "connection graph" (CG) for
+// the method being analyzed. The nodes of the connection graph are:
//
// - Java objects (JO)
// - Local variables (LV)
@@ -40,47 +41,51 @@
//
// The CG contains 3 types of edges:
//
-// - PointsTo (-P>) {LV,OF} to JO
-// - Deferred (-D>) from {LV, OF} to {LV, OF}
+// - PointsTo (-P>) {LV, OF} to JO
+// - Deferred (-D>) from {LV, OF} to {LV, OF}
// - Field (-F>) from JO to OF
//
// The following utility functions is used by the algorithm:
//
-// PointsTo(n) - n is any CG node, it returns the set of JO that n could
-// point to.
+// PointsTo(n) - n is any CG node, it returns the set of JO that n could
+// point to.
//
-// The algorithm describes how to construct the connection graph in the following 4 cases:
+// The algorithm describes how to construct the connection graph
+// in the following 4 cases:
//
// Case Edges Created
//
-// (1) p = new T() LV -P> JO
-// (2) p = q LV -D> LV
-// (3) p.f = q JO -F> OF, OF -D> LV
-// (4) p = q.f JO -F> OF, LV -D> OF
+// (1) p = new T() LV -P> JO
+// (2) p = q LV -D> LV
+// (3) p.f = q JO -F> OF, OF -D> LV
+// (4) p = q.f JO -F> OF, LV -D> OF
//
-// In all these cases, p and q are local variables. For static field references, we can
-// construct a local variable containing a reference to the static memory.
+// In all these cases, p and q are local variables. For static field
+// references, we can construct a local variable containing a reference
+// to the static memory.
//
// C2 does not have local variables. However for the purposes of constructing
// the connection graph, the following IR nodes are treated as local variables:
// Phi (pointer values)
// LoadP
-// Proj (value returned from callnodes including allocations)
-// CheckCastPP
+// Proj#5 (value returned from callnodes including allocations)
+// CheckCastPP, CastPP
//
-// The LoadP, Proj and CheckCastPP behave like variables assigned to only once. Only
-// a Phi can have multiple assignments. Each input to a Phi is treated
+// The LoadP, Proj and CheckCastPP behave like variables assigned to only once.
+// Only a Phi can have multiple assignments. Each input to a Phi is treated
// as an assignment to it.
//
-// The following note types are JavaObject:
+// The following node types are JavaObject:
//
// top()
// Allocate
// AllocateArray
// Parm (for incoming arguments)
+// CastX2P ("unsafe" operations)
// CreateEx
// ConP
// LoadKlass
+// ThreadLocal
//
// AddP nodes are fields.
//
@@ -89,7 +94,7 @@
// source. This results in a graph with no deferred edges, only:
//
// LV -P> JO
-// OF -P> JO
+// OF -P> JO (the object whose oop is stored in the field)
// JO -F> OF
//
// Then, for each node which is GlobalEscape, anything it could point to
@@ -110,17 +115,18 @@
friend class ConnectionGraph;
public:
typedef enum {
- UnknownType = 0,
- JavaObject = 1,
- LocalVar = 2,
- Field = 3
+ UnknownType = 0,
+ JavaObject = 1,
+ LocalVar = 2,
+ Field = 3
} NodeType;
typedef enum {
UnknownEscape = 0,
- NoEscape = 1,
- ArgEscape = 2,
- GlobalEscape = 3
+ NoEscape = 1, // A scalar replaceable object with unique type.
+ ArgEscape = 2, // An object passed as argument or referenced by
+ // argument (and not globally escape during call).
+ GlobalEscape = 3 // An object escapes the method and thread.
} EscapeState;
typedef enum {
@@ -140,18 +146,24 @@
NodeType _type;
EscapeState _escape;
- GrowableArray<uint>* _edges; // outgoing edges
- int _offset; // for fields
+ GrowableArray<uint>* _edges; // outgoing edges
- bool _unique_type; // For allocated objects, this node may be a unique type
public:
- Node* _node; // Ideal node corresponding to this PointsTo node
- int _inputs_processed; // the number of Phi inputs that have been processed so far
- bool _hidden_alias; // this node is an argument to a function which may return it
- // creating a hidden alias
+ Node* _node; // Ideal node corresponding to this PointsTo node.
+ int _offset; // Object fields offsets.
+ bool _scalar_replaceable;// Not escaped object could be replaced with scalar
+ bool _hidden_alias; // This node is an argument to a function.
+ // which may return it creating a hidden alias.
+ PointsToNode():
+ _type(UnknownType),
+ _escape(UnknownEscape),
+ _edges(NULL),
+ _node(NULL),
+ _offset(-1),
+ _scalar_replaceable(true),
+ _hidden_alias(false) {}
- PointsToNode(): _offset(-1), _type(UnknownType), _escape(UnknownEscape), _edges(NULL), _node(NULL), _inputs_processed(0), _hidden_alias(false), _unique_type(true) {}
EscapeState escape_state() const { return _escape; }
NodeType node_type() const { return _type;}
@@ -182,22 +194,28 @@
class ConnectionGraph: public ResourceObj {
private:
- enum {
- INITIAL_NODE_COUNT = 100 // initial size of _nodes array
- };
+ GrowableArray<PointsToNode>* _nodes; // Connection graph nodes indexed
+ // by ideal node index.
+ Unique_Node_List _delayed_worklist; // Nodes to be processed before
+ // the call build_connection_graph().
+
+ VectorSet _processed; // Records which nodes have been
+ // processed.
- GrowableArray<PointsToNode>* _nodes; // connection graph nodes Indexed by ideal
- // node index
- Unique_Node_List _deferred; // Phi's to be processed after parsing
- VectorSet _processed; // records which nodes have been processed
- bool _collecting; // indicates whether escape information is
- // still being collected. If false, no new
- // nodes will be processed
- uint _phantom_object; // index of globally escaping object that
- // pointer values loaded from a field which
- // has not been set are assumed to point to
- Compile * _compile; // Compile object for current compilation
+ bool _collecting; // Indicates whether escape information
+ // is still being collected. If false,
+ // no new nodes will be processed.
+
+ bool _has_allocations; // Indicates whether method has any
+ // non-escaping allocations.
+
+ uint _phantom_object; // Index of globally escaping object
+ // that pointer values loaded from
+ // a field which has not been set
+ // are assumed to point to.
+
+ Compile * _compile; // Compile object for current compilation
// address of an element in _nodes. Used when the element is to be modified
PointsToNode *ptnode_adr(uint idx) {
@@ -208,8 +226,11 @@
return _nodes->adr_at(idx);
}
+ // Add node to ConnectionGraph.
+ void add_node(Node *n, PointsToNode::NodeType nt, PointsToNode::EscapeState es, bool done);
+
// offset of a field reference
- int type_to_offset(const Type *t);
+ int address_offset(Node* adr, PhaseTransform *phase);
// compute the escape state for arguments to a call
void process_call_arguments(CallNode *call, PhaseTransform *phase);
@@ -217,12 +238,11 @@
// compute the escape state for the return value of a call
void process_call_result(ProjNode *resproj, PhaseTransform *phase);
- // compute the escape state of a Phi. This may be called multiple
- // times as new inputs are added to the Phi.
- void process_phi_escape(PhiNode *phi, PhaseTransform *phase);
+ // Populate Connection Graph with Ideal nodes.
+ void record_for_escape_analysis(Node *n, PhaseTransform *phase);
- // compute the escape state of an ideal node.
- void record_escape_work(Node *n, PhaseTransform *phase);
+ // Build Connection Graph and set nodes escape state.
+ void build_connection_graph(Node *n, PhaseTransform *phase);
// walk the connection graph starting at the node corresponding to "n" and
// add the index of everything it could point to, to "ptset". This may cause
@@ -241,8 +261,8 @@
// a pointsto edge is added if it is a JavaObject
void add_edge_from_fields(uint adr, uint to_i, int offs);
- // Add a deferred edge from node given by "from_i" to any field of adr_i whose offset
- // matches "offset"
+ // Add a deferred edge from node given by "from_i" to any field
+ // of adr_i whose offset matches "offset"
void add_deferred_edge_to_fields(uint from_i, uint adr, int offs);
@@ -262,6 +282,8 @@
PhiNode *create_split_phi(PhiNode *orig_phi, int alias_idx, GrowableArray<PhiNode *> &orig_phi_worklist, PhaseGVN *igvn, bool &new_created);
PhiNode *split_memory_phi(PhiNode *orig_phi, int alias_idx, GrowableArray<PhiNode *> &orig_phi_worklist, PhaseGVN *igvn);
Node *find_mem(Node *mem, int alias_idx, PhaseGVN *igvn);
+ Node *find_inst_mem(Node *mem, int alias_idx,GrowableArray<PhiNode *> &orig_phi_worklist, PhaseGVN *igvn);
+
// Propagate unique types created for unescaped allocated objects
// through the graph
void split_unique_types(GrowableArray<Node *> &alloc_worklist);
@@ -285,26 +307,24 @@
// Set the escape state of a node
void set_escape_state(uint ni, PointsToNode::EscapeState es);
- // bypass any casts and return the node they refer to
- Node * skip_casts(Node *n);
-
// Get Compile object for current compilation.
Compile *C() const { return _compile; }
public:
ConnectionGraph(Compile *C);
- // record a Phi for later processing.
- void record_for_escape_analysis(Node *n);
-
- // process a node and fill in its connection graph node
- void record_escape(Node *n, PhaseTransform *phase);
-
- // All nodes have been recorded, compute the escape information
+ // Compute the escape information
void compute_escape();
// escape state of a node
PointsToNode::EscapeState escape_state(Node *n, PhaseTransform *phase);
+ // other information we have collected
+ bool is_scalar_replaceable(Node *n) {
+ if (_collecting)
+ return false;
+ PointsToNode ptn = _nodes->at_grow(n->_idx);
+ return ptn.escape_state() == PointsToNode::NoEscape && ptn._scalar_replaceable;
+ }
bool hidden_alias(Node *n) {
if (_collecting)
--- a/hotspot/src/share/vm/opto/gcm.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/gcm.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -448,9 +448,9 @@
ResourceArea *area = Thread::current()->resource_area();
Node_List worklist_mem(area); // prior memory state to store
Node_List worklist_store(area); // possible-def to explore
+ Node_List worklist_visited(area); // visited mergemem nodes
Node_List non_early_stores(area); // all relevant stores outside of early
bool must_raise_LCA = false;
- DEBUG_ONLY(VectorSet should_not_repeat(area));
#ifdef TRACK_PHI_INPUTS
// %%% This extra checking fails because MergeMem nodes are not GVNed.
@@ -479,8 +479,8 @@
Node* initial_mem = load->in(MemNode::Memory);
worklist_store.push(initial_mem);
+ worklist_visited.push(initial_mem);
worklist_mem.push(NULL);
- DEBUG_ONLY(should_not_repeat.test_set(initial_mem->_idx));
while (worklist_store.size() > 0) {
// Examine a nearby store to see if it might interfere with our load.
Node* mem = worklist_mem.pop();
@@ -494,18 +494,20 @@
|| op == Op_MergeMem // internal node of tree we are searching
) {
mem = store; // It's not a possibly interfering store.
+ if (store == initial_mem)
+ initial_mem = NULL; // only process initial memory once
+
for (DUIterator_Fast imax, i = mem->fast_outs(imax); i < imax; i++) {
store = mem->fast_out(i);
if (store->is_MergeMem()) {
// Be sure we don't get into combinatorial problems.
// (Allow phis to be repeated; they can merge two relevant states.)
- uint i = worklist_store.size();
- for (; i > 0; i--) {
- if (worklist_store.at(i-1) == store) break;
+ uint j = worklist_visited.size();
+ for (; j > 0; j--) {
+ if (worklist_visited.at(j-1) == store) break;
}
- if (i > 0) continue; // already on work list; do not repeat
- DEBUG_ONLY(int repeated = should_not_repeat.test_set(store->_idx));
- assert(!repeated, "do not walk merges twice");
+ if (j > 0) continue; // already on work list; do not repeat
+ worklist_visited.push(store);
}
worklist_mem.push(mem);
worklist_store.push(store);
--- a/hotspot/src/share/vm/opto/graphKit.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/graphKit.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -857,6 +857,13 @@
for (j = 0; j < l; j++)
call->set_req(p++, in_map->in(k+j));
+ // Copy any scalar object fields.
+ k = in_jvms->scloff();
+ l = in_jvms->scl_size();
+ out_jvms->set_scloff(p);
+ for (j = 0; j < l; j++)
+ call->set_req(p++, in_map->in(k+j));
+
// Finish the new jvms.
out_jvms->set_endoff(p);
@@ -864,6 +871,7 @@
assert(out_jvms->depth() == in_jvms->depth(), "depth must match");
assert(out_jvms->loc_size() == in_jvms->loc_size(), "size must match");
assert(out_jvms->mon_size() == in_jvms->mon_size(), "size must match");
+ assert(out_jvms->scl_size() == in_jvms->scl_size(), "size must match");
assert(out_jvms->debug_size() == in_jvms->debug_size(), "size must match");
// Update the two tail pointers in parallel.
@@ -1447,7 +1455,7 @@
//-------------------------array_element_address-------------------------
Node* GraphKit::array_element_address(Node* ary, Node* idx, BasicType elembt,
const TypeInt* sizetype) {
- uint shift = exact_log2(type2aelembytes[elembt]);
+ uint shift = exact_log2(type2aelembytes(elembt));
uint header = arrayOopDesc::base_offset_in_bytes(elembt);
// short-circuit a common case (saves lots of confusing waste motion)
@@ -2808,7 +2816,7 @@
ciInstanceKlass* ik = oop_type->klass()->as_instance_klass();
for (int i = 0, len = ik->nof_nonstatic_fields(); i < len; i++) {
ciField* field = ik->nonstatic_field_at(i);
- if (field->offset() >= TrackedInitializationLimit)
+ if (field->offset() >= TrackedInitializationLimit * HeapWordSize)
continue; // do not bother to track really large numbers of fields
// Find (or create) the alias category for this field:
int fieldidx = C->alias_type(field)->index();
@@ -2914,10 +2922,22 @@
const TypeOopPtr* oop_type = tklass->as_instance_type();
// Now generate allocation code
+
+ // With escape analysis, the entire memory state is needed to be able to
+ // eliminate the allocation. If the allocations cannot be eliminated, this
+ // will be optimized to the raw slice when the allocation is expanded.
+ Node *mem;
+ if (C->do_escape_analysis()) {
+ mem = reset_memory();
+ set_all_memory(mem);
+ } else {
+ mem = memory(Compile::AliasIdxRaw);
+ }
+
AllocateNode* alloc
= new (C, AllocateNode::ParmLimit)
AllocateNode(C, AllocateNode::alloc_type(),
- control(), memory(Compile::AliasIdxRaw), i_o(),
+ control(), mem, i_o(),
size, klass_node,
initial_slow_test);
@@ -3048,11 +3068,23 @@
}
// Now generate allocation code
+
+ // With escape analysis, the entire memory state is needed to be able to
+ // eliminate the allocation. If the allocations cannot be eliminated, this
+ // will be optimized to the raw slice when the allocation is expanded.
+ Node *mem;
+ if (C->do_escape_analysis()) {
+ mem = reset_memory();
+ set_all_memory(mem);
+ } else {
+ mem = memory(Compile::AliasIdxRaw);
+ }
+
// Create the AllocateArrayNode and its result projections
AllocateArrayNode* alloc
= new (C, AllocateArrayNode::ParmLimit)
AllocateArrayNode(C, AllocateArrayNode::alloc_type(),
- control(), memory(Compile::AliasIdxRaw), i_o(),
+ control(), mem, i_o(),
size, klass_node,
initial_slow_test,
length);
--- a/hotspot/src/share/vm/opto/ifnode.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/ifnode.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -543,6 +543,159 @@
return NULL; // Dead loop? Or hit root?
}
+
+//------------------------------filtered_int_type--------------------------------
+// Return a possibly more restrictive type for val based on condition control flow for an if
+const TypeInt* IfNode::filtered_int_type(PhaseGVN* gvn, Node *val, Node* if_proj) {
+ assert(if_proj &&
+ (if_proj->Opcode() == Op_IfTrue || if_proj->Opcode() == Op_IfFalse), "expecting an if projection");
+ if (if_proj->in(0) && if_proj->in(0)->is_If()) {
+ IfNode* iff = if_proj->in(0)->as_If();
+ if (iff->in(1) && iff->in(1)->is_Bool()) {
+ BoolNode* bol = iff->in(1)->as_Bool();
+ if (bol->in(1) && bol->in(1)->is_Cmp()) {
+ const CmpNode* cmp = bol->in(1)->as_Cmp();
+ if (cmp->in(1) == val) {
+ const TypeInt* cmp2_t = gvn->type(cmp->in(2))->isa_int();
+ if (cmp2_t != NULL) {
+ jint lo = cmp2_t->_lo;
+ jint hi = cmp2_t->_hi;
+ BoolTest::mask msk = if_proj->Opcode() == Op_IfTrue ? bol->_test._test : bol->_test.negate();
+ switch (msk) {
+ case BoolTest::ne:
+ // Can't refine type
+ return NULL;
+ case BoolTest::eq:
+ return cmp2_t;
+ case BoolTest::lt:
+ lo = TypeInt::INT->_lo;
+ if (hi - 1 < hi) {
+ hi = hi - 1;
+ }
+ break;
+ case BoolTest::le:
+ lo = TypeInt::INT->_lo;
+ break;
+ case BoolTest::gt:
+ if (lo + 1 > lo) {
+ lo = lo + 1;
+ }
+ hi = TypeInt::INT->_hi;
+ break;
+ case BoolTest::ge:
+ // lo unchanged
+ hi = TypeInt::INT->_hi;
+ break;
+ }
+ const TypeInt* rtn_t = TypeInt::make(lo, hi, cmp2_t->_widen);
+ return rtn_t;
+ }
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
+//------------------------------fold_compares----------------------------
+// See if a pair of CmpIs can be converted into a CmpU. In some cases
+// the direction of this if is determined by the preciding if so it
+// can be eliminate entirely. Given an if testing (CmpI n c) check
+// for an immediately control dependent if that is testing (CmpI n c2)
+// and has one projection leading to this if and the other projection
+// leading to a region that merges one of this ifs control
+// projections.
+//
+// If
+// / |
+// / |
+// / |
+// If |
+// /\ |
+// / \ |
+// / \ |
+// / Region
+//
+Node* IfNode::fold_compares(PhaseGVN* phase) {
+ if (!EliminateAutoBox || Opcode() != Op_If) return NULL;
+
+ Node* this_cmp = in(1)->in(1);
+ if (this_cmp != NULL && this_cmp->Opcode() == Op_CmpI &&
+ this_cmp->in(2)->is_Con() && this_cmp->in(2) != phase->C->top()) {
+ Node* ctrl = in(0);
+ BoolNode* this_bool = in(1)->as_Bool();
+ Node* n = this_cmp->in(1);
+ int hi = this_cmp->in(2)->get_int();
+ if (ctrl != NULL && ctrl->is_Proj() && ctrl->outcnt() == 1 &&
+ ctrl->in(0)->is_If() &&
+ ctrl->in(0)->outcnt() == 2 &&
+ ctrl->in(0)->in(1)->is_Bool() &&
+ ctrl->in(0)->in(1)->in(1)->Opcode() == Op_CmpI &&
+ ctrl->in(0)->in(1)->in(1)->in(2)->is_Con() &&
+ ctrl->in(0)->in(1)->in(1)->in(1) == n) {
+ IfNode* dom_iff = ctrl->in(0)->as_If();
+ Node* otherproj = dom_iff->proj_out(!ctrl->as_Proj()->_con);
+ if (otherproj->outcnt() == 1 && otherproj->unique_out()->is_Region() &&
+ this_bool->_test._test != BoolTest::ne && this_bool->_test._test != BoolTest::eq) {
+ // Identify which proj goes to the region and which continues on
+ RegionNode* region = otherproj->unique_out()->as_Region();
+ Node* success = NULL;
+ Node* fail = NULL;
+ for (int i = 0; i < 2; i++) {
+ Node* proj = proj_out(i);
+ if (success == NULL && proj->outcnt() == 1 && proj->unique_out() == region) {
+ success = proj;
+ } else if (fail == NULL) {
+ fail = proj;
+ } else {
+ success = fail = NULL;
+ }
+ }
+ if (success != NULL && fail != NULL && !region->has_phi()) {
+ int lo = dom_iff->in(1)->in(1)->in(2)->get_int();
+ BoolNode* dom_bool = dom_iff->in(1)->as_Bool();
+ Node* dom_cmp = dom_bool->in(1);
+ const TypeInt* failtype = filtered_int_type(phase, n, ctrl);
+ if (failtype != NULL) {
+ const TypeInt* type2 = filtered_int_type(phase, n, fail);
+ if (type2 != NULL) {
+ failtype = failtype->join(type2)->is_int();
+ } else {
+ failtype = NULL;
+ }
+ }
+
+ if (failtype != NULL &&
+ dom_bool->_test._test != BoolTest::ne && dom_bool->_test._test != BoolTest::eq) {
+ int bound = failtype->_hi - failtype->_lo + 1;
+ if (failtype->_hi != max_jint && failtype->_lo != min_jint && bound > 1) {
+ // Merge the two compares into a single unsigned compare by building (CmpU (n - lo) hi)
+ BoolTest::mask cond = fail->as_Proj()->_con ? BoolTest::lt : BoolTest::ge;
+ Node* adjusted = phase->transform(new (phase->C, 3) SubINode(n, phase->intcon(failtype->_lo)));
+ Node* newcmp = phase->transform(new (phase->C, 3) CmpUNode(adjusted, phase->intcon(bound)));
+ Node* newbool = phase->transform(new (phase->C, 2) BoolNode(newcmp, cond));
+ phase->hash_delete(dom_iff);
+ dom_iff->set_req(1, phase->intcon(ctrl->as_Proj()->_con));
+ phase->is_IterGVN()->_worklist.push(dom_iff);
+ phase->hash_delete(this);
+ set_req(1, newbool);
+ return this;
+ }
+ if (failtype->_lo > failtype->_hi) {
+ // previous if determines the result of this if so
+ // replace Bool with constant
+ phase->hash_delete(this);
+ set_req(1, phase->intcon(success->as_Proj()->_con));
+ return this;
+ }
+ }
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
//------------------------------remove_useless_bool----------------------------
// Check for people making a useless boolean: things like
// if( (x < y ? true : false) ) { ... }
@@ -744,6 +897,11 @@
// Normal equivalent-test check.
if( !dom ) return NULL; // Dead loop?
+ Node* result = fold_compares(phase);
+ if (result != NULL) {
+ return result;
+ }
+
// Search up the dominator tree for an If with an identical test
while( dom->Opcode() != op || // Not same opcode?
dom->in(1) != in(1) || // Not same input 1?
--- a/hotspot/src/share/vm/opto/library_call.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/library_call.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -2097,7 +2097,7 @@
int type_words = type2size[type];
// Cannot inline wide CAS on machines that don't support it natively
- if (type2aelembytes[type] > BytesPerInt && !VM_Version::supports_cx8())
+ if (type2aelembytes(type) > BytesPerInt && !VM_Version::supports_cx8())
return false;
C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe".
@@ -3975,7 +3975,7 @@
// both indices are constants
int s_offs = src_offset_inttype->get_con();
int d_offs = dest_offset_inttype->get_con();
- int element_size = type2aelembytes[t];
+ int element_size = type2aelembytes(t);
aligned = ((arrayOopDesc::base_offset_in_bytes(t) + s_offs * element_size) % HeapWordSize == 0) &&
((arrayOopDesc::base_offset_in_bytes(t) + d_offs * element_size) % HeapWordSize == 0);
if (s_offs >= d_offs) disjoint = true;
@@ -4170,6 +4170,7 @@
&& !_gvn.eqv_uncast(src, dest)
&& ((alloc = tightly_coupled_allocation(dest, slow_region))
!= NULL)
+ && _gvn.find_int_con(alloc->in(AllocateNode::ALength), 1) > 0
&& alloc->maybe_set_complete(&_gvn)) {
// "You break it, you buy it."
InitializeNode* init = alloc->initialization();
@@ -4389,7 +4390,7 @@
if (alloc != NULL && use_ReduceInitialCardMarks()) {
// If we do not need card marks, copy using the jint or jlong stub.
copy_type = LP64_ONLY(T_LONG) NOT_LP64(T_INT);
- assert(type2aelembytes[basic_elem_type] == type2aelembytes[copy_type],
+ assert(type2aelembytes(basic_elem_type) == type2aelembytes(copy_type),
"sizes agree");
}
}
@@ -4659,7 +4660,7 @@
Node* mem = memory(adr_type); // memory slice to operate on
// scaling and rounding of indexes:
- int scale = exact_log2(type2aelembytes[basic_elem_type]);
+ int scale = exact_log2(type2aelembytes(basic_elem_type));
int abase = arrayOopDesc::base_offset_in_bytes(basic_elem_type);
int clear_low = (-1 << scale) & (BytesPerInt - 1);
int bump_bit = (-1 << scale) & BytesPerInt;
@@ -4753,7 +4754,7 @@
Node* dest, Node* dest_offset,
Node* dest_size) {
// See if there is an advantage from block transfer.
- int scale = exact_log2(type2aelembytes[basic_elem_type]);
+ int scale = exact_log2(type2aelembytes(basic_elem_type));
if (scale >= LogBytesPerLong)
return false; // it is already a block transfer
--- a/hotspot/src/share/vm/opto/locknode.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/locknode.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -36,7 +36,8 @@
uint BoxLockNode::size_of() const { return sizeof(*this); }
-BoxLockNode::BoxLockNode( int slot ) : Node( Compile::current()->root() ), _slot(slot) {
+BoxLockNode::BoxLockNode( int slot ) : Node( Compile::current()->root() ),
+ _slot(slot), _is_eliminated(false) {
init_class_id(Class_BoxLock);
init_flags(Flag_rematerialize);
OptoReg::Name reg = OptoReg::stack2reg(_slot);
--- a/hotspot/src/share/vm/opto/locknode.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/locknode.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -27,6 +27,7 @@
public:
const int _slot;
RegMask _inmask;
+ bool _is_eliminated; // indicates this lock was safely eliminated
BoxLockNode( int lock );
virtual int Opcode() const;
@@ -42,6 +43,10 @@
static OptoReg::Name stack_slot(Node* box_node);
+ bool is_eliminated() { return _is_eliminated; }
+ // mark lock as eliminated.
+ void set_eliminated() { _is_eliminated = true; }
+
#ifndef PRODUCT
virtual void format( PhaseRegAlloc *, outputStream *st ) const;
virtual void dump_spec(outputStream *st) const { st->print(" Lock %d",_slot); }
--- a/hotspot/src/share/vm/opto/loopTransform.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -1714,6 +1714,7 @@
// Gate unrolling, RCE and peeling efforts.
if( !_child && // If not an inner loop, do not split
!_irreducible &&
+ _allow_optimizations &&
!tail()->is_top() ) { // Also ignore the occasional dead backedge
if (!_has_call) {
iteration_split_impl( phase, old_new );
--- a/hotspot/src/share/vm/opto/loopnode.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/loopnode.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -651,7 +651,7 @@
while (if_cnt < if_limit) {
if ((pred->Opcode() == Op_IfTrue || pred->Opcode() == Op_IfFalse)) {
if_cnt++;
- const TypeInt* if_t = filtered_type_at_if(val, pred);
+ const TypeInt* if_t = IfNode::filtered_int_type(&_igvn, val, pred);
if (if_t != NULL) {
if (rtn_t == NULL) {
rtn_t = if_t;
@@ -674,59 +674,6 @@
}
-//------------------------------filtered_type_at_if--------------------------------
-// Return a possibly more restrictive type for val based on condition control flow for an if
-const TypeInt* PhaseIdealLoop::filtered_type_at_if( Node* val, Node *if_proj) {
- assert(if_proj &&
- (if_proj->Opcode() == Op_IfTrue || if_proj->Opcode() == Op_IfFalse), "expecting an if projection");
- if (if_proj->in(0) && if_proj->in(0)->is_If()) {
- IfNode* iff = if_proj->in(0)->as_If();
- if (iff->in(1) && iff->in(1)->is_Bool()) {
- BoolNode* bol = iff->in(1)->as_Bool();
- if (bol->in(1) && bol->in(1)->is_Cmp()) {
- const CmpNode* cmp = bol->in(1)->as_Cmp();
- if (cmp->in(1) == val) {
- const TypeInt* cmp2_t = _igvn.type(cmp->in(2))->isa_int();
- if (cmp2_t != NULL) {
- jint lo = cmp2_t->_lo;
- jint hi = cmp2_t->_hi;
- BoolTest::mask msk = if_proj->Opcode() == Op_IfTrue ? bol->_test._test : bol->_test.negate();
- switch (msk) {
- case BoolTest::ne:
- // Can't refine type
- return NULL;
- case BoolTest::eq:
- return cmp2_t;
- case BoolTest::lt:
- lo = TypeInt::INT->_lo;
- if (hi - 1 < hi) {
- hi = hi - 1;
- }
- break;
- case BoolTest::le:
- lo = TypeInt::INT->_lo;
- break;
- case BoolTest::gt:
- if (lo + 1 > lo) {
- lo = lo + 1;
- }
- hi = TypeInt::INT->_hi;
- break;
- case BoolTest::ge:
- // lo unchanged
- hi = TypeInt::INT->_hi;
- break;
- }
- const TypeInt* rtn_t = TypeInt::make(lo, hi, cmp2_t->_widen);
- return rtn_t;
- }
- }
- }
- }
- }
- return NULL;
-}
-
//------------------------------dump_spec--------------------------------------
// Dump special per-node info
#ifndef PRODUCT
@@ -1614,7 +1561,7 @@
// on just their loop-phi's for this pass of loop opts
if( SplitIfBlocks && do_split_ifs ) {
if (lpt->policy_range_check(this)) {
- lpt->_rce_candidate = true;
+ lpt->_rce_candidate = 1; // = true
}
}
}
@@ -2198,7 +2145,7 @@
// as well? If so, then I found another entry into the loop.
while( is_postvisited(l->_head) ) {
// found irreducible
- l->_irreducible = true;
+ l->_irreducible = 1; // = true
l = l->_parent;
_has_irreducible_loops = true;
// Check for bad CFG here to prevent crash, and bailout of compile
@@ -2252,6 +2199,12 @@
(iff->as_If()->_prob >= 0.01) )
innermost->_has_call = 1;
}
+ } else if( n->is_Allocate() && n->as_Allocate()->_is_scalar_replaceable ) {
+ // Disable loop optimizations if the loop has a scalar replaceable
+ // allocation. This disabling may cause a potential performance lost
+ // if the allocation is not eliminated for some reason.
+ innermost->_allow_optimizations = false;
+ innermost->_has_call = 1; // = true
}
}
}
--- a/hotspot/src/share/vm/opto/loopnode.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/loopnode.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -289,13 +289,15 @@
_has_sfpt:1, // True if has non-call safepoint
_rce_candidate:1; // True if candidate for range check elimination
- Node_List* _required_safept; // A inner loop cannot delete these safepts;
+ Node_List* _required_safept; // A inner loop cannot delete these safepts;
+ bool _allow_optimizations; // Allow loop optimizations
IdealLoopTree( PhaseIdealLoop* phase, Node *head, Node *tail )
: _parent(0), _next(0), _child(0),
_head(head), _tail(tail),
_phase(phase),
_required_safept(NULL),
+ _allow_optimizations(true),
_nest(0), _irreducible(0), _has_call(0), _has_sfpt(0), _rce_candidate(0)
{ }
@@ -850,7 +852,6 @@
const TypeInt* filtered_type( Node *n ) { return filtered_type(n, NULL); }
// Helpers for filtered type
const TypeInt* filtered_type_from_dominators( Node* val, Node *val_ctrl);
- const TypeInt* filtered_type_at_if( Node* val, Node *if_proj);
// Helper functions
void register_new_node( Node *n, Node *blk );
--- a/hotspot/src/share/vm/opto/loopopts.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/loopopts.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -29,10 +29,26 @@
//------------------------------split_thru_phi---------------------------------
// Split Node 'n' through merge point if there is enough win.
Node *PhaseIdealLoop::split_thru_phi( Node *n, Node *region, int policy ) {
+ if (n->Opcode() == Op_ConvI2L && n->bottom_type() != TypeLong::LONG) {
+ // ConvI2L may have type information on it which is unsafe to push up
+ // so disable this for now
+ return NULL;
+ }
int wins = 0;
assert( !n->is_CFG(), "" );
assert( region->is_Region(), "" );
- Node *phi = new (C, region->req()) PhiNode( region, n->bottom_type() );
+
+ const Type* type = n->bottom_type();
+ const TypeOopPtr *t_oop = _igvn.type(n)->isa_oopptr();
+ Node *phi;
+ if( t_oop != NULL && t_oop->is_instance_field() ) {
+ int iid = t_oop->instance_id();
+ int index = C->get_alias_index(t_oop);
+ int offset = t_oop->offset();
+ phi = new (C,region->req()) PhiNode(region, type, NULL, iid, index, offset);
+ } else {
+ phi = new (C,region->req()) PhiNode(region, type);
+ }
uint old_unique = C->unique();
for( uint i = 1; i < region->req(); i++ ) {
Node *x;
@@ -435,9 +451,11 @@
// Check profitability
int cost = 0;
+ int phis = 0;
for (DUIterator_Fast imax, i = region->fast_outs(imax); i < imax; i++) {
Node *out = region->fast_out(i);
if( !out->is_Phi() ) continue; // Ignore other control edges, etc
+ phis++;
PhiNode* phi = out->as_Phi();
switch (phi->type()->basic_type()) {
case T_LONG:
@@ -489,6 +507,12 @@
}
}
if( cost >= ConditionalMoveLimit ) return NULL; // Too much goo
+ Node* bol = iff->in(1);
+ assert( bol->Opcode() == Op_Bool, "" );
+ int cmp_op = bol->in(1)->Opcode();
+ // It is expensive to generate flags from a float compare.
+ // Avoid duplicated float compare.
+ if( phis > 1 && (cmp_op == Op_CmpF || cmp_op == Op_CmpD)) return NULL;
// --------------
// Now replace all Phis with CMOV's
--- a/hotspot/src/share/vm/opto/macro.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/macro.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -54,15 +54,30 @@
uint new_dbg_start = newcall->tf()->domain()->cnt();
int jvms_adj = new_dbg_start - old_dbg_start;
assert (new_dbg_start == newcall->req(), "argument count mismatch");
+
+ Dict* sosn_map = new Dict(cmpkey,hashkey);
for (uint i = old_dbg_start; i < oldcall->req(); i++) {
- newcall->add_req(oldcall->in(i));
+ Node* old_in = oldcall->in(i);
+ // Clone old SafePointScalarObjectNodes, adjusting their field contents.
+ if (old_in->is_SafePointScalarObject()) {
+ SafePointScalarObjectNode* old_sosn = old_in->as_SafePointScalarObject();
+ uint old_unique = C->unique();
+ Node* new_in = old_sosn->clone(jvms_adj, sosn_map);
+ if (old_unique != C->unique()) {
+ new_in = transform_later(new_in); // Register new node.
+ }
+ old_in = new_in;
+ }
+ newcall->add_req(old_in);
}
+
newcall->set_jvms(oldcall->jvms());
for (JVMState *jvms = newcall->jvms(); jvms != NULL; jvms = jvms->caller()) {
jvms->set_map(newcall);
jvms->set_locoff(jvms->locoff()+jvms_adj);
jvms->set_stkoff(jvms->stkoff()+jvms_adj);
jvms->set_monoff(jvms->monoff()+jvms_adj);
+ jvms->set_scloff(jvms->scloff()+jvms_adj);
jvms->set_endoff(jvms->endoff()+jvms_adj);
}
}
@@ -166,6 +181,622 @@
}
+// Eliminate a card mark sequence. p2x is a ConvP2XNode
+void PhaseMacroExpand::eliminate_card_mark(Node *p2x) {
+ assert(p2x->Opcode() == Op_CastP2X, "ConvP2XNode required");
+ Node *shift = p2x->unique_out();
+ Node *addp = shift->unique_out();
+ for (DUIterator_Last jmin, j = addp->last_outs(jmin); j >= jmin; --j) {
+ Node *st = addp->last_out(j);
+ assert(st->is_Store(), "store required");
+ _igvn.replace_node(st, st->in(MemNode::Memory));
+ }
+}
+
+// Search for a memory operation for the specified memory slice.
+static Node *scan_mem_chain(Node *mem, int alias_idx, int offset, Node *start_mem, Node *alloc) {
+ Node *orig_mem = mem;
+ Node *alloc_mem = alloc->in(TypeFunc::Memory);
+ while (true) {
+ if (mem == alloc_mem || mem == start_mem ) {
+ return mem; // hit one of our sentinals
+ } else if (mem->is_MergeMem()) {
+ mem = mem->as_MergeMem()->memory_at(alias_idx);
+ } else if (mem->is_Proj() && mem->as_Proj()->_con == TypeFunc::Memory) {
+ Node *in = mem->in(0);
+ // we can safely skip over safepoints, calls, locks and membars because we
+ // already know that the object is safe to eliminate.
+ if (in->is_Initialize() && in->as_Initialize()->allocation() == alloc) {
+ return in;
+ } else if (in->is_Call() || in->is_MemBar()) {
+ mem = in->in(TypeFunc::Memory);
+ } else {
+ assert(false, "unexpected projection");
+ }
+ } else if (mem->is_Store()) {
+ const TypePtr* atype = mem->as_Store()->adr_type();
+ int adr_idx = Compile::current()->get_alias_index(atype);
+ if (adr_idx == alias_idx) {
+ assert(atype->isa_oopptr(), "address type must be oopptr");
+ int adr_offset = atype->offset();
+ uint adr_iid = atype->is_oopptr()->instance_id();
+ // Array elements references have the same alias_idx
+ // but different offset and different instance_id.
+ if (adr_offset == offset && adr_iid == alloc->_idx)
+ return mem;
+ } else {
+ assert(adr_idx == Compile::AliasIdxRaw, "address must match or be raw");
+ }
+ mem = mem->in(MemNode::Memory);
+ } else {
+ return mem;
+ }
+ if (mem == orig_mem)
+ return mem;
+ }
+}
+
+//
+// Given a Memory Phi, compute a value Phi containing the values from stores
+// on the input paths.
+// Note: this function is recursive, its depth is limied by the "level" argument
+// Returns the computed Phi, or NULL if it cannot compute it.
+Node *PhaseMacroExpand::value_from_mem_phi(Node *mem, BasicType ft, const Type *phi_type, const TypeOopPtr *adr_t, Node *alloc, int level) {
+
+ if (level <= 0) {
+ return NULL;
+ }
+ int alias_idx = C->get_alias_index(adr_t);
+ int offset = adr_t->offset();
+ int instance_id = adr_t->instance_id();
+
+ Node *start_mem = C->start()->proj_out(TypeFunc::Memory);
+ Node *alloc_mem = alloc->in(TypeFunc::Memory);
+
+ uint length = mem->req();
+ GrowableArray <Node *> values(length, length, NULL);
+
+ for (uint j = 1; j < length; j++) {
+ Node *in = mem->in(j);
+ if (in == NULL || in->is_top()) {
+ values.at_put(j, in);
+ } else {
+ Node *val = scan_mem_chain(in, alias_idx, offset, start_mem, alloc);
+ if (val == start_mem || val == alloc_mem) {
+ // hit a sentinel, return appropriate 0 value
+ values.at_put(j, _igvn.zerocon(ft));
+ continue;
+ }
+ if (val->is_Initialize()) {
+ val = val->as_Initialize()->find_captured_store(offset, type2aelembytes(ft), &_igvn);
+ }
+ if (val == NULL) {
+ return NULL; // can't find a value on this path
+ }
+ if (val == mem) {
+ values.at_put(j, mem);
+ } else if (val->is_Store()) {
+ values.at_put(j, val->in(MemNode::ValueIn));
+ } else if(val->is_Proj() && val->in(0) == alloc) {
+ values.at_put(j, _igvn.zerocon(ft));
+ } else if (val->is_Phi()) {
+ // Check if an appropriate node already exists.
+ Node* region = val->in(0);
+ Node* old_phi = NULL;
+ for (DUIterator_Fast kmax, k = region->fast_outs(kmax); k < kmax; k++) {
+ Node* phi = region->fast_out(k);
+ if (phi->is_Phi() && phi != val &&
+ phi->as_Phi()->is_same_inst_field(phi_type, instance_id, alias_idx, offset)) {
+ old_phi = phi;
+ break;
+ }
+ }
+ if (old_phi == NULL) {
+ val = value_from_mem_phi(val, ft, phi_type, adr_t, alloc, level-1);
+ if (val == NULL) {
+ return NULL;
+ }
+ values.at_put(j, val);
+ } else {
+ values.at_put(j, old_phi);
+ }
+ } else {
+ return NULL; // unknown node on this path
+ }
+ }
+ }
+ // create a new Phi for the value
+ PhiNode *phi = new (C, length) PhiNode(mem->in(0), phi_type, NULL, instance_id, alias_idx, offset);
+ for (uint j = 1; j < length; j++) {
+ if (values.at(j) == mem) {
+ phi->init_req(j, phi);
+ } else {
+ phi->init_req(j, values.at(j));
+ }
+ }
+ transform_later(phi);
+ return phi;
+}
+
+// Search the last value stored into the object's field.
+Node *PhaseMacroExpand::value_from_mem(Node *sfpt_mem, BasicType ft, const Type *ftype, const TypeOopPtr *adr_t, Node *alloc) {
+ assert(adr_t->is_instance_field(), "instance required");
+ uint instance_id = adr_t->instance_id();
+ assert(instance_id == alloc->_idx, "wrong allocation");
+
+ int alias_idx = C->get_alias_index(adr_t);
+ int offset = adr_t->offset();
+ Node *start_mem = C->start()->proj_out(TypeFunc::Memory);
+ Node *alloc_ctrl = alloc->in(TypeFunc::Control);
+ Node *alloc_mem = alloc->in(TypeFunc::Memory);
+ VectorSet visited(Thread::current()->resource_area());
+
+
+ bool done = sfpt_mem == alloc_mem;
+ Node *mem = sfpt_mem;
+ while (!done) {
+ if (visited.test_set(mem->_idx)) {
+ return NULL; // found a loop, give up
+ }
+ mem = scan_mem_chain(mem, alias_idx, offset, start_mem, alloc);
+ if (mem == start_mem || mem == alloc_mem) {
+ done = true; // hit a sentinel, return appropriate 0 value
+ } else if (mem->is_Initialize()) {
+ mem = mem->as_Initialize()->find_captured_store(offset, type2aelembytes(ft), &_igvn);
+ if (mem == NULL) {
+ done = true; // Something go wrong.
+ } else if (mem->is_Store()) {
+ const TypePtr* atype = mem->as_Store()->adr_type();
+ assert(C->get_alias_index(atype) == Compile::AliasIdxRaw, "store is correct memory slice");
+ done = true;
+ }
+ } else if (mem->is_Store()) {
+ const TypeOopPtr* atype = mem->as_Store()->adr_type()->isa_oopptr();
+ assert(atype != NULL, "address type must be oopptr");
+ assert(C->get_alias_index(atype) == alias_idx &&
+ atype->is_instance_field() && atype->offset() == offset &&
+ atype->instance_id() == instance_id, "store is correct memory slice");
+ done = true;
+ } else if (mem->is_Phi()) {
+ // try to find a phi's unique input
+ Node *unique_input = NULL;
+ Node *top = C->top();
+ for (uint i = 1; i < mem->req(); i++) {
+ Node *n = scan_mem_chain(mem->in(i), alias_idx, offset, start_mem, alloc);
+ if (n == NULL || n == top || n == mem) {
+ continue;
+ } else if (unique_input == NULL) {
+ unique_input = n;
+ } else if (unique_input != n) {
+ unique_input = top;
+ break;
+ }
+ }
+ if (unique_input != NULL && unique_input != top) {
+ mem = unique_input;
+ } else {
+ done = true;
+ }
+ } else {
+ assert(false, "unexpected node");
+ }
+ }
+ if (mem != NULL) {
+ if (mem == start_mem || mem == alloc_mem) {
+ // hit a sentinel, return appropriate 0 value
+ return _igvn.zerocon(ft);
+ } else if (mem->is_Store()) {
+ return mem->in(MemNode::ValueIn);
+ } else if (mem->is_Phi()) {
+ // attempt to produce a Phi reflecting the values on the input paths of the Phi
+ Node * phi = value_from_mem_phi(mem, ft, ftype, adr_t, alloc, 8);
+ if (phi != NULL) {
+ return phi;
+ }
+ }
+ }
+ // Something go wrong.
+ return NULL;
+}
+
+// Check the possibility of scalar replacement.
+bool PhaseMacroExpand::can_eliminate_allocation(AllocateNode *alloc, GrowableArray <SafePointNode *>& safepoints) {
+ // Scan the uses of the allocation to check for anything that would
+ // prevent us from eliminating it.
+ NOT_PRODUCT( const char* fail_eliminate = NULL; )
+ DEBUG_ONLY( Node* disq_node = NULL; )
+ bool can_eliminate = true;
+
+ Node* res = alloc->result_cast();
+ const TypeOopPtr* res_type = NULL;
+ if (res == NULL) {
+ // All users were eliminated.
+ } else if (!res->is_CheckCastPP()) {
+ alloc->_is_scalar_replaceable = false; // don't try again
+ NOT_PRODUCT(fail_eliminate = "Allocation does not have unique CheckCastPP";)
+ can_eliminate = false;
+ } else {
+ res_type = _igvn.type(res)->isa_oopptr();
+ if (res_type == NULL) {
+ NOT_PRODUCT(fail_eliminate = "Neither instance or array allocation";)
+ can_eliminate = false;
+ } else if (res_type->isa_aryptr()) {
+ int length = alloc->in(AllocateNode::ALength)->find_int_con(-1);
+ if (length < 0) {
+ NOT_PRODUCT(fail_eliminate = "Array's size is not constant";)
+ can_eliminate = false;
+ }
+ }
+ }
+
+ if (can_eliminate && res != NULL) {
+ for (DUIterator_Fast jmax, j = res->fast_outs(jmax);
+ j < jmax && can_eliminate; j++) {
+ Node* use = res->fast_out(j);
+
+ if (use->is_AddP()) {
+ const TypePtr* addp_type = _igvn.type(use)->is_ptr();
+ int offset = addp_type->offset();
+
+ if (offset == Type::OffsetTop || offset == Type::OffsetBot) {
+ NOT_PRODUCT(fail_eliminate = "Undefined field referrence";)
+ can_eliminate = false;
+ break;
+ }
+ for (DUIterator_Fast kmax, k = use->fast_outs(kmax);
+ k < kmax && can_eliminate; k++) {
+ Node* n = use->fast_out(k);
+ if (!n->is_Store() && n->Opcode() != Op_CastP2X) {
+ DEBUG_ONLY(disq_node = n;)
+ if (n->is_Load()) {
+ NOT_PRODUCT(fail_eliminate = "Field load";)
+ } else {
+ NOT_PRODUCT(fail_eliminate = "Not store field referrence";)
+ }
+ can_eliminate = false;
+ }
+ }
+ } else if (use->is_SafePoint()) {
+ SafePointNode* sfpt = use->as_SafePoint();
+ if (sfpt->has_non_debug_use(res)) {
+ // Object is passed as argument.
+ DEBUG_ONLY(disq_node = use;)
+ NOT_PRODUCT(fail_eliminate = "Object is passed as argument";)
+ can_eliminate = false;
+ }
+ Node* sfptMem = sfpt->memory();
+ if (sfptMem == NULL || sfptMem->is_top()) {
+ DEBUG_ONLY(disq_node = use;)
+ NOT_PRODUCT(fail_eliminate = "NULL or TOP memory";)
+ can_eliminate = false;
+ } else {
+ safepoints.append_if_missing(sfpt);
+ }
+ } else if (use->Opcode() != Op_CastP2X) { // CastP2X is used by card mark
+ if (use->is_Phi()) {
+ if (use->outcnt() == 1 && use->unique_out()->Opcode() == Op_Return) {
+ NOT_PRODUCT(fail_eliminate = "Object is return value";)
+ } else {
+ NOT_PRODUCT(fail_eliminate = "Object is referenced by Phi";)
+ }
+ DEBUG_ONLY(disq_node = use;)
+ } else {
+ if (use->Opcode() == Op_Return) {
+ NOT_PRODUCT(fail_eliminate = "Object is return value";)
+ }else {
+ NOT_PRODUCT(fail_eliminate = "Object is referenced by node";)
+ }
+ DEBUG_ONLY(disq_node = use;)
+ }
+ can_eliminate = false;
+ }
+ }
+ }
+
+#ifndef PRODUCT
+ if (PrintEliminateAllocations) {
+ if (can_eliminate) {
+ tty->print("Scalar ");
+ if (res == NULL)
+ alloc->dump();
+ else
+ res->dump();
+ } else {
+ tty->print("NotScalar (%s)", fail_eliminate);
+ if (res == NULL)
+ alloc->dump();
+ else
+ res->dump();
+#ifdef ASSERT
+ if (disq_node != NULL) {
+ tty->print(" >>>> ");
+ disq_node->dump();
+ }
+#endif /*ASSERT*/
+ }
+ }
+#endif
+ return can_eliminate;
+}
+
+// Do scalar replacement.
+bool PhaseMacroExpand::scalar_replacement(AllocateNode *alloc, GrowableArray <SafePointNode *>& safepoints) {
+ GrowableArray <SafePointNode *> safepoints_done;
+
+ ciKlass* klass = NULL;
+ ciInstanceKlass* iklass = NULL;
+ int nfields = 0;
+ int array_base;
+ int element_size;
+ BasicType basic_elem_type;
+ ciType* elem_type;
+
+ Node* res = alloc->result_cast();
+ const TypeOopPtr* res_type = NULL;
+ if (res != NULL) { // Could be NULL when there are no users
+ res_type = _igvn.type(res)->isa_oopptr();
+ }
+
+ if (res != NULL) {
+ klass = res_type->klass();
+ if (res_type->isa_instptr()) {
+ // find the fields of the class which will be needed for safepoint debug information
+ assert(klass->is_instance_klass(), "must be an instance klass.");
+ iklass = klass->as_instance_klass();
+ nfields = iklass->nof_nonstatic_fields();
+ } else {
+ // find the array's elements which will be needed for safepoint debug information
+ nfields = alloc->in(AllocateNode::ALength)->find_int_con(-1);
+ assert(klass->is_array_klass() && nfields >= 0, "must be an array klass.");
+ elem_type = klass->as_array_klass()->element_type();
+ basic_elem_type = elem_type->basic_type();
+ array_base = arrayOopDesc::base_offset_in_bytes(basic_elem_type);
+ element_size = type2aelembytes(basic_elem_type);
+ }
+ }
+ //
+ // Process the safepoint uses
+ //
+ while (safepoints.length() > 0) {
+ SafePointNode* sfpt = safepoints.pop();
+ Node* mem = sfpt->memory();
+ uint first_ind = sfpt->req();
+ SafePointScalarObjectNode* sobj = new (C, 1) SafePointScalarObjectNode(res_type,
+#ifdef ASSERT
+ alloc,
+#endif
+ first_ind, nfields);
+ sobj->init_req(0, sfpt->in(TypeFunc::Control));
+ transform_later(sobj);
+
+ // Scan object's fields adding an input to the safepoint for each field.
+ for (int j = 0; j < nfields; j++) {
+ int offset;
+ ciField* field = NULL;
+ if (iklass != NULL) {
+ field = iklass->nonstatic_field_at(j);
+ offset = field->offset();
+ elem_type = field->type();
+ basic_elem_type = field->layout_type();
+ } else {
+ offset = array_base + j * element_size;
+ }
+
+ const Type *field_type;
+ // The next code is taken from Parse::do_get_xxx().
+ if (basic_elem_type == T_OBJECT) {
+ if (!elem_type->is_loaded()) {
+ field_type = TypeInstPtr::BOTTOM;
+ } else if (field != NULL && field->is_constant()) {
+ // This can happen if the constant oop is non-perm.
+ ciObject* con = field->constant_value().as_object();
+ // Do not "join" in the previous type; it doesn't add value,
+ // and may yield a vacuous result if the field is of interface type.
+ field_type = TypeOopPtr::make_from_constant(con)->isa_oopptr();
+ assert(field_type != NULL, "field singleton type must be consistent");
+ } else {
+ field_type = TypeOopPtr::make_from_klass(elem_type->as_klass());
+ }
+ } else {
+ field_type = Type::get_const_basic_type(basic_elem_type);
+ }
+
+ const TypeOopPtr *field_addr_type = res_type->add_offset(offset)->isa_oopptr();
+
+ Node *field_val = value_from_mem(mem, basic_elem_type, field_type, field_addr_type, alloc);
+ if (field_val == NULL) {
+ // we weren't able to find a value for this field,
+ // give up on eliminating this allocation
+ alloc->_is_scalar_replaceable = false; // don't try again
+ // remove any extra entries we added to the safepoint
+ uint last = sfpt->req() - 1;
+ for (int k = 0; k < j; k++) {
+ sfpt->del_req(last--);
+ }
+ // rollback processed safepoints
+ while (safepoints_done.length() > 0) {
+ SafePointNode* sfpt_done = safepoints_done.pop();
+ // remove any extra entries we added to the safepoint
+ last = sfpt_done->req() - 1;
+ for (int k = 0; k < nfields; k++) {
+ sfpt_done->del_req(last--);
+ }
+ JVMState *jvms = sfpt_done->jvms();
+ jvms->set_endoff(sfpt_done->req());
+ // Now make a pass over the debug information replacing any references
+ // to SafePointScalarObjectNode with the allocated object.
+ int start = jvms->debug_start();
+ int end = jvms->debug_end();
+ for (int i = start; i < end; i++) {
+ if (sfpt_done->in(i)->is_SafePointScalarObject()) {
+ SafePointScalarObjectNode* scobj = sfpt_done->in(i)->as_SafePointScalarObject();
+ if (scobj->first_index() == sfpt_done->req() &&
+ scobj->n_fields() == (uint)nfields) {
+ assert(scobj->alloc() == alloc, "sanity");
+ sfpt_done->set_req(i, res);
+ }
+ }
+ }
+ }
+#ifndef PRODUCT
+ if (PrintEliminateAllocations) {
+ if (field != NULL) {
+ tty->print("=== At SafePoint node %d can't find value of Field: ",
+ sfpt->_idx);
+ field->print();
+ int field_idx = C->get_alias_index(field_addr_type);
+ tty->print(" (alias_idx=%d)", field_idx);
+ } else { // Array's element
+ tty->print("=== At SafePoint node %d can't find value of array element [%d]",
+ sfpt->_idx, j);
+ }
+ tty->print(", which prevents elimination of: ");
+ if (res == NULL)
+ alloc->dump();
+ else
+ res->dump();
+ }
+#endif
+ return false;
+ }
+ sfpt->add_req(field_val);
+ }
+ JVMState *jvms = sfpt->jvms();
+ jvms->set_endoff(sfpt->req());
+ // Now make a pass over the debug information replacing any references
+ // to the allocated object with "sobj"
+ int start = jvms->debug_start();
+ int end = jvms->debug_end();
+ for (int i = start; i < end; i++) {
+ if (sfpt->in(i) == res) {
+ sfpt->set_req(i, sobj);
+ }
+ }
+ safepoints_done.append_if_missing(sfpt); // keep it for rollback
+ }
+ return true;
+}
+
+// Process users of eliminated allocation.
+void PhaseMacroExpand::process_users_of_allocation(AllocateNode *alloc) {
+ Node* res = alloc->result_cast();
+ if (res != NULL) {
+ for (DUIterator_Last jmin, j = res->last_outs(jmin); j >= jmin; ) {
+ Node *use = res->last_out(j);
+ uint oc1 = res->outcnt();
+
+ if (use->is_AddP()) {
+ for (DUIterator_Last kmin, k = use->last_outs(kmin); k >= kmin; ) {
+ Node *n = use->last_out(k);
+ uint oc2 = use->outcnt();
+ if (n->is_Store()) {
+ _igvn.replace_node(n, n->in(MemNode::Memory));
+ } else {
+ assert( n->Opcode() == Op_CastP2X, "CastP2X required");
+ eliminate_card_mark(n);
+ }
+ k -= (oc2 - use->outcnt());
+ }
+ } else {
+ assert( !use->is_SafePoint(), "safepoint uses must have been already elimiated");
+ assert( use->Opcode() == Op_CastP2X, "CastP2X required");
+ eliminate_card_mark(use);
+ }
+ j -= (oc1 - res->outcnt());
+ }
+ assert(res->outcnt() == 0, "all uses of allocated objects must be deleted");
+ _igvn.remove_dead_node(res);
+ }
+
+ //
+ // Process other users of allocation's projections
+ //
+ if (_resproj != NULL && _resproj->outcnt() != 0) {
+ for (DUIterator_Last jmin, j = _resproj->last_outs(jmin); j >= jmin; ) {
+ Node *use = _resproj->last_out(j);
+ uint oc1 = _resproj->outcnt();
+ if (use->is_Initialize()) {
+ // Eliminate Initialize node.
+ InitializeNode *init = use->as_Initialize();
+ assert(init->outcnt() <= 2, "only a control and memory projection expected");
+ Node *ctrl_proj = init->proj_out(TypeFunc::Control);
+ if (ctrl_proj != NULL) {
+ assert(init->in(TypeFunc::Control) == _fallthroughcatchproj, "allocation control projection");
+ _igvn.replace_node(ctrl_proj, _fallthroughcatchproj);
+ }
+ Node *mem_proj = init->proj_out(TypeFunc::Memory);
+ if (mem_proj != NULL) {
+ Node *mem = init->in(TypeFunc::Memory);
+#ifdef ASSERT
+ if (mem->is_MergeMem()) {
+ assert(mem->in(TypeFunc::Memory) == _memproj_fallthrough, "allocation memory projection");
+ } else {
+ assert(mem == _memproj_fallthrough, "allocation memory projection");
+ }
+#endif
+ _igvn.replace_node(mem_proj, mem);
+ }
+ } else if (use->is_AddP()) {
+ // raw memory addresses used only by the initialization
+ _igvn.hash_delete(use);
+ _igvn.subsume_node(use, C->top());
+ } else {
+ assert(false, "only Initialize or AddP expected");
+ }
+ j -= (oc1 - _resproj->outcnt());
+ }
+ }
+ if (_fallthroughcatchproj != NULL) {
+ _igvn.replace_node(_fallthroughcatchproj, alloc->in(TypeFunc::Control));
+ }
+ if (_memproj_fallthrough != NULL) {
+ _igvn.replace_node(_memproj_fallthrough, alloc->in(TypeFunc::Memory));
+ }
+ if (_memproj_catchall != NULL) {
+ _igvn.replace_node(_memproj_catchall, C->top());
+ }
+ if (_ioproj_fallthrough != NULL) {
+ _igvn.replace_node(_ioproj_fallthrough, alloc->in(TypeFunc::I_O));
+ }
+ if (_ioproj_catchall != NULL) {
+ _igvn.replace_node(_ioproj_catchall, C->top());
+ }
+ if (_catchallcatchproj != NULL) {
+ _igvn.replace_node(_catchallcatchproj, C->top());
+ }
+}
+
+bool PhaseMacroExpand::eliminate_allocate_node(AllocateNode *alloc) {
+
+ if (!EliminateAllocations || !alloc->_is_scalar_replaceable) {
+ return false;
+ }
+
+ extract_call_projections(alloc);
+
+ GrowableArray <SafePointNode *> safepoints;
+ if (!can_eliminate_allocation(alloc, safepoints)) {
+ return false;
+ }
+
+ if (!scalar_replacement(alloc, safepoints)) {
+ return false;
+ }
+
+ process_users_of_allocation(alloc);
+
+#ifndef PRODUCT
+if (PrintEliminateAllocations) {
+ if (alloc->is_AllocateArray())
+ tty->print_cr("++++ Eliminated: %d AllocateArray", alloc->_idx);
+ else
+ tty->print_cr("++++ Eliminated: %d Allocate", alloc->_idx);
+}
+#endif
+
+ return true;
+}
+
//---------------------------set_eden_pointers-------------------------
void PhaseMacroExpand::set_eden_pointers(Node* &eden_top_adr, Node* &eden_end_adr) {
@@ -270,6 +901,13 @@
Node* klass_node = alloc->in(AllocateNode::KlassNode);
Node* initial_slow_test = alloc->in(AllocateNode::InitialTest);
+ // With escape analysis, the entire memory state was needed to be able to
+ // eliminate the allocation. Since the allocations cannot be eliminated,
+ // optimize it to the raw slice.
+ if (mem->is_MergeMem()) {
+ mem = mem->as_MergeMem()->memory_at(Compile::AliasIdxRaw);
+ }
+
Node* eden_top_adr;
Node* eden_end_adr;
set_eden_pointers(eden_top_adr, eden_end_adr);
@@ -813,27 +1451,87 @@
// Note: The membar's associated with the lock/unlock are currently not
// eliminated. This should be investigated as a future enhancement.
//
-void PhaseMacroExpand::eliminate_locking_node(AbstractLockNode *alock) {
- Node* mem = alock->in(TypeFunc::Memory);
+bool PhaseMacroExpand::eliminate_locking_node(AbstractLockNode *alock) {
+
+ if (!alock->is_eliminated()) {
+ return false;
+ }
+ // Mark the box lock as eliminated if all correspondent locks are eliminated
+ // to construct correct debug info.
+ BoxLockNode* box = alock->box_node()->as_BoxLock();
+ if (!box->is_eliminated()) {
+ bool eliminate = true;
+ for (DUIterator_Fast imax, i = box->fast_outs(imax); i < imax; i++) {
+ Node *lck = box->fast_out(i);
+ if (lck->is_Lock() && !lck->as_AbstractLock()->is_eliminated()) {
+ eliminate = false;
+ break;
+ }
+ }
+ if (eliminate)
+ box->set_eliminated();
+ }
+
+ #ifndef PRODUCT
+ if (PrintEliminateLocks) {
+ if (alock->is_Lock()) {
+ tty->print_cr("++++ Eliminating: %d Lock", alock->_idx);
+ } else {
+ tty->print_cr("++++ Eliminating: %d Unlock", alock->_idx);
+ }
+ }
+ #endif
+
+ Node* mem = alock->in(TypeFunc::Memory);
+ Node* ctrl = alock->in(TypeFunc::Control);
+
+ extract_call_projections(alock);
+ // There are 2 projections from the lock. The lock node will
+ // be deleted when its last use is subsumed below.
+ assert(alock->outcnt() == 2 &&
+ _fallthroughproj != NULL &&
+ _memproj_fallthrough != NULL,
+ "Unexpected projections from Lock/Unlock");
+
+ Node* fallthroughproj = _fallthroughproj;
+ Node* memproj_fallthrough = _memproj_fallthrough;
// The memory projection from a lock/unlock is RawMem
// The input to a Lock is merged memory, so extract its RawMem input
// (unless the MergeMem has been optimized away.)
if (alock->is_Lock()) {
- if (mem->is_MergeMem())
- mem = mem->as_MergeMem()->in(Compile::AliasIdxRaw);
+ // Seach for MemBarAcquire node and delete it also.
+ MemBarNode* membar = fallthroughproj->unique_ctrl_out()->as_MemBar();
+ assert(membar != NULL && membar->Opcode() == Op_MemBarAcquire, "");
+ Node* ctrlproj = membar->proj_out(TypeFunc::Control);
+ Node* memproj = membar->proj_out(TypeFunc::Memory);
+ _igvn.hash_delete(ctrlproj);
+ _igvn.subsume_node(ctrlproj, fallthroughproj);
+ _igvn.hash_delete(memproj);
+ _igvn.subsume_node(memproj, memproj_fallthrough);
}
- extract_call_projections(alock);
- // There are 2 projections from the lock. The lock node will
- // be deleted when its last use is subsumed below.
- assert(alock->outcnt() == 2 && _fallthroughproj != NULL &&
- _memproj_fallthrough != NULL, "Unexpected projections from Lock/Unlock");
- _igvn.hash_delete(_fallthroughproj);
- _igvn.subsume_node(_fallthroughproj, alock->in(TypeFunc::Control));
- _igvn.hash_delete(_memproj_fallthrough);
- _igvn.subsume_node(_memproj_fallthrough, mem);
- return;
+ // Seach for MemBarRelease node and delete it also.
+ if (alock->is_Unlock() && ctrl != NULL && ctrl->is_Proj() &&
+ ctrl->in(0)->is_MemBar()) {
+ MemBarNode* membar = ctrl->in(0)->as_MemBar();
+ assert(membar->Opcode() == Op_MemBarRelease &&
+ mem->is_Proj() && membar == mem->in(0), "");
+ _igvn.hash_delete(fallthroughproj);
+ _igvn.subsume_node(fallthroughproj, ctrl);
+ _igvn.hash_delete(memproj_fallthrough);
+ _igvn.subsume_node(memproj_fallthrough, mem);
+ fallthroughproj = ctrl;
+ memproj_fallthrough = mem;
+ ctrl = membar->in(TypeFunc::Control);
+ mem = membar->in(TypeFunc::Memory);
+ }
+
+ _igvn.hash_delete(fallthroughproj);
+ _igvn.subsume_node(fallthroughproj, ctrl);
+ _igvn.hash_delete(memproj_fallthrough);
+ _igvn.subsume_node(memproj_fallthrough, mem);
+ return true;
}
@@ -844,12 +1542,7 @@
Node* mem = lock->in(TypeFunc::Memory);
Node* obj = lock->obj_node();
Node* box = lock->box_node();
- Node *flock = lock->fastlock_node();
-
- if (lock->is_eliminated()) {
- eliminate_locking_node(lock);
- return;
- }
+ Node* flock = lock->fastlock_node();
// Make the merge point
Node *region = new (C, 3) RegionNode(3);
@@ -898,17 +1591,11 @@
//------------------------------expand_unlock_node----------------------
void PhaseMacroExpand::expand_unlock_node(UnlockNode *unlock) {
- Node *ctrl = unlock->in(TypeFunc::Control);
+ Node* ctrl = unlock->in(TypeFunc::Control);
Node* mem = unlock->in(TypeFunc::Memory);
Node* obj = unlock->obj_node();
Node* box = unlock->box_node();
-
- if (unlock->is_eliminated()) {
- eliminate_locking_node(unlock);
- return;
- }
-
// No need for a null check on unlock
// Make the merge point
@@ -958,14 +1645,41 @@
bool PhaseMacroExpand::expand_macro_nodes() {
if (C->macro_count() == 0)
return false;
- // Make sure expansion will not cause node limit to be exceeded. Worst case is a
- // macro node gets expanded into about 50 nodes. Allow 50% more for optimization
+ // attempt to eliminate allocations
+ bool progress = true;
+ while (progress) {
+ progress = false;
+ for (int i = C->macro_count(); i > 0; i--) {
+ Node * n = C->macro_node(i-1);
+ bool success = false;
+ debug_only(int old_macro_count = C->macro_count(););
+ switch (n->class_id()) {
+ case Node::Class_Allocate:
+ case Node::Class_AllocateArray:
+ success = eliminate_allocate_node(n->as_Allocate());
+ break;
+ case Node::Class_Lock:
+ case Node::Class_Unlock:
+ success = eliminate_locking_node(n->as_AbstractLock());
+ break;
+ default:
+ assert(false, "unknown node type in macro list");
+ }
+ assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count");
+ progress = progress || success;
+ }
+ }
+ // Make sure expansion will not cause node limit to be exceeded.
+ // Worst case is a macro node gets expanded into about 50 nodes.
+ // Allow 50% more for optimization.
if (C->check_node_count(C->macro_count() * 75, "out of nodes before macro expansion" ) )
return true;
+
// expand "macro" nodes
// nodes are removed from the macro list as they are processed
while (C->macro_count() > 0) {
- Node * n = C->macro_node(0);
+ int macro_count = C->macro_count();
+ Node * n = C->macro_node(macro_count-1);
assert(n->is_macro(), "only macro nodes expected here");
if (_igvn.type(n) == Type::TOP || n->in(0)->is_top() ) {
// node is unreachable, so don't try to expand it
@@ -988,6 +1702,7 @@
default:
assert(false, "unknown node type in macro list");
}
+ assert(C->macro_count() < macro_count, "must have deleted a node from macro list");
if (C->failing()) return true;
}
_igvn.optimize();
--- a/hotspot/src/share/vm/opto/macro.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/macro.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -78,7 +78,16 @@
Node* length,
const TypeFunc* slow_call_type,
address slow_call_address);
- void eliminate_locking_node(AbstractLockNode *alock);
+ Node *value_from_mem(Node *mem, BasicType ft, const Type *ftype, const TypeOopPtr *adr_t, Node *alloc);
+ Node *value_from_mem_phi(Node *mem, BasicType ft, const Type *ftype, const TypeOopPtr *adr_t, Node *alloc, int level);
+
+ bool eliminate_allocate_node(AllocateNode *alloc);
+ bool can_eliminate_allocation(AllocateNode *alloc, GrowableArray <SafePointNode *>& safepoints);
+ bool scalar_replacement(AllocateNode *alloc, GrowableArray <SafePointNode *>& safepoints_done);
+ void process_users_of_allocation(AllocateNode *alloc);
+
+ void eliminate_card_mark(Node *cm);
+ bool eliminate_locking_node(AbstractLockNode *alock);
void expand_lock_node(LockNode *lock);
void expand_unlock_node(UnlockNode *unlock);
--- a/hotspot/src/share/vm/opto/matcher.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/matcher.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -1647,6 +1647,7 @@
case Op_Phi: // Treat Phis as shared roots
case Op_Parm:
case Op_Proj: // All handled specially during matching
+ case Op_SafePointScalarObject:
set_shared(n);
set_dontcare(n);
break;
--- a/hotspot/src/share/vm/opto/memnode.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/memnode.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -29,6 +29,8 @@
#include "incls/_precompiled.incl"
#include "incls/_memnode.cpp.incl"
+static Node *step_through_mergemem(PhaseGVN *phase, MergeMemNode *mmem, const TypePtr *tp, const TypePtr *adr_check, outputStream *st);
+
//=============================================================================
uint MemNode::size_of() const { return sizeof(*this); }
@@ -87,6 +89,112 @@
#endif
+Node *MemNode::optimize_simple_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase) {
+ const TypeOopPtr *tinst = t_adr->isa_oopptr();
+ if (tinst == NULL || !tinst->is_instance_field())
+ return mchain; // don't try to optimize non-instance types
+ uint instance_id = tinst->instance_id();
+ Node *prev = NULL;
+ Node *result = mchain;
+ while (prev != result) {
+ prev = result;
+ // skip over a call which does not affect this memory slice
+ if (result->is_Proj() && result->as_Proj()->_con == TypeFunc::Memory) {
+ Node *proj_in = result->in(0);
+ if (proj_in->is_Call()) {
+ CallNode *call = proj_in->as_Call();
+ if (!call->may_modify(t_adr, phase)) {
+ result = call->in(TypeFunc::Memory);
+ }
+ } else if (proj_in->is_Initialize()) {
+ AllocateNode* alloc = proj_in->as_Initialize()->allocation();
+ // Stop if this is the initialization for the object instance which
+ // which contains this memory slice, otherwise skip over it.
+ if (alloc != NULL && alloc->_idx != instance_id) {
+ result = proj_in->in(TypeFunc::Memory);
+ }
+ } else if (proj_in->is_MemBar()) {
+ result = proj_in->in(TypeFunc::Memory);
+ }
+ } else if (result->is_MergeMem()) {
+ result = step_through_mergemem(phase, result->as_MergeMem(), t_adr, NULL, tty);
+ }
+ }
+ return result;
+}
+
+Node *MemNode::optimize_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase) {
+ const TypeOopPtr *t_oop = t_adr->isa_oopptr();
+ bool is_instance = (t_oop != NULL) && t_oop->is_instance_field();
+ PhaseIterGVN *igvn = phase->is_IterGVN();
+ Node *result = mchain;
+ result = optimize_simple_memory_chain(result, t_adr, phase);
+ if (is_instance && igvn != NULL && result->is_Phi()) {
+ PhiNode *mphi = result->as_Phi();
+ assert(mphi->bottom_type() == Type::MEMORY, "memory phi required");
+ const TypePtr *t = mphi->adr_type();
+ if (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM) {
+ // clone the Phi with our address type
+ result = mphi->split_out_instance(t_adr, igvn);
+ } else {
+ assert(phase->C->get_alias_index(t) == phase->C->get_alias_index(t_adr), "correct memory chain");
+ }
+ }
+ return result;
+}
+
+static Node *step_through_mergemem(PhaseGVN *phase, MergeMemNode *mmem, const TypePtr *tp, const TypePtr *adr_check, outputStream *st) {
+ uint alias_idx = phase->C->get_alias_index(tp);
+ Node *mem = mmem;
+#ifdef ASSERT
+ {
+ // Check that current type is consistent with the alias index used during graph construction
+ assert(alias_idx >= Compile::AliasIdxRaw, "must not be a bad alias_idx");
+ bool consistent = adr_check == NULL || adr_check->empty() ||
+ phase->C->must_alias(adr_check, alias_idx );
+ // Sometimes dead array references collapse to a[-1], a[-2], or a[-3]
+ if( !consistent && adr_check != NULL && !adr_check->empty() &&
+ tp->isa_aryptr() && tp->offset() == Type::OffsetBot &&
+ adr_check->isa_aryptr() && adr_check->offset() != Type::OffsetBot &&
+ ( adr_check->offset() == arrayOopDesc::length_offset_in_bytes() ||
+ adr_check->offset() == oopDesc::klass_offset_in_bytes() ||
+ adr_check->offset() == oopDesc::mark_offset_in_bytes() ) ) {
+ // don't assert if it is dead code.
+ consistent = true;
+ }
+ if( !consistent ) {
+ st->print("alias_idx==%d, adr_check==", alias_idx);
+ if( adr_check == NULL ) {
+ st->print("NULL");
+ } else {
+ adr_check->dump();
+ }
+ st->cr();
+ print_alias_types();
+ assert(consistent, "adr_check must match alias idx");
+ }
+ }
+#endif
+ // TypeInstPtr::NOTNULL+any is an OOP with unknown offset - generally
+ // means an array I have not precisely typed yet. Do not do any
+ // alias stuff with it any time soon.
+ const TypeOopPtr *tinst = tp->isa_oopptr();
+ if( tp->base() != Type::AnyPtr &&
+ !(tinst &&
+ tinst->klass()->is_java_lang_Object() &&
+ tinst->offset() == Type::OffsetBot) ) {
+ // compress paths and change unreachable cycles to TOP
+ // If not, we can update the input infinitely along a MergeMem cycle
+ // Equivalent code in PhiNode::Ideal
+ Node* m = phase->transform(mmem);
+ // If tranformed to a MergeMem, get the desired slice
+ // Otherwise the returned node represents memory for every slice
+ mem = (m->is_MergeMem())? m->as_MergeMem()->memory_at(alias_idx) : m;
+ // Update input if it is progress over what we have now
+ }
+ return mem;
+}
+
//--------------------------Ideal_common---------------------------------------
// Look for degenerate control and memory inputs. Bypass MergeMem inputs.
// Unhook non-raw memories from complete (macro-expanded) initializations.
@@ -108,65 +216,19 @@
// Avoid independent memory operations
Node* old_mem = mem;
- if (mem->is_Proj() && mem->in(0)->is_Initialize()) {
- InitializeNode* init = mem->in(0)->as_Initialize();
- if (init->is_complete()) { // i.e., after macro expansion
- const TypePtr* tp = t_adr->is_ptr();
- uint alias_idx = phase->C->get_alias_index(tp);
- // Free this slice from the init. It was hooked, temporarily,
- // by GraphKit::set_output_for_allocation.
- if (alias_idx > Compile::AliasIdxRaw) {
- mem = init->memory(alias_idx);
- // ...but not with the raw-pointer slice.
- }
- }
- }
+ // The code which unhooks non-raw memories from complete (macro-expanded)
+ // initializations was removed. After macro-expansion all stores catched
+ // by Initialize node became raw stores and there is no information
+ // which memory slices they modify. So it is unsafe to move any memory
+ // operation above these stores. Also in most cases hooked non-raw memories
+ // were already unhooked by using information from detect_ptr_independence()
+ // and find_previous_store().
if (mem->is_MergeMem()) {
MergeMemNode* mmem = mem->as_MergeMem();
const TypePtr *tp = t_adr->is_ptr();
- uint alias_idx = phase->C->get_alias_index(tp);
-#ifdef ASSERT
- {
- // Check that current type is consistent with the alias index used during graph construction
- assert(alias_idx >= Compile::AliasIdxRaw, "must not be a bad alias_idx");
- const TypePtr *adr_t = adr_type();
- bool consistent = adr_t == NULL || adr_t->empty() || phase->C->must_alias(adr_t, alias_idx );
- // Sometimes dead array references collapse to a[-1], a[-2], or a[-3]
- if( !consistent && adr_t != NULL && !adr_t->empty() &&
- tp->isa_aryptr() && tp->offset() == Type::OffsetBot &&
- adr_t->isa_aryptr() && adr_t->offset() != Type::OffsetBot &&
- ( adr_t->offset() == arrayOopDesc::length_offset_in_bytes() ||
- adr_t->offset() == oopDesc::klass_offset_in_bytes() ||
- adr_t->offset() == oopDesc::mark_offset_in_bytes() ) ) {
- // don't assert if it is dead code.
- consistent = true;
- }
- if( !consistent ) {
- tty->print("alias_idx==%d, adr_type()==", alias_idx); if( adr_t == NULL ) { tty->print("NULL"); } else { adr_t->dump(); }
- tty->cr();
- print_alias_types();
- assert(consistent, "adr_type must match alias idx");
- }
- }
-#endif
- // TypeInstPtr::NOTNULL+any is an OOP with unknown offset - generally
- // means an array I have not precisely typed yet. Do not do any
- // alias stuff with it any time soon.
- const TypeInstPtr *tinst = tp->isa_instptr();
- if( tp->base() != Type::AnyPtr &&
- !(tinst &&
- tinst->klass()->is_java_lang_Object() &&
- tinst->offset() == Type::OffsetBot) ) {
- // compress paths and change unreachable cycles to TOP
- // If not, we can update the input infinitely along a MergeMem cycle
- // Equivalent code in PhiNode::Ideal
- Node* m = phase->transform(mmem);
- // If tranformed to a MergeMem, get the desired slice
- // Otherwise the returned node represents memory for every slice
- mem = (m->is_MergeMem())? m->as_MergeMem()->memory_at(alias_idx) : m;
- // Update input if it is progress over what we have now
- }
+
+ mem = step_through_mergemem(phase, mmem, tp, adr_type(), tty);
}
if (mem != old_mem) {
@@ -179,36 +241,91 @@
}
// Helper function for proving some simple control dominations.
-// Attempt to prove that control input 'dom' dominates (or equals) 'sub'.
+// Attempt to prove that all control inputs of 'dom' dominate 'sub'.
// Already assumes that 'dom' is available at 'sub', and that 'sub'
// is not a constant (dominated by the method's StartNode).
// Used by MemNode::find_previous_store to prove that the
// control input of a memory operation predates (dominates)
// an allocation it wants to look past.
-bool MemNode::detect_dominating_control(Node* dom, Node* sub) {
- if (dom == NULL) return false;
- if (dom->is_Proj()) dom = dom->in(0);
- if (dom->is_Start()) return true; // anything inside the method
- if (dom->is_Root()) return true; // dom 'controls' a constant
- int cnt = 20; // detect cycle or too much effort
- while (sub != NULL) { // walk 'sub' up the chain to 'dom'
- if (--cnt < 0) return false; // in a cycle or too complex
- if (sub == dom) return true;
- if (sub->is_Start()) return false;
- if (sub->is_Root()) return false;
- Node* up = sub->in(0);
- if (sub == up && sub->is_Region()) {
- for (uint i = 1; i < sub->req(); i++) {
- Node* in = sub->in(i);
- if (in != NULL && !in->is_top() && in != sub) {
- up = in; break; // take any path on the way up to 'dom'
+bool MemNode::all_controls_dominate(Node* dom, Node* sub) {
+ if (dom == NULL || dom->is_top() || sub == NULL || sub->is_top())
+ return false; // Conservative answer for dead code
+
+ // Check 'dom'.
+ dom = dom->find_exact_control(dom);
+ if (dom == NULL || dom->is_top())
+ return false; // Conservative answer for dead code
+
+ if (dom->is_Start() || dom->is_Root() || dom == sub)
+ return true;
+
+ // 'dom' dominates 'sub' if its control edge and control edges
+ // of all its inputs dominate or equal to sub's control edge.
+
+ // Currently 'sub' is either Allocate, Initialize or Start nodes.
+ assert(sub->is_Allocate() || sub->is_Initialize() || sub->is_Start(), "expecting only these nodes");
+
+ // Get control edge of 'sub'.
+ sub = sub->find_exact_control(sub->in(0));
+ if (sub == NULL || sub->is_top())
+ return false; // Conservative answer for dead code
+
+ assert(sub->is_CFG(), "expecting control");
+
+ if (sub == dom)
+ return true;
+
+ if (sub->is_Start() || sub->is_Root())
+ return false;
+
+ {
+ // Check all control edges of 'dom'.
+
+ ResourceMark rm;
+ Arena* arena = Thread::current()->resource_area();
+ Node_List nlist(arena);
+ Unique_Node_List dom_list(arena);
+
+ dom_list.push(dom);
+ bool only_dominating_controls = false;
+
+ for (uint next = 0; next < dom_list.size(); next++) {
+ Node* n = dom_list.at(next);
+ if (!n->is_CFG() && n->pinned()) {
+ // Check only own control edge for pinned non-control nodes.
+ n = n->find_exact_control(n->in(0));
+ if (n == NULL || n->is_top())
+ return false; // Conservative answer for dead code
+ assert(n->is_CFG(), "expecting control");
+ }
+ if (n->is_Start() || n->is_Root()) {
+ only_dominating_controls = true;
+ } else if (n->is_CFG()) {
+ if (n->dominates(sub, nlist))
+ only_dominating_controls = true;
+ else
+ return false;
+ } else {
+ // First, own control edge.
+ Node* m = n->find_exact_control(n->in(0));
+ if (m == NULL)
+ continue;
+ if (m->is_top())
+ return false; // Conservative answer for dead code
+ dom_list.push(m);
+
+ // Now, the rest of edges.
+ uint cnt = n->req();
+ for (uint i = 1; i < cnt; i++) {
+ m = n->find_exact_control(n->in(i));
+ if (m == NULL || m->is_top())
+ continue;
+ dom_list.push(m);
}
}
}
- if (sub == up) return false; // some kind of tight cycle
- sub = up;
+ return only_dominating_controls;
}
- return false;
}
//---------------------detect_ptr_independence---------------------------------
@@ -229,9 +346,9 @@
return (a1 != a2);
} else if (a1 != NULL) { // one allocation a1
// (Note: p2->is_Con implies p2->in(0)->is_Root, which dominates.)
- return detect_dominating_control(p2->in(0), a1->in(0));
+ return all_controls_dominate(p2, a1);
} else { //(a2 != NULL) // one allocation a2
- return detect_dominating_control(p1->in(0), a2->in(0));
+ return all_controls_dominate(p1, a2);
}
return false;
}
@@ -260,6 +377,8 @@
if (offset == Type::OffsetBot)
return NULL; // cannot unalias unless there are precise offsets
+ const TypeOopPtr *addr_t = adr->bottom_type()->isa_oopptr();
+
intptr_t size_in_bytes = memory_size();
Node* mem = in(MemNode::Memory); // start searching here...
@@ -315,8 +434,7 @@
known_identical = true;
else if (alloc != NULL)
known_independent = true;
- else if (ctrl != NULL &&
- detect_dominating_control(ctrl, st_alloc->in(0)))
+ else if (all_controls_dominate(this, st_alloc))
known_independent = true;
if (known_independent) {
@@ -339,6 +457,22 @@
return mem; // let caller handle steps (c), (d)
}
+ } else if (addr_t != NULL && addr_t->is_instance_field()) {
+ // Can't use optimize_simple_memory_chain() since it needs PhaseGVN.
+ if (mem->is_Proj() && mem->in(0)->is_Call()) {
+ CallNode *call = mem->in(0)->as_Call();
+ if (!call->may_modify(addr_t, phase)) {
+ mem = call->in(TypeFunc::Memory);
+ continue; // (a) advance through independent call memory
+ }
+ } else if (mem->is_Proj() && mem->in(0)->is_MemBar()) {
+ mem = mem->in(0)->in(TypeFunc::Memory);
+ continue; // (a) advance through independent MemBar memory
+ } else if (mem->is_MergeMem()) {
+ int alias_idx = phase->C->get_alias_index(adr_type());
+ mem = mem->as_MergeMem()->memory_at(alias_idx);
+ continue; // (a) advance through independent MergeMem memory
+ }
}
// Unless there is an explicit 'continue', we must bail out here,
@@ -540,7 +674,10 @@
const Node* call = adr->in(0);
if (call->is_CallStaticJava()) {
const CallStaticJavaNode* call_java = call->as_CallStaticJava();
- assert(call_java && call_java->method() == NULL, "must be runtime call");
+ const TypeTuple *r = call_java->tf()->range();
+ assert(r->cnt() > TypeFunc::Parms, "must return value");
+ const Type* ret_type = r->field_at(TypeFunc::Parms);
+ assert(ret_type && ret_type->isa_ptr(), "must return pointer");
// We further presume that this is one of
// new_instance_Java, new_array_Java, or
// the like, but do not assert for this.
@@ -634,6 +771,46 @@
Node* MemNode::can_see_stored_value(Node* st, PhaseTransform* phase) const {
Node* ld_adr = in(MemNode::Address);
+ const TypeInstPtr* tp = phase->type(ld_adr)->isa_instptr();
+ Compile::AliasType* atp = tp != NULL ? phase->C->alias_type(tp) : NULL;
+ if (EliminateAutoBox && atp != NULL && atp->index() >= Compile::AliasIdxRaw &&
+ atp->field() != NULL && !atp->field()->is_volatile()) {
+ uint alias_idx = atp->index();
+ bool final = atp->field()->is_final();
+ Node* result = NULL;
+ Node* current = st;
+ // Skip through chains of MemBarNodes checking the MergeMems for
+ // new states for the slice of this load. Stop once any other
+ // kind of node is encountered. Loads from final memory can skip
+ // through any kind of MemBar but normal loads shouldn't skip
+ // through MemBarAcquire since the could allow them to move out of
+ // a synchronized region.
+ while (current->is_Proj()) {
+ int opc = current->in(0)->Opcode();
+ if ((final && opc == Op_MemBarAcquire) ||
+ opc == Op_MemBarRelease || opc == Op_MemBarCPUOrder) {
+ Node* mem = current->in(0)->in(TypeFunc::Memory);
+ if (mem->is_MergeMem()) {
+ MergeMemNode* merge = mem->as_MergeMem();
+ Node* new_st = merge->memory_at(alias_idx);
+ if (new_st == merge->base_memory()) {
+ // Keep searching
+ current = merge->base_memory();
+ continue;
+ }
+ // Save the new memory state for the slice and fall through
+ // to exit.
+ result = new_st;
+ }
+ }
+ break;
+ }
+ if (result != NULL) {
+ st = result;
+ }
+ }
+
+
// Loop around twice in the case Load -> Initialize -> Store.
// (See PhaseIterGVN::add_users_to_worklist, which knows about this case.)
for (int trip = 0; trip <= 1; trip++) {
@@ -698,6 +875,21 @@
return NULL;
}
+//----------------------is_instance_field_load_with_local_phi------------------
+bool LoadNode::is_instance_field_load_with_local_phi(Node* ctrl) {
+ if( in(MemNode::Memory)->is_Phi() && in(MemNode::Memory)->in(0) == ctrl &&
+ in(MemNode::Address)->is_AddP() ) {
+ const TypeOopPtr* t_oop = in(MemNode::Address)->bottom_type()->isa_oopptr();
+ // Only instances.
+ if( t_oop != NULL && t_oop->is_instance_field() &&
+ t_oop->offset() != Type::OffsetBot &&
+ t_oop->offset() != Type::OffsetTop) {
+ return true;
+ }
+ }
+ return false;
+}
+
//------------------------------Identity---------------------------------------
// Loads are identity if previous store is to same address
Node *LoadNode::Identity( PhaseTransform *phase ) {
@@ -720,9 +912,190 @@
// usually runs first, producing the singleton type of the Con.)
return value;
}
+
+ // Search for an existing data phi which was generated before for the same
+ // instance's field to avoid infinite genertion of phis in a loop.
+ Node *region = mem->in(0);
+ if (is_instance_field_load_with_local_phi(region)) {
+ const TypePtr *addr_t = in(MemNode::Address)->bottom_type()->isa_ptr();
+ int this_index = phase->C->get_alias_index(addr_t);
+ int this_offset = addr_t->offset();
+ int this_id = addr_t->is_oopptr()->instance_id();
+ const Type* this_type = bottom_type();
+ for (DUIterator_Fast imax, i = region->fast_outs(imax); i < imax; i++) {
+ Node* phi = region->fast_out(i);
+ if (phi->is_Phi() && phi != mem &&
+ phi->as_Phi()->is_same_inst_field(this_type, this_id, this_index, this_offset)) {
+ return phi;
+ }
+ }
+ }
+
return this;
}
+
+// Returns true if the AliasType refers to the field that holds the
+// cached box array. Currently only handles the IntegerCache case.
+static bool is_autobox_cache(Compile::AliasType* atp) {
+ if (atp != NULL && atp->field() != NULL) {
+ ciField* field = atp->field();
+ ciSymbol* klass = field->holder()->name();
+ if (field->name() == ciSymbol::cache_field_name() &&
+ field->holder()->uses_default_loader() &&
+ klass == ciSymbol::java_lang_Integer_IntegerCache()) {
+ return true;
+ }
+ }
+ return false;
+}
+
+// Fetch the base value in the autobox array
+static bool fetch_autobox_base(Compile::AliasType* atp, int& cache_offset) {
+ if (atp != NULL && atp->field() != NULL) {
+ ciField* field = atp->field();
+ ciSymbol* klass = field->holder()->name();
+ if (field->name() == ciSymbol::cache_field_name() &&
+ field->holder()->uses_default_loader() &&
+ klass == ciSymbol::java_lang_Integer_IntegerCache()) {
+ assert(field->is_constant(), "what?");
+ ciObjArray* array = field->constant_value().as_object()->as_obj_array();
+ // Fetch the box object at the base of the array and get its value
+ ciInstance* box = array->obj_at(0)->as_instance();
+ ciInstanceKlass* ik = box->klass()->as_instance_klass();
+ if (ik->nof_nonstatic_fields() == 1) {
+ // This should be true nonstatic_field_at requires calling
+ // nof_nonstatic_fields so check it anyway
+ ciConstant c = box->field_value(ik->nonstatic_field_at(0));
+ cache_offset = c.as_int();
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+// Returns true if the AliasType refers to the value field of an
+// autobox object. Currently only handles Integer.
+static bool is_autobox_object(Compile::AliasType* atp) {
+ if (atp != NULL && atp->field() != NULL) {
+ ciField* field = atp->field();
+ ciSymbol* klass = field->holder()->name();
+ if (field->name() == ciSymbol::value_name() &&
+ field->holder()->uses_default_loader() &&
+ klass == ciSymbol::java_lang_Integer()) {
+ return true;
+ }
+ }
+ return false;
+}
+
+
+// We're loading from an object which has autobox behaviour.
+// If this object is result of a valueOf call we'll have a phi
+// merging a newly allocated object and a load from the cache.
+// We want to replace this load with the original incoming
+// argument to the valueOf call.
+Node* LoadNode::eliminate_autobox(PhaseGVN* phase) {
+ Node* base = in(Address)->in(AddPNode::Base);
+ if (base->is_Phi() && base->req() == 3) {
+ AllocateNode* allocation = NULL;
+ int allocation_index = -1;
+ int load_index = -1;
+ for (uint i = 1; i < base->req(); i++) {
+ allocation = AllocateNode::Ideal_allocation(base->in(i), phase);
+ if (allocation != NULL) {
+ allocation_index = i;
+ load_index = 3 - allocation_index;
+ break;
+ }
+ }
+ LoadNode* load = NULL;
+ if (allocation != NULL && base->in(load_index)->is_Load()) {
+ load = base->in(load_index)->as_Load();
+ }
+ if (load != NULL && in(Memory)->is_Phi() && in(Memory)->in(0) == base->in(0)) {
+ // Push the loads from the phi that comes from valueOf up
+ // through it to allow elimination of the loads and the recovery
+ // of the original value.
+ Node* mem_phi = in(Memory);
+ Node* offset = in(Address)->in(AddPNode::Offset);
+
+ Node* in1 = clone();
+ Node* in1_addr = in1->in(Address)->clone();
+ in1_addr->set_req(AddPNode::Base, base->in(allocation_index));
+ in1_addr->set_req(AddPNode::Address, base->in(allocation_index));
+ in1_addr->set_req(AddPNode::Offset, offset);
+ in1->set_req(0, base->in(allocation_index));
+ in1->set_req(Address, in1_addr);
+ in1->set_req(Memory, mem_phi->in(allocation_index));
+
+ Node* in2 = clone();
+ Node* in2_addr = in2->in(Address)->clone();
+ in2_addr->set_req(AddPNode::Base, base->in(load_index));
+ in2_addr->set_req(AddPNode::Address, base->in(load_index));
+ in2_addr->set_req(AddPNode::Offset, offset);
+ in2->set_req(0, base->in(load_index));
+ in2->set_req(Address, in2_addr);
+ in2->set_req(Memory, mem_phi->in(load_index));
+
+ in1_addr = phase->transform(in1_addr);
+ in1 = phase->transform(in1);
+ in2_addr = phase->transform(in2_addr);
+ in2 = phase->transform(in2);
+
+ PhiNode* result = PhiNode::make_blank(base->in(0), this);
+ result->set_req(allocation_index, in1);
+ result->set_req(load_index, in2);
+ return result;
+ }
+ } else if (base->is_Load()) {
+ // Eliminate the load of Integer.value for integers from the cache
+ // array by deriving the value from the index into the array.
+ // Capture the offset of the load and then reverse the computation.
+ Node* load_base = base->in(Address)->in(AddPNode::Base);
+ if (load_base != NULL) {
+ Compile::AliasType* atp = phase->C->alias_type(load_base->adr_type());
+ intptr_t cache_offset;
+ int shift = -1;
+ Node* cache = NULL;
+ if (is_autobox_cache(atp)) {
+ shift = exact_log2(type2aelembytes(T_OBJECT));
+ cache = AddPNode::Ideal_base_and_offset(load_base->in(Address), phase, cache_offset);
+ }
+ if (cache != NULL && base->in(Address)->is_AddP()) {
+ Node* elements[4];
+ int count = base->in(Address)->as_AddP()->unpack_offsets(elements, ARRAY_SIZE(elements));
+ int cache_low;
+ if (count > 0 && fetch_autobox_base(atp, cache_low)) {
+ int offset = arrayOopDesc::base_offset_in_bytes(memory_type()) - (cache_low << shift);
+ // Add up all the offsets making of the address of the load
+ Node* result = elements[0];
+ for (int i = 1; i < count; i++) {
+ result = phase->transform(new (phase->C, 3) AddXNode(result, elements[i]));
+ }
+ // Remove the constant offset from the address and then
+ // remove the scaling of the offset to recover the original index.
+ result = phase->transform(new (phase->C, 3) AddXNode(result, phase->MakeConX(-offset)));
+ if (result->Opcode() == Op_LShiftX && result->in(2) == phase->intcon(shift)) {
+ // Peel the shift off directly but wrap it in a dummy node
+ // since Ideal can't return existing nodes
+ result = new (phase->C, 3) RShiftXNode(result->in(1), phase->intcon(0));
+ } else {
+ result = new (phase->C, 3) RShiftXNode(result, phase->intcon(shift));
+ }
+#ifdef _LP64
+ result = new (phase->C, 2) ConvL2INode(phase->transform(result));
+#endif
+ return result;
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
+
//------------------------------Ideal------------------------------------------
// If the load is from Field memory and the pointer is non-null, we can
// zero out the control input.
@@ -749,12 +1122,145 @@
Node* base = AddPNode::Ideal_base_and_offset(address, phase, ignore);
if (base != NULL
&& phase->type(base)->higher_equal(TypePtr::NOTNULL)
- && detect_dominating_control(base->in(0), phase->C->start())) {
+ && all_controls_dominate(base, phase->C->start())) {
// A method-invariant, non-null address (constant or 'this' argument).
set_req(MemNode::Control, NULL);
}
}
+ if (EliminateAutoBox && can_reshape && in(Address)->is_AddP()) {
+ Node* base = in(Address)->in(AddPNode::Base);
+ if (base != NULL) {
+ Compile::AliasType* atp = phase->C->alias_type(adr_type());
+ if (is_autobox_object(atp)) {
+ Node* result = eliminate_autobox(phase);
+ if (result != NULL) return result;
+ }
+ }
+ }
+
+ Node* mem = in(MemNode::Memory);
+ const TypePtr *addr_t = phase->type(address)->isa_ptr();
+
+ if (addr_t != NULL) {
+ // try to optimize our memory input
+ Node* opt_mem = MemNode::optimize_memory_chain(mem, addr_t, phase);
+ if (opt_mem != mem) {
+ set_req(MemNode::Memory, opt_mem);
+ return this;
+ }
+ const TypeOopPtr *t_oop = addr_t->isa_oopptr();
+ if (can_reshape && opt_mem->is_Phi() &&
+ (t_oop != NULL) && t_oop->is_instance_field()) {
+ assert(t_oop->offset() != Type::OffsetBot && t_oop->offset() != Type::OffsetTop, "");
+ Node *region = opt_mem->in(0);
+ uint cnt = opt_mem->req();
+ for( uint i = 1; i < cnt; i++ ) {
+ Node *in = opt_mem->in(i);
+ if( in == NULL ) {
+ region = NULL; // Wait stable graph
+ break;
+ }
+ }
+ if (region != NULL) {
+ // Check for loop invariant.
+ if (cnt == 3) {
+ for( uint i = 1; i < cnt; i++ ) {
+ Node *in = opt_mem->in(i);
+ Node* m = MemNode::optimize_memory_chain(in, addr_t, phase);
+ if (m == opt_mem) {
+ set_req(MemNode::Memory, opt_mem->in(cnt - i)); // Skip this phi.
+ return this;
+ }
+ }
+ }
+ // Split through Phi (see original code in loopopts.cpp).
+ assert(phase->C->have_alias_type(addr_t), "instance should have alias type");
+
+ // Do nothing here if Identity will find a value
+ // (to avoid infinite chain of value phis generation).
+ if ( !phase->eqv(this, this->Identity(phase)) )
+ return NULL;
+
+ const Type* this_type = this->bottom_type();
+ int this_index = phase->C->get_alias_index(addr_t);
+ int this_offset = addr_t->offset();
+ int this_iid = addr_t->is_oopptr()->instance_id();
+ int wins = 0;
+ PhaseIterGVN *igvn = phase->is_IterGVN();
+ Node *phi = new (igvn->C, region->req()) PhiNode(region, this_type, NULL, this_iid, this_index, this_offset);
+ for( uint i = 1; i < region->req(); i++ ) {
+ Node *x;
+ Node* the_clone = NULL;
+ if( region->in(i) == phase->C->top() ) {
+ x = phase->C->top(); // Dead path? Use a dead data op
+ } else {
+ x = this->clone(); // Else clone up the data op
+ the_clone = x; // Remember for possible deletion.
+ // Alter data node to use pre-phi inputs
+ if( this->in(0) == region ) {
+ x->set_req( 0, region->in(i) );
+ } else {
+ x->set_req( 0, NULL );
+ }
+ for( uint j = 1; j < this->req(); j++ ) {
+ Node *in = this->in(j);
+ if( in->is_Phi() && in->in(0) == region )
+ x->set_req( j, in->in(i) ); // Use pre-Phi input for the clone
+ }
+ }
+ // Check for a 'win' on some paths
+ const Type *t = x->Value(igvn);
+
+ bool singleton = t->singleton();
+
+ // See comments in PhaseIdealLoop::split_thru_phi().
+ if( singleton && t == Type::TOP ) {
+ singleton &= region->is_Loop() && (i != LoopNode::EntryControl);
+ }
+
+ if( singleton ) {
+ wins++;
+ x = igvn->makecon(t);
+ } else {
+ // We now call Identity to try to simplify the cloned node.
+ // Note that some Identity methods call phase->type(this).
+ // Make sure that the type array is big enough for
+ // our new node, even though we may throw the node away.
+ // (This tweaking with igvn only works because x is a new node.)
+ igvn->set_type(x, t);
+ Node *y = x->Identity(igvn);
+ if( y != x ) {
+ wins++;
+ x = y;
+ } else {
+ y = igvn->hash_find(x);
+ if( y ) {
+ wins++;
+ x = y;
+ } else {
+ // Else x is a new node we are keeping
+ // We do not need register_new_node_with_optimizer
+ // because set_type has already been called.
+ igvn->_worklist.push(x);
+ }
+ }
+ }
+ if (x != the_clone && the_clone != NULL)
+ igvn->remove_dead_node(the_clone);
+ phi->set_req(i, x);
+ }
+ if( wins > 0 ) {
+ // Record Phi
+ igvn->register_new_node_with_optimizer(phi);
+ return phi;
+ } else {
+ igvn->remove_dead_node(phi);
+ }
+ }
+ }
+ }
+
// Check for prior store with a different base or offset; make Load
// independent. Skip through any number of them. Bail out if the stores
// are in an endless dead cycle and report no progress. This is a key
@@ -858,6 +1364,17 @@
// This can happen if a interface-typed array narrows to a class type.
jt = _type;
}
+
+ if (EliminateAutoBox) {
+ // The pointers in the autobox arrays are always non-null
+ Node* base = in(Address)->in(AddPNode::Base);
+ if (base != NULL) {
+ Compile::AliasType* atp = phase->C->alias_type(base->adr_type());
+ if (is_autobox_cache(atp)) {
+ return jt->join(TypePtr::NOTNULL)->is_ptr();
+ }
+ }
+ }
return jt;
}
}
@@ -971,6 +1488,17 @@
return value->bottom_type();
}
+ const TypeOopPtr *tinst = tp->isa_oopptr();
+ if (tinst != NULL && tinst->is_instance_field()) {
+ // If we have an instance type and our memory input is the
+ // programs's initial memory state, there is no matching store,
+ // so just return a zero of the appropriate type
+ Node *mem = in(MemNode::Memory);
+ if (mem->is_Parm() && mem->in(0)->is_Start()) {
+ assert(mem->as_Parm()->_con == TypeFunc::Memory, "must be memory Parm");
+ return Type::get_zero_type(_type->basic_type());
+ }
+ }
return _type;
}
@@ -1494,7 +2022,7 @@
const TypeOopPtr *adr_oop = phase->type(adr)->isa_oopptr();
if (adr_oop == NULL)
return false;
- if (!adr_oop->is_instance())
+ if (!adr_oop->is_instance_field())
return false; // if not a distinct instance, there may be aliases of the address
for (DUIterator_Fast imax, i = adr->fast_outs(imax); i < imax; i++) {
Node *use = adr->fast_out(i);
@@ -1553,9 +2081,16 @@
//------------------------------Value-----------------------------------------
const Type *StoreCMNode::Value( PhaseTransform *phase ) const {
+ // Either input is TOP ==> the result is TOP
+ const Type *t = phase->type( in(MemNode::Memory) );
+ if( t == Type::TOP ) return Type::TOP;
+ t = phase->type( in(MemNode::Address) );
+ if( t == Type::TOP ) return Type::TOP;
+ t = phase->type( in(MemNode::ValueIn) );
+ if( t == Type::TOP ) return Type::TOP;
// If extra input is TOP ==> the result is TOP
- const Type *t1 = phase->type( in(MemNode::OopStore) );
- if( t1 == Type::TOP ) return Type::TOP;
+ t = phase->type( in(MemNode::OopStore) );
+ if( t == Type::TOP ) return Type::TOP;
return StoreNode::Value( phase );
}
@@ -1596,7 +2131,7 @@
//------------------------------Identity---------------------------------------
// Clearing a zero length array does nothing
Node *ClearArrayNode::Identity( PhaseTransform *phase ) {
- return phase->type(in(2))->higher_equal(TypeInt::ZERO) ? in(1) : this;
+ return phase->type(in(2))->higher_equal(TypeX::ZERO) ? in(1) : this;
}
//------------------------------Idealize---------------------------------------
@@ -1669,6 +2204,11 @@
Node* start_offset,
Node* end_offset,
PhaseGVN* phase) {
+ if (start_offset == end_offset) {
+ // nothing to do
+ return mem;
+ }
+
Compile* C = phase->C;
int unit = BytesPerLong;
Node* zbase = start_offset;
@@ -1694,6 +2234,11 @@
intptr_t start_offset,
intptr_t end_offset,
PhaseGVN* phase) {
+ if (start_offset == end_offset) {
+ // nothing to do
+ return mem;
+ }
+
Compile* C = phase->C;
assert((end_offset % BytesPerInt) == 0, "odd end offset");
intptr_t done_offset = end_offset;
@@ -1998,7 +2543,7 @@
// must have preceded the init, or else be equal to the init.
// Even after loop optimizations (which might change control edges)
// a store is never pinned *before* the availability of its inputs.
- if (!MemNode::detect_dominating_control(ctl, this->in(0)))
+ if (!MemNode::all_controls_dominate(n, this))
return false; // failed to prove a good control
}
@@ -3019,7 +3564,7 @@
}
}
- assert(verify_sparse(), "please, no dups of base");
+ assert(progress || verify_sparse(), "please, no dups of base");
return progress;
}
--- a/hotspot/src/share/vm/opto/memnode.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/memnode.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -60,15 +60,17 @@
debug_only(_adr_type=at; adr_type();)
}
+public:
// Helpers for the optimizer. Documented in memnode.cpp.
static bool detect_ptr_independence(Node* p1, AllocateNode* a1,
Node* p2, AllocateNode* a2,
PhaseTransform* phase);
static bool adr_phi_is_loop_invariant(Node* adr_phi, Node* cast);
-public:
+ static Node *optimize_simple_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase);
+ static Node *optimize_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase);
// This one should probably be a phase-specific function:
- static bool detect_dominating_control(Node* dom, Node* sub);
+ static bool all_controls_dominate(Node* dom, Node* sub);
// Is this Node a MemNode or some descendent? Default is YES.
virtual Node *Ideal_DU_postCCP( PhaseCCP *ccp );
@@ -97,7 +99,13 @@
// What is the type of the value in memory? (T_VOID mean "unspecified".)
virtual BasicType memory_type() const = 0;
- virtual int memory_size() const { return type2aelembytes[memory_type()]; }
+ virtual int memory_size() const {
+#ifdef ASSERT
+ return type2aelembytes(memory_type(), true);
+#else
+ return type2aelembytes(memory_type());
+#endif
+ }
// Search through memory states which precede this node (load or store).
// Look for an exact match for the address, with no intervening
@@ -141,6 +149,9 @@
// zero out the control input.
virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
+ // Recover original value from boxed values
+ Node *eliminate_autobox(PhaseGVN *phase);
+
// Compute a new Type for this node. Basically we just do the pre-check,
// then call the virtual add() to set the type.
virtual const Type *Value( PhaseTransform *phase ) const;
@@ -163,6 +174,9 @@
// Map a load opcode to its corresponding store opcode.
virtual int store_Opcode() const = 0;
+ // Check if the load's memory input is a Phi node with the same control.
+ bool is_instance_field_load_with_local_phi(Node* ctrl);
+
#ifndef PRODUCT
virtual void dump_spec(outputStream *st) const;
#endif
--- a/hotspot/src/share/vm/opto/node.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/node.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -812,8 +812,7 @@
Node* Node::uncast() const {
// Should be inline:
//return is_ConstraintCast() ? uncast_helper(this) : (Node*) this;
- if (is_ConstraintCast() ||
- (is_Type() && req() == 2 && Opcode() == Op_CheckCastPP))
+ if (is_ConstraintCast() || is_CheckCastPP())
return uncast_helper(this);
else
return (Node*) this;
@@ -827,7 +826,7 @@
break;
} else if (p->is_ConstraintCast()) {
p = p->in(1);
- } else if (p->is_Type() && p->Opcode() == Op_CheckCastPP) {
+ } else if (p->is_CheckCastPP()) {
p = p->in(1);
} else {
break;
@@ -1018,6 +1017,101 @@
return false;
};
+//--------------------------find_exact_control---------------------------------
+// Skip Proj and CatchProj nodes chains. Check for Null and Top.
+Node* Node::find_exact_control(Node* ctrl) {
+ if (ctrl == NULL && this->is_Region())
+ ctrl = this->as_Region()->is_copy();
+
+ if (ctrl != NULL && ctrl->is_CatchProj()) {
+ if (ctrl->as_CatchProj()->_con == CatchProjNode::fall_through_index)
+ ctrl = ctrl->in(0);
+ if (ctrl != NULL && !ctrl->is_top())
+ ctrl = ctrl->in(0);
+ }
+
+ if (ctrl != NULL && ctrl->is_Proj())
+ ctrl = ctrl->in(0);
+
+ return ctrl;
+}
+
+//--------------------------dominates------------------------------------------
+// Helper function for MemNode::all_controls_dominate().
+// Check if 'this' control node dominates or equal to 'sub' control node.
+bool Node::dominates(Node* sub, Node_List &nlist) {
+ assert(this->is_CFG(), "expecting control");
+ assert(sub != NULL && sub->is_CFG(), "expecting control");
+
+ Node* orig_sub = sub;
+ nlist.clear();
+ bool this_dominates = false;
+ uint region_input = 0;
+ while (sub != NULL) { // walk 'sub' up the chain to 'this'
+ if (sub == this) {
+ if (nlist.size() == 0) {
+ // No Region nodes except loops were visited before and the EntryControl
+ // path was taken for loops: it did not walk in a cycle.
+ return true;
+ } else if (!this_dominates) {
+ // Region nodes were visited. Continue walk up to Start or Root
+ // to make sure that it did not walk in a cycle.
+ this_dominates = true; // first time meet
+ } else {
+ return false; // already met before: walk in a cycle
+ }
+ }
+ if (sub->is_Start() || sub->is_Root())
+ return this_dominates;
+
+ Node* up = sub->find_exact_control(sub->in(0));
+ if (up == NULL || up->is_top())
+ return false; // Conservative answer for dead code
+
+ if (sub == up && sub->is_Loop()) {
+ up = sub->in(0); // in(LoopNode::EntryControl);
+ } else if (sub == up && sub->is_Region()) {
+ uint i = 1;
+ if (nlist.size() == 0) {
+ // No Region nodes (except Loops) were visited before.
+ // Take first valid path on the way up to 'this'.
+ } else if (nlist.at(nlist.size() - 1) == sub) {
+ // This Region node was just visited. Take other path.
+ i = region_input + 1;
+ nlist.pop();
+ } else {
+ // Was this Region node visited before?
+ uint size = nlist.size();
+ for (uint j = 0; j < size; j++) {
+ if (nlist.at(j) == sub) {
+ return false; // The Region node was visited before. Give up.
+ }
+ }
+ // The Region node was not visited before.
+ // Take first valid path on the way up to 'this'.
+ }
+ for (; i < sub->req(); i++) {
+ Node* in = sub->in(i);
+ if (in != NULL && !in->is_top() && in != sub) {
+ break;
+ }
+ }
+ if (i < sub->req()) {
+ nlist.push(sub);
+ up = sub->in(i);
+ region_input = i;
+ }
+ }
+ if (sub == up)
+ return false; // some kind of tight cycle
+ if (orig_sub == up)
+ return false; // walk in a cycle
+
+ sub = up;
+ }
+ return false;
+}
+
//------------------------------remove_dead_region-----------------------------
// This control node is dead. Follow the subgraph below it making everything
// using it dead as well. This will happen normally via the usual IterGVN
@@ -1462,97 +1556,48 @@
}
//------------------------------dump_nodes-------------------------------------
-
-// Helper class for dump_nodes. Wraps an old and new VectorSet.
-class OldNewVectorSet : public StackObj {
- Arena* _node_arena;
- VectorSet _old_vset, _new_vset;
- VectorSet* select(Node* n) {
- return _node_arena->contains(n) ? &_new_vset : &_old_vset;
- }
- public:
- OldNewVectorSet(Arena* node_arena, ResourceArea* area) :
- _node_arena(node_arena),
- _old_vset(area), _new_vset(area) {}
-
- void set(Node* n) { select(n)->set(n->_idx); }
- bool test_set(Node* n) { return select(n)->test_set(n->_idx) != 0; }
- bool test(Node* n) { return select(n)->test(n->_idx) != 0; }
- void del(Node* n) { (*select(n)) >>= n->_idx; }
-};
-
-
static void dump_nodes(const Node* start, int d, bool only_ctrl) {
Node* s = (Node*)start; // remove const
if (NotANode(s)) return;
+ uint depth = (uint)ABS(d);
+ int direction = d;
Compile* C = Compile::current();
- ResourceArea *area = Thread::current()->resource_area();
- Node_Stack stack(area, MIN2((uint)ABS(d), C->unique() >> 1));
- OldNewVectorSet visited(C->node_arena(), area);
- OldNewVectorSet on_stack(C->node_arena(), area);
-
- visited.set(s);
- on_stack.set(s);
- stack.push(s, 0);
- if (d < 0) s->dump();
-
- // Do a depth first walk over edges
- while (stack.is_nonempty()) {
- Node* tp = stack.node();
- uint idx = stack.index();
- uint limit = d > 0 ? tp->len() : tp->outcnt();
- if (idx >= limit) {
- // no more arcs to visit
- if (d > 0) tp->dump();
- on_stack.del(tp);
- stack.pop();
- } else {
- // process the "idx"th arc
- stack.set_index(idx + 1);
- Node* n = d > 0 ? tp->in(idx) : tp->raw_out(idx);
-
- if (NotANode(n)) continue;
- // do not recurse through top or the root (would reach unrelated stuff)
- if (n->is_Root() || n->is_top()) continue;
- if (only_ctrl && !n->is_CFG()) continue;
+ GrowableArray <Node *> nstack(C->unique());
- if (!visited.test_set(n)) { // forward arc
- // Limit depth
- if (stack.size() < (uint)ABS(d)) {
- if (d < 0) n->dump();
- stack.push(n, 0);
- on_stack.set(n);
- }
- } else { // back or cross arc
- if (on_stack.test(n)) { // back arc
- // print loop if there are no phis or regions in the mix
- bool found_loop_breaker = false;
- int k;
- for (k = stack.size() - 1; k >= 0; k--) {
- Node* m = stack.node_at(k);
- if (m->is_Phi() || m->is_Region() || m->is_Root() || m->is_Start()) {
- found_loop_breaker = true;
- break;
- }
- if (m == n) // Found loop head
- break;
- }
- assert(k >= 0, "n must be on stack");
+ nstack.append(s);
+ int begin = 0;
+ int end = 0;
+ for(uint i = 0; i < depth; i++) {
+ end = nstack.length();
+ for(int j = begin; j < end; j++) {
+ Node* tp = nstack.at(j);
+ uint limit = direction > 0 ? tp->len() : tp->outcnt();
+ for(uint k = 0; k < limit; k++) {
+ Node* n = direction > 0 ? tp->in(k) : tp->raw_out(k);
- if (!found_loop_breaker) {
- tty->print("# %s LOOP FOUND:", only_ctrl ? "CONTROL" : "DATA");
- for (int i = stack.size() - 1; i >= k; i--) {
- Node* m = stack.node_at(i);
- bool mnew = C->node_arena()->contains(m);
- tty->print(" %s%d:%s", (mnew? "": "o"), m->_idx, m->Name());
- if (i != 0) tty->print(d > 0? " <-": " ->");
- }
- tty->cr();
- }
+ if (NotANode(n)) continue;
+ // do not recurse through top or the root (would reach unrelated stuff)
+ if (n->is_Root() || n->is_top()) continue;
+ if (only_ctrl && !n->is_CFG()) continue;
+
+ bool on_stack = nstack.contains(n);
+ if (!on_stack) {
+ nstack.append(n);
}
}
}
+ begin = end;
+ }
+ end = nstack.length();
+ if (direction > 0) {
+ for(int j = end-1; j >= 0; j--) {
+ nstack.at(j)->dump();
+ }
+ } else {
+ for(int j = 0; j < end; j++) {
+ nstack.at(j)->dump();
+ }
}
}
--- a/hotspot/src/share/vm/opto/node.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/node.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -91,6 +91,7 @@
class Node_Stack;
class NullCheckNode;
class OopMap;
+class ParmNode;
class PCTableNode;
class PhaseCCP;
class PhaseGVN;
@@ -105,6 +106,7 @@
class RegionNode;
class RootNode;
class SafePointNode;
+class SafePointScalarObjectNode;
class StartNode;
class State;
class StoreNode;
@@ -557,6 +559,7 @@
DEFINE_CLASS_ID(JumpProj, Proj, 1)
DEFINE_CLASS_ID(IfTrue, Proj, 2)
DEFINE_CLASS_ID(IfFalse, Proj, 3)
+ DEFINE_CLASS_ID(Parm, Proj, 4)
DEFINE_CLASS_ID(Region, Node, 3)
DEFINE_CLASS_ID(Loop, Region, 0)
@@ -573,6 +576,7 @@
DEFINE_CLASS_ID(ConstraintCast, Type, 1)
DEFINE_CLASS_ID(CheckCastPP, Type, 2)
DEFINE_CLASS_ID(CMove, Type, 3)
+ DEFINE_CLASS_ID(SafePointScalarObject, Type, 4)
DEFINE_CLASS_ID(Mem, Node, 6)
DEFINE_CLASS_ID(Load, Mem, 0)
@@ -712,12 +716,14 @@
DEFINE_CLASS_QUERY(Mul)
DEFINE_CLASS_QUERY(Multi)
DEFINE_CLASS_QUERY(MultiBranch)
+ DEFINE_CLASS_QUERY(Parm)
DEFINE_CLASS_QUERY(PCTable)
DEFINE_CLASS_QUERY(Phi)
DEFINE_CLASS_QUERY(Proj)
DEFINE_CLASS_QUERY(Region)
DEFINE_CLASS_QUERY(Root)
DEFINE_CLASS_QUERY(SafePoint)
+ DEFINE_CLASS_QUERY(SafePointScalarObject)
DEFINE_CLASS_QUERY(Start)
DEFINE_CLASS_QUERY(Store)
DEFINE_CLASS_QUERY(Sub)
@@ -811,6 +817,12 @@
// for the transformations to happen.
bool has_special_unique_user() const;
+ // Skip Proj and CatchProj nodes chains. Check for Null and Top.
+ Node* find_exact_control(Node* ctrl);
+
+ // Check if 'this' node dominates or equal to 'sub'.
+ bool dominates(Node* sub, Node_List &nlist);
+
protected:
bool remove_dead_region(PhaseGVN *phase, bool can_reshape);
public:
@@ -1322,7 +1334,6 @@
// Inline definition of Compile::record_for_igvn must be deferred to this point.
inline void Compile::record_for_igvn(Node* n) {
_for_igvn->push(n);
- record_for_escape_analysis(n);
}
//------------------------------Node_Stack-------------------------------------
@@ -1381,7 +1392,7 @@
_inode_top->indx = i;
}
uint size_max() const { return (uint)pointer_delta(_inode_max, _inodes, sizeof(INode)); } // Max size
- uint size() const { return (uint)pointer_delta(_inode_top, _inodes, sizeof(INode)) + 1; } // Current size
+ uint size() const { return (uint)pointer_delta((_inode_top+1), _inodes, sizeof(INode)); } // Current size
bool is_nonempty() const { return (_inode_top >= _inodes); }
bool is_empty() const { return (_inode_top < _inodes); }
void clear() { _inode_top = _inodes - 1; } // retain storage
--- a/hotspot/src/share/vm/opto/output.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/output.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -561,7 +561,30 @@
: new LocationValue(Location::new_stk_loc(l_type, ra->reg2offset(regnum)));
}
-void Compile::FillLocArray( int idx, Node *local, GrowableArray<ScopeValue*> *array ) {
+
+ObjectValue*
+Compile::sv_for_node_id(GrowableArray<ScopeValue*> *objs, int id) {
+ for (int i = 0; i < objs->length(); i++) {
+ assert(objs->at(i)->is_object(), "corrupt object cache");
+ ObjectValue* sv = (ObjectValue*) objs->at(i);
+ if (sv->id() == id) {
+ return sv;
+ }
+ }
+ // Otherwise..
+ return NULL;
+}
+
+void Compile::set_sv_for_object_node(GrowableArray<ScopeValue*> *objs,
+ ObjectValue* sv ) {
+ assert(sv_for_node_id(objs, sv->id()) == NULL, "Precondition");
+ objs->append(sv);
+}
+
+
+void Compile::FillLocArray( int idx, MachSafePointNode* sfpt, Node *local,
+ GrowableArray<ScopeValue*> *array,
+ GrowableArray<ScopeValue*> *objs ) {
assert( local, "use _top instead of null" );
if (array->length() != idx) {
assert(array->length() == idx + 1, "Unexpected array count");
@@ -578,6 +601,29 @@
}
const Type *t = local->bottom_type();
+ // Is it a safepoint scalar object node?
+ if (local->is_SafePointScalarObject()) {
+ SafePointScalarObjectNode* spobj = local->as_SafePointScalarObject();
+
+ ObjectValue* sv = Compile::sv_for_node_id(objs, spobj->_idx);
+ if (sv == NULL) {
+ ciKlass* cik = t->is_oopptr()->klass();
+ assert(cik->is_instance_klass() ||
+ cik->is_array_klass(), "Not supported allocation.");
+ sv = new ObjectValue(spobj->_idx,
+ new ConstantOopWriteValue(cik->encoding()));
+ Compile::set_sv_for_object_node(objs, sv);
+
+ uint first_ind = spobj->first_index();
+ for (uint i = 0; i < spobj->n_fields(); i++) {
+ Node* fld_node = sfpt->in(first_ind+i);
+ (void)FillLocArray(sv->field_values()->length(), sfpt, fld_node, sv->field_values(), objs);
+ }
+ }
+ array->append(sv);
+ return;
+ }
+
// Grab the register number for the local
OptoReg::Name regnum = _regalloc->get_reg_first(local);
if( OptoReg::is_valid(regnum) ) {// Got a register/stack?
@@ -755,6 +801,11 @@
JVMState* youngest_jvms = sfn->jvms();
int max_depth = youngest_jvms->depth();
+ // Allocate the object pool for scalar-replaced objects -- the map from
+ // small-integer keys (which can be recorded in the local and ostack
+ // arrays) to descriptions of the object state.
+ GrowableArray<ScopeValue*> *objs = new GrowableArray<ScopeValue*>();
+
// Visit scopes from oldest to youngest.
for (int depth = 1; depth <= max_depth; depth++) {
JVMState* jvms = youngest_jvms->of_depth(depth);
@@ -773,13 +824,13 @@
// Insert locals into the locarray
GrowableArray<ScopeValue*> *locarray = new GrowableArray<ScopeValue*>(num_locs);
for( idx = 0; idx < num_locs; idx++ ) {
- FillLocArray( idx, sfn->local(jvms, idx), locarray );
+ FillLocArray( idx, sfn, sfn->local(jvms, idx), locarray, objs );
}
// Insert expression stack entries into the exparray
GrowableArray<ScopeValue*> *exparray = new GrowableArray<ScopeValue*>(num_exps);
for( idx = 0; idx < num_exps; idx++ ) {
- FillLocArray( idx, sfn->stack(jvms, idx), exparray );
+ FillLocArray( idx, sfn, sfn->stack(jvms, idx), exparray, objs );
}
// Add in mappings of the monitors
@@ -803,7 +854,27 @@
// Create ScopeValue for object
ScopeValue *scval = NULL;
- if( !obj_node->is_Con() ) {
+
+ if( obj_node->is_SafePointScalarObject() ) {
+ SafePointScalarObjectNode* spobj = obj_node->as_SafePointScalarObject();
+ scval = Compile::sv_for_node_id(objs, spobj->_idx);
+ if (scval == NULL) {
+ const Type *t = obj_node->bottom_type();
+ ciKlass* cik = t->is_oopptr()->klass();
+ assert(cik->is_instance_klass() ||
+ cik->is_array_klass(), "Not supported allocation.");
+ ObjectValue* sv = new ObjectValue(spobj->_idx,
+ new ConstantOopWriteValue(cik->encoding()));
+ Compile::set_sv_for_object_node(objs, sv);
+
+ uint first_ind = spobj->first_index();
+ for (uint i = 0; i < spobj->n_fields(); i++) {
+ Node* fld_node = sfn->in(first_ind+i);
+ (void)FillLocArray(sv->field_values()->length(), sfn, fld_node, sv->field_values(), objs);
+ }
+ scval = sv;
+ }
+ } else if( !obj_node->is_Con() ) {
OptoReg::Name obj_reg = _regalloc->get_reg_first(obj_node);
scval = new_loc_value( _regalloc, obj_reg, Location::oop );
} else {
@@ -811,9 +882,13 @@
}
OptoReg::Name box_reg = BoxLockNode::stack_slot(box_node);
- monarray->append(new MonitorValue(scval, Location::new_stk_loc(Location::normal,_regalloc->reg2offset(box_reg))));
+ Location basic_lock = Location::new_stk_loc(Location::normal,_regalloc->reg2offset(box_reg));
+ monarray->append(new MonitorValue(scval, basic_lock, box_node->as_BoxLock()->is_eliminated()));
}
+ // We dump the object pool first, since deoptimization reads it in first.
+ debug_info()->dump_object_pool(objs);
+
// Build first class objects to pass to scope
DebugToken *locvals = debug_info()->create_scope_values(locarray);
DebugToken *expvals = debug_info()->create_scope_values(exparray);
@@ -823,6 +898,7 @@
ciMethod* scope_method = method ? method : _method;
// Describe the scope here
assert(jvms->bci() >= InvocationEntryBci && jvms->bci() <= 0x10000, "must be a valid or entry BCI");
+ // Now we can describe the scope.
debug_info()->describe_scope(safepoint_pc_offset,scope_method,jvms->bci(),locvals,expvals,monvals);
} // End jvms loop
@@ -921,11 +997,8 @@
// blown the code cache size.
C->record_failure("excessive request to CodeCache");
} else {
- UseInterpreter = true;
- UseCompiler = false;
- AlwaysCompileLoopMethods = false;
+ // Let CompilerBroker disable further compilations.
C->record_failure("CodeCache is full");
- warning("CodeCache is full. Compiling has been disabled");
}
}
--- a/hotspot/src/share/vm/opto/parse.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/parse.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -54,9 +54,9 @@
InlineTree *build_inline_tree_for_callee(ciMethod* callee_method,
JVMState* caller_jvms,
int caller_bci);
- const char* try_to_inline(ciMethod* callee_method, int caller_bci, ciCallProfile& profile, WarmCallInfo* wci_result);
- const char* shouldInline(ciMethod* callee_method, int caller_bci, ciCallProfile& profile, WarmCallInfo* wci_result) const;
- const char* shouldNotInline(ciMethod* callee_method, WarmCallInfo* wci_result) const;
+ const char* try_to_inline(ciMethod* callee_method, ciMethod* caller_method, int caller_bci, ciCallProfile& profile, WarmCallInfo* wci_result);
+ const char* shouldInline(ciMethod* callee_method, ciMethod* caller_method, int caller_bci, ciCallProfile& profile, WarmCallInfo* wci_result) const;
+ const char* shouldNotInline(ciMethod* callee_method, ciMethod* caller_method, WarmCallInfo* wci_result) const;
void print_inlining(ciMethod *callee_method, int caller_bci, const char *failure_msg) const PRODUCT_RETURN;
InlineTree *caller_tree() const { return _caller_tree; }
--- a/hotspot/src/share/vm/opto/parse1.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/parse1.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -1836,7 +1836,7 @@
PhiNode* phi = PhiNode::make(region, o, t);
gvn().set_type(phi, t);
- if (DoEscapeAnalysis) record_for_igvn(phi);
+ if (C->do_escape_analysis()) record_for_igvn(phi);
map->set_req(idx, phi);
return phi;
}
--- a/hotspot/src/share/vm/opto/parse2.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/parse2.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -885,6 +885,9 @@
void Parse::do_ifnull(BoolTest::mask btest) {
int target_bci = iter().get_dest();
+ Block* branch_block = successor_for_bci(target_bci);
+ Block* next_block = successor_for_bci(iter().next_bci());
+
float cnt;
float prob = branch_prediction(cnt, btest, target_bci);
if (prob == PROB_UNKNOWN) {
@@ -902,13 +905,16 @@
uncommon_trap(Deoptimization::Reason_unreached,
Deoptimization::Action_reinterpret,
NULL, "cold");
+ if (EliminateAutoBox) {
+ // Mark the successor blocks as parsed
+ branch_block->next_path_num();
+ next_block->next_path_num();
+ }
return;
}
// If this is a backwards branch in the bytecodes, add Safepoint
maybe_add_safepoint(target_bci);
- Block* branch_block = successor_for_bci(target_bci);
- Block* next_block = successor_for_bci(iter().next_bci());
explicit_null_checks_inserted++;
Node* a = null();
@@ -935,6 +941,10 @@
if (stopped()) { // Path is dead?
explicit_null_checks_elided++;
+ if (EliminateAutoBox) {
+ // Mark the successor block as parsed
+ branch_block->next_path_num();
+ }
} else { // Path is live.
// Update method data
profile_taken_branch(target_bci);
@@ -950,6 +960,10 @@
if (stopped()) { // Path is dead?
explicit_null_checks_elided++;
+ if (EliminateAutoBox) {
+ // Mark the successor block as parsed
+ next_block->next_path_num();
+ }
} else { // Path is live.
// Update method data
profile_not_taken_branch();
@@ -962,6 +976,9 @@
void Parse::do_if(BoolTest::mask btest, Node* c) {
int target_bci = iter().get_dest();
+ Block* branch_block = successor_for_bci(target_bci);
+ Block* next_block = successor_for_bci(iter().next_bci());
+
float cnt;
float prob = branch_prediction(cnt, btest, target_bci);
float untaken_prob = 1.0 - prob;
@@ -980,6 +997,11 @@
uncommon_trap(Deoptimization::Reason_unreached,
Deoptimization::Action_reinterpret,
NULL, "cold");
+ if (EliminateAutoBox) {
+ // Mark the successor blocks as parsed
+ branch_block->next_path_num();
+ next_block->next_path_num();
+ }
return;
}
@@ -1000,10 +1022,27 @@
Node* tst = _gvn.transform(tst0);
BoolTest::mask taken_btest = BoolTest::illegal;
BoolTest::mask untaken_btest = BoolTest::illegal;
- if (btest == BoolTest::ne) {
- // For now, these are the only cases of btest that matter. (More later.)
- taken_btest = taken_if_true ? btest : BoolTest::eq;
- untaken_btest = taken_if_true ? BoolTest::eq : btest;
+
+ if (tst->is_Bool()) {
+ // Refresh c from the transformed bool node, since it may be
+ // simpler than the original c. Also re-canonicalize btest.
+ // This wins when (Bool ne (Conv2B p) 0) => (Bool ne (CmpP p NULL)).
+ // That can arise from statements like: if (x instanceof C) ...
+ if (tst != tst0) {
+ // Canonicalize one more time since transform can change it.
+ btest = tst->as_Bool()->_test._test;
+ if (!BoolTest(btest).is_canonical()) {
+ // Reverse edges one more time...
+ tst = _gvn.transform( tst->as_Bool()->negate(&_gvn) );
+ btest = tst->as_Bool()->_test._test;
+ assert(BoolTest(btest).is_canonical(), "sanity");
+ taken_if_true = !taken_if_true;
+ }
+ c = tst->in(1);
+ }
+ BoolTest::mask neg_btest = BoolTest(btest).negate();
+ taken_btest = taken_if_true ? btest : neg_btest;
+ untaken_btest = taken_if_true ? neg_btest : btest;
}
// Generate real control flow
@@ -1018,15 +1057,17 @@
untaken_branch = tmp;
}
- Block* branch_block = successor_for_bci(target_bci);
- Block* next_block = successor_for_bci(iter().next_bci());
-
// Branch is taken:
{ PreserveJVMState pjvms(this);
taken_branch = _gvn.transform(taken_branch);
set_control(taken_branch);
- if (!stopped()) {
+ if (stopped()) {
+ if (EliminateAutoBox) {
+ // Mark the successor block as parsed
+ branch_block->next_path_num();
+ }
+ } else {
// Update method data
profile_taken_branch(target_bci);
adjust_map_after_if(taken_btest, c, prob, branch_block, next_block);
@@ -1039,7 +1080,12 @@
set_control(untaken_branch);
// Branch not taken.
- if (!stopped()) {
+ if (stopped()) {
+ if (EliminateAutoBox) {
+ // Mark the successor block as parsed
+ next_block->next_path_num();
+ }
+ } else {
// Update method data
profile_not_taken_branch();
adjust_map_after_if(untaken_btest, c, untaken_prob,
--- a/hotspot/src/share/vm/opto/phaseX.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/phaseX.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -587,11 +587,6 @@
Node_Notes* loc = C->locate_node_notes(nna, x->_idx, true);
loc->clear(); // do not put debug info on constants
}
- // Collect points-to information for escape analysys
- ConnectionGraph *cgr = C->congraph();
- if (cgr != NULL) {
- cgr->record_escape(x, this);
- }
} else {
x->destruct(); // Hit, destroy duplicate constant
x = k; // use existing constant
@@ -648,79 +643,9 @@
//=============================================================================
//------------------------------transform--------------------------------------
// Return a node which computes the same function as this node, but in a
-// faster or cheaper fashion. The Node passed in here must have no other
-// pointers to it, as its storage will be reclaimed if the Node can be
-// optimized away.
+// faster or cheaper fashion.
Node *PhaseGVN::transform( Node *n ) {
- NOT_PRODUCT( set_transforms(); )
-
- // Apply the Ideal call in a loop until it no longer applies
- Node *k = n;
- NOT_PRODUCT( uint loop_count = 0; )
- while( 1 ) {
- Node *i = k->Ideal(this, /*can_reshape=*/false);
- if( !i ) break;
- assert( i->_idx >= k->_idx, "Idealize should return new nodes, use Identity to return old nodes" );
- // Can never reclaim storage for Ideal calls, because the Ideal call
- // returns a new Node, bumping the High Water Mark and our old Node
- // is caught behind the new one.
- //if( k != i ) {
- //k->destruct(); // Reclaim storage for recent node
- k = i;
- //}
- assert(loop_count++ < K, "infinite loop in PhaseGVN::transform");
- }
- NOT_PRODUCT( if( loop_count != 0 ) { set_progress(); } )
-
- // If brand new node, make space in type array.
- ensure_type_or_null(k);
-
- // Cache result of Value call since it can be expensive
- // (abstract interpretation of node 'k' using phase->_types[ inputs ])
- const Type *t = k->Value(this); // Get runtime Value set
- assert(t != NULL, "value sanity");
- if (type_or_null(k) != t) {
-#ifndef PRODUCT
- // Do not record transformation or value construction on first visit
- if (type_or_null(k) == NULL) {
- inc_new_values();
- set_progress();
- }
-#endif
- set_type(k, t);
- // If k is a TypeNode, capture any more-precise type permanently into Node
- k->raise_bottom_type(t);
- }
-
- if( t->singleton() && !k->is_Con() ) {
- //k->destruct(); // Reclaim storage for recent node
- NOT_PRODUCT( set_progress(); )
- return makecon(t); // Turn into a constant
- }
-
- // Now check for Identities
- Node *i = k->Identity(this); // Look for a nearby replacement
- if( i != k ) { // Found? Return replacement!
- //k->destruct(); // Reclaim storage for recent node
- NOT_PRODUCT( set_progress(); )
- return i;
- }
-
- // Try Global Value Numbering
- i = hash_find_insert(k); // Found older value when i != NULL
- if( i && i != k ) { // Hit? Return the old guy
- NOT_PRODUCT( set_progress(); )
- return i;
- }
-
- // Collect points-to information for escape analysys
- ConnectionGraph *cgr = C->congraph();
- if (cgr != NULL) {
- cgr->record_escape(k, this);
- }
-
- // Return Idealized original
- return k;
+ return transform_no_reclaim(n);
}
//------------------------------transform--------------------------------------
@@ -1309,7 +1234,7 @@
uint use_op = use->Opcode();
// If changed Cast input, check Phi users for simple cycles
- if( use->is_ConstraintCast() || use->Opcode() == Op_CheckCastPP ) {
+ if( use->is_ConstraintCast() || use->is_CheckCastPP() ) {
for (DUIterator_Fast i2max, i2 = use->fast_outs(i2max); i2 < i2max; i2++) {
Node* u = use->fast_out(i2);
if (u->is_Phi())
--- a/hotspot/src/share/vm/opto/phaseX.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/phaseX.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -439,6 +439,13 @@
void add_users_to_worklist0( Node *n );
void add_users_to_worklist ( Node *n );
+ // Replace old node with new one.
+ void replace_node( Node *old, Node *nn ) {
+ add_users_to_worklist(old);
+ hash_delete(old);
+ subsume_node(old, nn);
+ }
+
#ifndef PRODUCT
protected:
// Sub-quadratic implementation of VerifyIterativeGVN.
--- a/hotspot/src/share/vm/opto/postaloc.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/postaloc.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -253,7 +253,8 @@
// nodes can represent the same constant so the type and rule of the
// MachNode must be checked to ensure equivalence.
//
-bool PhaseChaitin::eliminate_copy_of_constant(Node* val, Block *current_block,
+bool PhaseChaitin::eliminate_copy_of_constant(Node* val, Node* n,
+ Block *current_block,
Node_List& value, Node_List& regnd,
OptoReg::Name nreg, OptoReg::Name nreg2) {
if (value[nreg] != val && val->is_Con() &&
@@ -269,12 +270,12 @@
// Since they are equivalent the second one if redundant and can
// be removed.
//
- // val will be replaced with the old value but val might have
+ // n will be replaced with the old value but n might have
// kills projections associated with it so remove them now so that
// yank_if_dead will be able to elminate the copy once the uses
// have been transferred to the old[value].
- for (DUIterator_Fast imax, i = val->fast_outs(imax); i < imax; i++) {
- Node* use = val->fast_out(i);
+ for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) {
+ Node* use = n->fast_out(i);
if (use->is_Proj() && use->outcnt() == 0) {
// Kill projections have no users and one input
use->set_req(0, C->top());
@@ -521,7 +522,7 @@
// then 'n' is a useless copy. Do not update the register->node
// mapping so 'n' will go dead.
if( value[nreg] != val ) {
- if (eliminate_copy_of_constant(val, b, value, regnd, nreg, OptoReg::Bad)) {
+ if (eliminate_copy_of_constant(val, n, b, value, regnd, nreg, OptoReg::Bad)) {
n->replace_by(regnd[nreg]);
j -= yank_if_dead(n,b,&value,®nd);
} else {
@@ -549,7 +550,7 @@
nreg_lo = tmp.find_first_elem();
}
if( value[nreg] != val || value[nreg_lo] != val ) {
- if (eliminate_copy_of_constant(n, b, value, regnd, nreg, nreg_lo)) {
+ if (eliminate_copy_of_constant(val, n, b, value, regnd, nreg, nreg_lo)) {
n->replace_by(regnd[nreg]);
j -= yank_if_dead(n,b,&value,®nd);
} else {
--- a/hotspot/src/share/vm/opto/subnode.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/subnode.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -614,6 +614,13 @@
const TypeOopPtr* p0 = r0->isa_oopptr();
const TypeOopPtr* p1 = r1->isa_oopptr();
if (p0 && p1) {
+ Node* in1 = in(1)->uncast();
+ Node* in2 = in(2)->uncast();
+ AllocateNode* alloc1 = AllocateNode::Ideal_allocation(in1, NULL);
+ AllocateNode* alloc2 = AllocateNode::Ideal_allocation(in2, NULL);
+ if (MemNode::detect_ptr_independence(in1, alloc1, in2, alloc2, NULL)) {
+ return TypeInt::CC_GT; // different pointers
+ }
ciKlass* klass0 = p0->klass();
bool xklass0 = p0->klass_is_exact();
ciKlass* klass1 = p1->klass();
--- a/hotspot/src/share/vm/opto/superword.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/superword.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -159,7 +159,8 @@
Node_List memops;
for (int i = 0; i < _block.length(); i++) {
Node* n = _block.at(i);
- if (n->is_Mem() && in_bb(n)) {
+ if (n->is_Mem() && in_bb(n) &&
+ is_java_primitive(n->as_Mem()->memory_type())) {
int align = memory_alignment(n->as_Mem(), 0);
if (align != bottom_align) {
memops.push(n);
@@ -182,8 +183,8 @@
#ifndef PRODUCT
if (TraceSuperWord)
- tty->print_cr("\noffset = %d iv_adjustment = %d elt_align = %d",
- offset, iv_adjustment, align_to_ref_p.memory_size());
+ tty->print_cr("\noffset = %d iv_adjustment = %d elt_align = %d scale = %d iv_stride = %d",
+ offset, iv_adjustment, align_to_ref_p.memory_size(), align_to_ref_p.scale_in_bytes(), iv_stride());
#endif
// Set alignment relative to "align_to_ref"
@@ -570,7 +571,7 @@
int SuperWord::data_size(Node* s) {
const Type* t = velt_type(s);
BasicType bt = t->array_element_basic_type();
- int bsize = type2aelembytes[bt];
+ int bsize = type2aelembytes(bt);
assert(bsize != 0, "valid size");
return bsize;
}
@@ -1542,7 +1543,7 @@
Node *pre_opaq1 = pre_end->limit();
assert(pre_opaq1->Opcode() == Op_Opaque1, "");
Opaque1Node *pre_opaq = (Opaque1Node*)pre_opaq1;
- Node *pre_limit = pre_opaq->in(1);
+ Node *lim0 = pre_opaq->in(1);
// Where we put new limit calculations
Node *pre_ctrl = pre_end->loopnode()->in(LoopNode::EntryControl);
@@ -1554,64 +1555,116 @@
SWPointer align_to_ref_p(align_to_ref, this);
- // Let l0 == original pre_limit, l == new pre_limit, V == v_align
+ // Given:
+ // lim0 == original pre loop limit
+ // V == v_align (power of 2)
+ // invar == extra invariant piece of the address expression
+ // e == k [ +/- invar ]
+ //
+ // When reassociating expressions involving '%' the basic rules are:
+ // (a - b) % k == 0 => a % k == b % k
+ // and:
+ // (a + b) % k == 0 => a % k == (k - b) % k
+ //
+ // For stride > 0 && scale > 0,
+ // Derive the new pre-loop limit "lim" such that the two constraints:
+ // (1) lim = lim0 + N (where N is some positive integer < V)
+ // (2) (e + lim) % V == 0
+ // are true.
+ //
+ // Substituting (1) into (2),
+ // (e + lim0 + N) % V == 0
+ // solve for N:
+ // N = (V - (e + lim0)) % V
+ // substitute back into (1), so that new limit
+ // lim = lim0 + (V - (e + lim0)) % V
//
- // For stride > 0
- // Need l such that l > l0 && (l+k)%V == 0
- // Find n such that l = (l0 + n)
- // (l0 + n + k) % V == 0
- // n = [V - (l0 + k)%V]%V
- // new limit = l0 + [V - (l0 + k)%V]%V
- // For stride < 0
- // Need l such that l < l0 && (l+k)%V == 0
- // Find n such that l = (l0 - n)
- // (l0 - n + k) % V == 0
- // n = (l0 + k)%V
- // new limit = l0 - (l0 + k)%V
+ // For stride > 0 && scale < 0
+ // Constraints:
+ // lim = lim0 + N
+ // (e - lim) % V == 0
+ // Solving for lim:
+ // (e - lim0 - N) % V == 0
+ // N = (e - lim0) % V
+ // lim = lim0 + (e - lim0) % V
+ //
+ // For stride < 0 && scale > 0
+ // Constraints:
+ // lim = lim0 - N
+ // (e + lim) % V == 0
+ // Solving for lim:
+ // (e + lim0 - N) % V == 0
+ // N = (e + lim0) % V
+ // lim = lim0 - (e + lim0) % V
+ //
+ // For stride < 0 && scale < 0
+ // Constraints:
+ // lim = lim0 - N
+ // (e - lim) % V == 0
+ // Solving for lim:
+ // (e - lim0 + N) % V == 0
+ // N = (V - (e - lim0)) % V
+ // lim = lim0 - (V - (e - lim0)) % V
+ int stride = iv_stride();
+ int scale = align_to_ref_p.scale_in_bytes();
int elt_size = align_to_ref_p.memory_size();
int v_align = vector_width_in_bytes() / elt_size;
int k = align_to_ref_p.offset_in_bytes() / elt_size;
Node *kn = _igvn.intcon(k);
- Node *limk = new (_phase->C, 3) AddINode(pre_limit, kn);
- _phase->_igvn.register_new_node_with_optimizer(limk);
- _phase->set_ctrl(limk, pre_ctrl);
+
+ Node *e = kn;
if (align_to_ref_p.invar() != NULL) {
+ // incorporate any extra invariant piece producing k +/- invar >>> log2(elt)
Node* log2_elt = _igvn.intcon(exact_log2(elt_size));
Node* aref = new (_phase->C, 3) URShiftINode(align_to_ref_p.invar(), log2_elt);
_phase->_igvn.register_new_node_with_optimizer(aref);
_phase->set_ctrl(aref, pre_ctrl);
- if (!align_to_ref_p.negate_invar()) {
- limk = new (_phase->C, 3) AddINode(limk, aref);
+ if (align_to_ref_p.negate_invar()) {
+ e = new (_phase->C, 3) SubINode(e, aref);
} else {
- limk = new (_phase->C, 3) SubINode(limk, aref);
+ e = new (_phase->C, 3) AddINode(e, aref);
}
- _phase->_igvn.register_new_node_with_optimizer(limk);
- _phase->set_ctrl(limk, pre_ctrl);
+ _phase->_igvn.register_new_node_with_optimizer(e);
+ _phase->set_ctrl(e, pre_ctrl);
}
- Node* va_msk = _igvn.intcon(v_align - 1);
- Node* n = new (_phase->C, 3) AndINode(limk, va_msk);
- _phase->_igvn.register_new_node_with_optimizer(n);
- _phase->set_ctrl(n, pre_ctrl);
- Node* newlim;
- if (iv_stride() > 0) {
+
+ // compute e +/- lim0
+ if (scale < 0) {
+ e = new (_phase->C, 3) SubINode(e, lim0);
+ } else {
+ e = new (_phase->C, 3) AddINode(e, lim0);
+ }
+ _phase->_igvn.register_new_node_with_optimizer(e);
+ _phase->set_ctrl(e, pre_ctrl);
+
+ if (stride * scale > 0) {
+ // compute V - (e +/- lim0)
Node* va = _igvn.intcon(v_align);
- Node* adj = new (_phase->C, 3) SubINode(va, n);
- _phase->_igvn.register_new_node_with_optimizer(adj);
- _phase->set_ctrl(adj, pre_ctrl);
- Node* adj2 = new (_phase->C, 3) AndINode(adj, va_msk);
- _phase->_igvn.register_new_node_with_optimizer(adj2);
- _phase->set_ctrl(adj2, pre_ctrl);
- newlim = new (_phase->C, 3) AddINode(pre_limit, adj2);
+ e = new (_phase->C, 3) SubINode(va, e);
+ _phase->_igvn.register_new_node_with_optimizer(e);
+ _phase->set_ctrl(e, pre_ctrl);
+ }
+ // compute N = (exp) % V
+ Node* va_msk = _igvn.intcon(v_align - 1);
+ Node* N = new (_phase->C, 3) AndINode(e, va_msk);
+ _phase->_igvn.register_new_node_with_optimizer(N);
+ _phase->set_ctrl(N, pre_ctrl);
+
+ // substitute back into (1), so that new limit
+ // lim = lim0 + N
+ Node* lim;
+ if (stride < 0) {
+ lim = new (_phase->C, 3) SubINode(lim0, N);
} else {
- newlim = new (_phase->C, 3) SubINode(pre_limit, n);
+ lim = new (_phase->C, 3) AddINode(lim0, N);
}
- _phase->_igvn.register_new_node_with_optimizer(newlim);
- _phase->set_ctrl(newlim, pre_ctrl);
+ _phase->_igvn.register_new_node_with_optimizer(lim);
+ _phase->set_ctrl(lim, pre_ctrl);
Node* constrained =
- (iv_stride() > 0) ? (Node*) new (_phase->C,3) MinINode(newlim, orig_limit)
- : (Node*) new (_phase->C,3) MaxINode(newlim, orig_limit);
+ (stride > 0) ? (Node*) new (_phase->C,3) MinINode(lim, orig_limit)
+ : (Node*) new (_phase->C,3) MaxINode(lim, orig_limit);
_phase->_igvn.register_new_node_with_optimizer(constrained);
_phase->set_ctrl(constrained, pre_ctrl);
_igvn.hash_delete(pre_opaq);
--- a/hotspot/src/share/vm/opto/type.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/type.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -3164,7 +3164,7 @@
case TopPTR:
// Compute new klass on demand, do not use tap->_klass
xk = (tap->_klass_is_exact | this->_klass_is_exact);
- return make( ptr, const_oop(), tary, lazy_klass, xk, off );
+ return make( ptr, const_oop(), tary, lazy_klass, xk, off, iid );
case Constant: {
ciObject* o = const_oop();
if( _ptr == Constant ) {
@@ -3176,7 +3176,7 @@
o = tap->const_oop();
}
xk = true;
- return TypeAryPtr::make( ptr, o, tary, tap->_klass, xk, off );
+ return TypeAryPtr::make( ptr, o, tary, tap->_klass, xk, off, iid );
}
case NotNull:
case BotPTR:
@@ -3263,14 +3263,21 @@
break;
}
- st->print("*");
+ if( _offset != 0 ) {
+ int header_size = objArrayOopDesc::header_size() * wordSize;
+ if( _offset == OffsetTop ) st->print("+undefined");
+ else if( _offset == OffsetBot ) st->print("+any");
+ else if( _offset < header_size ) st->print("+%d", _offset);
+ else {
+ BasicType basic_elem_type = elem()->basic_type();
+ int array_base = arrayOopDesc::base_offset_in_bytes(basic_elem_type);
+ int elem_size = type2aelembytes(basic_elem_type);
+ st->print("[%d]", (_offset - array_base)/elem_size);
+ }
+ }
+ st->print(" *");
if (_instance_id != UNKNOWN_INSTANCE)
st->print(",iid=%d",_instance_id);
- if( !_offset ) return;
- if( _offset == OffsetTop ) st->print("+undefined");
- else if( _offset == OffsetBot ) st->print("+any");
- else if( _offset < 12 ) st->print("+%d",_offset);
- else st->print("[%d]", (_offset-12)/4 );
}
#endif
--- a/hotspot/src/share/vm/opto/type.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/type.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -686,6 +686,7 @@
bool klass_is_exact() const { return _klass_is_exact; }
bool is_instance() const { return _instance_id != UNKNOWN_INSTANCE; }
uint instance_id() const { return _instance_id; }
+ bool is_instance_field() const { return _instance_id != UNKNOWN_INSTANCE && _offset >= 0; }
virtual intptr_t get_con() const;
@@ -1070,6 +1071,7 @@
#define LShiftXNode LShiftLNode
// For object size computation:
#define AddXNode AddLNode
+#define RShiftXNode RShiftLNode
// For card marks and hashcodes
#define URShiftXNode URShiftLNode
// Opcodes
@@ -1108,6 +1110,7 @@
#define LShiftXNode LShiftINode
// For object size computation:
#define AddXNode AddINode
+#define RShiftXNode RShiftINode
// For card marks and hashcodes
#define URShiftXNode URShiftINode
// Opcodes
--- a/hotspot/src/share/vm/opto/vectornode.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/vectornode.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -135,7 +135,7 @@
int mid = lo + ct/2;
Node* n1 = ct == 2 ? in(lo) : binaryTreePack(C, lo, mid);
Node* n2 = ct == 2 ? in(lo+1) : binaryTreePack(C, mid, hi );
- int rslt_bsize = ct * type2aelembytes[elt_basic_type()];
+ int rslt_bsize = ct * type2aelembytes(elt_basic_type());
if (bottom_type()->is_floatingpoint()) {
switch (rslt_bsize) {
case 8: return new (C, 3) PackFNode(n1, n2);
--- a/hotspot/src/share/vm/opto/vectornode.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/opto/vectornode.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -48,7 +48,7 @@
uint length() const { return _length; } // Vector length
static uint max_vlen(BasicType bt) { // max vector length
- return (uint)(Matcher::vector_width_in_bytes() / type2aelembytes[bt]);
+ return (uint)(Matcher::vector_width_in_bytes() / type2aelembytes(bt));
}
// Element and vector type
@@ -392,7 +392,7 @@
virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(); }
virtual BasicType memory_type() const { return T_VOID; }
- virtual int memory_size() const { return length()*type2aelembytes[elt_basic_type()]; }
+ virtual int memory_size() const { return length()*type2aelembytes(elt_basic_type()); }
// Vector opcode from scalar opcode
static int opcode(int sopc, uint vlen);
@@ -620,7 +620,7 @@
virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(); }
virtual BasicType memory_type() const { return T_VOID; }
- virtual int memory_size() const { return length()*type2aelembytes[elt_basic_type()]; }
+ virtual int memory_size() const { return length()*type2aelembytes(elt_basic_type()); }
// Vector opcode from scalar opcode
static int opcode(int sopc, uint vlen);
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClassesTrace.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClassesTrace.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -64,7 +64,7 @@
// 0x01000000 | 16777216 - impl details: nmethod evolution info
// 0x02000000 | 33554432 - impl details: annotation updates
// 0x04000000 | 67108864 - impl details: StackMapTable updates
-// 0x08000000 | 134217728 - unused
+// 0x08000000 | 134217728 - impl details: OopMapCache updates
// 0x10000000 | 268435456 - unused
// 0x20000000 | 536870912 - unused
// 0x40000000 | 1073741824 - unused
--- a/hotspot/src/share/vm/runtime/arguments.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -924,10 +924,18 @@
void Arguments::set_parnew_gc_flags() {
assert(!UseSerialGC && !UseParallelGC, "control point invariant");
+ // Turn off AdaptiveSizePolicy by default for parnew until it is
+ // complete.
+ if (UseParNewGC &&
+ FLAG_IS_DEFAULT(UseAdaptiveSizePolicy)) {
+ FLAG_SET_DEFAULT(UseAdaptiveSizePolicy, false);
+ }
+
if (FLAG_IS_DEFAULT(UseParNewGC) && ParallelGCThreads > 1) {
FLAG_SET_DEFAULT(UseParNewGC, true);
} else if (UseParNewGC && ParallelGCThreads == 0) {
- FLAG_SET_DEFAULT(ParallelGCThreads, nof_parallel_gc_threads());
+ FLAG_SET_DEFAULT(ParallelGCThreads,
+ Abstract_VM_Version::parallel_worker_threads());
if (FLAG_IS_DEFAULT(ParallelGCThreads) && ParallelGCThreads == 1) {
FLAG_SET_DEFAULT(UseParNewGC, false);
}
@@ -956,25 +964,6 @@
}
}
-// CAUTION: this code is currently shared by UseParallelGC, UseParNewGC and
-// UseconcMarkSweepGC. Further tuning of individual collectors might
-// dictate refinement on a per-collector basis.
-int Arguments::nof_parallel_gc_threads() {
- if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
- // For very large machines, there are diminishing returns
- // for large numbers of worker threads. Instead of
- // hogging the whole system, use 5/8ths of a worker for every
- // processor after the first 8. For example, on a 72 cpu
- // machine use 8 + (72 - 8) * (5/8) == 48 worker threads.
- // This is just a start and needs further tuning and study in
- // Tiger.
- int ncpus = os::active_processor_count();
- return (ncpus <= 8) ? ncpus : 3 + ((ncpus * 5) / 8);
- } else {
- return ParallelGCThreads;
- }
-}
-
// Adjust some sizes to suit CMS and/or ParNew needs; these work well on
// sparc/solaris for certain applications, but would gain from
// further optimization and tuning efforts, and would almost
@@ -984,26 +973,24 @@
return;
}
+ assert(UseConcMarkSweepGC, "CMS is expected to be on here");
+
// If we are using CMS, we prefer to UseParNewGC,
// unless explicitly forbidden.
- if (UseConcMarkSweepGC && !UseParNewGC && FLAG_IS_DEFAULT(UseParNewGC)) {
- FLAG_SET_DEFAULT(UseParNewGC, true);
+ if (!UseParNewGC && FLAG_IS_DEFAULT(UseParNewGC)) {
+ FLAG_SET_ERGO(bool, UseParNewGC, true);
}
// Turn off AdaptiveSizePolicy by default for cms until it is
- // complete. Also turn it off in general if the
- // parnew collector has been selected.
- if ((UseConcMarkSweepGC || UseParNewGC) &&
- FLAG_IS_DEFAULT(UseAdaptiveSizePolicy)) {
+ // complete.
+ if (FLAG_IS_DEFAULT(UseAdaptiveSizePolicy)) {
FLAG_SET_DEFAULT(UseAdaptiveSizePolicy, false);
}
// In either case, adjust ParallelGCThreads and/or UseParNewGC
// as needed.
- set_parnew_gc_flags();
-
- if (!UseConcMarkSweepGC) {
- return;
+ if (UseParNewGC) {
+ set_parnew_gc_flags();
}
// Now make adjustments for CMS
@@ -1013,7 +1000,7 @@
intx tenuring_default;
if (CMSUseOldDefaults) { // old defaults: "old" as of 6.0
if FLAG_IS_DEFAULT(CMSYoungGenPerWorker) {
- FLAG_SET_DEFAULT(CMSYoungGenPerWorker, 4*M);
+ FLAG_SET_ERGO(intx, CMSYoungGenPerWorker, 4*M);
}
young_gen_per_worker = 4*M;
new_ratio = (intx)15;
@@ -1038,16 +1025,20 @@
// for "short" pauses ~ 4M*ParallelGCThreads
if (FLAG_IS_DEFAULT(MaxNewSize)) { // MaxNewSize not set at command-line
if (!FLAG_IS_DEFAULT(NewSize)) { // NewSize explicitly set at command-line
- FLAG_SET_DEFAULT(MaxNewSize, MAX2(NewSize, preferred_max_new_size));
+ FLAG_SET_ERGO(uintx, MaxNewSize, MAX2(NewSize, preferred_max_new_size));
} else {
- FLAG_SET_DEFAULT(MaxNewSize, preferred_max_new_size);
+ FLAG_SET_ERGO(uintx, MaxNewSize, preferred_max_new_size);
}
+ if(PrintGCDetails && Verbose) {
+ // Too early to use gclog_or_tty
+ tty->print_cr("Ergo set MaxNewSize: " SIZE_FORMAT, MaxNewSize);
+ }
}
// Unless explicitly requested otherwise, prefer a large
// Old to Young gen size so as to shift the collection load
// to the old generation concurrent collector
if (FLAG_IS_DEFAULT(NewRatio)) {
- FLAG_SET_DEFAULT(NewRatio, MAX2(NewRatio, new_ratio));
+ FLAG_SET_ERGO(intx, NewRatio, MAX2(NewRatio, new_ratio));
size_t min_new = align_size_up(ScaleForWordSize(min_new_default), os::vm_page_size());
size_t prev_initial_size = initial_heap_size();
@@ -1065,19 +1056,34 @@
size_t max_heap = align_size_down(MaxHeapSize,
CardTableRS::ct_max_alignment_constraint());
+ if(PrintGCDetails && Verbose) {
+ // Too early to use gclog_or_tty
+ tty->print_cr("CMS set min_heap_size: " SIZE_FORMAT
+ " initial_heap_size: " SIZE_FORMAT
+ " max_heap: " SIZE_FORMAT,
+ min_heap_size(), initial_heap_size(), max_heap);
+ }
if (max_heap > min_new) {
// Unless explicitly requested otherwise, make young gen
// at least min_new, and at most preferred_max_new_size.
if (FLAG_IS_DEFAULT(NewSize)) {
- FLAG_SET_DEFAULT(NewSize, MAX2(NewSize, min_new));
- FLAG_SET_DEFAULT(NewSize, MIN2(preferred_max_new_size, NewSize));
+ FLAG_SET_ERGO(uintx, NewSize, MAX2(NewSize, min_new));
+ FLAG_SET_ERGO(uintx, NewSize, MIN2(preferred_max_new_size, NewSize));
+ if(PrintGCDetails && Verbose) {
+ // Too early to use gclog_or_tty
+ tty->print_cr("Ergo set NewSize: " SIZE_FORMAT, NewSize);
+ }
}
// Unless explicitly requested otherwise, size old gen
// so that it's at least 3X of NewSize to begin with;
// later NewRatio will decide how it grows; see above.
if (FLAG_IS_DEFAULT(OldSize)) {
if (max_heap > NewSize) {
- FLAG_SET_DEFAULT(OldSize, MIN2(3*NewSize, max_heap - NewSize));
+ FLAG_SET_ERGO(uintx, OldSize, MIN2(3*NewSize, max_heap - NewSize));
+ if(PrintGCDetails && Verbose) {
+ // Too early to use gclog_or_tty
+ tty->print_cr("Ergo set OldSize: " SIZE_FORMAT, OldSize);
+ }
}
}
}
@@ -1086,14 +1092,14 @@
// promote all objects surviving "tenuring_default" scavenges.
if (FLAG_IS_DEFAULT(MaxTenuringThreshold) &&
FLAG_IS_DEFAULT(SurvivorRatio)) {
- FLAG_SET_DEFAULT(MaxTenuringThreshold, tenuring_default);
+ FLAG_SET_ERGO(intx, MaxTenuringThreshold, tenuring_default);
}
// If we decided above (or user explicitly requested)
// `promote all' (via MaxTenuringThreshold := 0),
// prefer minuscule survivor spaces so as not to waste
// space for (non-existent) survivors
if (FLAG_IS_DEFAULT(SurvivorRatio) && MaxTenuringThreshold == 0) {
- FLAG_SET_DEFAULT(SurvivorRatio, MAX2((intx)1024, SurvivorRatio));
+ FLAG_SET_ERGO(intx, SurvivorRatio, MAX2((intx)1024, SurvivorRatio));
}
// If OldPLABSize is set and CMSParPromoteBlocksToClaim is not,
// set CMSParPromoteBlocksToClaim equal to OldPLABSize.
@@ -1102,7 +1108,11 @@
// See CR 6362902.
if (!FLAG_IS_DEFAULT(OldPLABSize)) {
if (FLAG_IS_DEFAULT(CMSParPromoteBlocksToClaim)) {
- FLAG_SET_CMDLINE(uintx, CMSParPromoteBlocksToClaim, OldPLABSize);
+ // OldPLABSize is not the default value but CMSParPromoteBlocksToClaim
+ // is. In this situtation let CMSParPromoteBlocksToClaim follow
+ // the value (either from the command line or ergonomics) of
+ // OldPLABSize. Following OldPLABSize is an ergonomics decision.
+ FLAG_SET_ERGO(uintx, CMSParPromoteBlocksToClaim, OldPLABSize);
}
else {
// OldPLABSize and CMSParPromoteBlocksToClaim are both set.
@@ -1147,17 +1157,11 @@
FLAG_IS_DEFAULT(UseParallelGC)) {
if (should_auto_select_low_pause_collector()) {
FLAG_SET_ERGO(bool, UseConcMarkSweepGC, true);
- set_cms_and_parnew_gc_flags();
} else {
FLAG_SET_ERGO(bool, UseParallelGC, true);
}
no_shared_spaces();
}
-
- // This is here because the parallel collector could
- // have been selected so this initialization should
- // still be done.
- set_parallel_gc_flags();
}
}
@@ -1170,6 +1174,9 @@
// If no heap maximum was requested explicitly, use some reasonable fraction
// of the physical memory, up to a maximum of 1GB.
if (UseParallelGC) {
+ FLAG_SET_ERGO(uintx, ParallelGCThreads,
+ Abstract_VM_Version::parallel_worker_threads());
+
if (FLAG_IS_DEFAULT(MaxHeapSize)) {
const uint64_t reasonable_fraction =
os::physical_memory() / DefaultMaxRAMFraction;
@@ -1227,12 +1234,13 @@
if (UseParallelOldGC) {
// Par compact uses lower default values since they are treated as
- // minimums.
+ // minimums. These are different defaults because of the different
+ // interpretation and are not ergonomically set.
if (FLAG_IS_DEFAULT(MarkSweepDeadRatio)) {
- MarkSweepDeadRatio = 1;
+ FLAG_SET_DEFAULT(MarkSweepDeadRatio, 1);
}
if (FLAG_IS_DEFAULT(PermMarkSweepDeadRatio)) {
- PermMarkSweepDeadRatio = 5;
+ FLAG_SET_DEFAULT(PermMarkSweepDeadRatio, 5);
}
}
}
@@ -1254,13 +1262,30 @@
// Aggressive optimization flags -XX:+AggressiveOpts
void Arguments::set_aggressive_opts_flags() {
+#ifdef COMPILER2
+ if (AggressiveOpts || !FLAG_IS_DEFAULT(AutoBoxCacheMax)) {
+ if (FLAG_IS_DEFAULT(EliminateAutoBox)) {
+ FLAG_SET_DEFAULT(EliminateAutoBox, true);
+ }
+ if (FLAG_IS_DEFAULT(AutoBoxCacheMax)) {
+ FLAG_SET_DEFAULT(AutoBoxCacheMax, 20000);
+ }
+
+ // Feed the cache size setting into the JDK
+ char buffer[1024];
+ sprintf(buffer, "java.lang.Integer.IntegerCache.high=%d", AutoBoxCacheMax);
+ add_property(buffer);
+ }
+ if (AggressiveOpts && FLAG_IS_DEFAULT(DoEscapeAnalysis)) {
+ FLAG_SET_DEFAULT(DoEscapeAnalysis, true);
+ }
+#endif
+
if (AggressiveOpts) {
-NOT_WINDOWS(
- // No measured benefit on Windows
- if (FLAG_IS_DEFAULT(CacheTimeMillis)) {
- FLAG_SET_DEFAULT(CacheTimeMillis, true);
- }
-)
+// Sample flag setting code
+// if (FLAG_IS_DEFAULT(EliminateZeroing)) {
+// FLAG_SET_DEFAULT(EliminateZeroing, true);
+// }
}
}
@@ -1312,6 +1337,31 @@
UseParallelOldGC));
}
+// Check consistency of GC selection
+bool Arguments::check_gc_consistency() {
+ bool status = true;
+ // Ensure that the user has not selected conflicting sets
+ // of collectors. [Note: this check is merely a user convenience;
+ // collectors over-ride each other so that only a non-conflicting
+ // set is selected; however what the user gets is not what they
+ // may have expected from the combination they asked for. It's
+ // better to reduce user confusion by not allowing them to
+ // select conflicting combinations.
+ uint i = 0;
+ if (UseSerialGC) i++;
+ if (UseConcMarkSweepGC || UseParNewGC) i++;
+ if (UseParallelGC || UseParallelOldGC) i++;
+ if (i > 1) {
+ jio_fprintf(defaultStream::error_stream(),
+ "Conflicting collector combinations in option list; "
+ "please refer to the release notes for the combinations "
+ "allowed\n");
+ status = false;
+ }
+
+ return status;
+}
+
// Check the consistency of vm_init_args
bool Arguments::check_vm_args_consistency() {
// Method for adding checks for flag consistency.
@@ -1354,14 +1404,14 @@
status = false;
}
- status &= verify_percentage(MaxLiveObjectEvacuationRatio,
+ status = status && verify_percentage(MaxLiveObjectEvacuationRatio,
"MaxLiveObjectEvacuationRatio");
- status &= verify_percentage(AdaptiveSizePolicyWeight,
+ status = status && verify_percentage(AdaptiveSizePolicyWeight,
"AdaptiveSizePolicyWeight");
- status &= verify_percentage(AdaptivePermSizeWeight, "AdaptivePermSizeWeight");
- status &= verify_percentage(ThresholdTolerance, "ThresholdTolerance");
- status &= verify_percentage(MinHeapFreeRatio, "MinHeapFreeRatio");
- status &= verify_percentage(MaxHeapFreeRatio, "MaxHeapFreeRatio");
+ status = status && verify_percentage(AdaptivePermSizeWeight, "AdaptivePermSizeWeight");
+ status = status && verify_percentage(ThresholdTolerance, "ThresholdTolerance");
+ status = status && verify_percentage(MinHeapFreeRatio, "MinHeapFreeRatio");
+ status = status && verify_percentage(MaxHeapFreeRatio, "MaxHeapFreeRatio");
if (MinHeapFreeRatio > MaxHeapFreeRatio) {
jio_fprintf(defaultStream::error_stream(),
@@ -1377,14 +1427,14 @@
MarkSweepAlwaysCompactCount = 1; // Move objects every gc.
}
- status &= verify_percentage(GCHeapFreeLimit, "GCHeapFreeLimit");
- status &= verify_percentage(GCTimeLimit, "GCTimeLimit");
+ status = status && verify_percentage(GCHeapFreeLimit, "GCHeapFreeLimit");
+ status = status && verify_percentage(GCTimeLimit, "GCTimeLimit");
if (GCTimeLimit == 100) {
// Turn off gc-overhead-limit-exceeded checks
FLAG_SET_DEFAULT(UseGCOverheadLimit, false);
}
- status &= verify_percentage(GCHeapFreeLimit, "GCHeapFreeLimit");
+ status = status && verify_percentage(GCHeapFreeLimit, "GCHeapFreeLimit");
// Check user specified sharing option conflict with Parallel GC
bool cannot_share = (UseConcMarkSweepGC || UseParallelGC ||
@@ -1402,24 +1452,7 @@
}
}
- // Ensure that the user has not selected conflicting sets
- // of collectors. [Note: this check is merely a user convenience;
- // collectors over-ride each other so that only a non-conflicting
- // set is selected; however what the user gets is not what they
- // may have expected from the combination they asked for. It's
- // better to reduce user confusion by not allowing them to
- // select conflicting combinations.
- uint i = 0;
- if (UseSerialGC) i++;
- if (UseConcMarkSweepGC || UseParNewGC) i++;
- if (UseParallelGC || UseParallelOldGC) i++;
- if (i > 1) {
- jio_fprintf(defaultStream::error_stream(),
- "Conflicting collector combinations in option list; "
- "please refer to the release notes for the combinations "
- "allowed\n");
- status = false;
- }
+ status = status && check_gc_consistency();
if (_has_alloc_profile) {
if (UseParallelGC || UseParallelOldGC) {
@@ -1451,15 +1484,15 @@
"allocation buffers\n(-XX:+UseTLAB).\n");
status = false;
} else {
- status &= verify_percentage(CMSIncrementalDutyCycle,
+ status = status && verify_percentage(CMSIncrementalDutyCycle,
"CMSIncrementalDutyCycle");
- status &= verify_percentage(CMSIncrementalDutyCycleMin,
+ status = status && verify_percentage(CMSIncrementalDutyCycleMin,
"CMSIncrementalDutyCycleMin");
- status &= verify_percentage(CMSIncrementalSafetyFactor,
+ status = status && verify_percentage(CMSIncrementalSafetyFactor,
"CMSIncrementalSafetyFactor");
- status &= verify_percentage(CMSIncrementalOffset,
+ status = status && verify_percentage(CMSIncrementalOffset,
"CMSIncrementalOffset");
- status &= verify_percentage(CMSExpAvgFactor,
+ status = status && verify_percentage(CMSExpAvgFactor,
"CMSExpAvgFactor");
// If it was not set on the command line, set
// CMSInitiatingOccupancyFraction to 1 so icms can initiate cycles early.
@@ -2064,7 +2097,8 @@
// Enable parallel GC and adaptive generation sizing
FLAG_SET_CMDLINE(bool, UseParallelGC, true);
- FLAG_SET_DEFAULT(ParallelGCThreads, nof_parallel_gc_threads());
+ FLAG_SET_DEFAULT(ParallelGCThreads,
+ Abstract_VM_Version::parallel_worker_threads());
// Encourage steady state memory management
FLAG_SET_CMDLINE(uintx, ThresholdTolerance, 100);
@@ -2451,15 +2485,25 @@
no_shared_spaces();
#endif // KERNEL
- // Set some flags for ParallelGC if needed.
- set_parallel_gc_flags();
-
- // Set some flags for CMS and/or ParNew collectors, as needed.
- set_cms_and_parnew_gc_flags();
-
// Set flags based on ergonomics.
set_ergonomics_flags();
+ // Check the GC selections again.
+ if (!check_gc_consistency()) {
+ return JNI_EINVAL;
+ }
+
+ if (UseParallelGC || UseParallelOldGC) {
+ // Set some flags for ParallelGC if needed.
+ set_parallel_gc_flags();
+ } else if (UseConcMarkSweepGC) {
+ // Set some flags for CMS
+ set_cms_and_parnew_gc_flags();
+ } else if (UseParNewGC) {
+ // Set some flags for ParNew
+ set_parnew_gc_flags();
+ }
+
#ifdef SERIALGC
assert(verify_serial_gc_flags(), "SerialGC unset");
#endif // SERIALGC
@@ -2479,6 +2523,12 @@
CommandLineFlags::printSetFlags();
}
+#ifdef ASSERT
+ if (PrintFlagsFinal) {
+ CommandLineFlags::printFlags();
+ }
+#endif
+
return JNI_OK;
}
--- a/hotspot/src/share/vm/runtime/arguments.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/arguments.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -291,8 +291,6 @@
static bool _CIDynamicCompilePriority;
static intx _Tier2CompileThreshold;
- // GC processing
- static int nof_parallel_gc_threads();
// CMS/ParNew garbage collectors
static void set_parnew_gc_flags();
static void set_cms_and_parnew_gc_flags();
@@ -385,6 +383,8 @@
public:
// Parses the arguments
static jint parse(const JavaVMInitArgs* args);
+ // Check for consistency in the selection of the garbage collector.
+ static bool check_gc_consistency();
// Check consistecy or otherwise of VM argument settings
static bool check_vm_args_consistency();
// Used by os_solaris
--- a/hotspot/src/share/vm/runtime/biasedLocking.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/biasedLocking.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,3 @@
-
/*
* Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -37,9 +36,14 @@
}
class VM_EnableBiasedLocking: public VM_Operation {
+ private:
+ bool _is_cheap_allocated;
public:
- VM_EnableBiasedLocking() {}
- VMOp_Type type() const { return VMOp_EnableBiasedLocking; }
+ VM_EnableBiasedLocking(bool is_cheap_allocated) { _is_cheap_allocated = is_cheap_allocated; }
+ VMOp_Type type() const { return VMOp_EnableBiasedLocking; }
+ Mode evaluation_mode() const { return _is_cheap_allocated ? _async_safepoint : _safepoint; }
+ bool is_cheap_allocated() const { return _is_cheap_allocated; }
+
void doit() {
// Iterate the system dictionary enabling biased locking for all
// currently loaded classes
@@ -62,8 +66,10 @@
EnableBiasedLockingTask(size_t interval_time) : PeriodicTask(interval_time) {}
virtual void task() {
- VM_EnableBiasedLocking op;
- VMThread::execute(&op);
+ // Use async VM operation to avoid blocking the Watcher thread.
+ // VM Thread will free C heap storage.
+ VM_EnableBiasedLocking *op = new VM_EnableBiasedLocking(true);
+ VMThread::execute(op);
// Reclaim our storage and disenroll ourself
delete this;
@@ -84,7 +90,7 @@
EnableBiasedLockingTask* task = new EnableBiasedLockingTask(BiasedLockingStartupDelay);
task->enroll();
} else {
- VM_EnableBiasedLocking op;
+ VM_EnableBiasedLocking op(false);
VMThread::execute(&op);
}
}
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -141,41 +141,53 @@
#ifdef COMPILER2
// Reallocate the non-escaping objects and restore their fields. Then
// relock objects if synchronization on them was eliminated.
- if (DoEscapeAnalysis && EliminateAllocations) {
- GrowableArray<ScopeValue*>* objects = chunk->at(0)->scope()->objects();
- bool reallocated = false;
- if (objects != NULL) {
- JRT_BLOCK
- reallocated = realloc_objects(thread, &deoptee, objects, THREAD);
- JRT_END
- }
- if (reallocated) {
- reassign_fields(&deoptee, &map, objects);
-#ifndef PRODUCT
- if (TraceDeoptimization) {
- ttyLocker ttyl;
- tty->print_cr("REALLOC OBJECTS in thread " INTPTR_FORMAT, thread);
- print_objects(objects);
+ if (DoEscapeAnalysis) {
+ if (EliminateAllocations) {
+ assert (chunk->at(0)->scope() != NULL,"expect only compiled java frames");
+ GrowableArray<ScopeValue*>* objects = chunk->at(0)->scope()->objects();
+ bool reallocated = false;
+ if (objects != NULL) {
+ JRT_BLOCK
+ reallocated = realloc_objects(thread, &deoptee, objects, THREAD);
+ JRT_END
}
-#endif
- }
- for (int i = 0; i < chunk->length(); i++) {
- GrowableArray<MonitorValue*>* monitors = chunk->at(i)->scope()->monitors();
- if (monitors != NULL) {
- relock_objects(&deoptee, &map, monitors);
+ if (reallocated) {
+ reassign_fields(&deoptee, &map, objects);
#ifndef PRODUCT
if (TraceDeoptimization) {
ttyLocker ttyl;
- tty->print_cr("RELOCK OBJECTS in thread " INTPTR_FORMAT, thread);
- for (int j = 0; i < monitors->length(); i++) {
- MonitorValue* mv = monitors->at(i);
- if (mv->eliminated()) {
- StackValue* owner = StackValue::create_stack_value(&deoptee, &map, mv->owner());
- tty->print_cr(" object <" INTPTR_FORMAT "> locked", owner->get_obj()());
+ tty->print_cr("REALLOC OBJECTS in thread " INTPTR_FORMAT, thread);
+ print_objects(objects);
+ }
+#endif
+ }
+ }
+ if (EliminateLocks) {
+#ifndef PRODUCT
+ bool first = true;
+#endif
+ for (int i = 0; i < chunk->length(); i++) {
+ compiledVFrame* cvf = chunk->at(i);
+ assert (cvf->scope() != NULL,"expect only compiled java frames");
+ GrowableArray<MonitorInfo*>* monitors = cvf->monitors();
+ if (monitors->is_nonempty()) {
+ relock_objects(monitors, thread);
+#ifndef PRODUCT
+ if (TraceDeoptimization) {
+ ttyLocker ttyl;
+ for (int j = 0; j < monitors->length(); j++) {
+ MonitorInfo* mi = monitors->at(j);
+ if (mi->eliminated()) {
+ if (first) {
+ first = false;
+ tty->print_cr("RELOCK OBJECTS in thread " INTPTR_FORMAT, thread);
+ }
+ tty->print_cr(" object <" INTPTR_FORMAT "> locked", mi->owner());
+ }
}
}
+#endif
}
-#endif
}
}
}
@@ -656,6 +668,7 @@
void do_field(fieldDescriptor* fd) {
+ intptr_t val;
StackValue* value =
StackValue::create_stack_value(_fr, _reg_map, _sv->field_at(i()));
int offset = fd->offset();
@@ -669,24 +682,36 @@
assert(value->type() == T_INT, "Agreement.");
StackValue* low =
StackValue::create_stack_value(_fr, _reg_map, _sv->field_at(++_i));
+#ifdef _LP64
+ jlong res = (jlong)low->get_int();
+#else
+#ifdef SPARC
+ // For SPARC we have to swap high and low words.
+ jlong res = jlong_from((jint)low->get_int(), (jint)value->get_int());
+#else
jlong res = jlong_from((jint)value->get_int(), (jint)low->get_int());
+#endif //SPARC
+#endif
_obj->long_field_put(offset, res);
break;
}
-
+ // Have to cast to INT (32 bits) pointer to avoid little/big-endian problem.
case T_INT: case T_FLOAT: // 4 bytes.
assert(value->type() == T_INT, "Agreement.");
- _obj->int_field_put(offset, (jint)value->get_int());
+ val = value->get_int();
+ _obj->int_field_put(offset, (jint)*((jint*)&val));
break;
case T_SHORT: case T_CHAR: // 2 bytes
assert(value->type() == T_INT, "Agreement.");
- _obj->short_field_put(offset, (jshort)value->get_int());
+ val = value->get_int();
+ _obj->short_field_put(offset, (jshort)*((jint*)&val));
break;
- case T_BOOLEAN: // 1 byte
+ case T_BOOLEAN: case T_BYTE: // 1 byte
assert(value->type() == T_INT, "Agreement.");
- _obj->bool_field_put(offset, (jboolean)value->get_int());
+ val = value->get_int();
+ _obj->bool_field_put(offset, (jboolean)*((jint*)&val));
break;
default:
@@ -698,25 +723,49 @@
// restore elements of an eliminated type array
void Deoptimization::reassign_type_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, typeArrayOop obj, BasicType type) {
- StackValue* low;
- jlong lval;
int index = 0;
+ intptr_t val;
for (int i = 0; i < sv->field_size(); i++) {
StackValue* value = StackValue::create_stack_value(fr, reg_map, sv->field_at(i));
switch(type) {
- case T_BOOLEAN: obj->bool_at_put (index, (jboolean) value->get_int()); break;
- case T_BYTE: obj->byte_at_put (index, (jbyte) value->get_int()); break;
- case T_CHAR: obj->char_at_put (index, (jchar) value->get_int()); break;
- case T_SHORT: obj->short_at_put(index, (jshort) value->get_int()); break;
- case T_INT: obj->int_at_put (index, (jint) value->get_int()); break;
- case T_FLOAT: obj->float_at_put(index, (jfloat) value->get_int()); break;
- case T_LONG:
- case T_DOUBLE:
- low = StackValue::create_stack_value(fr, reg_map, sv->field_at(++i));
- lval = jlong_from((jint)value->get_int(), (jint)low->get_int());
- sv->value()->long_field_put(index, lval);
- break;
+ case T_LONG: case T_DOUBLE: {
+ assert(value->type() == T_INT, "Agreement.");
+ StackValue* low =
+ StackValue::create_stack_value(fr, reg_map, sv->field_at(++i));
+#ifdef _LP64
+ jlong res = (jlong)low->get_int();
+#else
+#ifdef SPARC
+ // For SPARC we have to swap high and low words.
+ jlong res = jlong_from((jint)low->get_int(), (jint)value->get_int());
+#else
+ jlong res = jlong_from((jint)value->get_int(), (jint)low->get_int());
+#endif //SPARC
+#endif
+ obj->long_at_put(index, res);
+ break;
+ }
+
+ // Have to cast to INT (32 bits) pointer to avoid little/big-endian problem.
+ case T_INT: case T_FLOAT: // 4 bytes.
+ assert(value->type() == T_INT, "Agreement.");
+ val = value->get_int();
+ obj->int_at_put(index, (jint)*((jint*)&val));
+ break;
+
+ case T_SHORT: case T_CHAR: // 2 bytes
+ assert(value->type() == T_INT, "Agreement.");
+ val = value->get_int();
+ obj->short_at_put(index, (jshort)*((jint*)&val));
+ break;
+
+ case T_BOOLEAN: case T_BYTE: // 1 byte
+ assert(value->type() == T_INT, "Agreement.");
+ val = value->get_int();
+ obj->bool_at_put(index, (jboolean)*((jint*)&val));
+ break;
+
default:
ShouldNotReachHere();
}
@@ -758,18 +807,27 @@
// relock objects for which synchronization was eliminated
-void Deoptimization::relock_objects(frame* fr, RegisterMap* reg_map, GrowableArray<MonitorValue*>* monitors) {
+void Deoptimization::relock_objects(GrowableArray<MonitorInfo*>* monitors, JavaThread* thread) {
for (int i = 0; i < monitors->length(); i++) {
- MonitorValue* mv = monitors->at(i);
- StackValue* owner = StackValue::create_stack_value(fr, reg_map, mv->owner());
- if (mv->eliminated()) {
- Handle obj = owner->get_obj();
- assert(obj.not_null(), "reallocation was missed");
- BasicLock* lock = StackValue::resolve_monitor_lock(fr, mv->basic_lock());
- lock->set_displaced_header(obj->mark());
- obj->set_mark((markOop) lock);
+ MonitorInfo* mon_info = monitors->at(i);
+ if (mon_info->eliminated()) {
+ assert(mon_info->owner() != NULL, "reallocation was missed");
+ Handle obj = Handle(mon_info->owner());
+ markOop mark = obj->mark();
+ if (UseBiasedLocking && mark->has_bias_pattern()) {
+ // New allocated objects may have the mark set to anonymously biased.
+ // Also the deoptimized method may called methods with synchronization
+ // where the thread-local object is bias locked to the current thread.
+ assert(mark->is_biased_anonymously() ||
+ mark->biased_locker() == thread, "should be locked to current thread");
+ // Reset mark word to unbiased prototype.
+ markOop unbiased_prototype = markOopDesc::prototype()->set_age(mark->age());
+ obj->set_mark(unbiased_prototype);
+ }
+ BasicLock* lock = mon_info->lock();
+ ObjectSynchronizer::slow_enter(obj, lock, thread);
}
- assert(owner->get_obj()->is_locked(), "object must be locked now");
+ assert(mon_info->owner()->is_locked(), "object must be locked now");
}
}
@@ -875,7 +933,7 @@
GrowableArray<MonitorInfo*>* monitors = cvf->monitors();
for (int i = 0; i < monitors->length(); i++) {
MonitorInfo* mon_info = monitors->at(i);
- if (mon_info->owner() != NULL) {
+ if (mon_info->owner() != NULL && !mon_info->eliminated()) {
objects_to_revoke->append(Handle(mon_info->owner()));
}
}
--- a/hotspot/src/share/vm/runtime/deoptimization.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/deoptimization.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -105,7 +105,7 @@
static void reassign_type_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, typeArrayOop obj, BasicType type);
static void reassign_object_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, objArrayOop obj);
static void reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects);
- static void relock_objects(frame* fr, RegisterMap* reg_map, GrowableArray<MonitorValue*>* monitors);
+ static void relock_objects(GrowableArray<MonitorInfo*>* monitors, JavaThread* thread);
NOT_PRODUCT(static void print_objects(GrowableArray<ScopeValue*>* objects);)
#endif // COMPILER2
--- a/hotspot/src/share/vm/runtime/globals.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/globals.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -205,6 +205,18 @@
return (f->origin == DEFAULT);
}
+bool CommandLineFlagsEx::is_ergo(CommandLineFlag flag) {
+ assert((size_t)flag < Flag::numFlags, "bad command line flag index");
+ Flag* f = &Flag::flags[flag];
+ return (f->origin == ERGONOMIC);
+}
+
+bool CommandLineFlagsEx::is_cmdline(CommandLineFlag flag) {
+ assert((size_t)flag < Flag::numFlags, "bad command line flag index");
+ Flag* f = &Flag::flags[flag];
+ return (f->origin == COMMAND_LINE);
+}
+
bool CommandLineFlags::wasSetOnCmdline(const char* name, bool* value) {
Flag* result = Flag::find_flag((char*)name, strlen(name));
if (result == NULL) return false;
--- a/hotspot/src/share/vm/runtime/globals.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/globals.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -344,12 +344,6 @@
product(bool, ForceTimeHighResolution, false, \
"Using high time resolution(For Win32 only)") \
\
- product(bool, CacheTimeMillis, false, \
- "Cache os::javaTimeMillis with CacheTimeMillisGranularity") \
- \
- diagnostic(uintx, CacheTimeMillisGranularity, 50, \
- "Granularity for CacheTimeMillis") \
- \
develop(bool, TraceItables, false, \
"Trace initialization and use of itables") \
\
@@ -586,7 +580,7 @@
develop(bool, ZapJNIHandleArea, trueInDebug, \
"Zap freed JNI handle space with 0xFEFEFEFE") \
\
- develop(bool, ZapUnusedHeapArea, trueInDebug, \
+ develop(bool, ZapUnusedHeapArea, false, \
"Zap unused heap space with 0xBAADBABE") \
\
develop(bool, PrintVMMessages, true, \
@@ -949,6 +943,12 @@
product(bool, UseXmmRegToRegMoveAll, false, \
"Copy all XMM register bits when moving value between registers") \
\
+ product(bool, UseXmmI2D, false, \
+ "Use SSE2 CVTDQ2PD instruction to convert Integer to Double") \
+ \
+ product(bool, UseXmmI2F, false, \
+ "Use SSE2 CVTDQ2PS instruction to convert Integer to Float") \
+ \
product(intx, FieldsAllocationStyle, 1, \
"0 - type based with oops first, 1 - with oops last") \
\
@@ -1794,6 +1794,9 @@
"number of times a GC thread (minus the coordinator) " \
"will sleep while yielding before giving up and resuming GC") \
\
+ notproduct(bool, PrintFlagsFinal, false, \
+ "Print all command line flags after argument processing") \
+ \
/* gc tracing */ \
manageable(bool, PrintGC, false, \
"Print message at garbage collect") \
--- a/hotspot/src/share/vm/runtime/globals_extension.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/globals_extension.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -154,6 +154,8 @@
} CommandLineFlagWithType;
#define FLAG_IS_DEFAULT(name) (CommandLineFlagsEx::is_default(FLAG_MEMBER(name)))
+#define FLAG_IS_ERGO(name) (CommandLineFlagsEx::is_ergo(FLAG_MEMBER(name)))
+#define FLAG_IS_CMDLINE(name) (CommandLineFlagsEx::is_cmdline(FLAG_MEMBER(name)))
#define FLAG_SET_DEFAULT(name, value) ((name) = (value))
@@ -171,4 +173,6 @@
static void ccstrAtPut(CommandLineFlagWithType flag, ccstr value, FlagValueOrigin origin);
static bool is_default(CommandLineFlag flag);
+ static bool is_ergo(CommandLineFlag flag);
+ static bool is_cmdline(CommandLineFlag flag);
};
--- a/hotspot/src/share/vm/runtime/java.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/java.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -390,11 +390,6 @@
StatSampler::disengage();
StatSampler::destroy();
- // shut down the TimeMillisUpdateTask
- if (CacheTimeMillis) {
- TimeMillisUpdateTask::disengage();
- }
-
#ifndef SERIALGC
// stop CMS threads
if (UseConcMarkSweepGC) {
--- a/hotspot/src/share/vm/runtime/mutex.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/mutex.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -1119,10 +1119,15 @@
assert ((UNS(_owner)|UNS(_LockWord.FullWord)|UNS(_EntryList)|UNS(_WaitSet)|UNS(_OnDeck)) == 0, "") ;
}
-void Monitor::ClearMonitor (Monitor * m) {
+void Monitor::ClearMonitor (Monitor * m, const char *name) {
m->_owner = NULL ;
m->_snuck = false ;
- m->_name = "UNKNOWN" ;
+ if (name == NULL) {
+ strcpy(m->_name, "UNKNOWN") ;
+ } else {
+ strncpy(m->_name, name, MONITOR_NAME_LEN - 1);
+ m->_name[MONITOR_NAME_LEN - 1] = '\0';
+ }
m->_LockWord.FullWord = 0 ;
m->_EntryList = NULL ;
m->_OnDeck = NULL ;
@@ -1133,7 +1138,7 @@
Monitor::Monitor() { ClearMonitor(this); }
Monitor::Monitor (int Rank, const char * name, bool allow_vm_block) {
- ClearMonitor (this) ;
+ ClearMonitor (this, name) ;
#ifdef ASSERT
_allow_vm_block = allow_vm_block;
_rank = Rank ;
@@ -1145,7 +1150,7 @@
}
Mutex::Mutex (int Rank, const char * name, bool allow_vm_block) {
- ClearMonitor ((Monitor *) this) ;
+ ClearMonitor ((Monitor *) this, name) ;
#ifdef ASSERT
_allow_vm_block = allow_vm_block;
_rank = Rank ;
--- a/hotspot/src/share/vm/runtime/mutex.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/mutex.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -82,6 +82,9 @@
// *in that order*. If their implementations change such that these
// assumptions are violated, a whole lot of code will break.
+// The default length of monitor name is choosen to be 64 to avoid false sharing.
+static const int MONITOR_NAME_LEN = 64;
+
class Monitor : public CHeapObj {
public:
@@ -126,9 +129,8 @@
volatile intptr_t _WaitLock [1] ; // Protects _WaitSet
ParkEvent * volatile _WaitSet ; // LL of ParkEvents
volatile bool _snuck; // Used for sneaky locking (evil).
- const char * _name; // Name of mutex
int NotifyCount ; // diagnostic assist
- double pad [8] ; // avoid false sharing
+ char _name[MONITOR_NAME_LEN]; // Name of mutex
// Debugging fields for naming, deadlock detection, etc. (some only used in debug mode)
#ifndef PRODUCT
@@ -170,7 +172,7 @@
int ILocked () ;
protected:
- static void ClearMonitor (Monitor * m) ;
+ static void ClearMonitor (Monitor * m, const char* name = NULL) ;
Monitor() ;
public:
--- a/hotspot/src/share/vm/runtime/mutexLocker.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/mutexLocker.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -188,10 +188,6 @@
def(Safepoint_lock , Monitor, safepoint, true ); // locks SnippetCache_lock/Threads_lock
- if (!UseMembar) {
- def(SerializePage_lock , Monitor, leaf, true );
- }
-
def(Threads_lock , Monitor, barrier, true );
def(VMOperationQueue_lock , Monitor, nonleaf, true ); // VM_thread allowed to block on these
--- a/hotspot/src/share/vm/runtime/mutexLocker.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/mutexLocker.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -52,7 +52,6 @@
extern Monitor* VMOperationQueue_lock; // a lock on queue of vm_operations waiting to execute
extern Monitor* VMOperationRequest_lock; // a lock on Threads waiting for a vm_operation to terminate
extern Monitor* Safepoint_lock; // a lock used by the safepoint abstraction
-extern Monitor* SerializePage_lock; // a lock used when VMThread changing serialize memory page permission during safepoint
extern Monitor* Threads_lock; // a lock on the Threads table of active Java threads
// (also used by Safepoints too to block threads creation/destruction)
extern Monitor* CGC_lock; // used for coordination between
--- a/hotspot/src/share/vm/runtime/os.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/os.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -33,9 +33,6 @@
uintptr_t os::_serialize_page_mask = 0;
long os::_rand_seed = 1;
int os::_processor_count = 0;
-volatile jlong os::_global_time = 0;
-volatile int os::_global_time_lock = 0;
-bool os::_use_global_time = false;
size_t os::_page_sizes[os::page_sizes_max];
#ifndef PRODUCT
@@ -44,74 +41,6 @@
int os::num_frees = 0; // # of calls to free
#endif
-// Atomic read of a jlong is assured by a seqlock; see update_global_time()
-jlong os::read_global_time() {
-#ifdef _LP64
- return _global_time;
-#else
- volatile int lock;
- volatile jlong current_time;
- int ctr = 0;
-
- for (;;) {
- lock = _global_time_lock;
-
- // spin while locked
- while ((lock & 0x1) != 0) {
- ++ctr;
- if ((ctr & 0xFFF) == 0) {
- // Guarantee writer progress. Can't use yield; yield is advisory
- // and has almost no effect on some platforms. Don't need a state
- // transition - the park call will return promptly.
- assert(Thread::current() != NULL, "TLS not initialized");
- assert(Thread::current()->_ParkEvent != NULL, "sync not initialized");
- Thread::current()->_ParkEvent->park(1);
- }
- lock = _global_time_lock;
- }
-
- OrderAccess::loadload();
- current_time = _global_time;
- OrderAccess::loadload();
-
- // ratify seqlock value
- if (lock == _global_time_lock) {
- return current_time;
- }
- }
-#endif
-}
-
-//
-// NOTE - Assumes only one writer thread!
-//
-// We use a seqlock to guarantee that jlong _global_time is updated
-// atomically on 32-bit platforms. A locked value is indicated by
-// the lock variable LSB == 1. Readers will initially read the lock
-// value, spinning until the LSB == 0. They then speculatively read
-// the global time value, then re-read the lock value to ensure that
-// it hasn't changed. If the lock value has changed, the entire read
-// sequence is retried.
-//
-// Writers simply set the LSB = 1 (i.e. increment the variable),
-// update the global time, then release the lock and bump the version
-// number (i.e. increment the variable again.) In this case we don't
-// even need a CAS since we ensure there's only one writer.
-//
-void os::update_global_time() {
-#ifdef _LP64
- _global_time = timeofday();
-#else
- assert((_global_time_lock & 0x1) == 0, "multiple writers?");
- jlong current_time = timeofday();
- _global_time_lock++; // lock
- OrderAccess::storestore();
- _global_time = current_time;
- OrderAccess::storestore();
- _global_time_lock++; // unlock
-#endif
-}
-
// Fill in buffer with current local time as an ISO-8601 string.
// E.g., yyyy-mm-ddThh:mm:ss-zzzz.
// Returns buffer, or NULL if it failed.
@@ -138,7 +67,7 @@
return NULL;
}
// Get the current time
- jlong milliseconds_since_19700101 = timeofday();
+ jlong milliseconds_since_19700101 = javaTimeMillis();
const int milliseconds_per_microsecond = 1000;
const time_t seconds_since_19700101 =
milliseconds_since_19700101 / milliseconds_per_microsecond;
@@ -956,7 +885,6 @@
return true;
}
-
void os::set_memory_serialize_page(address page) {
int count = log2_intptr(sizeof(class JavaThread)) - log2_intptr(64);
_mem_serialize_page = (volatile int32_t *)page;
@@ -967,6 +895,8 @@
set_serialize_page_mask((uintptr_t)(vm_page_size() - sizeof(int32_t)));
}
+static volatile intptr_t SerializePageLock = 0;
+
// This method is called from signal handler when SIGSEGV occurs while the current
// thread tries to store to the "read-only" memory serialize page during state
// transition.
@@ -974,15 +904,14 @@
if (TraceSafepoint) {
tty->print_cr("Block until the serialize page permission restored");
}
- // When VMThread is holding the SerializePage_lock during modifying the
+ // When VMThread is holding the SerializePageLock during modifying the
// access permission of the memory serialize page, the following call
// will block until the permission of that page is restored to rw.
// Generally, it is unsafe to manipulate locks in signal handlers, but in
// this case, it's OK as the signal is synchronous and we know precisely when
- // it can occur. SerializePage_lock is a transiently-held leaf lock, so
- // lock_without_safepoint_check should be safe.
- SerializePage_lock->lock_without_safepoint_check();
- SerializePage_lock->unlock();
+ // it can occur.
+ Thread::muxAcquire(&SerializePageLock, "set_memory_serialize_page");
+ Thread::muxRelease(&SerializePageLock);
}
// Serialize all thread state variables
@@ -990,14 +919,12 @@
// On some platforms such as Solaris & Linux, the time duration of the page
// permission restoration is observed to be much longer than expected due to
// scheduler starvation problem etc. To avoid the long synchronization
- // time and expensive page trap spinning, 'SerializePage_lock' is used to block
- // the mutator thread if such case is encountered. Since this method is always
- // called by VMThread during safepoint, lock_without_safepoint_check is used
- // instead. See bug 6546278.
- SerializePage_lock->lock_without_safepoint_check();
+ // time and expensive page trap spinning, 'SerializePageLock' is used to block
+ // the mutator thread if such case is encountered. See bug 6546278 for details.
+ Thread::muxAcquire(&SerializePageLock, "serialize_thread_states");
os::protect_memory( (char *)os::get_memory_serialize_page(), os::vm_page_size() );
os::unguard_memory( (char *)os::get_memory_serialize_page(), os::vm_page_size() );
- SerializePage_lock->unlock();
+ Thread::muxRelease(&SerializePageLock);
}
// Returns true if the current stack pointer is above the stack shadow
--- a/hotspot/src/share/vm/runtime/os.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/os.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -66,9 +66,6 @@
static address _polling_page;
static volatile int32_t * _mem_serialize_page;
static uintptr_t _serialize_page_mask;
- static volatile jlong _global_time;
- static volatile int _global_time_lock;
- static bool _use_global_time;
static size_t _page_sizes[page_sizes_max];
static void init_page_sizes(size_t default_page_size) {
@@ -88,11 +85,6 @@
static bool getenv(const char* name, char* buffer, int len);
static bool have_special_privileges();
- static jlong timeofday();
- static void enable_global_time() { _use_global_time = true; }
- static void disable_global_time() { _use_global_time = false; }
- static jlong read_global_time();
- static void update_global_time();
static jlong javaTimeMillis();
static jlong javaTimeNanos();
static void javaTimeNanos_info(jvmtiTimerInfo *info_ptr);
@@ -236,6 +228,7 @@
static bool large_page_init();
static size_t large_page_size();
static bool can_commit_large_page_memory();
+ static bool can_execute_large_page_memory();
// OS interface to polling page
static address get_polling_page() { return _polling_page; }
--- a/hotspot/src/share/vm/runtime/reflection.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/reflection.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -1548,10 +1548,11 @@
}
instanceKlassHandle klass(THREAD, java_lang_Class::as_klassOop(mirror));
- if (!klass->methods()->is_within_bounds(slot)) {
+ methodOop m = klass->method_with_idnum(slot);
+ if (m == NULL) {
THROW_MSG_0(vmSymbols::java_lang_InternalError(), "invoke");
}
- methodHandle method(THREAD, methodOop(klass->methods()->obj_at(slot)));
+ methodHandle method(THREAD, m);
return invoke(klass, method, receiver, override, ptypes, rtype, args, true, THREAD);
}
@@ -1564,10 +1565,11 @@
objArrayHandle ptypes(THREAD, objArrayOop(java_lang_reflect_Constructor::parameter_types(constructor_mirror)));
instanceKlassHandle klass(THREAD, java_lang_Class::as_klassOop(mirror));
- if (!klass->methods()->is_within_bounds(slot)) {
+ methodOop m = klass->method_with_idnum(slot);
+ if (m == NULL) {
THROW_MSG_0(vmSymbols::java_lang_InternalError(), "invoke");
}
- methodHandle method(THREAD, methodOop(klass->methods()->obj_at(slot)));
+ methodHandle method(THREAD, m);
assert(method->name() == vmSymbols::object_initializer_name(), "invalid constructor");
// Make sure klass gets initialize
--- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -467,6 +467,11 @@
throw_and_post_jvmti_exception(thread, vmSymbols::java_lang_AbstractMethodError());
JRT_END
+JRT_ENTRY(void, SharedRuntime::throw_IncompatibleClassChangeError(JavaThread* thread))
+ // These errors occur only at call sites
+ throw_and_post_jvmti_exception(thread, vmSymbols::java_lang_IncompatibleClassChangeError(), "vtable stub");
+JRT_END
+
JRT_ENTRY(void, SharedRuntime::throw_ArithmeticException(JavaThread* thread))
throw_and_post_jvmti_exception(thread, vmSymbols::java_lang_ArithmeticException(), "/ by zero");
JRT_END
@@ -1481,11 +1486,9 @@
const char* desc = " cannot be cast to ";
size_t msglen = strlen(objName) + strlen(desc) + strlen(targetKlassName) + 1;
- char* message = NEW_C_HEAP_ARRAY(char, msglen);
+ char* message = NEW_RESOURCE_ARRAY(char, msglen);
if (NULL == message) {
- // out of memory - can't use a detailed message. Since caller is
- // using a resource mark to free memory, returning this should be
- // safe (caller won't explicitly delete it).
+ // Shouldn't happen, but don't cause even more problems if it does
message = const_cast<char*>(objName);
} else {
jio_snprintf(message, msglen, "%s%s%s", objName, desc, targetKlassName);
@@ -1834,7 +1837,25 @@
regs);
B = BufferBlob::create(AdapterHandlerEntry::name, &buffer);
- if (B == NULL) return -2; // Out of CodeCache space
+ if (B == NULL) {
+ // CodeCache is full, disable compilation
+ // Ought to log this but compile log is only per compile thread
+ // and we're some non descript Java thread.
+ UseInterpreter = true;
+ if (UseCompiler || AlwaysCompileLoopMethods ) {
+#ifndef PRODUCT
+ warning("CodeCache is full. Compiler has been disabled");
+ if (CompileTheWorld || ExitOnFullCodeCache) {
+ before_exit(JavaThread::current());
+ exit_globals(); // will delete tty
+ vm_direct_exit(CompileTheWorld ? 0 : 1);
+ }
+#endif
+ UseCompiler = false;
+ AlwaysCompileLoopMethods = false;
+ }
+ return 0; // Out of CodeCache space (_handlers[0] == NULL)
+ }
entry->relocate(B->instructions_begin());
#ifndef PRODUCT
// debugging suppport
--- a/hotspot/src/share/vm/runtime/sharedRuntime.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -104,6 +104,7 @@
STACK_OVERFLOW
};
static void throw_AbstractMethodError(JavaThread* thread);
+ static void throw_IncompatibleClassChangeError(JavaThread* thread);
static void throw_ArithmeticException(JavaThread* thread);
static void throw_NullPointerException(JavaThread* thread);
static void throw_NullPointerException_at_call(JavaThread* thread);
--- a/hotspot/src/share/vm/runtime/stubRoutines.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/stubRoutines.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -40,6 +40,7 @@
address StubRoutines::_catch_exception_entry = NULL;
address StubRoutines::_forward_exception_entry = NULL;
address StubRoutines::_throw_AbstractMethodError_entry = NULL;
+address StubRoutines::_throw_IncompatibleClassChangeError_entry = NULL;
address StubRoutines::_throw_ArithmeticException_entry = NULL;
address StubRoutines::_throw_NullPointerException_entry = NULL;
address StubRoutines::_throw_NullPointerException_at_call_entry = NULL;
--- a/hotspot/src/share/vm/runtime/stubRoutines.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/stubRoutines.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -84,6 +84,7 @@
static address _forward_exception_entry;
static address _catch_exception_entry;
static address _throw_AbstractMethodError_entry;
+ static address _throw_IncompatibleClassChangeError_entry;
static address _throw_ArithmeticException_entry;
static address _throw_NullPointerException_entry;
static address _throw_NullPointerException_at_call_entry;
@@ -184,6 +185,7 @@
static address forward_exception_entry() { return _forward_exception_entry; }
// Implicit exceptions
static address throw_AbstractMethodError_entry() { return _throw_AbstractMethodError_entry; }
+ static address throw_IncompatibleClassChangeError_entry(){ return _throw_IncompatibleClassChangeError_entry; }
static address throw_ArithmeticException_entry() { return _throw_ArithmeticException_entry; }
static address throw_NullPointerException_entry() { return _throw_NullPointerException_entry; }
static address throw_NullPointerException_at_call_entry(){ return _throw_NullPointerException_at_call_entry; }
--- a/hotspot/src/share/vm/runtime/task.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/task.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -107,25 +107,3 @@
_tasks[index] = _tasks[index+1];
}
}
-
-TimeMillisUpdateTask* TimeMillisUpdateTask::_task = NULL;
-
-void TimeMillisUpdateTask::task() {
- os::update_global_time();
-}
-
-void TimeMillisUpdateTask::engage() {
- assert(_task == NULL, "init twice?");
- os::update_global_time(); // initial update
- os::enable_global_time();
- _task = new TimeMillisUpdateTask(CacheTimeMillisGranularity);
- _task->enroll();
-}
-
-void TimeMillisUpdateTask::disengage() {
- assert(_task != NULL, "uninit twice?");
- os::disable_global_time();
- _task->disenroll();
- delete _task;
- _task = NULL;
-}
--- a/hotspot/src/share/vm/runtime/task.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/task.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -113,13 +113,3 @@
// The task to perform at each period
virtual void task() = 0;
};
-
-class TimeMillisUpdateTask : public PeriodicTask {
- private:
- static TimeMillisUpdateTask* _task;
- public:
- TimeMillisUpdateTask(int interval) : PeriodicTask(interval) {}
- void task();
- static void engage();
- static void disengage();
-};
--- a/hotspot/src/share/vm/runtime/thread.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/thread.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -1317,10 +1317,6 @@
ThreadSafepointState::destroy(this);
if (_thread_profiler != NULL) delete _thread_profiler;
if (_thread_stat != NULL) delete _thread_stat;
-
- if (jvmti_thread_state() != NULL) {
- JvmtiExport::cleanup_thread(this);
- }
}
@@ -1571,6 +1567,10 @@
tlab().make_parsable(true); // retire TLAB
}
+ if (jvmti_thread_state() != NULL) {
+ JvmtiExport::cleanup_thread(this);
+ }
+
// Remove from list of active threads list, and notify VM thread if we are the last non-daemon thread
Threads::remove(this);
}
@@ -2925,6 +2925,25 @@
warning("java.lang.String not initialized");
}
+ if (AggressiveOpts) {
+ // Forcibly initialize java/util/HashMap and mutate the private
+ // static final "frontCacheEnabled" field before we start creating instances
+#ifdef ASSERT
+ klassOop tmp_k = SystemDictionary::find(vmSymbolHandles::java_util_HashMap(), Handle(), Handle(), CHECK_0);
+ assert(tmp_k == NULL, "java/util/HashMap should not be loaded yet");
+#endif
+ klassOop k_o = SystemDictionary::resolve_or_null(vmSymbolHandles::java_util_HashMap(), Handle(), Handle(), CHECK_0);
+ KlassHandle k = KlassHandle(THREAD, k_o);
+ guarantee(k.not_null(), "Must find java/util/HashMap");
+ instanceKlassHandle ik = instanceKlassHandle(THREAD, k());
+ ik->initialize(CHECK_0);
+ fieldDescriptor fd;
+ // Possible we might not find this field; if so, don't break
+ if (ik->find_local_field(vmSymbols::frontCacheEnabled_name(), vmSymbols::bool_signature(), &fd)) {
+ k()->bool_field_put(fd.offset(), true);
+ }
+ }
+
// Initialize java_lang.System (needed before creating the thread)
if (InitializeJavaLangSystem) {
initialize_class(vmSymbolHandles::java_lang_System(), CHECK_0);
@@ -3066,7 +3085,6 @@
if (MemProfiling) MemProfiler::engage();
StatSampler::engage();
if (CheckJNICalls) JniPeriodicChecker::engage();
- if (CacheTimeMillis) TimeMillisUpdateTask::engage();
BiasedLocking::init();
--- a/hotspot/src/share/vm/runtime/vframe.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/vframe.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -206,7 +206,7 @@
for (BasicObjectLock* current = (fr().previous_monitor_in_interpreter_frame(fr().interpreter_frame_monitor_begin()));
current >= fr().interpreter_frame_monitor_end();
current = fr().previous_monitor_in_interpreter_frame(current)) {
- result->push(new MonitorInfo(current->obj(), current->lock()));
+ result->push(new MonitorInfo(current->obj(), current->lock(), false));
}
return result;
}
--- a/hotspot/src/share/vm/runtime/vframe.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/vframe.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -230,15 +230,18 @@
private:
oop _owner; // the object owning the monitor
BasicLock* _lock;
+ bool _eliminated;
public:
// Constructor
- MonitorInfo(oop owner, BasicLock* lock) {
+ MonitorInfo(oop owner, BasicLock* lock, bool eliminated) {
_owner = owner;
_lock = lock;
+ _eliminated = eliminated;
}
// Accessors
oop owner() const { return _owner; }
BasicLock* lock() const { return _lock; }
+ bool eliminated() const { return _eliminated; }
};
class vframeStreamCommon : StackObj {
--- a/hotspot/src/share/vm/runtime/vframe_hp.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/vframe_hp.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -190,7 +190,7 @@
// Casting away const
frame& fr = (frame&) _fr;
MonitorInfo* info = new MonitorInfo(fr.compiled_synchronized_native_monitor_owner(nm),
- fr.compiled_synchronized_native_monitor(nm));
+ fr.compiled_synchronized_native_monitor(nm), false);
monitors->push(info);
return monitors;
}
@@ -202,7 +202,7 @@
for (int index = 0; index < monitors->length(); index++) {
MonitorValue* mv = monitors->at(index);
StackValue *owner_sv = create_stack_value(mv->owner()); // it is an oop
- result->push(new MonitorInfo(owner_sv->get_obj()(), resolve_monitor_lock(mv->basic_lock())));
+ result->push(new MonitorInfo(owner_sv->get_obj()(), resolve_monitor_lock(mv->basic_lock()), mv->eliminated()));
}
return result;
}
--- a/hotspot/src/share/vm/runtime/vm_version.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/vm_version.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -52,6 +52,8 @@
int Abstract_VM_Version::_vm_minor_version = 0;
int Abstract_VM_Version::_vm_build_number = 0;
bool Abstract_VM_Version::_initialized = false;
+int Abstract_VM_Version::_parallel_worker_threads = 0;
+bool Abstract_VM_Version::_parallel_worker_threads_initialized = false;
void Abstract_VM_Version::initialize() {
if (_initialized) {
@@ -210,3 +212,43 @@
}
#endif
}
+
+unsigned int Abstract_VM_Version::nof_parallel_worker_threads(
+ unsigned int num,
+ unsigned int den,
+ unsigned int switch_pt) {
+ if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
+ assert(ParallelGCThreads == 0, "Default ParallelGCThreads is not 0");
+ // For very large machines, there are diminishing returns
+ // for large numbers of worker threads. Instead of
+ // hogging the whole system, use a fraction of the workers for every
+ // processor after the first 8. For example, on a 72 cpu machine
+ // and a chosen fraction of 5/8
+ // use 8 + (72 - 8) * (5/8) == 48 worker threads.
+ unsigned int ncpus = (unsigned int) os::active_processor_count();
+ return (ncpus <= switch_pt) ?
+ ncpus :
+ (switch_pt + ((ncpus - switch_pt) * num) / den);
+ } else {
+ return ParallelGCThreads;
+ }
+}
+
+unsigned int Abstract_VM_Version::calc_parallel_worker_threads() {
+ return nof_parallel_worker_threads(5, 8, 8);
+}
+
+
+// Does not set the _initialized flag since it is
+// a global flag.
+unsigned int Abstract_VM_Version::parallel_worker_threads() {
+ if (!_parallel_worker_threads_initialized) {
+ if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
+ _parallel_worker_threads = VM_Version::calc_parallel_worker_threads();
+ } else {
+ _parallel_worker_threads = ParallelGCThreads;
+ }
+ _parallel_worker_threads_initialized = true;
+ }
+ return _parallel_worker_threads;
+}
--- a/hotspot/src/share/vm/runtime/vm_version.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/runtime/vm_version.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -36,6 +36,12 @@
static int _vm_minor_version;
static int _vm_build_number;
static bool _initialized;
+ static int _parallel_worker_threads;
+ static bool _parallel_worker_threads_initialized;
+
+ static unsigned int nof_parallel_worker_threads(unsigned int num,
+ unsigned int dem,
+ unsigned int switch_pt);
public:
static void initialize();
@@ -69,4 +75,13 @@
// subclasses should define new versions to hide this one as needed. Note
// that the O/S may support more sizes, but at most this many are used.
static uint page_size_count() { return 2; }
+
+ // Returns the number of parallel threads to be used for VM
+ // work. If that number has not been calculated, do so and
+ // save it. Returns ParallelGCThreads if it is set on the
+ // command line.
+ static unsigned int parallel_worker_threads();
+ // Calculates and returns the number of parallel threads. May
+ // be VM version specific.
+ static unsigned int calc_parallel_worker_threads();
};
--- a/hotspot/src/share/vm/services/heapDumper.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/services/heapDumper.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -997,7 +997,7 @@
}
// If the byte ordering is big endian then we can copy most types directly
- int length_in_bytes = array->length() * type2aelembytes[type];
+ int length_in_bytes = array->length() * type2aelembytes(type);
assert(length_in_bytes > 0, "nothing to copy");
switch (type) {
--- a/hotspot/src/share/vm/utilities/globalDefinitions.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/utilities/globalDefinitions.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -214,7 +214,7 @@
};
-int type2aelembytes[T_CONFLICT+1] = {
+int _type2aelembytes[T_CONFLICT+1] = {
0, // 0
0, // 1
0, // 2
@@ -230,10 +230,16 @@
T_OBJECT_aelem_bytes, // T_OBJECT = 12,
T_ARRAY_aelem_bytes, // T_ARRAY = 13,
0, // T_VOID = 14,
- T_INT_aelem_bytes, // T_ADDRESS = 15,
+ T_OBJECT_aelem_bytes, // T_ADDRESS = 15,
0 // T_CONFLICT = 16,
};
+#ifdef ASSERT
+int type2aelembytes(BasicType t, bool allow_address) {
+ assert(allow_address || t != T_ADDRESS, " ");
+ return _type2aelembytes[t];
+}
+#endif
// Support for 64-bit integer arithmetic
--- a/hotspot/src/share/vm/utilities/globalDefinitions.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/utilities/globalDefinitions.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -392,6 +392,10 @@
T_ILLEGAL = 99
};
+inline bool is_java_primitive(BasicType t) {
+ return T_BOOLEAN <= t && t <= T_LONG;
+}
+
// Convert a char from a classfile signature to a BasicType
inline BasicType char2type(char c) {
switch( c ) {
@@ -464,7 +468,12 @@
T_VOID_aelem_bytes = 0
};
-extern int type2aelembytes[T_CONFLICT+1]; // maps a BasicType to nof bytes used by its array element
+extern int _type2aelembytes[T_CONFLICT+1]; // maps a BasicType to nof bytes used by its array element
+#ifdef ASSERT
+extern int type2aelembytes(BasicType t, bool allow_address = false); // asserts
+#else
+inline int type2aelembytes(BasicType t) { return _type2aelembytes[t]; }
+#endif
// JavaValue serves as a container for arbitrary Java values.
--- a/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp Tue Apr 15 17:48:22 2008 -0700
@@ -37,23 +37,45 @@
# include <stdlib.h>
# include <wchar.h>
# include <stdarg.h>
+#ifdef SOLARIS
# include <ieeefp.h>
+#endif
# include <math.h>
+#ifdef LINUX
+#ifndef FP_PZERO
+ // Linux doesn't have positive/negative zero
+ #define FP_PZERO FP_ZERO
+#endif
+#ifndef fpclass
+ #define fpclass fpclassify
+#endif
+#endif
# include <time.h>
# include <fcntl.h>
# include <dlfcn.h>
# include <pthread.h>
+#ifdef SOLARIS
# include <thread.h>
+#endif
# include <limits.h>
# include <errno.h>
+#ifdef SOLARIS
# include <sys/trap.h>
# include <sys/regset.h>
# include <sys/procset.h>
# include <ucontext.h>
# include <setjmp.h>
+#endif
# ifdef SOLARIS_MUTATOR_LIBTHREAD
# include <sys/procfs.h>
# endif
+#ifdef LINUX
+# include <inttypes.h>
+# include <signal.h>
+# include <ucontext.h>
+# include <sys/time.h>
+#endif
+
// 4810578: varargs unsafe on 32-bit integer/64-bit pointer architectures
// When __cplusplus is defined, NULL is defined as 0 (32-bit constant) in
@@ -68,6 +90,11 @@
// pointer when it extracts the argument, then we have a problem.
//
// Solution: For 64-bit architectures, redefine NULL as 64-bit constant 0.
+//
+// Note: this fix doesn't work well on Linux because NULL will be overwritten
+// whenever a system header file is included. Linux handles NULL correctly
+// through a special type '__null'.
+#ifdef SOLARIS
#ifdef _LP64
#undef NULL
#define NULL 0L
@@ -76,13 +103,25 @@
#define NULL 0
#endif
#endif
+#endif
// NULL vs NULL_WORD:
// On Linux NULL is defined as a special type '__null'. Assigning __null to
// integer variable will cause gcc warning. Use NULL_WORD in places where a
-// pointer is stored as integer value.
-#define NULL_WORD NULL
+// pointer is stored as integer value. On some platforms, sizeof(intptr_t) >
+// sizeof(void*), so here we want something which is integer type, but has the
+// same size as a pointer.
+#ifdef LINUX
+ #ifdef _LP64
+ #define NULL_WORD 0L
+ #else
+ #define NULL_WORD 0
+ #endif
+#else
+ #define NULL_WORD NULL
+#endif
+#ifndef LINUX
// Compiler-specific primitive types
typedef unsigned short uint16_t;
#ifndef _UINT32_T
@@ -100,6 +139,7 @@
// If this gets an error, figure out a symbol XXX that implies the
// prior definition of intptr_t, and add "&& !defined(XXX)" above.
#endif
+#endif
// Additional Java basic types
@@ -128,7 +168,7 @@
const jlong min_jlong = CONST64(0x8000000000000000);
const jlong max_jlong = CONST64(0x7fffffffffffffff);
-
+#ifdef SOLARIS
//----------------------------------------------------------------------------------------------------
// ANSI C++ fixes
// NOTE:In the ANSI committee's continuing attempt to make each version
@@ -162,7 +202,7 @@
typedef int (*int_fnP_cond_tP_i_vP)(cond_t *cv, int scope, void *arg);
typedef int (*int_fnP_cond_tP)(cond_t *cv);
};
-
+#endif
//----------------------------------------------------------------------------------------------------
// Debugging
@@ -173,7 +213,7 @@
#define BREAKPOINT ::breakpoint()
// checking for nanness
-
+#ifdef SOLARIS
#ifdef SPARC
inline int g_isnan(float f) { return isnanf(f); }
#else
@@ -182,6 +222,12 @@
#endif
inline int g_isnan(double f) { return isnand(f); }
+#elif LINUX
+inline int g_isnan(float f) { return isnanf(f); }
+inline int g_isnan(double f) { return isnan(f); }
+#else
+#error "missing platform-specific definition here"
+#endif
// Checking for finiteness
@@ -195,9 +241,11 @@
// Misc
+// NOTE: This one leads to an infinite recursion on Linux
+#ifndef LINUX
int local_vsnprintf(char* buf, size_t count, const char* fmt, va_list argptr);
#define vsnprintf local_vsnprintf
-
+#endif
// Portability macros
#define PRAGMA_INTERFACE
--- a/hotspot/src/share/vm/utilities/ostream.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/utilities/ostream.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -829,7 +829,7 @@
server.sin_port = htons(port);
server.sin_addr.s_addr = inet_addr(ip);
- if (server.sin_addr.s_addr == (unsigned long)-1) {
+ if (server.sin_addr.s_addr == (uint32_t)-1) {
#ifdef _WINDOWS
struct hostent* host = hpi::get_host_by_name((char*)ip);
#else
--- a/hotspot/src/share/vm/utilities/vmError.cpp Wed Apr 09 15:30:44 2008 +0100
+++ b/hotspot/src/share/vm/utilities/vmError.cpp Tue Apr 15 17:48:22 2008 -0700
@@ -170,7 +170,8 @@
out->print_raw_cr(Arguments::java_vendor_url_bug());
// If the crash is in native code, encourage user to submit a bug to the
// provider of that code.
- if (thread && thread->is_Java_thread()) {
+ if (thread && thread->is_Java_thread() &&
+ !thread->is_hidden_from_external_view()) {
JavaThread* jt = (JavaThread*)thread;
if (jt->thread_state() == _thread_in_native) {
out->print_cr("# The crash happened outside the Java Virtual Machine in native code.\n# See problematic frame for where to report the bug.");
@@ -249,10 +250,10 @@
BEGIN
- STEP(10, "(printing unexpected error message)")
+ STEP(10, "(printing fatal error message)")
st->print_cr("#");
- st->print_cr("# An unexpected error has been detected by Java Runtime Environment:");
+ st->print_cr("# A fatal error has been detected by the Java Runtime Environment:");
STEP(15, "(printing type of error)")
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/6659207/Test.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+
+/*
+ * @test
+ * @bug 6659207
+ * @summary access violation in CompilerThread0
+ */
+
+public class Test {
+ static int[] array = new int[12];
+
+ static int index(int i) {
+ if (i == 0) return 0;
+ for (int n = 0; n < array.length; n++)
+ if (i < array[n]) return n;
+ return -1;
+ }
+
+ static int test(int i) {
+ int result = 0;
+ i = index(i);
+ if (i >= 0)
+ if (array[i] != 0)
+ result++;
+
+ if (i != -1)
+ array[i]++;
+
+ return result;
+ }
+
+ public static void main(String[] args) {
+ int total = 0;
+ for (int i = 0; i < 100000; i++) {
+ total += test(10);
+ }
+ System.out.println(total);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/6661247/Test.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+
+/*
+ * @test
+ * @bug 6661247
+ * @summary Internal bug in 32-bit HotSpot optimizer while bit manipulations
+ */
+
+import java.util.Random;
+import java.nio.*;
+
+// This isn't a completely reliable test for 6661247 since the results
+// depend on what the local schedule looks like but it does reproduce
+// the issue in current builds.
+
+public class Test {
+
+ public static void test(boolean[] src, int srcPos, LongBuffer dest, long destPos, int count) {
+ int countStart = (destPos & 63) == 0 ? 0 : 64 - (int)(destPos & 63);
+ if (countStart > count)
+ countStart = count;
+ for (int srcPosMax = srcPos + countStart; srcPos < srcPosMax; srcPos++, destPos++) {
+ if (src[srcPos])
+ dest.put((int)(destPos >>> 6), dest.get((int)(destPos >>> 6)) | 1L << (destPos & 63));
+ else
+ dest.put((int)(destPos >>> 6), dest.get((int)(destPos >>> 6)) & ~(1L << (destPos & 63)));
+ }
+ count -= countStart;
+ int cnt = count >>> 6;
+ for (int k = (int)(destPos >>> 6), kMax = k + cnt; k < kMax; k++) {
+ int low = (src[srcPos] ? 1 : 0)
+ | (src[srcPos + 1] ? 1 << 1 : 0)
+ | (src[srcPos + 2] ? 1 << 2 : 0)
+ | (src[srcPos + 3] ? 1 << 3 : 0)
+ | (src[srcPos + 4] ? 1 << 4 : 0)
+ | (src[srcPos + 5] ? 1 << 5 : 0)
+ | (src[srcPos + 6] ? 1 << 6 : 0)
+ | (src[srcPos + 7] ? 1 << 7 : 0)
+ | (src[srcPos + 8] ? 1 << 8 : 0)
+ | (src[srcPos + 9] ? 1 << 9 : 0)
+ | (src[srcPos + 10] ? 1 << 10 : 0)
+ | (src[srcPos + 11] ? 1 << 11 : 0)
+ | (src[srcPos + 12] ? 1 << 12 : 0)
+ | (src[srcPos + 13] ? 1 << 13 : 0)
+ | (src[srcPos + 14] ? 1 << 14 : 0)
+ | (src[srcPos + 15] ? 1 << 15 : 0)
+ | (src[srcPos + 16] ? 1 << 16 : 0)
+ | (src[srcPos + 17] ? 1 << 17 : 0)
+ | (src[srcPos + 18] ? 1 << 18 : 0)
+ | (src[srcPos + 19] ? 1 << 19 : 0)
+ | (src[srcPos + 20] ? 1 << 20 : 0)
+ | (src[srcPos + 21] ? 1 << 21 : 0)
+ | (src[srcPos + 22] ? 1 << 22 : 0)
+ | (src[srcPos + 23] ? 1 << 23 : 0)
+ | (src[srcPos + 24] ? 1 << 24 : 0)
+ | (src[srcPos + 25] ? 1 << 25 : 0)
+ | (src[srcPos + 26] ? 1 << 26 : 0)
+ | (src[srcPos + 27] ? 1 << 27 : 0)
+ | (src[srcPos + 28] ? 1 << 28 : 0)
+ | (src[srcPos + 29] ? 1 << 29 : 0)
+ | (src[srcPos + 30] ? 1 << 30 : 0)
+ | (src[srcPos + 31] ? 1 << 31 : 0)
+ ;
+ srcPos += 32;
+ int high = (src[srcPos] ? 1 : 0) // PROBLEM!
+ | (src[srcPos + 1] ? 1 << 1 : 0)
+ | (src[srcPos + 2] ? 1 << 2 : 0)
+ | (src[srcPos + 3] ? 1 << 3 : 0)
+ | (src[srcPos + 4] ? 1 << 4 : 0)
+ | (src[srcPos + 5] ? 1 << 5 : 0)
+ | (src[srcPos + 6] ? 1 << 6 : 0)
+ | (src[srcPos + 7] ? 1 << 7 : 0)
+ | (src[srcPos + 8] ? 1 << 8 : 0)
+ | (src[srcPos + 9] ? 1 << 9 : 0)
+ | (src[srcPos + 10] ? 1 << 10 : 0)
+ | (src[srcPos + 11] ? 1 << 11 : 0)
+ | (src[srcPos + 12] ? 1 << 12 : 0)
+ | (src[srcPos + 13] ? 1 << 13 : 0)
+ | (src[srcPos + 14] ? 1 << 14 : 0)
+ | (src[srcPos + 15] ? 1 << 15 : 0)
+ | (src[srcPos + 16] ? 1 << 16 : 0)
+ | (src[srcPos + 17] ? 1 << 17 : 0)
+ | (src[srcPos + 18] ? 1 << 18 : 0)
+ | (src[srcPos + 19] ? 1 << 19 : 0)
+ | (src[srcPos + 20] ? 1 << 20 : 0)
+ | (src[srcPos + 21] ? 1 << 21 : 0)
+ | (src[srcPos + 22] ? 1 << 22 : 0)
+ | (src[srcPos + 23] ? 1 << 23 : 0)
+ | (src[srcPos + 24] ? 1 << 24 : 0)
+ | (src[srcPos + 25] ? 1 << 25 : 0)
+ | (src[srcPos + 26] ? 1 << 26 : 0)
+ | (src[srcPos + 27] ? 1 << 27 : 0)
+ | (src[srcPos + 28] ? 1 << 28 : 0)
+ | (src[srcPos + 29] ? 1 << 29 : 0)
+ | (src[srcPos + 30] ? 1 << 30 : 0)
+ | (src[srcPos + 31] ? 1 << 31 : 0)
+ ;
+ srcPos += 32;
+ dest.put(k, ((long)low & 0xFFFFFFFFL) | (((long)high) << 32));
+ destPos += 64;
+ }
+ int countFinish = count & 63;
+ for (int srcPosMax = srcPos + countFinish; srcPos < srcPosMax; srcPos++, destPos++) {
+ if (src[srcPos])
+ dest.put((int)(destPos >>> 6), dest.get((int)(destPos >>> 6)) | 1L << (destPos & 63));
+ else
+ dest.put((int)(destPos >>> 6), dest.get((int)(destPos >>> 6)) & ~(1L << (destPos & 63)));
+ }
+ }
+ public static void main(String[] args) {
+ Random r = new Random();
+ int entries = 1000;
+ boolean[] src = new boolean[entries * 64];
+ long[] dest = new long[entries];
+ long[] result = new long[entries];
+
+ for (int c = 0; c < 2000; c++) {
+ for (int i = 0; i < entries; i++) {
+ long l = r.nextLong();
+ for (int bit = 0; bit < 64; bit++) {
+ src[i * 64 + bit] = (l & (1L << bit)) != 0;
+ }
+ dest[i] = 0;
+ result[i] = l;
+ }
+ test(src, 0, LongBuffer.wrap(dest, 0, dest.length), 0, src.length);
+ for (int i = 0; i < entries; i++) {
+ if (dest[i] != result[i]) {
+ throw new InternalError(i + ": " + Long.toHexString(dest[i]) + " != " + Long.toHexString(result[i]));
+ }
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/6663621/IVTest.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+
+/**
+ * @test
+ * @bug 6663621
+ * @summary JVM crashes while trying to execute api/java_security/Signature/SignatureTests.html#initSign tests.
+ */
+
+public class IVTest {
+ static int paddedSize;
+
+ static void padV15(byte[] padded) {
+ int psSize = padded.length;
+ int k = 0;
+ while (psSize-- > 0) {
+ padded[k++] = (byte)0xff;
+ }
+ }
+
+ static void padV15_2(int paddedSize) {
+ byte[] padded = new byte[paddedSize];
+ int psSize = padded.length;
+ int k = 0;
+ while (psSize-- > 0) {
+ padded[k++] = (byte)0xff;
+ }
+ }
+
+ static void padV15_3() {
+ byte[] padded = new byte[paddedSize];
+ int psSize = padded.length;
+ int k = 0;
+ while (psSize-- > 0) {
+ padded[k++] = (byte)0xff;
+ }
+ }
+
+ static void padV15_4() {
+ byte[] padded = new byte[paddedSize];
+ int psSize = padded.length;
+ for (int k = 0;psSize > 0; psSize--) {
+ int i = padded.length - psSize;
+ padded[i] = (byte)0xff;
+ }
+ }
+
+ static void padV15_5() {
+ byte[] padded = new byte[paddedSize];
+ int psSize = padded.length;
+ int k = psSize - 1;
+ for (int i = 0; i < psSize; i++) {
+ padded[k--] = (byte)0xff;
+ }
+ }
+
+ public static void main(String argv[]) {
+ int bounds = 1024;
+ int lim = 500000;
+ long start = System.currentTimeMillis();
+ for (int j = 0; j < lim; j++) {
+ paddedSize = j % bounds;
+ padV15(new byte[paddedSize]);
+ }
+ long end = System.currentTimeMillis();
+ System.out.println(end - start);
+ start = System.currentTimeMillis();
+ for (int j = 0; j < lim; j++) {
+ paddedSize = j % bounds;
+ padV15_2(paddedSize);
+ }
+ end = System.currentTimeMillis();
+ System.out.println(end - start);
+ start = System.currentTimeMillis();
+ for (int j = 0; j < lim; j++) {
+ paddedSize = j % bounds;
+ padV15_3();
+ }
+ end = System.currentTimeMillis();
+ System.out.println(end - start);
+ start = System.currentTimeMillis();
+ for (int j = 0; j < lim; j++) {
+ paddedSize = j % bounds;
+ padV15_4();
+ }
+ end = System.currentTimeMillis();
+ System.out.println(end - start);
+ start = System.currentTimeMillis();
+ for (int j = 0; j < lim; j++) {
+ paddedSize = j % bounds;
+ padV15_5();
+ }
+ end = System.currentTimeMillis();
+ System.out.println(end - start);
+ }
+}
--- a/jaxp/.hgtags Wed Apr 09 15:30:44 2008 +0100
+++ b/jaxp/.hgtags Tue Apr 15 17:48:22 2008 -0700
@@ -1,1 +1,2 @@
6ce5f4757bde08f7470cbb9f0b46da8f2f3d4f56 jdk7-b24
+a3b3ba7d6034dc754b51ddc3d281399ac1cae5f1 jdk7-b25
--- a/jaxws/.hgtags Wed Apr 09 15:30:44 2008 +0100
+++ b/jaxws/.hgtags Tue Apr 15 17:48:22 2008 -0700
@@ -1,1 +1,2 @@
0961a4a211765fea071b8dac419003ee0c3d5973 jdk7-b24
+59fd8224ba2da5c2d8d4c68e33cf33ab41ce8de0 jdk7-b25
--- a/jdk/.hgtags Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/.hgtags Tue Apr 15 17:48:22 2008 -0700
@@ -1,1 +1,2 @@
37a05a11f281b4d238e2f9e7ebb67c63f64d0e77 jdk7-b24
+75fca0b0ab83ab1392e615910cea020f66535390 jdk7-b25
--- a/jdk/make/com/sun/crypto/provider/Makefile Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/com/sun/crypto/provider/Makefile Tue Apr 15 17:48:22 2008 -0700
@@ -1,5 +1,5 @@
#
-# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
+# Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -87,8 +87,7 @@
# sign Alias for sign-jar
# sign-jar Builds/signs sunjce_provider.jar (no install)
#
-# obfus Builds/obfuscates/signs/installs
-# sunjce_provider.jar
+# obfus Builds/obfuscates/signs sunjce_provider.jar
#
# release Builds all targets in preparation
# for workspace integration.
@@ -101,8 +100,25 @@
BUILDDIR = ../../../..
PACKAGE = com.sun.crypto.provider
PRODUCT = sun
+
+#
+# The following is for when we need to do postprocessing
+# (signing/obfuscation) against a read-only build. If the OUTPUTDIR
+# isn't writable, the build currently crashes out.
+#
+ifndef OPENJDK
+ ifdef ALT_JCE_BUILD_DIR
+ # =====================================================
+ # Where to place the output, in case we're building from a read-only
+ # build area. (e.g. a release engineering build.)
+ JCE_BUILD_DIR=${ALT_JCE_BUILD_DIR}
+ IGNORE_WRITABLE_OUTPUTDIR_TEST=true
+ else
+ JCE_BUILD_DIR=${TEMPDIR}
+ endif
+endif
+
include $(BUILDDIR)/common/Defs.gmk
-include $(BUILDDIR)/javax/crypto/Defs-jce.gmk
#
# Location for the newly built classfiles.
@@ -147,6 +163,8 @@
#
UNSIGNED_DIR = $(TEMPDIR)/unsigned
+include $(BUILDDIR)/javax/crypto/Defs-jce.gmk
+
# =====================================================
# Build the unsigned sunjce_provider.jar file.
@@ -184,44 +202,66 @@
# Sign the provider jar file. Not needed for OpenJDK.
#
-SIGNED_DIR = $(TEMPDIR)/signed
+SIGNED_DIR = $(JCE_BUILD_DIR)/signed
sign: sign-jar
sign-jar: $(SIGNED_DIR)/sunjce_provider.jar
+ifndef ALT_JCE_BUILD_DIR
$(SIGNED_DIR)/sunjce_provider.jar: $(UNSIGNED_DIR)/sunjce_provider.jar
- $(sign-file)
+else
+#
+# We have to remove the build dependency, otherwise, we'll try to rebuild it
+# which we can't do on a read-only filesystem.
+#
+$(SIGNED_DIR)/sunjce_provider.jar:
+ @if [ ! -r $(UNSIGNED_DIR)/sunjce_provider.jar ] ; then \
+ $(ECHO) "Couldn't find $(UNSIGNED_DIR)/sunjce_provider.jar"; \
+ exit 1; \
+ fi
+endif
+ $(call sign-file, $(UNSIGNED_DIR)/sunjce_provider.jar)
# =====================================================
# Obfuscate/sign/install the JDK build. Not needed for OpenJDK.
#
-OBFUS_DIR = $(TEMPDIR)/obfus
+OBFUS_DIR = $(JCE_BUILD_DIR)/obfus/sunjce
CLOSED_DIR = $(BUILDDIR)/closed/com/sun/crypto/provider
obfus: $(OBFUS_DIR)/sunjce_provider.jar
$(release-warning)
-$(OBFUS_DIR)/sunjce_provider.jar: build-jar $(JCE_MANIFEST_FILE)
+ifndef ALT_JCE_BUILD_DIR
+$(OBFUS_DIR)/sunjce_provider.jar: build-jar $(JCE_MANIFEST_FILE) \
+ $(OBFUS_DIR)/sunjce.dox
+else
+$(OBFUS_DIR)/sunjce_provider.jar: $(JCE_MANIFEST_FILE) $(OBFUS_DIR)/sunjce.dox
+ @if [ ! -d $(CLASSDESTDIR) ] ; then \
+ $(ECHO) "Couldn't find $(CLASSDESTDIR)"; \
+ exit 1; \
+ fi
+endif
+ @$(ECHO) ">>>Obfuscating SunJCE Provider..."
$(presign)
$(preobfus)
- @$(ECHO) ">>>Obfuscating Sun JCE Provider..."
$(prep-target)
$(CD) $(OBFUS_DIR); \
- $(OBFUSCATOR) -fv \
- $(CURRENT_DIRECTORY)/$(CLOSED_DIR)/obfus/sunjce.dox
+ $(OBFUSCATOR) -fv sunjce.dox
@$(CD) $(OBFUS_DIR); $(java-vm-cleanup)
$(BOOT_JAR_CMD) cmf $(JCE_MANIFEST_FILE) $@ \
-C $(OBFUS_DIR)/build com \
$(JAR_JFLAGS)
$(sign-target)
- $(MKDIR) -p $(dir $(JAR_DESTFILE))
- $(RM) $(JAR_DESTFILE)
- $(CP) $@ $(JAR_DESTFILE)
@$(java-vm-cleanup)
+$(OBFUS_DIR)/sunjce.dox: $(CLOSED_DIR)/obfus/sunjce.dox
+ @$(ECHO) ">>>Creating sunjce.dox"
+ $(prep-target)
+ $(SED) "s:@@TEMPDIR@@:$(ABS_TEMPDIR):" $< > $@
+
#
# The current obfuscator has a limitation in that it currently only
# supports up to v49 class file format. Force v49 classfiles in our
@@ -235,9 +275,9 @@
#
release: $(OBFUS_DIR)/sunjce_provider.jar
- $(RM) $(RELEASE_DIR)/sunjce_provider.jar
- $(MKDIR) -p $(RELEASE_DIR)
- $(CP) $(OBFUS_DIR)/sunjce_provider.jar $(RELEASE_DIR)
+ $(RM) $(JCE_BUILD_DIR)/release/sunjce_provider.jar
+ $(MKDIR) -p $(JCE_BUILD_DIR)/release
+ $(CP) $(OBFUS_DIR)/sunjce_provider.jar $(JCE_BUILD_DIR)/release
$(release-warning)
endif # OPENJDK
@@ -275,7 +315,7 @@
#
clobber clean::
- $(RM) -r $(JAR_DESTFILE) $(TEMPDIR)
+ $(RM) -r $(JAR_DESTFILE) $(TEMPDIR) $(JCE_BUILD_DIR)
.PHONY: build-jar jar install-jar
ifndef OPENJDK
--- a/jdk/make/common/Defs.gmk Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/common/Defs.gmk Tue Apr 15 17:48:22 2008 -0700
@@ -303,6 +303,8 @@
# for build tool jar files
BUILDTOOLJARDIR = $(OUTPUTDIR)/btjars
ABS_BUILDTOOLJARDIR = $(ABS_OUTPUTDIR)/btjars
+# for generated tool class files
+BUILDTOOLBINDIR = $(OUTPUTDIR)/btbins
# for generated java source files
GENSRCDIR = $(OUTPUTDIR)/gensrc
# for generated C source files (not javah)
--- a/jdk/make/common/Rules.gmk Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/common/Rules.gmk Tue Apr 15 17:48:22 2008 -0700
@@ -231,12 +231,14 @@
.compile.classlist : $(JAVA_SOURCE_LIST)
@$(MKDIR) -p $(CLASSDESTDIR)
- @if [ `$(CAT) $(JAVA_SOURCE_LIST) | $(WC) -l` -ge 1 ] ; then \
- $(ECHO) "# Java sources to be compiled: (listed in file $(JAVA_SOURCE_LIST))"; \
- $(CAT) $(JAVA_SOURCE_LIST); \
+ @$(RM) $<.filtered
+ @$(CAT) $< | $(NAWK) 'length>0' | $(SORT) -u > $<.filtered
+ @if [ `$(CAT) $<.filtered | $(WC) -l` -ge 1 ] ; then \
+ $(ECHO) "# Java sources to be compiled: (listed in file $<)"; \
+ $(CAT) $<.filtered; \
$(ECHO) "# Running javac:"; \
- $(ECHO) $(JAVAC_CMD) -sourcepath "$(SOURCEPATH)" -d $(CLASSDESTDIR) @$(JAVA_SOURCE_LIST); \
- $(JAVAC_CMD) -sourcepath "$(SOURCEPATH)" -d $(CLASSDESTDIR) @$(JAVA_SOURCE_LIST); \
+ $(ECHO) $(JAVAC_CMD) -sourcepath "$(SOURCEPATH)" -d $(CLASSDESTDIR) @$<.filtered; \
+ $(JAVAC_CMD) -sourcepath "$(SOURCEPATH)" -d $(CLASSDESTDIR) @$<.filtered; \
fi
@$(java-vm-cleanup)
--- a/jdk/make/common/shared/Compiler-gcc.gmk Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/common/shared/Compiler-gcc.gmk Tue Apr 15 17:48:22 2008 -0700
@@ -45,10 +45,8 @@
NMAKE = MFLAGS= MAKEFLAGS= $(COMPILER_PATH)nmake -nologo
ifeq ($(ARCH_DATA_MODEL), 32)
CC_VER = UNKNOWN
- CC_TYPE = UNKNOWN
else
CC_VER = UNKNOWN
- CC_TYPE = UNKNOWN
endif
_LINK_VER :=$(shell $(LINK) 2>&1 | $(HEAD) -n 1)
LINK_VER :=$(call GetVersion,"$(_LINK_VER)")
--- a/jdk/make/common/shared/Compiler-msvc.gmk Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/common/shared/Compiler-msvc.gmk Tue Apr 15 17:48:22 2008 -0700
@@ -47,13 +47,13 @@
# unset any GNU Make settings of MFLAGS and MAKEFLAGS which may mess up nmake
NMAKE = MFLAGS= MAKEFLAGS= $(COMPILER_PATH)nmake -nologo
+ # Compiler version and type (Always get word after "Version")
+ CC_VER := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(SED) 's/.*\(Version.*\)/\1/' | $(NAWK) '{print $$2}')
+
# SDK-64 and MSVC6 put REBASE.EXE in a different places - go figure...
ifeq ($(ARCH_DATA_MODEL), 32)
- CC_VER := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(NAWK) '{print $$8}')
LINK_VER := $(shell $(LINK) | $(HEAD) -n 1 | $(NAWK) '{print $$6}')
- CC_TYPE := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(NAWK) '{print $$5}')
CC_MAJORVER :=$(call MajorVersion,$(CC_VER))
- REQUIRED_CCTYPE = Optimizing
REQUIRED_CC_VER = 13.10.3077
REQUIRED_LINK_VER = 7.10.3077
ifeq ($(CC_MAJORVER), 12)
@@ -85,9 +85,7 @@
endif
endif
else
- CC_VER := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(NAWK) '{print $$7}')
LINK_VER := $(shell $(LINK) | $(HEAD) -n 1 | $(NAWK) '{print $$6}')
- CC_TYPE := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(NAWK) '{print $$4}')
CC_MAJORVER :=$(call MajorVersion,$(CC_VER))
CC_MINORVER :=$(call MinorVersion,$(CC_VER))
CC_MICROVER :=$(call MicroVersion,$(CC_VER))
--- a/jdk/make/common/shared/Defs-control.gmk Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/common/shared/Defs-control.gmk Tue Apr 15 17:48:22 2008 -0700
@@ -69,9 +69,8 @@
# Get shared platform settings
include $(JDK_MAKE_SHARED_DIR)/Platform.gmk
-# Default output directory
+# Default directory immediately above the "build" output directory (OUTPUTDIR)
BUILD_PARENT_DIRECTORY=$(TOPDIR)
-_OUTPUTDIR=$(TOPDIR)/build/$(PLATFORM)-$(ARCH)
# Get platform specific settings
include $(JDK_MAKE_SHARED_DIR)/Defs.gmk
--- a/jdk/make/common/shared/Defs.gmk Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/common/shared/Defs.gmk Tue Apr 15 17:48:22 2008 -0700
@@ -1,5 +1,5 @@
#
-# Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved.
+# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -265,7 +265,9 @@
FULL_VERSION = $(RELEASE)-$(BUILD_NUMBER)
else
BUILD_NUMBER = b00
- USER_RELEASE_SUFFIX := $(shell echo $(USER)_`date '+%d_%b_%Y_%H_%M' | tr "A-Z" "a-z"`)
+ BUILD_DATE := $(shell $(DATE) '+%Y_%m_%d_%H_%M')
+ CLEAN_USERNAME := $(shell $(ECHO) "$(USER)" | $(TR) -d -c '[:alnum:]')
+ USER_RELEASE_SUFFIX := $(shell $(ECHO) "$(CLEAN_USERNAME)_$(BUILD_DATE)" | $(TR) '[:upper:]' '[:lower:]' )
FULL_VERSION = $(RELEASE)-$(USER_RELEASE_SUFFIX)-$(BUILD_NUMBER)
endif
@@ -449,11 +451,20 @@
# Check for spaces and null value
OUTPUTDIR:=$(call AltCheckSpaces,OUTPUTDIR)
OUTPUTDIR:=$(call AltCheckValue,OUTPUTDIR)
+
+#
+# When signing the JCE framework and provider, we could be using built
+# bits on a read-only filesystem. If so, this test will fail and crash
+# the build.
+#
+ifndef IGNORE_WRITABLE_OUTPUTDIR_TEST
# Create the output directory and make sure it exists and is writable
_create_outputdir:=$(shell $(MKDIR) -p "$(OUTPUTDIR)" > $(DEV_NULL) 2>&1)
ifeq ($(call WriteDirExists,$(OUTPUTDIR),/dev/null),/dev/null)
_outputdir_error:=$(error "ERROR: OUTPUTDIR '$(OUTPUTDIR)' not created or not writable")
endif
+endif
+
# Define absolute path if needed and check for spaces and null value
ifndef ABS_OUTPUTDIR
ABS_OUTPUTDIR:=$(call FullPath,$(OUTPUTDIR))
--- a/jdk/make/common/shared/Sanity.gmk Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/common/shared/Sanity.gmk Tue Apr 15 17:48:22 2008 -0700
@@ -788,21 +788,17 @@
ifdef OPENJDK
-#name of test program that prints out "Failed" if freetype is not good enough
-FREETYPE_VERSION_CHECK_NAME = freetype_versioncheck
-FREETYPE_VERSION_CHECK = $(TEMPDIR)/$(FREETYPE_VERSION_CHECK_NAME)$(EXE_SUFFIX)
+# The freetypecheck Makefile prints out "Failed" if not good enough
+$(TEMPDIR)/freetypeinfo: FRC
+ @$(prep-target)
+ @(($(CD) $(BUILDDIR)/tools/freetypecheck && $(MAKE)) || \
+ $(ECHO) "Failed to build freetypecheck." ) > $@
-sane-freetype:
- @-($(CD) $(BUILDDIR)/tools/freetypecheck && \
- $(MAKE) REQUIRED_FREETYPE_VERSION=$(REQUIRED_FREETYPE_VERSION) \
- FT_TEST=$(FREETYPE_VERSION_CHECK_NAME) \
- FT_HEADERS=$(FREETYPE_HEADERS_PATH) \
- FT_LIB=$(FREETYPE_LIB_PATH) \
- XARCH=$(XARCH))
- @if [ ! -r $(FREETYPE_VERSION_CHECK) -o \
- "`$(FREETYPE_VERSION_CHECK) | $(GREP) Fail`" != "" ]; then \
+sane-freetype: $(TEMPDIR)/freetypeinfo
+ @if [ "`$(CAT) $< | $(GREP) Fail`" != "" ]; then \
$(ECHO) "ERROR: FreeType version " $(REQUIRED_FREETYPE_VERSION) \
- "or higher is required. \n" >> $(ERROR_FILE) ; \
+ " or higher is required. \n" \
+ "`$(CAT) $<` \n" >> $(ERROR_FILE) ; \
fi
else
@@ -1339,7 +1335,7 @@
ifndef OPENJDK
@if [ "$(CC_CHECK)" != "same" ]; then \
$(ECHO) "WARNING: The $(PLATFORM) compiler is not version $(COMPILER_VERSION) $(REQUIRED_CC_VER) \n" \
- " Specifically the $(COMPILER_NAME) $(CC_TYPE) compiler. \n " \
+ " Specifically the $(COMPILER_NAME) compiler. \n " \
" $(YOU_ARE_USING) compiler version: $(CC_VER) \n" \
" The compiler was obtained from the following location: \n" \
" $(COMPILER_PATH) \n" \
--- a/jdk/make/java/java/genlocales.gmk Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/java/java/genlocales.gmk Tue Apr 15 17:48:22 2008 -0700
@@ -80,7 +80,8 @@
@$(ECHO) $(subst .java,'\n',$(Euro_Resources_java)) >> $@.tmp.euro;
@$(ECHO) $(subst .properties,'\n',$(NonEuro_Resources_properties)) > $@.tmp.noneuro;
@$(ECHO) $(subst .java,'\n',$(NonEuro_Resources_java)) >> $@.tmp.noneuro;
- NAWK=$(NAWK) SED=$(SED) $(SH) $(LOCALEGEN_SH) $(RESOURCE_NAMES) $@.tmp.euro \
+ NAWK="$(NAWK)" SED="$(SED)" SORT="$(SORT)" \
+ $(SH) $(LOCALEGEN_SH) $(RESOURCE_NAMES) $@.tmp.euro \
$@.tmp.noneuro $< $@
@$(RM) $@.tmp.euro $@.tmp.noneuro;
--- a/jdk/make/java/java/localegen.sh Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/java/java/localegen.sh Tue Apr 15 17:48:22 2008 -0700
@@ -29,7 +29,7 @@
# This script is to generate the supported locale list string and replace the
# LocaleDataMetaInfo-XLocales.java in <ws>/src/share/classes/sun/util
#
-# NAWK & SED is passed in as environment variables.
+# SORT, NAWK & SED is passed in as environment variables.
#
# A list of resource base name list;
@@ -47,7 +47,7 @@
localelist=
getlocalelist() {
localelist=""
- localelist=`$NAWK -F$1_ '{print $2}' $2 | sort`
+ localelist=`$NAWK -F$1_ '{print $2}' $2 | $SORT`
}
sed_script="$SED -e \"s@^#warn .*@// -- This file was mechanically generated: Do not edit! -- //@\" "
--- a/jdk/make/javax/Makefile Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/javax/Makefile Tue Apr 15 17:48:22 2008 -0700
@@ -30,24 +30,10 @@
BUILDDIR = ..
include $(BUILDDIR)/common/Defs.gmk
-#
-# Files to compile
-#
-AUTO_FILES_JAVA_DIRS = \
- javax/naming \
- com/sun/naming/internal \
- javax/net \
- javax/script \
- javax/security/auth \
- javax/security/cert \
- javax/security/sasl \
- javax/smartcardio \
- javax/tools \
- javax/xml
-
# imageio uses xml, so build it last
SUBDIRS = \
+ others \
accessibility \
print \
swing \
@@ -63,8 +49,3 @@
clean clobber::
$(SUBDIRS-loop)
-#
-# Rules
-#
-include $(BUILDDIR)/common/Classes.gmk
-
--- a/jdk/make/javax/crypto/Defs-jce.gmk Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/javax/crypto/Defs-jce.gmk Tue Apr 15 17:48:22 2008 -0700
@@ -1,5 +1,5 @@
#
-# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
+# Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -31,7 +31,7 @@
JCE_MANIFEST_FILE = $(TEMPDIR)/manifest.mf
$(JCE_MANIFEST_FILE): $(MAINMANIFEST)
$(prep-target)
- ( $(SED) "s/@@RELEASE@@/$(RELEASE)/" $(MAINMANIFEST); \
+ ( $(SED) "s/@@RELEASE@@/$(RELEASE)/" $<; \
$(ECHO) "Extension-Name: javax.crypto"; \
$(ECHO) "Implementation-Vendor-Id: com.sun"; ) > $@
@@ -75,6 +75,7 @@
define sign-target
$(BOOT_JARSIGNER_CMD) -keystore $(SIGNING_KEYSTORE) \
$@ $(SIGNING_ALIAS) < $(SIGNING_PASSPHRASE)
+ @$(java-vm-cleanup)
@$(ECHO) "\nJar codesigning finished."
endef
@@ -88,13 +89,15 @@
endef
#
-# Convenience macro for steps needed to sign a jar file.
+# Convenience macros for signing a jar file.
+#
+# Call through $(call sign-file, target file)
#
define sign-file
$(presign)
- $(install-file)
+ $(prep-target)
+ $(CP) $1 $@
$(sign-target)
- @$(java-vm-cleanup)
endef
#
--- a/jdk/make/javax/crypto/Makefile Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/javax/crypto/Makefile Tue Apr 15 17:48:22 2008 -0700
@@ -1,5 +1,5 @@
#
-# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
+# Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -96,7 +96,7 @@
# sign-jar Builds/signs jce.jar file (no install)
# sign-policy Builds/signs policy files (no install)
#
-# obfus Builds/obfuscates/signs/installs jce.jar
+# obfus Builds/obfuscates/signs jce.jar
#
# release Builds all targets in preparation
# for workspace integration.
@@ -110,8 +110,24 @@
PACKAGE = javax.crypto
PRODUCT = sun
+#
+# The following is for when we need to do postprocessing
+# (signing/obfuscation) against a read-only build. If the OUTPUTDIR
+# isn't writable, the build currently crashes out.
+#
+ifndef OPENJDK
+ ifdef ALT_JCE_BUILD_DIR
+ # =====================================================
+ # Where to place the output, in case we're building from a read-only
+ # build area. (e.g. a release engineering build.)
+ JCE_BUILD_DIR=${ALT_JCE_BUILD_DIR}
+ IGNORE_WRITABLE_OUTPUTDIR_TEST=true
+ else
+ JCE_BUILD_DIR=${TEMPDIR}
+ endif
+endif
+
include $(BUILDDIR)/common/Defs.gmk
-include Defs-jce.gmk
#
# Location for the newly built classfiles.
@@ -158,6 +174,8 @@
#
UNSIGNED_DIR = $(TEMPDIR)/unsigned
+include Defs-jce.gmk
+
# =====================================================
# Build the unsigned jce.jar file. Signing/obfuscation comes later.
@@ -299,7 +317,7 @@
# Sign the various jar files. Not needed for OpenJDK.
#
-SIGNED_DIR = $(TEMPDIR)/signed
+SIGNED_DIR = $(JCE_BUILD_DIR)/signed
SIGNED_POLICY_BUILDDIR = $(SIGNED_DIR)/policy
SIGNED_POLICY_FILES = \
@@ -312,61 +330,87 @@
sign-policy: $(SIGNED_POLICY_FILES)
+ifndef ALT_JCE_BUILD_DIR
$(SIGNED_DIR)/jce.jar: $(UNSIGNED_DIR)/jce.jar
- $(sign-file)
+else
+#
+# We have to remove the build dependency, otherwise, we'll try to rebuild it
+# which we can't do on a read-only filesystem.
+#
+$(SIGNED_DIR)/jce.jar:
+ @if [ ! -r $(UNSIGNED_DIR)/jce.jar ] ; then \
+ $(ECHO) "Couldn't find $(UNSIGNED_DIR)/jce.jar"; \
+ exit 1; \
+ fi
+endif
+ $(call sign-file, $(UNSIGNED_DIR)/jce.jar)
$(SIGNED_POLICY_BUILDDIR)/unlimited/US_export_policy.jar: \
-$(UNSIGNED_POLICY_BUILDDIR)/unlimited/US_export_policy.jar
- $(sign-file)
+ $(UNSIGNED_POLICY_BUILDDIR)/unlimited/US_export_policy.jar
+ $(call sign-file, $<)
$(SIGNED_POLICY_BUILDDIR)/unlimited/local_policy.jar: \
-$(UNSIGNED_POLICY_BUILDDIR)/unlimited/local_policy.jar
- $(sign-file)
+ $(UNSIGNED_POLICY_BUILDDIR)/unlimited/local_policy.jar
+ $(call sign-file, $<)
$(SIGNED_POLICY_BUILDDIR)/limited/US_export_policy.jar: \
-$(UNSIGNED_POLICY_BUILDDIR)/limited/US_export_policy.jar
- $(sign-file)
+ $(UNSIGNED_POLICY_BUILDDIR)/limited/US_export_policy.jar
+ $(call sign-file, $<)
$(SIGNED_POLICY_BUILDDIR)/limited/local_policy.jar: \
-$(UNSIGNED_POLICY_BUILDDIR)/limited/local_policy.jar
- $(sign-file)
+ $(UNSIGNED_POLICY_BUILDDIR)/limited/local_policy.jar
+ $(call sign-file, $<)
# =====================================================
# Obfuscate/sign/install the JDK build. Not needed for OpenJDK.
#
-OBFUS_DIR = $(TEMPDIR)/obfus
+OBFUS_DIR = $(JCE_BUILD_DIR)/obfus/jce
CLOSED_DIR = $(BUILDDIR)/closed/javax/crypto
obfus: $(OBFUS_DIR)/jce.jar
$(release-warning)
-$(OBFUS_DIR)/jce.jar: build-jar $(JCE_MANIFEST_FILE)
+ifndef ALT_JCE_BUILD_DIR
+$(OBFUS_DIR)/jce.jar: build-jar $(JCE_MANIFEST_FILE) $(OBFUS_DIR)/framework.dox
+else
+#
+# We have to remove the build dependency, otherwise, we'll try to rebuild it
+# which we can't do on a read-only filesystem.
+#
+$(OBFUS_DIR)/jce.jar: $(JCE_MANIFEST_FILE) $(OBFUS_DIR)/framework.dox
+ @if [ ! -d $(CLASSDESTDIR) ] ; then \
+ $(ECHO) "Couldn't find $(CLASSDESTDIR)"; \
+ exit 1; \
+ fi
+endif
+ @$(ECHO) ">>>Obfuscating JCE framework..."
$(presign)
$(preobfus)
- @$(ECHO) ">>>Obfuscating JCE framework..."
$(prep-target)
$(CD) $(OBFUS_DIR); \
- $(OBFUSCATOR) -fv \
- $(CURRENT_DIRECTORY)/$(CLOSED_DIR)/obfus/framework.dox
+ $(OBFUSCATOR) -fv framework.dox
@$(CD) $(OBFUS_DIR); $(java-vm-cleanup)
+ @#
@# The sun.security.internal classes are currently not obfuscated
@# due to an obfus problem. Manually copy them to the build directory
@# so that they are included in the jce.jar file.
+ @#
$(CP) -r $(CLASSDESTDIR)/sun $(OBFUS_DIR)/build
- $(RM) $(UNSIGNED_DIR)/jce.jar
$(BOOT_JAR_CMD) cmf $(JCE_MANIFEST_FILE) $@ \
-C $(OBFUS_DIR)/build javax \
-C $(OBFUS_DIR)/build sun \
$(JAR_JFLAGS)
$(sign-target)
- $(MKDIR) -p $(dir $(JAR_DESTFILE))
- $(RM) $(JAR_DESTFILE)
- $(CP) $@ $(JAR_DESTFILE)
@$(java-vm-cleanup)
+$(OBFUS_DIR)/framework.dox: $(CLOSED_DIR)/obfus/framework.dox
+ @$(ECHO) ">>>Creating framework.dox"
+ $(prep-target)
+ $(SED) "s:@@TEMPDIR@@:$(ABS_TEMPDIR):" $< > $@
+
#
# The current obfuscator has a limitation in that it currently only
# supports up to v49 class file format. Force v49 classfiles in our
@@ -380,26 +424,27 @@
# unlimited policy file distribution, etc.
#
-release: $(OBFUS_DIR)/jce.jar sign-policy
+release: $(OBFUS_DIR)/jce.jar sign-policy $(CLOSED_DIR)/doc/COPYRIGHT.html \
+ $(CLOSED_DIR)/doc/README.txt
$(RM) -r \
- $(RELEASE_DIR)/UnlimitedJCEPolicy \
- $(RELEASE_DIR)/jce.jar \
- $(RELEASE_DIR)/US_export_policy.jar \
- $(RELEASE_DIR)/local_policy.jar \
- $(RELEASE_DIR)/UnlimitedJCEPolicy.zip
- $(MKDIR) -p $(RELEASE_DIR)/UnlimitedJCEPolicy
- $(CP) $(OBFUS_DIR)/jce.jar $(RELEASE_DIR)
- $(CP) -r \
- $(SIGNED_POLICY_BUILDDIR)/limited/US_export_policy.jar \
- $(SIGNED_POLICY_BUILDDIR)/limited/local_policy.jar \
- $(RELEASE_DIR)
+ $(JCE_BUILD_DIR)/release/UnlimitedJCEPolicy \
+ $(JCE_BUILD_DIR)/release/jce.jar \
+ $(JCE_BUILD_DIR)/release/US_export_policy.jar \
+ $(JCE_BUILD_DIR)/release/local_policy.jar \
+ $(JCE_BUILD_DIR)/release/UnlimitedJCEPolicy.zip
+ $(MKDIR) -p $(JCE_BUILD_DIR)/release/UnlimitedJCEPolicy
+ $(CP) $(OBFUS_DIR)/jce.jar $(JCE_BUILD_DIR)/release
+ $(CP) \
+ $(SIGNED_POLICY_BUILDDIR)/limited/US_export_policy.jar \
+ $(SIGNED_POLICY_BUILDDIR)/limited/local_policy.jar \
+ $(JCE_BUILD_DIR)/release
$(CP) \
$(SIGNED_POLICY_BUILDDIR)/unlimited/US_export_policy.jar \
- $(SIGNED_POLICY_BUILDDIR)/unlimited/local_policy.jar \
- $(RELEASE_DIR)/UnlimitedJCEPolicy
- $(CP) $(CLOSED_DIR)/doc/COPYRIGHT.html \
- $(CLOSED_DIR)/doc/README.txt $(RELEASE_DIR)/UnlimitedJCEPolicy
- cd $(RELEASE_DIR) ; \
+ $(SIGNED_POLICY_BUILDDIR)/unlimited/local_policy.jar \
+ $(CLOSED_DIR)/doc/COPYRIGHT.html \
+ $(CLOSED_DIR)/doc/README.txt \
+ $(JCE_BUILD_DIR)/release/UnlimitedJCEPolicy
+ cd $(JCE_BUILD_DIR)/release ; \
$(ZIPEXE) -qr UnlimitedJCEPolicy.zip UnlimitedJCEPolicy
$(release-warning)
@@ -478,7 +523,8 @@
clobber clean::
$(RM) -r $(JAR_DESTFILE) $(POLICY_DESTDIR)/US_export_policy.jar \
- $(POLICY_DESTDIR)/local_policy.jar $(DELETE_DIRS) $(TEMPDIR)
+ $(POLICY_DESTDIR)/local_policy.jar $(DELETE_DIRS) $(TEMPDIR) \
+ $(JCE_BUILD_DIR)
.PHONY: build-jar jar build-policy unlimited limited install-jar \
install-limited install-unlimited
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/javax/others/Makefile Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,52 @@
+#
+# Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Sun designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Sun in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+#
+# Makefile for building javax (other classes)
+#
+
+BUILDDIR = ../..
+include $(BUILDDIR)/common/Defs.gmk
+
+#
+# Files to compile
+#
+AUTO_FILES_JAVA_DIRS = \
+ javax/naming \
+ com/sun/naming/internal \
+ javax/net \
+ javax/script \
+ javax/security/auth \
+ javax/security/cert \
+ javax/security/sasl \
+ javax/smartcardio \
+ javax/tools \
+ javax/xml
+
+#
+# Rules
+#
+include $(BUILDDIR)/common/Classes.gmk
+
--- a/jdk/make/sun/security/mscapi/Makefile Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/sun/security/mscapi/Makefile Tue Apr 15 17:48:22 2008 -0700
@@ -1,5 +1,5 @@
#
-# Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved.
+# Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -92,8 +92,25 @@
PACKAGE = sun.security.mscapi
LIBRARY = sunmscapi
PRODUCT = sun
+
+#
+# The following is for when we need to do postprocessing
+# (signing/obfuscation) against a read-only build. If the OUTPUTDIR
+# isn't writable, the build currently crashes out.
+#
+ifndef OPENJDK
+ ifdef ALT_JCE_BUILD_DIR
+ # =====================================================
+ # Where to place the output, in case we're building from a read-only
+ # build area. (e.g. a release engineering build.)
+ JCE_BUILD_DIR=${ALT_JCE_BUILD_DIR}
+ IGNORE_WRITABLE_OUTPUTDIR_TEST=true
+ else
+ JCE_BUILD_DIR=${TEMPDIR}
+ endif
+endif
+
include $(BUILDDIR)/common/Defs.gmk
-include $(BUILDDIR)/javax/crypto/Defs-jce.gmk
CPLUSPLUSLIBRARY=true
@@ -163,6 +180,8 @@
$(build-warning)
endif
+include $(BUILDDIR)/javax/crypto/Defs-jce.gmk
+
# =====================================================
# Build the unsigned sunmscapi.jar file.
@@ -200,14 +219,26 @@
# Sign the provider jar file. Not needed for OpenJDK.
#
-SIGNED_DIR = $(TEMPDIR)/signed
+SIGNED_DIR = $(JCE_BUILD_DIR)/signed
sign: sign-jar
sign-jar: $(SIGNED_DIR)/sunmscapi.jar
+ifndef ALT_JCE_BUILD_DIR
$(SIGNED_DIR)/sunmscapi.jar: $(UNSIGNED_DIR)/sunmscapi.jar
- $(sign-file)
+else
+#
+# We have to remove the build dependency, otherwise, we'll try to rebuild it
+# which we can't do on a read-only filesystem.
+#
+$(SIGNED_DIR)/sunmscapi.jar:
+ @if [ ! -r $(UNSIGNED_DIR)/sunmscapi.jar ] ; then \
+ $(ECHO) "Couldn't find $(UNSIGNED_DIR)/sunmscapi.jar"; \
+ exit 1; \
+ fi
+endif
+ $(call sign-file, $(UNSIGNED_DIR)/sunmscapi.jar)
# =====================================================
@@ -215,9 +246,9 @@
#
release: $(SIGNED_DIR)/sunmscapi.jar
- $(RM) $(RELEASE_DIR)/sunmscapi.jar
- $(MKDIR) -p $(RELEASE_DIR)
- $(CP) $(SIGNED_DIR)/sunmscapi.jar $(RELEASE_DIR)
+ $(RM) $(JCE_BUILD_DIR)/release/sunmscapi.jar
+ $(MKDIR) -p $(JCE_BUILD_DIR)/release
+ $(CP) $(SIGNED_DIR)/sunmscapi.jar $(JCE_BUILD_DIR)/release
$(release-warning)
endif # OPENJDK
@@ -255,7 +286,7 @@
#
clobber clean::
- $(RM) -r $(JAR_DESTFILE) $(TEMPDIR)
+ $(RM) -r $(JAR_DESTFILE) $(TEMPDIR) $(JCE_BUILD_DIR)
.PHONY: build-jar jar install-jar
ifndef OPENJDK
--- a/jdk/make/sun/security/pkcs11/Makefile Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/sun/security/pkcs11/Makefile Tue Apr 15 17:48:22 2008 -0700
@@ -1,5 +1,5 @@
#
-# Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+# Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -92,8 +92,25 @@
PACKAGE = sun.security.pkcs11
LIBRARY = j2pkcs11
PRODUCT = sun
+
+#
+# The following is for when we need to do postprocessing
+# (signing/obfuscation) against a read-only build. If the OUTPUTDIR
+# isn't writable, the build currently crashes out.
+#
+ifndef OPENJDK
+ ifdef ALT_JCE_BUILD_DIR
+ # =====================================================
+ # Where to place the output, in case we're building from a read-only
+ # build area. (e.g. a release engineering build.)
+ JCE_BUILD_DIR=${ALT_JCE_BUILD_DIR}
+ IGNORE_WRITABLE_OUTPUTDIR_TEST=true
+ else
+ JCE_BUILD_DIR=${TEMPDIR}
+ endif
+endif
+
include $(BUILDDIR)/common/Defs.gmk
-include $(BUILDDIR)/javax/crypto/Defs-jce.gmk
#
# C and Java Files
@@ -163,6 +180,8 @@
$(build-warning)
endif
+include $(BUILDDIR)/javax/crypto/Defs-jce.gmk
+
# =====================================================
# Build the unsigned sunpkcs11.jar file.
@@ -200,14 +219,26 @@
# Sign the provider jar file. Not needed for OpenJDK.
#
-SIGNED_DIR = $(TEMPDIR)/signed
+SIGNED_DIR = $(JCE_BUILD_DIR)/signed
sign: sign-jar
sign-jar: $(SIGNED_DIR)/sunpkcs11.jar
+ifndef ALT_JCE_BUILD_DIR
$(SIGNED_DIR)/sunpkcs11.jar: $(UNSIGNED_DIR)/sunpkcs11.jar
- $(sign-file)
+else
+#
+# We have to remove the build dependency, otherwise, we'll try to rebuild it
+# which we can't do on a read-only filesystem.
+#
+$(SIGNED_DIR)/sunpkcs11.jar:
+ @if [ ! -r $(UNSIGNED_DIR)/sunpkcs11.jar ] ; then \
+ $(ECHO) "Couldn't find $(UNSIGNED_DIR)/sunpkcs11.jar"; \
+ exit 1; \
+ fi
+endif
+ $(call sign-file, $(UNSIGNED_DIR)/sunpkcs11.jar)
# =====================================================
@@ -215,9 +246,9 @@
#
release: $(SIGNED_DIR)/sunpkcs11.jar
- $(RM) $(RELEASE_DIR)/sunpkcs11.jar
- $(MKDIR) -p $(RELEASE_DIR)
- $(CP) $(SIGNED_DIR)/sunpkcs11.jar $(RELEASE_DIR)
+ $(RM) $(JCE_BUILD_DIR)/release/sunpkcs11.jar
+ $(MKDIR) -p $(JCE_BUILD_DIR)/release
+ $(CP) $(SIGNED_DIR)/sunpkcs11.jar $(JCE_BUILD_DIR)/release
$(release-warning)
endif # OPENJDK
@@ -255,7 +286,7 @@
#
clobber clean::
- $(RM) -r $(JAR_DESTFILE) $(TEMPDIR)
+ $(RM) -r $(JAR_DESTFILE) $(TEMPDIR) $(JCE_BUILD_DIR)
.PHONY: build-jar jar install-jar
ifndef OPENJDK
--- a/jdk/make/tools/Makefile Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/tools/Makefile Tue Apr 15 17:48:22 2008 -0700
@@ -40,6 +40,7 @@
dir_diff \
dtdbuilder \
fontchecker \
+ freetypecheck \
generate_break_iterator \
GenerateCharacter \
generatecurrencydata \
@@ -58,4 +59,5 @@
clean clobber::
$(RM) -r $(BUILDTOOLCLASSDIR)
$(RM) -r $(BUILDTOOLJARDIR)
+ $(RM) -r $(BUILDTOOLBINDIR)
--- a/jdk/make/tools/freetypecheck/Makefile Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/make/tools/freetypecheck/Makefile Tue Apr 15 17:48:22 2008 -0700
@@ -22,55 +22,58 @@
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
-# Builds test program for freetype sanity check.
-#
-# Makefile should be called with following input parameters
-# FT_TEST - full name of test program
-# FT_HEADERS - path to freetype headers
-# FT_LIB - location of directory with library
-# XARCH - xarch option if required
+# Builds and runs test program for freetype sanity check.
BUILDDIR = ../..
include $(BUILDDIR)/common/Defs.gmk
-#test program is expected in the TEMPDIR
-FT_TEST_PATH = $(TEMPDIR)/$(FT_TEST)
+# Default name
+FT_TEST = $(BUILDTOOLBINDIR)/freetype_versioncheck$(EXE_SUFFIX)
-all: $(FT_TEST_PATH)
+# Used on openjdk only
+ifeq ($(OPENJDK),true)
# Start with CFLAGS (which gets us the required -xarch setting on solaris)
ifeq ($(PLATFORM), windows)
- FT_OPTIONS =
+ FT_OPTIONS = /nologo $(CC_OBJECT_OUTPUT_FLAG)$(TEMPDIR)
+ FREETYPE_DLL = $(FREETYPE_LIB_PATH)/freetype.dll
+ FT_LD_OPTIONS = $(FREETYPE_LIB_PATH)/freetype.lib
else
FT_OPTIONS = $(CFLAGS)
-endif
-
-FT_OPTIONS += -I$(FT_HEADERS) -I$(FT_HEADERS)/freetype2
-FT_OPTIONS += $(XARCH)
-
-#add runtime library search path
-ifeq ($(PLATFORM), windows)
- FREETYPE_LIB=$(FT_LIB)/freetype.lib
- FREETYPE_DLL=$(FT_LIB)/freetype.dll
- DFLAG=/D
-else
- FT_OPTIONS += -L$(FT_LIB)
- DFLAG = -D
-
- #add runtime lib search path to ensure test will be runnable
+ FT_LD_OPTIONS = -L$(FREETYPE_LIB_PATH)
+ # Add runtime lib search path to ensure test will be runnable
ifeq ($(PLATFORM), solaris)
- FT_OPTIONS += -R $(FT_LIB) -lfreetype
+ FT_LD_OPTIONS += -R $(FREETYPE_LIB_PATH) -lfreetype
else #linux
- FT_OPTIONS += -Wl,-rpath -Wl,$(FT_LIB) -lfreetype
+ FT_LD_OPTIONS += -Wl,-rpath -Wl,$(FREETYPE_LIB_PATH) -lfreetype
endif
endif
-
-FT_OPTIONS += $(DFLAG)REQUIRED_FREETYPE_VERSION=$(REQUIRED_FREETYPE_VERSION)
+FT_OPTIONS += -I$(FREETYPE_HEADERS_PATH)
+FT_OPTIONS += -I$(FREETYPE_HEADERS_PATH)/freetype2
+FT_OPTIONS += -DREQUIRED_FREETYPE_VERSION=$(REQUIRED_FREETYPE_VERSION)
+FT_LD_OPTIONS += $(LFLAGS_$(COMPILER_VERSION))
-# On windows we need to copy dll to test dir
-# ti ensure it will be found in runtime
-$(FT_TEST_PATH): freetypecheck.c
- @$(CC) $(FT_OPTIONS) $(CC_PROGRAM_OUTPUT_FLAG)$@ $< $(FREETYPE_LIB) $(LFLAGS_$(COMPILER_VERSION))
+# Create test program
+all: $(FT_TEST)
+ @$(FT_TEST)
+
+# On windows we need to copy dll to test dir to ensure it will be found
+# at runtime
+$(FT_TEST): freetypecheck.c
+ @$(prep-target)
+ @$(CC) $(FT_OPTIONS) $(CC_PROGRAM_OUTPUT_FLAG)$@ $< $(FT_LD_OPTIONS)
ifeq ($(PLATFORM), windows)
@$(CP) $(FREETYPE_DLL) `dirname $@`
endif
+
+else
+
+# Inform user this is openjdk only
+all:
+ @$(ECHO) "The freetype files are only used with OpenJDK"
+
+endif
+
+clean::
+ $(RM) $(FT_TEST)
+
--- a/jdk/src/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java Tue Apr 15 17:48:22 2008 -0700
@@ -34,8 +34,6 @@
import java.util.HashSet;
import java.util.WeakHashMap;
import java.lang.ref.WeakReference;
-import java.io.PrintWriter;
-import java.io.StringWriter;
import java.security.AccessControlContext;
import java.security.Permission;
import java.security.ProtectionDomain;
@@ -51,7 +49,6 @@
import javax.management.InstanceNotFoundException;
import javax.management.IntrospectionException;
import javax.management.InvalidAttributeValueException;
-import javax.management.JMException;
import javax.management.JMRuntimeException;
import javax.management.ListenerNotFoundException;
import javax.management.MalformedObjectNameException;
@@ -84,11 +81,10 @@
import com.sun.jmx.mbeanserver.DynamicMBean2;
import com.sun.jmx.mbeanserver.ModifiableClassLoaderRepository;
import com.sun.jmx.mbeanserver.MBeanInstantiator;
-import com.sun.jmx.mbeanserver.MXBeanSupport;
import com.sun.jmx.mbeanserver.Repository;
import com.sun.jmx.mbeanserver.NamedObject;
-import com.sun.jmx.defaults.ServiceName;
import com.sun.jmx.mbeanserver.Introspector;
+import com.sun.jmx.mbeanserver.Util;
import com.sun.jmx.remote.util.EnvHelp;
/**
@@ -623,18 +619,9 @@
List<String> result = new ArrayList<String>(domains.length);
for (int i = 0; i < domains.length; i++) {
try {
- ObjectName domain = new ObjectName(domains[i] + ":x=x");
+ ObjectName domain = Util.newObjectName(domains[i] + ":x=x");
checkMBeanPermission((String) null, null, domain, "getDomains");
result.add(domains[i]);
- } catch (MalformedObjectNameException e) {
- // Should never occur... But let's log it just in case.
- if (MBEANSERVER_LOGGER.isLoggable(Level.SEVERE)) {
- MBEANSERVER_LOGGER.logp(Level.SEVERE,
- DefaultMBeanServerInterceptor.class.getName(),
- "getDomains",
- "Failed to check permission for domain = " +
- domains[i], e);
- }
} catch (SecurityException e) {
// OK: Do not add this domain to the list
}
--- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanAnalyzer.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanAnalyzer.java Tue Apr 15 17:48:22 2008 -0700
@@ -107,10 +107,7 @@
private MBeanAnalyzer(Class<?> mbeanInterface,
MBeanIntrospector<M> introspector)
throws NotCompliantMBeanException {
- if (!mbeanInterface.isInterface()) {
- throw new NotCompliantMBeanException("Not an interface: " +
- mbeanInterface.getName());
- }
+ introspector.checkCompliance(mbeanInterface);
try {
initMaps(mbeanInterface, introspector);
@@ -121,11 +118,10 @@
// Introspect the mbeanInterface and initialize this object's maps.
//
- private void initMaps(Class<?> mbeanInterface,
+ private void initMaps(Class<?> mbeanType,
MBeanIntrospector<M> introspector) throws Exception {
- final Method[] methodArray = mbeanInterface.getMethods();
-
- final List<Method> methods = eliminateCovariantMethods(methodArray);
+ final List<Method> methods1 = introspector.getMethods(mbeanType);
+ final List<Method> methods = eliminateCovariantMethods(methods1);
/* Run through the methods to detect inconsistencies and to enable
us to give getter and setter together to visitAttribute. */
@@ -234,13 +230,13 @@
but existing code may depend on it and users may be used to seeing
operations or attributes appear in a particular order. */
static List<Method>
- eliminateCovariantMethods(Method[] methodArray) {
+ eliminateCovariantMethods(List<Method> startMethods) {
// We are assuming that you never have very many methods with the
// same name, so it is OK to use algorithms that are quadratic
// in the number of methods with the same name.
- final int len = methodArray.length;
- final Method[] sorted = methodArray.clone();
+ final int len = startMethods.size();
+ final Method[] sorted = startMethods.toArray(new Method[len]);
Arrays.sort(sorted,MethodOrder.instance);
final Set<Method> overridden = newSet();
for (int i=1;i<len;i++) {
@@ -259,7 +255,7 @@
}
}
- final List<Method> methods = newList(Arrays.asList(methodArray));
+ final List<Method> methods = newList(startMethods);
methods.removeAll(overridden);
return methods;
}
--- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanIntrospector.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanIntrospector.java Tue Apr 15 17:48:22 2008 -0700
@@ -34,6 +34,7 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
+import java.util.Arrays;
import java.util.List;
import java.util.WeakHashMap;
@@ -169,6 +170,19 @@
*/
abstract Descriptor getMBeanDescriptor(Class<?> resourceClass);
+ void checkCompliance(Class<?> mbeanType) throws NotCompliantMBeanException {
+ if (!mbeanType.isInterface()) {
+ throw new NotCompliantMBeanException("Not an interface: " +
+ mbeanType.getName());
+ }
+ }
+
+ /**
+ * Get the methods to be analyzed to build the MBean interface.
+ */
+ List<Method> getMethods(final Class<?> mbeanType) throws Exception {
+ return Arrays.asList(mbeanType.getMethods());
+ }
final PerInterface<M> getPerInterface(Class<?> mbeanInterface)
throws NotCompliantMBeanException {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/NotificationMBeanSupport.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package com.sun.jmx.mbeanserver;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import javax.management.NotCompliantMBeanException;
+import javax.management.Notification;
+
+/**
+ * <p>A variant of {@code StandardMBeanSupport} where the only
+ * methods included are public getters. This is used by
+ * {@code QueryNotificationFilter} to pretend that a Notification is
+ * an MBean so it can have a query evaluated on it. Standard queries
+ * never set attributes or invoke methods but custom queries could and
+ * we don't want to allow that. Also we don't want to fail if a
+ * Notification happens to have inconsistent types in a pair of getX and
+ * setX methods, and we want to include the Object.getClass() method.
+ */
+public class NotificationMBeanSupport extends StandardMBeanSupport {
+ public <T extends Notification> NotificationMBeanSupport(T n)
+ throws NotCompliantMBeanException {
+ super(n, Util.<Class<T>>cast(n.getClass()));
+ }
+
+ @Override
+ MBeanIntrospector<Method> getMBeanIntrospector() {
+ return introspector;
+ }
+
+ private static class Introspector extends StandardMBeanIntrospector {
+ @Override
+ void checkCompliance(Class<?> mbeanType) {}
+
+ @Override
+ List<Method> getMethods(final Class<?> mbeanType)
+ throws Exception {
+ List<Method> methods = new ArrayList<Method>();
+ for (Method m : mbeanType.getMethods()) {
+ String name = m.getName();
+ Class<?> ret = m.getReturnType();
+ if (m.getParameterTypes().length == 0) {
+ if ((name.startsWith("is") && name.length() > 2 &&
+ ret == boolean.class) ||
+ (name.startsWith("get") && name.length() > 3 &&
+ ret != void.class)) {
+ methods.add(m);
+ }
+ }
+ }
+ return methods;
+ }
+
+ }
+ private static final MBeanIntrospector<Method> introspector =
+ new Introspector();
+}
--- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/OpenConverter.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/OpenConverter.java Tue Apr 15 17:48:22 2008 -0700
@@ -438,7 +438,7 @@
c.getClassLoader() == null);
final List<Method> methods =
- MBeanAnalyzer.eliminateCovariantMethods(c.getMethods());
+ MBeanAnalyzer.eliminateCovariantMethods(Arrays.asList(c.getMethods()));
final SortedMap<String,Method> getterMap = newSortedMap();
/* Select public methods that look like "T getX()" or "boolean
@@ -1118,11 +1118,11 @@
final Class<ConstructorProperties> propertyNamesClass = ConstructorProperties.class;
Class targetClass = getTargetClass();
- Constructor[] constrs = targetClass.getConstructors();
+ Constructor<?>[] constrs = targetClass.getConstructors();
// Applicable if and only if there are any annotated constructors
- List<Constructor> annotatedConstrList = newList();
- for (Constructor constr : constrs) {
+ List<Constructor<?>> annotatedConstrList = newList();
+ for (Constructor<?> constr : constrs) {
if (Modifier.isPublic(constr.getModifiers())
&& constr.getAnnotation(propertyNamesClass) != null)
annotatedConstrList.add(constr);
@@ -1152,7 +1152,7 @@
// Also remember the set of properties in that constructor
// so we can test unambiguity.
Set<BitSet> getterIndexSets = newSet();
- for (Constructor constr : annotatedConstrList) {
+ for (Constructor<?> constr : annotatedConstrList) {
String[] propertyNames =
constr.getAnnotation(propertyNamesClass).value();
@@ -1309,10 +1309,10 @@
}
private static class Constr {
- final Constructor constructor;
+ final Constructor<?> constructor;
final int[] paramIndexes;
final BitSet presentParams;
- Constr(Constructor constructor, int[] paramIndexes,
+ Constr(Constructor<?> constructor, int[] paramIndexes,
BitSet presentParams) {
this.constructor = constructor;
this.paramIndexes = paramIndexes;
--- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/Repository.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/Repository.java Tue Apr 15 17:48:22 2008 -0700
@@ -415,17 +415,8 @@
boolean to_default_domain = false;
// Set domain to default if domain is empty and not already set
- if (dom.length() == 0) {
- try {
- name = new ObjectName(domain + name.toString());
- } catch (MalformedObjectNameException e) {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINEST)) {
- MBEANSERVER_LOGGER.logp(Level.FINEST,
- Repository.class.getName(), "addMBean",
- "Unexpected MalformedObjectNameException", e);
- }
- }
- }
+ if (dom.length() == 0)
+ name = Util.newObjectName(domain + name.toString());
// Do we have default domain ?
if (dom == domain) {
--- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/Util.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/Util.java Tue Apr 15 17:48:22 2008 -0700
@@ -38,6 +38,8 @@
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
public class Util {
static <K, V> Map<K, V> newMap() {
@@ -85,6 +87,14 @@
return new ArrayList<E>(c);
}
+ public static ObjectName newObjectName(String s) {
+ try {
+ return new ObjectName(s);
+ } catch (MalformedObjectNameException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
/* This method can be used by code that is deliberately violating the
* allowed checked casts. Rather than marking the whole method containing
* the code with @SuppressWarnings, you can use a call to this method for
--- a/jdk/src/share/classes/com/sun/management/package.html Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/com/sun/management/package.html Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-CTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<!--
--- a/jdk/src/share/classes/java/beans/MetaData.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/java/beans/MetaData.java Tue Apr 15 17:48:22 2008 -0700
@@ -1553,7 +1553,7 @@
private static String[] getConstructorProperties(Class type) {
String[] names = null;
int length = 0;
- for (Constructor constructor : type.getConstructors()) {
+ for (Constructor<?> constructor : type.getConstructors()) {
String[] value = getAnnotationValue(constructor);
if ((value != null) && (length < value.length) && isValid(constructor, value)) {
names = value;
@@ -1563,14 +1563,14 @@
return names;
}
- private static String[] getAnnotationValue(Constructor constructor) {
+ private static String[] getAnnotationValue(Constructor<?> constructor) {
ConstructorProperties annotation = constructor.getAnnotation(ConstructorProperties.class);
return (annotation != null)
? annotation.value()
: null;
}
- private static boolean isValid(Constructor constructor, String[] names) {
+ private static boolean isValid(Constructor<?> constructor, String[] names) {
Class[] parameters = constructor.getParameterTypes();
if (names.length != parameters.length) {
return false;
--- a/jdk/src/share/classes/java/lang/instrument/Instrumentation.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/java/lang/instrument/Instrumentation.java Tue Apr 15 17:48:22 2008 -0700
@@ -636,7 +636,11 @@
* @param transformer
* The ClassFileTransformer which wraps using this prefix.
* @param prefix
- * The prefix which has been applied to wrapped native methods.
+ * The prefix to apply to wrapped native methods when
+ * retrying a failed native method resolution. If prefix
+ * is either <code>null</code> or the empty string, then
+ * failed native method resolutions are not retried for
+ * this transformer.
* @throws java.lang.NullPointerException if passed a <code>null</code> transformer.
* @throws java.lang.UnsupportedOperationException if the current configuration of
* the JVM does not allow setting a native method prefix
--- a/jdk/src/share/classes/javax/management/MBeanServer.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/javax/management/MBeanServer.java Tue Apr 15 17:48:22 2008 -0700
@@ -50,7 +50,7 @@
* server. A Java object cannot be registered in the MBean server
* unless it is a JMX compliant MBean.</p>
*
- * <p>When an MBean is registered or unregistered in the MBean server
+ * <p id="notif">When an MBean is registered or unregistered in the MBean server
* a {@link javax.management.MBeanServerNotification
* MBeanServerNotification} Notification is emitted. To register an
* object as listener to MBeanServerNotifications you should call the
@@ -258,27 +258,43 @@
*/
public interface MBeanServer extends MBeanServerConnection {
- // doc comment inherited from MBeanServerConnection
+ /**
+ * {@inheritDoc}
+ * <p>If this method successfully creates an MBean, a notification
+ * is sent as described <a href="#notif">above</a>.</p>
+ */
public ObjectInstance createMBean(String className, ObjectName name)
throws ReflectionException, InstanceAlreadyExistsException,
MBeanRegistrationException, MBeanException,
NotCompliantMBeanException;
- // doc comment inherited from MBeanServerConnection
+ /**
+ * {@inheritDoc}
+ * <p>If this method successfully creates an MBean, a notification
+ * is sent as described <a href="#notif">above</a>.</p>
+ */
public ObjectInstance createMBean(String className, ObjectName name,
ObjectName loaderName)
throws ReflectionException, InstanceAlreadyExistsException,
MBeanRegistrationException, MBeanException,
NotCompliantMBeanException, InstanceNotFoundException;
- // doc comment inherited from MBeanServerConnection
+ /**
+ * {@inheritDoc}
+ * <p>If this method successfully creates an MBean, a notification
+ * is sent as described <a href="#notif">above</a>.</p>
+ */
public ObjectInstance createMBean(String className, ObjectName name,
Object params[], String signature[])
throws ReflectionException, InstanceAlreadyExistsException,
MBeanRegistrationException, MBeanException,
NotCompliantMBeanException;
- // doc comment inherited from MBeanServerConnection
+ /**
+ * {@inheritDoc}
+ * <p>If this method successfully creates an MBean, a notification
+ * is sent as described <a href="#notif">above</a>.</p>
+ */
public ObjectInstance createMBean(String className, ObjectName name,
ObjectName loaderName, Object params[],
String signature[])
@@ -287,12 +303,15 @@
NotCompliantMBeanException, InstanceNotFoundException;
/**
- * Registers a pre-existing object as an MBean with the MBean
+ * <p>Registers a pre-existing object as an MBean with the MBean
* server. If the object name given is null, the MBean must
* provide its own name by implementing the {@link
* javax.management.MBeanRegistration MBeanRegistration} interface
* and returning the name from the {@link
- * MBeanRegistration#preRegister preRegister} method.
+ * MBeanRegistration#preRegister preRegister} method.</p>
+ *
+ * <p>If this method successfully registers an MBean, a notification
+ * is sent as described <a href="#notif">above</a>.</p>
*
* @param object The MBean to be registered as an MBean.
* @param name The object name of the MBean. May be null.
@@ -319,7 +338,12 @@
throws InstanceAlreadyExistsException, MBeanRegistrationException,
NotCompliantMBeanException;
- // doc comment inherited from MBeanServerConnection
+ /**
+ * {@inheritDoc}
+ *
+ * <p>If this method successfully unregisters an MBean, a notification
+ * is sent as described <a href="#notif">above</a>.</p>
+ */
public void unregisterMBean(ObjectName name)
throws InstanceNotFoundException, MBeanRegistrationException;
--- a/jdk/src/share/classes/javax/management/ObjectName.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/javax/management/ObjectName.java Tue Apr 15 17:48:22 2008 -0700
@@ -26,6 +26,7 @@
package javax.management;
import com.sun.jmx.mbeanserver.GetPropertyAction;
+import com.sun.jmx.mbeanserver.Util;
import java.io.IOException;
import java.io.InvalidObjectException;
import java.io.ObjectInputStream;
@@ -1386,12 +1387,7 @@
throws NullPointerException {
if (name.getClass().equals(ObjectName.class))
return name;
- try {
- return new ObjectName(name.getSerializedNameString());
- } catch (MalformedObjectNameException e) {
- throw new IllegalArgumentException("Unexpected: " + e);
- // can't happen
- }
+ return Util.newObjectName(name.getSerializedNameString());
}
/**
@@ -1950,14 +1946,7 @@
*
* @since 1.6
*/
- public static final ObjectName WILDCARD;
- static {
- try {
- WILDCARD = new ObjectName("*:*");
- } catch (MalformedObjectNameException e) {
- throw new Error("Can't initialize wildcard name", e);
- }
- }
+ public static final ObjectName WILDCARD = Util.newObjectName("*:*");
// Category : Utilities <===================================
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/javax/management/QueryNotificationFilter.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,417 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package javax.management;
+
+import com.sun.jmx.mbeanserver.NotificationMBeanSupport;
+import com.sun.jmx.mbeanserver.Util;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * <p>General-purpose notification filter. This filter can be used to
+ * filter notifications from a possibly-remote MBean. Most filtering
+ * decisions can be coded using this filter, which avoids having to
+ * write a custom implementation of the {@link NotificationFilter}
+ * class. Writing a custom implementation requires you to deploy it
+ * on both the client and the server in the remote case, so using this class
+ * instead is recommended where possible.</p>
+ *
+ * <!-- <p>Because this class was introduced in version 2.0 of the JMX API,
+ * it may not be present on a remote JMX agent that is running an earlier
+ * version. The method {@link JMX#addListenerWithFilter JMX.addListenerWithFilter}
+ * can be used when you cannot be sure whether this class is present in the
+ * agent you are connecting to.</p> -->
+ *
+ * <p>This class uses the {@linkplain Query Query API} to specify the
+ * filtering logic. For example, to select only notifications where the
+ * {@linkplain Notification#getType() type} is {@code "com.example.mytype"},
+ * you could use</p>
+ *
+ * <pre>
+ * NotificationFilter filter =
+ * new QueryNotificationFilter("Type = 'com.example.mytype'");
+ * </pre>
+ *
+ * <p>or equivalently</p>
+ *
+ * <pre>
+ * NotificationFilter filter =
+ * new QueryNotificationFilter(
+ * Query.eq(Query.attr("Type"), Query.value("com.example.mytype")));
+ * </pre>
+ *
+ * <p>(This particular example could also use
+ * {@link NotificationFilterSupport}.)</p>
+ *
+ * <p>Here are some other examples of filters you can specify with this class.</p>
+ *
+ * <dl>
+ *
+ * <dt>{@code QueryNotificationFilter("Type = 'com.example.type1' or
+ * Type = 'com.example.type2'")}
+ * <dd>Notifications where the type is either of the given strings.
+ *
+ * <dt>{@code QueryNotificationFilter("Type in ('com.example.type1',
+ * 'com.example.type2')")}
+ * <dd>Another way to write the previous example.
+ *
+ * <dt>{@code QueryNotificationFilter("SequenceNumber > 1000")}
+ * <dd>Notifications where the {@linkplain Notification#getSequenceNumber()
+ * sequence number} is greater than 1000.
+ *
+ * <dt>{@code QueryNotificationFilter(AttributeChangeNotification.class, null)}
+ * <dd>Notifications where the notification class is
+ * {@link AttributeChangeNotification} or a subclass of it.
+ *
+ * <dt>{@code QueryNotificationFilter(AttributeChangeNotification.class,
+ * "AttributeName = 'Size'")}
+ * <dd>Notifications where the notification class is
+ * {@link AttributeChangeNotification} or a subclass, and where the
+ * {@linkplain AttributeChangeNotification#getAttributeName() name of the
+ * changed attribute} is {@code Size}.
+ *
+ * <dt>{@code QueryNotificationFilter(AttributeChangeNotification.class,
+ * "AttributeName = 'Size' and NewValue - OldValue > 100")}
+ * <dd>As above, but the difference between the
+ * {@linkplain AttributeChangeNotification#getNewValue() new value} and the
+ * {@linkplain AttributeChangeNotification#getOldValue() old value} must be
+ * greater than 100.
+ *
+ * <dt>{@code QueryNotificationFilter("like 'com.example.mydomain:*'")}
+ * <dd>Notifications where the {@linkplain Notification#getSource() source}
+ * is an ObjectName that matches the pattern.
+ *
+ * <dt>{@code QueryNotificationFilter("Source.canonicalName like
+ * 'com.example.mydomain:%'")}
+ * <dd>Another way to write the previous example.
+ *
+ * <dt>{@code QueryNotificationFilter(MBeanServerNotification.class,
+ * "Type = 'JMX.mbean.registered' and MBeanName.canonicalName like
+ * 'com.example.mydomain:%'")}
+ * <dd>Notifications of class {@link MBeanServerNotification} representing
+ * an object registered in the domain {@code com.example.mydomain}.
+ *
+ * </dl>
+ *
+ * <h4>How it works</h4>
+ *
+ * <p>Although the examples above are clear, looking closely at the
+ * Query API reveals a subtlety. A {@link QueryExp} is evaluated on
+ * an {@link ObjectName}, not a {@code Notification}.</p>
+ *
+ * <p>Every time a {@code Notification} is to be filtered by a
+ * {@code QueryNotificationFilter}, a special {@link MBeanServer} is created.
+ * This {@code MBeanServer} contains exactly one MBean, which represents the
+ * {@code Notification}. If the {@linkplain Notification#getSource()
+ * source} of the notification is an {@code ObjectName}, which is
+ * recommended practice, then the name of the MBean representing the
+ * {@code Notification} will be this {@code ObjectName}. Otherwise the
+ * name is unspecified.</p>
+ *
+ * <p>The query specified in the {@code QueryNotificationFilter} constructor
+ * is evaluated against this {@code MBeanServer} and {@code ObjectName},
+ * and the filter returns true if and only if the query does. If the
+ * query throws an exception, then the filter will return false.</p>
+ *
+ * <p>The MBean representing the {@code Notification} has one attribute for
+ * every property of the {@code Notification}. Specifically, for every public
+ * method {@code T getX()} in the {@code NotificationClass}, the MBean will
+ * have an attribute called {@code X} of type {@code T}. For example, if the
+ * {@code Notification} is an {@code AttributeChangeNotification}, then the
+ * MBean will have an attribute called {@code AttributeName} of type
+ * {@code "java.lang.String"}, corresponding to the method {@link
+ * AttributeChangeNotification#getAttributeName}.</p>
+ *
+ * <p>Query evaluation usually involves calls to the methods of {@code
+ * MBeanServer}. The methods have the following behavior:</p>
+ *
+ * <ul>
+ * <li>The {@link MBeanServer#getAttribute getAttribute} method returns the
+ * value of the corresponding property.
+ * <li>The {@link MBeanServer#getObjectInstance getObjectInstance}
+ * method returns an {@link ObjectInstance} where the {@link
+ * ObjectInstance#getObjectName ObjectName} is the name of the MBean and the
+ * {@link ObjectInstance#getClassName ClassName} is the class name of the
+ * {@code Notification}.
+ * <li>The {@link MBeanServer#isInstanceOf isInstanceOf} method returns true
+ * if and only if the {@code Notification}'s {@code ClassLoader} can load the
+ * named class, and the {@code Notification} is an {@linkplain Class#isInstance
+ * instance} of that class.
+ * </ul>
+ *
+ * <p>These are the only {@code MBeanServer} methods that are needed to
+ * evaluate standard queries. The behavior of the other {@code MBeanServer}
+ * methods is unspecified.</p>
+ *
+ * @since 1.7
+ */
+public class QueryNotificationFilter implements NotificationFilter {
+ private static final long serialVersionUID = -8408613922660635231L;
+
+ private static final ObjectName DEFAULT_NAME =
+ Util.newObjectName(":type=Notification");
+ private static final QueryExp trueQuery;
+ static {
+ ValueExp zero = Query.value(0);
+ trueQuery = Query.eq(zero, zero);
+ }
+
+ private final QueryExp query;
+
+ /**
+ * Construct a {@code QueryNotificationFilter} that evaluates the given
+ * {@code QueryExp} to determine whether to accept a notification.
+ *
+ * @param query the {@code QueryExp} to evaluate. Can be null,
+ * in which case all notifications are accepted.
+ */
+ public QueryNotificationFilter(QueryExp query) {
+ if (query == null)
+ this.query = trueQuery;
+ else
+ this.query = query;
+ }
+
+ /**
+ * Construct a {@code QueryNotificationFilter} that evaluates the query
+ * in the given string to determine whether to accept a notification.
+ * The string is converted into a {@code QueryExp} using
+ * {@link Query#fromString Query.fromString}.
+ *
+ * @param query the string specifying the query to evaluate. Can be null,
+ * in which case all notifications are accepted.
+ *
+ * @throws IllegalArgumentException if the string is not a valid
+ * query string.
+ */
+ public QueryNotificationFilter(String query) {
+ this(Query.fromString(query));
+ }
+
+ /**
+ * <p>Construct a {@code QueryNotificationFilter} that evaluates the query
+ * in the given string to determine whether to accept a notification,
+ * and where the notification must also be an instance of the given class.
+ * The string is converted into a {@code QueryExp} using
+ * {@link Query#fromString Query.fromString}.</p>
+ *
+ * @param notifClass the class that the notification must be an instance of.
+ * Cannot be null.
+ *
+ * @param query the string specifying the query to evaluate. Can be null,
+ * in which case all notifications are accepted.
+ *
+ * @throws IllegalArgumentException if the string is not a valid
+ * query string, or if {@code notifClass} is null.
+ */
+ public QueryNotificationFilter(
+ Class<? extends Notification> notifClass, String query) {
+ this(Query.and(Query.isInstanceOf(Query.value(notNull(notifClass).getName())),
+ Query.fromString(query)));
+ }
+
+ private static <T> T notNull(T x) {
+ if (x == null)
+ throw new IllegalArgumentException("Null argument");
+ return x;
+ }
+
+ /**
+ * Retrieve the query that this notification filter will evaluate for
+ * each notification.
+ *
+ * @return the query.
+ */
+ public QueryExp getQuery() {
+ return query;
+ }
+
+ public boolean isNotificationEnabled(Notification notification) {
+ ObjectName name;
+
+ Object source = notification.getSource();
+ if (source instanceof ObjectName)
+ name = (ObjectName) source;
+ else
+ name = DEFAULT_NAME;
+
+ MBS mbsImpl = new MBS(notification, name);
+ MBeanServer mbs = (MBeanServer) Proxy.newProxyInstance(
+ MBeanServer.class.getClassLoader(),
+ new Class<?>[] {MBeanServer.class},
+ new ForwardIH(mbsImpl));
+ return evalQuery(query, mbs, name);
+ }
+
+ private static boolean evalQuery(
+ QueryExp query, MBeanServer mbs, ObjectName name) {
+ MBeanServer oldMBS = QueryEval.getMBeanServer();
+ try {
+ if (mbs != null)
+ query.setMBeanServer(mbs);
+ return query.apply(name);
+ } catch (Exception e) {
+ return false;
+ } finally {
+ query.setMBeanServer(oldMBS);
+ }
+ }
+
+ private static class ForwardIH implements InvocationHandler {
+ private final MBS mbs;
+
+ ForwardIH(MBS mbs) {
+ this.mbs = mbs;
+ }
+
+ public Object invoke(Object proxy, Method method, Object[] args)
+ throws Throwable {
+ Method forward;
+ try {
+ forward = MBS.class.getMethod(
+ method.getName(), method.getParameterTypes());
+ } catch (NoSuchMethodException e) {
+ throw new UnsupportedOperationException(method.getName());
+ }
+ try {
+ return forward.invoke(mbs, args);
+ } catch (InvocationTargetException e) {
+ throw e.getCause();
+ }
+ }
+ }
+
+ private static class MBS {
+ private final Notification notification;
+ private final ObjectName objectName;
+ private final ObjectInstance objectInstance;
+ private volatile DynamicMBean mbean;
+
+ MBS(Notification n, ObjectName name) {
+ this.notification = n;
+ this.objectName = name;
+ this.objectInstance = new ObjectInstance(name, n.getClass().getName());
+ }
+
+ private void checkName(ObjectName name) throws InstanceNotFoundException {
+ if (!objectName.equals(name))
+ throw new InstanceNotFoundException(String.valueOf(name));
+ }
+
+ private DynamicMBean mbean(ObjectName name)
+ throws InstanceNotFoundException, ReflectionException {
+ if (mbean == null) {
+ try {
+ mbean = new NotificationMBeanSupport(notification);
+ } catch (NotCompliantMBeanException e) {
+ throw new ReflectionException(e);
+ }
+ }
+ return mbean;
+ }
+
+ public ObjectInstance getObjectInstance(ObjectName name)
+ throws InstanceNotFoundException {
+ checkName(name);
+ return objectInstance;
+ }
+
+ public Set<ObjectInstance> queryMBeans(ObjectName name, QueryExp query) {
+ Set<ObjectName> names = queryNames(name, query);
+ switch (names.size()) {
+ case 0:
+ return Collections.emptySet();
+ case 1:
+ return Collections.singleton(objectInstance);
+ default:
+ throw new UnsupportedOperationException("Internal error");
+ }
+ }
+
+ public Set<ObjectName> queryNames(ObjectName name, QueryExp query) {
+ if ((name != null && !name.apply(objectName)) ||
+ (query != null && !evalQuery(query, null, name)))
+ return Collections.emptySet();
+ return Collections.singleton(objectName);
+ }
+
+ public boolean isRegistered(ObjectName name) {
+ return objectName.equals(name);
+ }
+
+ public Integer getMBeanCount() {
+ return 1;
+ }
+
+ public Object getAttribute(ObjectName name, String attribute)
+ throws MBeanException, AttributeNotFoundException,
+ InstanceNotFoundException, ReflectionException {
+ return mbean(name).getAttribute(attribute);
+ }
+
+ public AttributeList getAttributes(ObjectName name, String[] attributes)
+ throws InstanceNotFoundException, ReflectionException {
+ return mbean(name).getAttributes(attributes);
+ }
+
+ public String getDefaultDomain() {
+ return objectName.getDomain();
+ }
+
+ public String[] getDomains() {
+ return new String[] {objectName.getDomain()};
+ }
+
+ public MBeanInfo getMBeanInfo(ObjectName name)
+ throws InstanceNotFoundException, ReflectionException {
+ return mbean(name).getMBeanInfo();
+ }
+
+ public boolean isInstanceOf(ObjectName name, String className)
+ throws InstanceNotFoundException {
+ try {
+ mbean(name);
+ ClassLoader loader = notification.getClass().getClassLoader();
+ Class<?> c = Class.forName(className, false, loader);
+ return c.isInstance(notification);
+ } catch (ReflectionException e) {
+ return false;
+ } catch (ClassNotFoundException e) {
+ return false;
+ }
+ }
+
+ public ClassLoader getClassLoaderFor(ObjectName mbeanName)
+ throws InstanceNotFoundException {
+ checkName(mbeanName);
+ return notification.getClass().getClassLoader();
+ }
+ }
+}
--- a/jdk/src/share/classes/javax/management/modelmbean/RequiredModelMBean.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/javax/management/modelmbean/RequiredModelMBean.java Tue Apr 15 17:48:22 2008 -0700
@@ -48,6 +48,7 @@
import java.util.Map;
import java.util.Set;
+import java.util.Vector;
import javax.management.Attribute;
import javax.management.AttributeChangeNotification;
import javax.management.AttributeChangeNotificationFilter;
@@ -132,8 +133,6 @@
* and operations will be executed */
private Object managedResource = null;
- private static final String currClass = "RequiredModelMBean";
-
/* records the registering in MBeanServer */
private boolean registered = false;
private transient MBeanServer server = null;
@@ -2488,10 +2487,13 @@
}
if (MODELMBEAN_LOGGER.isLoggable(Level.FINER)) {
+ Vector<String> enabledAttrs = currFilter.getEnabledAttributes();
+ String s = (enabledAttrs.size() > 1) ?
+ "[" + enabledAttrs.firstElement() + ", ...]" :
+ enabledAttrs.toString();
MODELMBEAN_LOGGER.logp(Level.FINER,
RequiredModelMBean.class.getName(), mth,
- "Set attribute change filter to " +
- currFilter.getEnabledAttributes().firstElement());
+ "Set attribute change filter to " + s);
}
attributeBroadcaster.addNotificationListener(inlistener,currFilter,
--- a/jdk/src/share/classes/sun/instrument/InstrumentationImpl.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/sun/instrument/InstrumentationImpl.java Tue Apr 15 17:48:22 2008 -0700
@@ -303,39 +303,78 @@
NoSuchMethodException firstExc = null;
boolean twoArgAgent = false;
- // The agent class has a premain or agentmain method that has 1 or 2
- // arguments. We first check for a signature of (String, Instrumentation),
- // and if not found we check for (String). If neither is found then we
- // throw the NoSuchMethodException from the first attempt so that the
- // exception text indicates the lookup failed for the 2-arg method
- // (same as JDK5.0).
+ // The agent class must have a premain or agentmain method that
+ // has 1 or 2 arguments. We check in the following order:
+ //
+ // 1) declared with a signature of (String, Instrumentation)
+ // 2) declared with a signature of (String)
+ // 3) inherited with a signature of (String, Instrumentation)
+ // 4) inherited with a signature of (String)
+ //
+ // So the declared version of either 1-arg or 2-arg always takes
+ // primary precedence over an inherited version. After that, the
+ // 2-arg version takes precedence over the 1-arg version.
+ //
+ // If no method is found then we throw the NoSuchMethodException
+ // from the first attempt so that the exception text indicates
+ // the lookup failed for the 2-arg method (same as JDK5.0).
try {
- m = javaAgentClass.getMethod( methodname,
- new Class[] {
- String.class,
- java.lang.instrument.Instrumentation.class
- }
- );
+ m = javaAgentClass.getDeclaredMethod( methodname,
+ new Class[] {
+ String.class,
+ java.lang.instrument.Instrumentation.class
+ }
+ );
twoArgAgent = true;
} catch (NoSuchMethodException x) {
// remember the NoSuchMethodException
firstExc = x;
}
- // check for the 1-arg method
if (m == null) {
+ // now try the declared 1-arg method
+ try {
+ m = javaAgentClass.getDeclaredMethod(methodname,
+ new Class[] { String.class });
+ } catch (NoSuchMethodException x) {
+ // ignore this exception because we'll try
+ // two arg inheritance next
+ }
+ }
+
+ if (m == null) {
+ // now try the inherited 2-arg method
try {
- m = javaAgentClass.getMethod(methodname, new Class[] { String.class });
+ m = javaAgentClass.getMethod( methodname,
+ new Class[] {
+ String.class,
+ java.lang.instrument.Instrumentation.class
+ }
+ );
+ twoArgAgent = true;
} catch (NoSuchMethodException x) {
- // Neither method exists so we throw the first NoSuchMethodException
- // as per 5.0
+ // ignore this exception because we'll try
+ // one arg inheritance next
+ }
+ }
+
+ if (m == null) {
+ // finally try the inherited 1-arg method
+ try {
+ m = javaAgentClass.getMethod(methodname,
+ new Class[] { String.class });
+ } catch (NoSuchMethodException x) {
+ // none of the methods exists so we throw the
+ // first NoSuchMethodException as per 5.0
throw firstExc;
}
}
// the premain method should not be required to be public,
// make it accessible so we can call it
+ // Note: The spec says the following:
+ // The agent class must implement a public static premain method...
setAccessible(m, true);
// invoke the 1 or 2-arg method
--- a/jdk/src/share/classes/sun/management/Flag.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/sun/management/Flag.java Tue Apr 15 17:48:22 2008 -0700
@@ -64,7 +64,8 @@
}
VMOption getVMOption() {
- return new VMOption(name, value.toString(), writeable, origin);
+ String val = value == null ? "" : value.toString();
+ return new VMOption(name, val, writeable, origin);
}
static Flag getFlag(String name) {
--- a/jdk/src/share/classes/sun/net/www/protocol/http/NegotiatorImpl.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/sun/net/www/protocol/http/NegotiatorImpl.java Tue Apr 15 17:48:22 2008 -0700
@@ -91,9 +91,10 @@
GSSManagerImpl manager = new GSSManagerImpl(
GSSUtil.CALLER_HTTP_NEGOTIATE);
- String peerName = "HTTP/" + hostname;
+ String peerName = "HTTP@" + hostname;
- GSSName serverName = manager.createName(peerName, null);
+ GSSName serverName = manager.createName(peerName,
+ GSSName.NT_HOSTBASED_SERVICE);
context = manager.createContext(serverName,
oid,
null,
--- a/jdk/src/share/classes/sun/security/pkcs11/P11Cipher.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/sun/security/pkcs11/P11Cipher.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,10 +22,10 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
-
package sun.security.pkcs11;
import java.nio.ByteBuffer;
+import java.util.Arrays;
import java.security.*;
import java.security.spec.*;
@@ -34,7 +34,6 @@
import javax.crypto.spec.*;
import sun.nio.ch.DirectBuffer;
-
import sun.security.pkcs11.wrapper.*;
import static sun.security.pkcs11.wrapper.PKCS11Constants.*;
@@ -43,8 +42,8 @@
* DES, DESede, AES, ARCFOUR, and Blowfish.
*
* This class is designed to support ECB and CBC with NoPadding and
- * PKCS5Padding for both. However, currently only CBC/NoPadding (and
- * ECB/NoPadding for stream ciphers) is functional.
+ * PKCS5Padding for both. It will use its own padding impl if the
+ * native mechanism does not support padding.
*
* Note that PKCS#11 current only supports ECB and CBC. There are no
* provisions for other modes such as CFB, OFB, PCBC, or CTR mode.
@@ -62,10 +61,59 @@
private final static int MODE_CBC = 4;
// padding constant for NoPadding
- private final static int PAD_NONE = 5;
+ private final static int PAD_NONE = 5;
// padding constant for PKCS5Padding
private final static int PAD_PKCS5 = 6;
+ private static interface Padding {
+ // ENC: format the specified buffer with padding bytes and return the
+ // actual padding length
+ int setPaddingBytes(byte[] paddingBuffer, int padLen);
+
+ // DEC: return the length of trailing padding bytes given the specified
+ // padded data
+ int unpad(byte[] paddedData, int len)
+ throws BadPaddingException;
+ }
+
+ private static class PKCS5Padding implements Padding {
+
+ private final int blockSize;
+
+ PKCS5Padding(int blockSize)
+ throws NoSuchPaddingException {
+ if (blockSize == 0) {
+ throw new NoSuchPaddingException
+ ("PKCS#5 padding not supported with stream ciphers");
+ }
+ this.blockSize = blockSize;
+ }
+
+ public int setPaddingBytes(byte[] paddingBuffer, int padLen) {
+ Arrays.fill(paddingBuffer, 0, padLen, (byte) (padLen & 0x007f));
+ return padLen;
+ }
+
+ public int unpad(byte[] paddedData, int len)
+ throws BadPaddingException {
+ if (len < 1 || len > paddedData.length) {
+ throw new BadPaddingException("Invalid pad array length!");
+ }
+ byte padValue = paddedData[len - 1];
+ if (padValue < 1 || padValue > blockSize) {
+ throw new BadPaddingException("Invalid pad value!");
+ }
+ // sanity check padding bytes
+ int padStartIndex = len - padValue;
+ for (int i = padStartIndex; i < len; i++) {
+ if (paddedData[i] != padValue) {
+ throw new BadPaddingException("Invalid pad bytes!");
+ }
+ }
+ return padValue;
+ }
+ }
+
// token instance
private final Token token;
@@ -99,65 +147,93 @@
// padding type, on of PAD_* above (PAD_NONE for stream ciphers)
private int paddingType;
+ // when the padding is requested but unsupported by the native mechanism,
+ // we use the following to do padding and necessary data buffering.
+ // padding object which generate padding and unpad the decrypted data
+ private Padding paddingObj;
+ // buffer for holding back the block which contains padding bytes
+ private byte[] padBuffer;
+ private int padBufferLen;
+
// original IV, if in MODE_CBC
private byte[] iv;
- // total number of bytes processed
- private int bytesProcessed;
+ // number of bytes buffered internally by the native mechanism and padBuffer
+ // if we do the padding
+ private int bytesBuffered;
P11Cipher(Token token, String algorithm, long mechanism)
- throws PKCS11Exception {
+ throws PKCS11Exception, NoSuchAlgorithmException {
super();
this.token = token;
this.algorithm = algorithm;
this.mechanism = mechanism;
- keyAlgorithm = algorithm.split("/")[0];
+
+ String algoParts[] = algorithm.split("/");
+ keyAlgorithm = algoParts[0];
+
if (keyAlgorithm.equals("AES")) {
blockSize = 16;
- blockMode = MODE_CBC;
- // XXX change default to PKCS5Padding
- paddingType = PAD_NONE;
- } else if (keyAlgorithm.equals("RC4") || keyAlgorithm.equals("ARCFOUR")) {
+ } else if (keyAlgorithm.equals("RC4") ||
+ keyAlgorithm.equals("ARCFOUR")) {
blockSize = 0;
- blockMode = MODE_ECB;
- paddingType = PAD_NONE;
} else { // DES, DESede, Blowfish
blockSize = 8;
- blockMode = MODE_CBC;
- // XXX change default to PKCS5Padding
- paddingType = PAD_NONE;
+ }
+ this.blockMode =
+ (algoParts.length > 1 ? parseMode(algoParts[1]) : MODE_ECB);
+
+ String defPadding = (blockSize == 0 ? "NoPadding" : "PKCS5Padding");
+ String paddingStr =
+ (algoParts.length > 2 ? algoParts[2] : defPadding);
+ try {
+ engineSetPadding(paddingStr);
+ } catch (NoSuchPaddingException nspe) {
+ // should not happen
+ throw new ProviderException(nspe);
}
session = token.getOpSession();
}
protected void engineSetMode(String mode) throws NoSuchAlgorithmException {
+ // Disallow change of mode for now since currently it's explicitly
+ // defined in transformation strings
+ throw new NoSuchAlgorithmException("Unsupported mode " + mode);
+ }
+
+ private int parseMode(String mode) throws NoSuchAlgorithmException {
mode = mode.toUpperCase();
+ int result;
if (mode.equals("ECB")) {
- this.blockMode = MODE_ECB;
+ result = MODE_ECB;
} else if (mode.equals("CBC")) {
if (blockSize == 0) {
throw new NoSuchAlgorithmException
("CBC mode not supported with stream ciphers");
}
- this.blockMode = MODE_CBC;
+ result = MODE_CBC;
} else {
throw new NoSuchAlgorithmException("Unsupported mode " + mode);
}
+ return result;
}
// see JCE spec
protected void engineSetPadding(String padding)
throws NoSuchPaddingException {
- if (padding.equalsIgnoreCase("NoPadding")) {
+ paddingObj = null;
+ padBuffer = null;
+ padding = padding.toUpperCase();
+ if (padding.equals("NOPADDING")) {
paddingType = PAD_NONE;
- } else if (padding.equalsIgnoreCase("PKCS5Padding")) {
- if (blockSize == 0) {
- throw new NoSuchPaddingException
- ("PKCS#5 padding not supported with stream ciphers");
+ } else if (padding.equals("PKCS5PADDING")) {
+ paddingType = PAD_PKCS5;
+ if (mechanism != CKM_DES_CBC_PAD && mechanism != CKM_DES3_CBC_PAD &&
+ mechanism != CKM_AES_CBC_PAD) {
+ // no native padding support; use our own padding impl
+ paddingObj = new PKCS5Padding(blockSize);
+ padBuffer = new byte[blockSize];
}
- paddingType = PAD_PKCS5;
- // XXX PKCS#5 not yet implemented
- throw new NoSuchPaddingException("pkcs5");
} else {
throw new NoSuchPaddingException("Unsupported padding " + padding);
}
@@ -175,7 +251,7 @@
// see JCE spec
protected byte[] engineGetIV() {
- return (iv == null) ? null : (byte[])iv.clone();
+ return (iv == null) ? null : (byte[]) iv.clone();
}
// see JCE spec
@@ -185,8 +261,9 @@
}
IvParameterSpec ivSpec = new IvParameterSpec(iv);
try {
- AlgorithmParameters params = AlgorithmParameters.getInstance
- (keyAlgorithm, P11Util.getSunJceProvider());
+ AlgorithmParameters params =
+ AlgorithmParameters.getInstance(keyAlgorithm,
+ P11Util.getSunJceProvider());
params.init(ivSpec);
return params;
} catch (GeneralSecurityException e) {
@@ -210,38 +287,38 @@
protected void engineInit(int opmode, Key key,
AlgorithmParameterSpec params, SecureRandom random)
throws InvalidKeyException, InvalidAlgorithmParameterException {
- byte[] iv;
+ byte[] ivValue;
if (params != null) {
if (params instanceof IvParameterSpec == false) {
throw new InvalidAlgorithmParameterException
("Only IvParameterSpec supported");
}
- IvParameterSpec ivSpec = (IvParameterSpec)params;
- iv = ivSpec.getIV();
+ IvParameterSpec ivSpec = (IvParameterSpec) params;
+ ivValue = ivSpec.getIV();
} else {
- iv = null;
+ ivValue = null;
}
- implInit(opmode, key, iv, random);
+ implInit(opmode, key, ivValue, random);
}
// see JCE spec
protected void engineInit(int opmode, Key key, AlgorithmParameters params,
SecureRandom random)
throws InvalidKeyException, InvalidAlgorithmParameterException {
- byte[] iv;
+ byte[] ivValue;
if (params != null) {
try {
IvParameterSpec ivSpec = (IvParameterSpec)
params.getParameterSpec(IvParameterSpec.class);
- iv = ivSpec.getIV();
+ ivValue = ivSpec.getIV();
} catch (InvalidParameterSpecException e) {
throw new InvalidAlgorithmParameterException
("Could not decode IV", e);
}
} else {
- iv = null;
+ ivValue = null;
}
- implInit(opmode, key, iv, random);
+ implInit(opmode, key, ivValue, random);
}
// actual init() implementation
@@ -250,31 +327,31 @@
throws InvalidKeyException, InvalidAlgorithmParameterException {
cancelOperation();
switch (opmode) {
- case Cipher.ENCRYPT_MODE:
- encrypt = true;
- break;
- case Cipher.DECRYPT_MODE:
- encrypt = false;
- break;
- default:
- throw new InvalidAlgorithmParameterException
- ("Unsupported mode: " + opmode);
+ case Cipher.ENCRYPT_MODE:
+ encrypt = true;
+ break;
+ case Cipher.DECRYPT_MODE:
+ encrypt = false;
+ break;
+ default:
+ throw new InvalidAlgorithmParameterException
+ ("Unsupported mode: " + opmode);
}
if (blockMode == MODE_ECB) { // ECB or stream cipher
if (iv != null) {
if (blockSize == 0) {
throw new InvalidAlgorithmParameterException
- ("IV not used with stream ciphers");
+ ("IV not used with stream ciphers");
} else {
throw new InvalidAlgorithmParameterException
- ("IV not used in ECB mode");
+ ("IV not used in ECB mode");
}
}
} else { // MODE_CBC
if (iv == null) {
if (encrypt == false) {
throw new InvalidAlgorithmParameterException
- ("IV must be specified for decryption in CBC mode");
+ ("IV must be specified for decryption in CBC mode");
}
// generate random IV
if (random == null) {
@@ -285,7 +362,7 @@
} else {
if (iv.length != blockSize) {
throw new InvalidAlgorithmParameterException
- ("IV length must match block size");
+ ("IV length must match block size");
}
}
}
@@ -331,63 +408,43 @@
session = token.getOpSession();
}
if (encrypt) {
- token.p11.C_EncryptInit
- (session.id(), new CK_MECHANISM(mechanism, iv), p11Key.keyID);
+ token.p11.C_EncryptInit(session.id(),
+ new CK_MECHANISM(mechanism, iv), p11Key.keyID);
} else {
- token.p11.C_DecryptInit
- (session.id(), new CK_MECHANISM(mechanism, iv), p11Key.keyID);
+ token.p11.C_DecryptInit(session.id(),
+ new CK_MECHANISM(mechanism, iv), p11Key.keyID);
}
- bytesProcessed = 0;
+ bytesBuffered = 0;
+ padBufferLen = 0;
initialized = true;
}
- // XXX the calculations below assume the PKCS#11 implementation is smart.
- // conceivably, not all implementations are and we may need to estimate
- // more conservatively
-
- private int bytesBuffered(int totalLen) {
- if (paddingType == PAD_NONE) {
- // with NoPadding, buffer only the current unfinished block
- return totalLen & (blockSize - 1);
- } else { // PKCS5
- // with PKCS5Padding in decrypt mode, the buffer must never
- // be empty. Buffer a full block instead of nothing.
- int buffered = totalLen & (blockSize - 1);
- if ((buffered == 0) && (encrypt == false)) {
- buffered = blockSize;
- }
- return buffered;
- }
- }
-
// if update(inLen) is called, how big does the output buffer have to be?
private int updateLength(int inLen) {
if (inLen <= 0) {
return 0;
}
- if (blockSize == 0) {
- return inLen;
- } else {
- // bytes that need to be buffered now
- int buffered = bytesBuffered(bytesProcessed);
- // bytes that need to be buffered after this update
- int newBuffered = bytesBuffered(bytesProcessed + inLen);
- return inLen + buffered - newBuffered;
+
+ int result = inLen + bytesBuffered;
+ if (blockSize != 0) {
+ // minus the number of bytes in the last incomplete block.
+ result -= (result & (blockSize - 1));
}
+ return result;
}
// if doFinal(inLen) is called, how big does the output buffer have to be?
private int doFinalLength(int inLen) {
- if (paddingType == PAD_NONE) {
- return updateLength(inLen);
- }
if (inLen < 0) {
return 0;
}
- int buffered = bytesBuffered(bytesProcessed);
- int newProcessed = bytesProcessed + inLen;
- int paddedProcessed = (newProcessed + blockSize) & ~(blockSize - 1);
- return paddedProcessed - bytesProcessed + buffered;
+
+ int result = inLen + bytesBuffered;
+ if (blockSize != 0 && encrypt && paddingType != PAD_NONE) {
+ // add the number of bytes to make the last block complete.
+ result += (blockSize - (result & (blockSize - 1)));
+ }
+ return result;
}
// see JCE spec
@@ -397,6 +454,7 @@
int n = engineUpdate(in, inOfs, inLen, out, 0);
return P11Util.convert(out, 0, n);
} catch (ShortBufferException e) {
+ // convert since the output length is calculated by updateLength()
throw new ProviderException(e);
}
}
@@ -409,6 +467,7 @@
}
// see JCE spec
+ @Override
protected int engineUpdate(ByteBuffer inBuffer, ByteBuffer outBuffer)
throws ShortBufferException {
return implUpdate(inBuffer, outBuffer);
@@ -422,14 +481,15 @@
int n = engineDoFinal(in, inOfs, inLen, out, 0);
return P11Util.convert(out, 0, n);
} catch (ShortBufferException e) {
+ // convert since the output length is calculated by doFinalLength()
throw new ProviderException(e);
}
}
// see JCE spec
protected int engineDoFinal(byte[] in, int inOfs, int inLen, byte[] out,
- int outOfs) throws ShortBufferException, IllegalBlockSizeException {
- // BadPaddingException {
+ int outOfs) throws ShortBufferException, IllegalBlockSizeException,
+ BadPaddingException {
int n = 0;
if ((inLen != 0) && (in != null)) {
n = engineUpdate(in, inOfs, inLen, out, outOfs);
@@ -440,8 +500,10 @@
}
// see JCE spec
+ @Override
protected int engineDoFinal(ByteBuffer inBuffer, ByteBuffer outBuffer)
- throws ShortBufferException, IllegalBlockSizeException, BadPaddingException {
+ throws ShortBufferException, IllegalBlockSizeException,
+ BadPaddingException {
int n = engineUpdate(inBuffer, outBuffer);
n += implDoFinal(outBuffer);
return n;
@@ -454,18 +516,55 @@
}
try {
ensureInitialized();
- int k;
+ int k = 0;
if (encrypt) {
- k = token.p11.C_EncryptUpdate
- (session.id(), 0, in, inOfs, inLen, 0, out, outOfs, outLen);
+ k = token.p11.C_EncryptUpdate(session.id(), 0, in, inOfs, inLen,
+ 0, out, outOfs, outLen);
} else {
- k = token.p11.C_DecryptUpdate
- (session.id(), 0, in, inOfs, inLen, 0, out, outOfs, outLen);
+ int newPadBufferLen = 0;
+ if (paddingObj != null) {
+ if (padBufferLen != 0) {
+ // NSS throws up when called with data not in multiple
+ // of blocks. Try to work around this by holding the
+ // extra data in padBuffer.
+ if (padBufferLen != padBuffer.length) {
+ int bufCapacity = padBuffer.length - padBufferLen;
+ if (inLen > bufCapacity) {
+ bufferInputBytes(in, inOfs, bufCapacity);
+ inOfs += bufCapacity;
+ inLen -= bufCapacity;
+ } else {
+ bufferInputBytes(in, inOfs, inLen);
+ return 0;
+ }
+ }
+ k = token.p11.C_DecryptUpdate(session.id(),
+ 0, padBuffer, 0, padBufferLen,
+ 0, out, outOfs, outLen);
+ padBufferLen = 0;
+ }
+ newPadBufferLen = inLen & (blockSize - 1);
+ if (newPadBufferLen == 0) {
+ newPadBufferLen = padBuffer.length;
+ }
+ inLen -= newPadBufferLen;
+ }
+ if (inLen > 0) {
+ k += token.p11.C_DecryptUpdate(session.id(), 0, in, inOfs,
+ inLen, 0, out, (outOfs + k), (outLen - k));
+ }
+ // update 'padBuffer' if using our own padding impl.
+ if (paddingObj != null) {
+ bufferInputBytes(in, inOfs + inLen, newPadBufferLen);
+ }
}
- bytesProcessed += inLen;
+ bytesBuffered += (inLen - k);
return k;
} catch (PKCS11Exception e) {
- // XXX throw correct exception
+ if (e.getErrorCode() == CKR_BUFFER_TOO_SMALL) {
+ throw (ShortBufferException)
+ (new ShortBufferException().initCause(e));
+ }
throw new ProviderException("update() failed", e);
}
}
@@ -481,101 +580,167 @@
if (outLen < updateLength(inLen)) {
throw new ShortBufferException();
}
- boolean inPosChanged = false;
+ int origPos = inBuffer.position();
try {
ensureInitialized();
long inAddr = 0;
- int inOfs = inBuffer.position();
+ int inOfs = 0;
byte[] inArray = null;
+
if (inBuffer instanceof DirectBuffer) {
- inAddr = ((DirectBuffer)inBuffer).address();
- } else {
- if (inBuffer.hasArray()) {
- inArray = inBuffer.array();
- inOfs += inBuffer.arrayOffset();
- } else {
- inArray = new byte[inLen];
- inBuffer.get(inArray);
- inOfs = 0;
- inPosChanged = true;
- }
+ inAddr = ((DirectBuffer) inBuffer).address();
+ inOfs = origPos;
+ } else if (inBuffer.hasArray()) {
+ inArray = inBuffer.array();
+ inOfs = (origPos + inBuffer.arrayOffset());
}
long outAddr = 0;
- int outOfs = outBuffer.position();
+ int outOfs = 0;
byte[] outArray = null;
if (outBuffer instanceof DirectBuffer) {
- outAddr = ((DirectBuffer)outBuffer).address();
+ outAddr = ((DirectBuffer) outBuffer).address();
+ outOfs = outBuffer.position();
} else {
if (outBuffer.hasArray()) {
outArray = outBuffer.array();
- outOfs += outBuffer.arrayOffset();
+ outOfs = (outBuffer.position() + outBuffer.arrayOffset());
} else {
outArray = new byte[outLen];
- outOfs = 0;
}
}
- int k;
+ int k = 0;
if (encrypt) {
- k = token.p11.C_EncryptUpdate
- (session.id(), inAddr, inArray, inOfs, inLen,
- outAddr, outArray, outOfs, outLen);
+ if (inAddr == 0 && inArray == null) {
+ inArray = new byte[inLen];
+ inBuffer.get(inArray);
+ } else {
+ inBuffer.position(origPos + inLen);
+ }
+ k = token.p11.C_EncryptUpdate(session.id(),
+ inAddr, inArray, inOfs, inLen,
+ outAddr, outArray, outOfs, outLen);
} else {
- k = token.p11.C_DecryptUpdate
- (session.id(), inAddr, inArray, inOfs, inLen,
- outAddr, outArray, outOfs, outLen);
+ int newPadBufferLen = 0;
+ if (paddingObj != null) {
+ if (padBufferLen != 0) {
+ // NSS throws up when called with data not in multiple
+ // of blocks. Try to work around this by holding the
+ // extra data in padBuffer.
+ if (padBufferLen != padBuffer.length) {
+ int bufCapacity = padBuffer.length - padBufferLen;
+ if (inLen > bufCapacity) {
+ bufferInputBytes(inBuffer, bufCapacity);
+ inOfs += bufCapacity;
+ inLen -= bufCapacity;
+ } else {
+ bufferInputBytes(inBuffer, inLen);
+ return 0;
+ }
+ }
+ k = token.p11.C_DecryptUpdate(session.id(), 0,
+ padBuffer, 0, padBufferLen, outAddr, outArray,
+ outOfs, outLen);
+ padBufferLen = 0;
+ }
+ newPadBufferLen = inLen & (blockSize - 1);
+ if (newPadBufferLen == 0) {
+ newPadBufferLen = padBuffer.length;
+ }
+ inLen -= newPadBufferLen;
+ }
+ if (inLen > 0) {
+ if (inAddr == 0 && inArray == null) {
+ inArray = new byte[inLen];
+ inBuffer.get(inArray);
+ } else {
+ inBuffer.position(inBuffer.position() + inLen);
+ }
+ k += token.p11.C_DecryptUpdate(session.id(), inAddr,
+ inArray, inOfs, inLen, outAddr, outArray,
+ (outOfs + k), (outLen - k));
+ }
+ // update 'padBuffer' if using our own padding impl.
+ if (paddingObj != null && newPadBufferLen != 0) {
+ bufferInputBytes(inBuffer, newPadBufferLen);
+ }
}
- bytesProcessed += inLen;
- if (!inPosChanged) {
- inBuffer.position(inBuffer.position() + inLen);
- }
+ bytesBuffered += (inLen - k);
if (!(outBuffer instanceof DirectBuffer) &&
- !outBuffer.hasArray()) {
+ !outBuffer.hasArray()) {
outBuffer.put(outArray, outOfs, k);
} else {
outBuffer.position(outBuffer.position() + k);
}
return k;
} catch (PKCS11Exception e) {
- // Un-read the bytes back to input buffer
- if (inPosChanged) {
- inBuffer.position(inBuffer.position() - inLen);
+ // Reset input buffer to its original position for
+ inBuffer.position(origPos);
+ if (e.getErrorCode() == CKR_BUFFER_TOO_SMALL) {
+ throw (ShortBufferException)
+ (new ShortBufferException().initCause(e));
}
- // XXX throw correct exception
throw new ProviderException("update() failed", e);
}
}
private int implDoFinal(byte[] out, int outOfs, int outLen)
- throws ShortBufferException, IllegalBlockSizeException {
- if (outLen < doFinalLength(0)) {
+ throws ShortBufferException, IllegalBlockSizeException,
+ BadPaddingException {
+ int requiredOutLen = doFinalLength(0);
+ if (outLen < requiredOutLen) {
throw new ShortBufferException();
}
try {
ensureInitialized();
+ int k = 0;
if (encrypt) {
- return token.p11.C_EncryptFinal
- (session.id(), 0, out, outOfs, outLen);
+ if (paddingObj != null) {
+ int actualPadLen = paddingObj.setPaddingBytes(padBuffer,
+ requiredOutLen - bytesBuffered);
+ k = token.p11.C_EncryptUpdate(session.id(),
+ 0, padBuffer, 0, actualPadLen,
+ 0, out, outOfs, outLen);
+ }
+ k += token.p11.C_EncryptFinal(session.id(),
+ 0, out, (outOfs + k), (outLen - k));
} else {
- return token.p11.C_DecryptFinal
- (session.id(), 0, out, outOfs, outLen);
+ if (paddingObj != null) {
+ if (padBufferLen != 0) {
+ k = token.p11.C_DecryptUpdate(session.id(), 0,
+ padBuffer, 0, padBufferLen, 0, padBuffer, 0,
+ padBuffer.length);
+ }
+ k += token.p11.C_DecryptFinal(session.id(), 0, padBuffer, k,
+ padBuffer.length - k);
+ int actualPadLen = paddingObj.unpad(padBuffer, k);
+ k -= actualPadLen;
+ System.arraycopy(padBuffer, 0, out, outOfs, k);
+ } else {
+ k = token.p11.C_DecryptFinal(session.id(), 0, out, outOfs,
+ outLen);
+ }
}
+ return k;
} catch (PKCS11Exception e) {
handleException(e);
throw new ProviderException("doFinal() failed", e);
} finally {
initialized = false;
- bytesProcessed = 0;
+ bytesBuffered = 0;
+ padBufferLen = 0;
session = token.releaseSession(session);
}
}
private int implDoFinal(ByteBuffer outBuffer)
- throws ShortBufferException, IllegalBlockSizeException {
+ throws ShortBufferException, IllegalBlockSizeException,
+ BadPaddingException {
int outLen = outBuffer.remaining();
- if (outLen < doFinalLength(0)) {
+ int requiredOutLen = doFinalLength(0);
+ if (outLen < requiredOutLen) {
throw new ShortBufferException();
}
@@ -583,30 +748,54 @@
ensureInitialized();
long outAddr = 0;
- int outOfs = outBuffer.position();
byte[] outArray = null;
+ int outOfs = 0;
if (outBuffer instanceof DirectBuffer) {
- outAddr = ((DirectBuffer)outBuffer).address();
+ outAddr = ((DirectBuffer) outBuffer).address();
+ outOfs = outBuffer.position();
} else {
if (outBuffer.hasArray()) {
outArray = outBuffer.array();
- outOfs += outBuffer.arrayOffset();
+ outOfs = outBuffer.position() + outBuffer.arrayOffset();
} else {
outArray = new byte[outLen];
- outOfs = 0;
}
}
- int k;
+ int k = 0;
+
if (encrypt) {
- k = token.p11.C_EncryptFinal
- (session.id(), outAddr, outArray, outOfs, outLen);
+ if (paddingObj != null) {
+ int actualPadLen = paddingObj.setPaddingBytes(padBuffer,
+ requiredOutLen - bytesBuffered);
+ k = token.p11.C_EncryptUpdate(session.id(),
+ 0, padBuffer, 0, actualPadLen,
+ outAddr, outArray, outOfs, outLen);
+ }
+ k += token.p11.C_EncryptFinal(session.id(),
+ outAddr, outArray, (outOfs + k), (outLen - k));
} else {
- k = token.p11.C_DecryptFinal
- (session.id(), outAddr, outArray, outOfs, outLen);
+ if (paddingObj != null) {
+ if (padBufferLen != 0) {
+ k = token.p11.C_DecryptUpdate(session.id(),
+ 0, padBuffer, 0, padBufferLen,
+ 0, padBuffer, 0, padBuffer.length);
+ padBufferLen = 0;
+ }
+ k += token.p11.C_DecryptFinal(session.id(),
+ 0, padBuffer, k, padBuffer.length - k);
+ int actualPadLen = paddingObj.unpad(padBuffer, k);
+ k -= actualPadLen;
+ outArray = padBuffer;
+ outOfs = 0;
+ } else {
+ k = token.p11.C_DecryptFinal(session.id(),
+ outAddr, outArray, outOfs, outLen);
+ }
}
- if (!(outBuffer instanceof DirectBuffer) &&
- !outBuffer.hasArray()) {
+ if ((!encrypt && paddingObj != null) ||
+ (!(outBuffer instanceof DirectBuffer) &&
+ !outBuffer.hasArray())) {
outBuffer.put(outArray, outOfs, k);
} else {
outBuffer.position(outBuffer.position() + k);
@@ -617,20 +806,22 @@
throw new ProviderException("doFinal() failed", e);
} finally {
initialized = false;
- bytesProcessed = 0;
+ bytesBuffered = 0;
session = token.releaseSession(session);
}
}
private void handleException(PKCS11Exception e)
- throws IllegalBlockSizeException {
+ throws ShortBufferException, IllegalBlockSizeException {
long errorCode = e.getErrorCode();
- // XXX better check
- if (errorCode == CKR_DATA_LEN_RANGE) {
- throw (IllegalBlockSizeException)new
- IllegalBlockSizeException(e.toString()).initCause(e);
+ if (errorCode == CKR_BUFFER_TOO_SMALL) {
+ throw (ShortBufferException)
+ (new ShortBufferException().initCause(e));
+ } else if (errorCode == CKR_DATA_LEN_RANGE ||
+ errorCode == CKR_ENCRYPTED_DATA_LEN_RANGE) {
+ throw (IllegalBlockSizeException)
+ (new IllegalBlockSizeException(e.toString()).initCause(e));
}
-
}
// see JCE spec
@@ -649,12 +840,14 @@
}
// see JCE spec
+ @Override
protected int engineGetKeySize(Key key) throws InvalidKeyException {
int n = P11SecretKeyFactory.convertKey
- (token, key, keyAlgorithm).keyLength();
+ (token, key, keyAlgorithm).keyLength();
return n;
}
+ @Override
protected void finalize() throws Throwable {
try {
if ((session != null) && token.isValid()) {
@@ -666,4 +859,15 @@
}
}
+ private final void bufferInputBytes(byte[] in, int inOfs, int len) {
+ System.arraycopy(in, inOfs, padBuffer, padBufferLen, len);
+ padBufferLen += len;
+ bytesBuffered += len;
+ }
+
+ private final void bufferInputBytes(ByteBuffer inBuffer, int len) {
+ inBuffer.get(padBuffer, padBufferLen, len);
+ padBufferLen += len;
+ bytesBuffered += len;
+ }
}
--- a/jdk/src/share/classes/sun/security/pkcs11/P11KeyGenerator.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/sun/security/pkcs11/P11KeyGenerator.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -65,10 +65,86 @@
// are supported.
private boolean supportBothKeySizes;
- // min and max key sizes (in bits) for variable-key-length
- // algorithms, e.g. RC4 and Blowfish
- private int minKeySize;
- private int maxKeySize;
+ /**
+ * Utility method for checking if the specified key size is valid
+ * and within the supported range. Return the significant key size
+ * upon successful validation.
+ * @param keyGenMech the PKCS#11 key generation mechanism.
+ * @param keySize the to-be-checked key size for this mechanism.
+ * @param token token which provides this mechanism.
+ * @return the significant key size (in bits) corresponding to the
+ * specified key size.
+ * @throws InvalidParameterException if the specified key size is invalid.
+ * @throws ProviderException if this mechanism isn't supported by SunPKCS11
+ * or underlying native impl.
+ */
+ static int checkKeySize(long keyGenMech, int keySize, Token token)
+ throws InvalidAlgorithmParameterException, ProviderException {
+ int sigKeySize;
+ switch ((int)keyGenMech) {
+ case (int)CKM_DES_KEY_GEN:
+ if ((keySize != 64) && (keySize != 56)) {
+ throw new InvalidAlgorithmParameterException
+ ("DES key length must be 56 bits");
+ }
+ sigKeySize = 56;
+ break;
+ case (int)CKM_DES2_KEY_GEN:
+ case (int)CKM_DES3_KEY_GEN:
+ if ((keySize == 112) || (keySize == 128)) {
+ sigKeySize = 112;
+ } else if ((keySize == 168) || (keySize == 192)) {
+ sigKeySize = 168;
+ } else {
+ throw new InvalidAlgorithmParameterException
+ ("DESede key length must be 112, or 168 bits");
+ }
+ break;
+ default:
+ // Handle all variable-key-length algorithms here
+ CK_MECHANISM_INFO info = null;
+ try {
+ info = token.getMechanismInfo(keyGenMech);
+ } catch (PKCS11Exception p11e) {
+ // Should never happen
+ throw new ProviderException
+ ("Cannot retrieve mechanism info", p11e);
+ }
+ if (info == null) {
+ // XXX Unable to retrieve the supported key length from
+ // the underlying native impl. Skip the checking for now.
+ return keySize;
+ }
+ // PKCS#11 defines these to be in number of bytes except for
+ // RC4 which is in bits. However, some PKCS#11 impls still use
+ // bytes for all mechs, e.g. NSS. We try to detect this
+ // inconsistency if the minKeySize seems unreasonably small.
+ int minKeySize = (int)info.ulMinKeySize;
+ int maxKeySize = (int)info.ulMaxKeySize;
+ if (keyGenMech != CKM_RC4_KEY_GEN || minKeySize < 8) {
+ minKeySize = (int)info.ulMinKeySize << 3;
+ maxKeySize = (int)info.ulMaxKeySize << 3;
+ }
+ // Explicitly disallow keys shorter than 40-bits for security
+ if (minKeySize < 40) minKeySize = 40;
+ if (keySize < minKeySize || keySize > maxKeySize) {
+ throw new InvalidAlgorithmParameterException
+ ("Key length must be between " + minKeySize +
+ " and " + maxKeySize + " bits");
+ }
+ if (keyGenMech == CKM_AES_KEY_GEN) {
+ if ((keySize != 128) && (keySize != 192) &&
+ (keySize != 256)) {
+ throw new InvalidAlgorithmParameterException
+ ("AES key length must be " + minKeySize +
+ (maxKeySize >= 192? ", 192":"") +
+ (maxKeySize >= 256? ", or 256":"") + " bits");
+ }
+ }
+ sigKeySize = keySize;
+ }
+ return sigKeySize;
+ }
P11KeyGenerator(Token token, String algorithm, long mechanism)
throws PKCS11Exception {
@@ -85,72 +161,44 @@
supportBothKeySizes =
(token.provider.config.isEnabled(CKM_DES2_KEY_GEN) &&
(token.getMechanismInfo(CKM_DES2_KEY_GEN) != null));
- } else if (this.mechanism == CKM_RC4_KEY_GEN) {
- CK_MECHANISM_INFO info = token.getMechanismInfo(mechanism);
- // Although PKCS#11 spec documented that these are in bits,
- // NSS, for one, uses bytes. Multiple by 8 if the number seems
- // unreasonably small.
- if (info.ulMinKeySize < 8) {
- minKeySize = (int)info.ulMinKeySize << 3;
- maxKeySize = (int)info.ulMaxKeySize << 3;
- } else {
- minKeySize = (int)info.ulMinKeySize;
- maxKeySize = (int)info.ulMaxKeySize;
- }
- // Explicitly disallow keys shorter than 40-bits for security
- if (minKeySize < 40) minKeySize = 40;
- } else if (this.mechanism == CKM_BLOWFISH_KEY_GEN) {
- CK_MECHANISM_INFO info = token.getMechanismInfo(mechanism);
- maxKeySize = (int)info.ulMaxKeySize << 3;
- minKeySize = (int)info.ulMinKeySize << 3;
- // Explicitly disallow keys shorter than 40-bits for security
- if (minKeySize < 40) minKeySize = 40;
}
-
setDefaultKeySize();
}
// set default keysize and also initialize keyType
private void setDefaultKeySize() {
- // whether to check default key size against the min and max value
- boolean validateKeySize = false;
switch ((int)mechanism) {
case (int)CKM_DES_KEY_GEN:
keySize = 64;
- significantKeySize = 56;
keyType = CKK_DES;
break;
case (int)CKM_DES2_KEY_GEN:
keySize = 128;
- significantKeySize = 112;
keyType = CKK_DES2;
break;
case (int)CKM_DES3_KEY_GEN:
keySize = 192;
- significantKeySize = 168;
keyType = CKK_DES3;
break;
case (int)CKM_AES_KEY_GEN:
+ keySize = 128;
keyType = CKK_AES;
- keySize = 128;
- significantKeySize = 128;
break;
case (int)CKM_RC4_KEY_GEN:
+ keySize = 128;
keyType = CKK_RC4;
- keySize = 128;
- validateKeySize = true;
break;
case (int)CKM_BLOWFISH_KEY_GEN:
+ keySize = 128;
keyType = CKK_BLOWFISH;
- keySize = 128;
- validateKeySize = true;
break;
default:
throw new ProviderException("Unknown mechanism " + mechanism);
}
- if (validateKeySize &&
- ((keySize > maxKeySize) || (keySize < minKeySize))) {
- throw new ProviderException("Unsupported key size");
+ try {
+ significantKeySize = checkKeySize(mechanism, keySize, token);
+ } catch (InvalidAlgorithmParameterException iape) {
+ throw new ProviderException("Unsupported default key size", iape);
}
}
@@ -170,57 +218,32 @@
// see JCE spec
protected void engineInit(int keySize, SecureRandom random) {
token.ensureValid();
- switch ((int)mechanism) {
- case (int)CKM_DES_KEY_GEN:
- if ((keySize != this.keySize) &&
- (keySize != this.significantKeySize)) {
- throw new InvalidParameterException
- ("DES key length must be 56 bits");
- }
- break;
- case (int)CKM_DES2_KEY_GEN:
- case (int)CKM_DES3_KEY_GEN:
- long newMechanism;
- if ((keySize == 112) || (keySize == 128)) {
- newMechanism = CKM_DES2_KEY_GEN;
- } else if ((keySize == 168) || (keySize == 192)) {
- newMechanism = CKM_DES3_KEY_GEN;
- } else {
- throw new InvalidParameterException
- ("DESede key length must be 112, or 168 bits");
- }
+ int newSignificantKeySize;
+ try {
+ newSignificantKeySize = checkKeySize(mechanism, keySize, token);
+ } catch (InvalidAlgorithmParameterException iape) {
+ throw (InvalidParameterException)
+ (new InvalidParameterException().initCause(iape));
+ }
+ if ((mechanism == CKM_DES2_KEY_GEN) ||
+ (mechanism == CKM_DES3_KEY_GEN)) {
+ long newMechanism = (newSignificantKeySize == 112 ?
+ CKM_DES2_KEY_GEN : CKM_DES3_KEY_GEN);
if (mechanism != newMechanism) {
if (supportBothKeySizes) {
mechanism = newMechanism;
- setDefaultKeySize();
+ // Adjust keyType to reflect the mechanism change
+ keyType = (mechanism == CKM_DES2_KEY_GEN ?
+ CKK_DES2 : CKK_DES3);
} else {
throw new InvalidParameterException
- ("Only " + significantKeySize +
- "-bit DESede key length is supported");
+ ("Only " + significantKeySize +
+ "-bit DESede is supported");
}
}
- break;
- case (int)CKM_AES_KEY_GEN:
- if ((keySize != 128) && (keySize != 192) && (keySize != 256)) {
- throw new InvalidParameterException
- ("AES key length must be 128, 192, or 256 bits");
- }
- this.keySize = keySize;
- significantKeySize = keySize;
- break;
- case (int)CKM_RC4_KEY_GEN:
- case (int)CKM_BLOWFISH_KEY_GEN:
- if ((keySize < minKeySize) || (keySize > maxKeySize)) {
- throw new InvalidParameterException
- (algorithm + " key length must be between " +
- minKeySize + " and " + maxKeySize + " bits");
- }
- this.keySize = keySize;
- this.significantKeySize = keySize;
- break;
- default:
- throw new ProviderException("Unknown mechanism " + mechanism);
}
+ this.keySize = keySize;
+ this.significantKeySize = newSignificantKeySize;
}
// see JCE spec
--- a/jdk/src/share/classes/sun/security/pkcs11/P11KeyStore.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/sun/security/pkcs11/P11KeyStore.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -156,10 +156,10 @@
// CKA_CLASS - entry type
private CK_ATTRIBUTE type = null;
- // CKA_LABEL of cert
+ // CKA_LABEL of cert and secret key
private String label = null;
- // CKA_ID - of private key/cert
+ // CKA_ID of the private key/cert pair
private byte[] id = null;
// CKA_TRUSTED - true if cert is trusted
@@ -871,10 +871,8 @@
if ((token.tokenInfo.flags & CKF_PROTECTED_AUTHENTICATION_PATH) == 0) {
token.provider.login(null, handler);
} else {
-
// token supports protected authentication path
// (external pin-pad, for example)
-
if (handler != null &&
!token.config.getKeyStoreCompatibilityMode()) {
throw new LoginException("can not specify password if token " +
@@ -1130,19 +1128,14 @@
SecretKey skey = ske.getSecretKey();
try {
- // first see if the key already exists.
- // if so, update the CKA_LABEL
- if (!updateSkey(alias)) {
+ // first check if the key already exists
+ AliasInfo aliasInfo = aliasMap.get(alias);
- // key entry does not exist.
- // delete existing entry for alias and
- // create new secret key entry
- // (new entry might be a secret key
- // session object converted into a token object)
+ if (aliasInfo != null) {
+ engineDeleteEntry(alias);
+ }
+ storeSkey(alias, ske);
- engineDeleteEntry(alias);
- storeSkey(alias, ske);
- }
} catch (PKCS11Exception pe) {
throw new KeyStoreException(pe);
}
@@ -1396,41 +1389,6 @@
}
}
- /**
- * return true if update occurred
- */
- private boolean updateSkey(String alias)
- throws KeyStoreException, PKCS11Exception {
-
- Session session = null;
- try {
- session = token.getOpSession();
-
- // first update existing secret key CKA_LABEL
-
- THandle h = getTokenObject(session, ATTR_CLASS_SKEY, null, alias);
- if (h.type != ATTR_CLASS_SKEY) {
- if (debug != null) {
- debug.println("did not find secret key " +
- "with CKA_LABEL [" + alias + "]");
- }
- return false;
- }
- CK_ATTRIBUTE[] attrs = new CK_ATTRIBUTE[] {
- new CK_ATTRIBUTE(CKA_LABEL, alias) };
- token.p11.C_SetAttributeValue(session.id(), h.handle, attrs);
-
- if (debug != null) {
- debug.println("updateSkey set new alias [" +
- alias +
- "] for secret key entry");
- }
-
- return true;
- } finally {
- token.releaseSession(session);
- }
- }
/**
* XXX On ibutton, when you C_SetAttribute(CKA_ID) for a private key
@@ -1532,30 +1490,6 @@
}
}
- private void updateP11Skey(String alias, P11Key key)
- throws PKCS11Exception {
-
- Session session = null;
- try {
- session = token.getOpSession();
-
- // session key - convert to token key and set CKA_LABEL
-
- CK_ATTRIBUTE[] attrs = new CK_ATTRIBUTE[] {
- ATTR_TOKEN_TRUE,
- new CK_ATTRIBUTE(CKA_LABEL, alias) };
- token.p11.C_CopyObject(session.id(), key.keyID, attrs);
- if (debug != null) {
- debug.println("updateP11Skey copied secret session key " +
- "for [" +
- alias +
- "] to token entry");
- }
- } finally {
- token.releaseSession(session);
- }
- }
-
private void updateP11Pkey(String alias, CK_ATTRIBUTE attribute, P11Key key)
throws PKCS11Exception {
@@ -1689,48 +1623,26 @@
throws PKCS11Exception, KeyStoreException {
SecretKey skey = ske.getSecretKey();
- long keyType = CKK_GENERIC_SECRET;
-
- if (skey instanceof P11Key && this.token == ((P11Key)skey).token) {
- updateP11Skey(alias, (P11Key)skey);
- return;
- }
-
- if ("AES".equalsIgnoreCase(skey.getAlgorithm())) {
- keyType = CKK_AES;
- } else if ("Blowfish".equalsIgnoreCase(skey.getAlgorithm())) {
- keyType = CKK_BLOWFISH;
- } else if ("DES".equalsIgnoreCase(skey.getAlgorithm())) {
- keyType = CKK_DES;
- } else if ("DESede".equalsIgnoreCase(skey.getAlgorithm())) {
- keyType = CKK_DES3;
- } else if ("RC4".equalsIgnoreCase(skey.getAlgorithm()) ||
- "ARCFOUR".equalsIgnoreCase(skey.getAlgorithm())) {
- keyType = CKK_RC4;
+ // No need to specify CKA_CLASS, CKA_KEY_TYPE, CKA_VALUE since
+ // they are handled in P11SecretKeyFactory.createKey() method.
+ CK_ATTRIBUTE[] attrs = new CK_ATTRIBUTE[] {
+ ATTR_SKEY_TOKEN_TRUE,
+ ATTR_PRIVATE_TRUE,
+ new CK_ATTRIBUTE(CKA_LABEL, alias),
+ };
+ try {
+ P11SecretKeyFactory.convertKey(token, skey, null, attrs);
+ } catch (InvalidKeyException ike) {
+ // re-throw KeyStoreException to match javadoc
+ throw new KeyStoreException("Cannot convert to PKCS11 keys", ike);
}
- CK_ATTRIBUTE[] attrs = new CK_ATTRIBUTE[] {
- ATTR_SKEY_TOKEN_TRUE,
- ATTR_CLASS_SKEY,
- ATTR_PRIVATE_TRUE,
- new CK_ATTRIBUTE(CKA_KEY_TYPE, keyType),
- new CK_ATTRIBUTE(CKA_LABEL, alias),
- new CK_ATTRIBUTE(CKA_VALUE, skey.getEncoded()) };
- attrs = token.getAttributes
- (TemplateManager.O_IMPORT, CKO_SECRET_KEY, keyType, attrs);
+ // update global alias map
+ aliasMap.put(alias, new AliasInfo(alias));
- // create the new entry
- Session session = null;
- try {
- session = token.getOpSession();
- token.p11.C_CreateObject(session.id(), attrs);
- if (debug != null) {
- debug.println("storeSkey created token secret key for [" +
- alias +
- "]");
- }
- } finally {
- token.releaseSession(session);
+ if (debug != null) {
+ debug.println("storeSkey created token secret key for [" +
+ alias + "]");
}
}
@@ -2492,7 +2404,8 @@
// if there are duplicates (either between secret keys,
// or between a secret key and another object),
// throw an exception
- HashSet<String> sKeySet = new HashSet<String>();
+ HashMap<String, AliasInfo> sKeyMap =
+ new HashMap<String, AliasInfo>();
attrs = new CK_ATTRIBUTE[] {
ATTR_SKEY_TOKEN_TRUE,
@@ -2507,8 +2420,8 @@
// there is a CKA_LABEL
String cka_label = new String(attrs[0].getCharArray());
- if (!sKeySet.contains(cka_label)) {
- sKeySet.add(cka_label);
+ if (sKeyMap.get(cka_label) == null) {
+ sKeyMap.put(cka_label, new AliasInfo(cka_label));
} else {
throw new KeyStoreException("invalid KeyStore state: " +
"found multiple secret keys sharing same " +
@@ -2523,7 +2436,7 @@
ArrayList<AliasInfo> matchedCerts =
mapPrivateKeys(pkeyIDs, certMap);
boolean sharedLabel = mapCerts(matchedCerts, certMap);
- mapSecretKeys(sKeySet);
+ mapSecretKeys(sKeyMap);
return sharedLabel;
@@ -2547,7 +2460,7 @@
HashMap<String, HashSet<AliasInfo>> certMap)
throws PKCS11Exception, CertificateException {
- // global alias map
+ // reset global alias map
aliasMap = new HashMap<String, AliasInfo>();
// list of matched certs that we will return
@@ -2722,18 +2635,17 @@
* If the secret key shares a CKA_LABEL with another entry,
* throw an exception
*/
- private void mapSecretKeys(HashSet<String> sKeySet)
+ private void mapSecretKeys(HashMap<String, AliasInfo> sKeyMap)
throws KeyStoreException {
- for (String label : sKeySet) {
- if (!aliasMap.containsKey(label)) {
- aliasMap.put(label, new AliasInfo(label));
- } else {
+ for (String label : sKeyMap.keySet()) {
+ if (aliasMap.containsKey(label)) {
throw new KeyStoreException("invalid KeyStore state: " +
"found secret key sharing CKA_LABEL [" +
label +
"] with another token object");
}
}
+ aliasMap.putAll(sKeyMap);
}
private void dumpTokenMap() {
--- a/jdk/src/share/classes/sun/security/pkcs11/P11RSACipher.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/sun/security/pkcs11/P11RSACipher.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -98,7 +98,6 @@
this.token = token;
this.algorithm = "RSA";
this.mechanism = mechanism;
- session = token.getOpSession();
}
// modes do not make sense for RSA, but allow ECB
@@ -184,7 +183,8 @@
throw new InvalidKeyException
("Wrap has to be used with public keys");
}
- // No further setup needed for C_Wrap(). We remain uninitialized.
+ // No further setup needed for C_Wrap(). We'll initialize later if
+ // we can't use C_Wrap().
return;
} else if (opmode == Cipher.UNWRAP_MODE) {
if (p11Key.isPrivate() == false) {
@@ -383,7 +383,8 @@
return implDoFinal(out, outOfs, out.length - outOfs);
}
- private byte[] doFinal() throws BadPaddingException, IllegalBlockSizeException {
+ private byte[] doFinal() throws BadPaddingException,
+ IllegalBlockSizeException {
byte[] t = new byte[2048];
int n = implDoFinal(t, 0, t.length);
byte[] out = new byte[n];
@@ -394,20 +395,37 @@
// see JCE spec
protected byte[] engineWrap(Key key) throws InvalidKeyException,
IllegalBlockSizeException {
- // XXX Note that if we cannot convert key to a key on this token,
- // we will fail. For example, trying a wrap an AES key on a token that
- // does not support AES.
- // We could implement a fallback that just encrypts the encoding
- // (assuming the key is not sensitive). For now, we are operating under
- // the assumption that this is not necessary.
String keyAlg = key.getAlgorithm();
- P11Key secretKey = P11SecretKeyFactory.convertKey(token, key, keyAlg);
+ P11Key sKey = null;
+ try {
+ // The conversion may fail, e.g. trying to wrap an AES key on
+ // a token that does not support AES, or when the key size is
+ // not within the range supported by the token.
+ sKey = P11SecretKeyFactory.convertKey(token, key, keyAlg);
+ } catch (InvalidKeyException ike) {
+ byte[] toBeWrappedKey = key.getEncoded();
+ if (toBeWrappedKey == null) {
+ throw new InvalidKeyException
+ ("wrap() failed, no encoding available", ike);
+ }
+ // Directly encrypt the key encoding when key conversion failed
+ implInit(Cipher.ENCRYPT_MODE, p11Key);
+ implUpdate(toBeWrappedKey, 0, toBeWrappedKey.length);
+ try {
+ return doFinal();
+ } catch (BadPaddingException bpe) {
+ // should not occur
+ throw new InvalidKeyException("wrap() failed", bpe);
+ } finally {
+ // Restore original mode
+ implInit(Cipher.WRAP_MODE, p11Key);
+ }
+ }
Session s = null;
try {
s = token.getOpSession();
- byte[] b = token.p11.C_WrapKey(s.id(), new CK_MECHANISM(mechanism),
- p11Key.keyID, secretKey.keyID);
- return b;
+ return token.p11.C_WrapKey(s.id(), new CK_MECHANISM(mechanism),
+ p11Key.keyID, sKey.keyID);
} catch (PKCS11Exception e) {
throw new InvalidKeyException("wrap() failed", e);
} finally {
@@ -431,11 +449,13 @@
};
attributes = token.getAttributes
(O_IMPORT, CKO_SECRET_KEY, keyType, attributes);
- long keyID = token.p11.C_UnwrapKey(s.id(), new CK_MECHANISM(mechanism),
- p11Key.keyID, wrappedKey, attributes);
- return P11Key.secretKey(session, keyID, algorithm, 48 << 3, attributes);
+ long keyID = token.p11.C_UnwrapKey(s.id(),
+ new CK_MECHANISM(mechanism), p11Key.keyID, wrappedKey,
+ attributes);
+ return P11Key.secretKey(session, keyID, algorithm, 48 << 3,
+ attributes);
} catch (PKCS11Exception e) {
- throw new InvalidKeyException("wrap() failed", e);
+ throw new InvalidKeyException("unwrap() failed", e);
} finally {
token.releaseSession(s);
}
--- a/jdk/src/share/classes/sun/security/pkcs11/P11SecretKeyFactory.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/sun/security/pkcs11/P11SecretKeyFactory.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -104,9 +104,20 @@
/**
* Convert an arbitrary key of algorithm into a P11Key of provider.
- * Used engineTranslateKey(), P11Cipher.init(), and P11Mac.init().
+ * Used in engineTranslateKey(), P11Cipher.init(), and P11Mac.init().
*/
- static P11Key convertKey(Token token, Key key, String algorithm)
+ static P11Key convertKey(Token token, Key key, String algo)
+ throws InvalidKeyException {
+ return convertKey(token, key, algo, null);
+ }
+
+ /**
+ * Convert an arbitrary key of algorithm w/ custom attributes into a
+ * P11Key of provider.
+ * Used in P11KeyStore.storeSkey.
+ */
+ static P11Key convertKey(Token token, Key key, String algo,
+ CK_ATTRIBUTE[] extraAttrs)
throws InvalidKeyException {
token.ensureValid();
if (key == null) {
@@ -115,25 +126,41 @@
if (key instanceof SecretKey == false) {
throw new InvalidKeyException("Key must be a SecretKey");
}
- long algorithmType;
- if (algorithm == null) {
- algorithm = key.getAlgorithm();
- algorithmType = getKeyType(algorithm);
+ long algoType;
+ if (algo == null) {
+ algo = key.getAlgorithm();
+ algoType = getKeyType(algo);
} else {
- algorithmType = getKeyType(algorithm);
+ algoType = getKeyType(algo);
long keyAlgorithmType = getKeyType(key.getAlgorithm());
- if (algorithmType != keyAlgorithmType) {
- if ((algorithmType == PCKK_HMAC) || (algorithmType == PCKK_SSLMAC)) {
+ if (algoType != keyAlgorithmType) {
+ if ((algoType == PCKK_HMAC) || (algoType == PCKK_SSLMAC)) {
// ignore key algorithm for MACs
} else {
throw new InvalidKeyException
- ("Key algorithm must be " + algorithm);
+ ("Key algorithm must be " + algo);
}
}
}
if (key instanceof P11Key) {
P11Key p11Key = (P11Key)key;
if (p11Key.token == token) {
+ if (extraAttrs != null) {
+ Session session = null;
+ try {
+ session = token.getObjSession();
+ long newKeyID = token.p11.C_CopyObject(session.id(),
+ p11Key.keyID, extraAttrs);
+ p11Key = (P11Key) (P11Key.secretKey(p11Key.session,
+ newKeyID, p11Key.algorithm, p11Key.keyLength,
+ extraAttrs));
+ } catch (PKCS11Exception p11e) {
+ throw new InvalidKeyException
+ ("Cannot duplicate the PKCS11 key", p11e);
+ } finally {
+ token.releaseSession(session);
+ }
+ }
return p11Key;
}
}
@@ -141,11 +168,11 @@
if (p11Key != null) {
return p11Key;
}
- if ("RAW".equals(key.getFormat()) == false) {
+ if ("RAW".equalsIgnoreCase(key.getFormat()) == false) {
throw new InvalidKeyException("Encoded format must be RAW");
}
byte[] encoded = key.getEncoded();
- p11Key = createKey(token, encoded, algorithm, algorithmType);
+ p11Key = createKey(token, encoded, algo, algoType, extraAttrs);
token.secretCache.put(key, p11Key);
return p11Key;
}
@@ -159,79 +186,79 @@
}
private static P11Key createKey(Token token, byte[] encoded,
- String algorithm, long keyType) throws InvalidKeyException {
- int n = encoded.length;
- int keyLength;
- switch ((int)keyType) {
- case (int)CKK_RC4:
- if ((n < 5) || (n > 128)) {
- throw new InvalidKeyException
- ("ARCFOUR key length must be between 5 and 128 bytes");
- }
- keyLength = n << 3;
- break;
- case (int)CKK_DES:
- if (n != 8) {
- throw new InvalidKeyException
- ("DES key length must be 8 bytes");
- }
- keyLength = 56;
- fixDESParity(encoded, 0);
- break;
- case (int)CKK_DES3:
- if (n == 16) {
- keyType = CKK_DES2;
- } else if (n == 24) {
- keyType = CKK_DES3;
- fixDESParity(encoded, 16);
- } else {
- throw new InvalidKeyException
- ("DESede key length must be 16 or 24 bytes");
+ String algorithm, long keyType, CK_ATTRIBUTE[] extraAttrs)
+ throws InvalidKeyException {
+ int n = encoded.length << 3;
+ int keyLength = n;
+ try {
+ switch ((int)keyType) {
+ case (int)CKK_DES:
+ keyLength =
+ P11KeyGenerator.checkKeySize(CKM_DES_KEY_GEN, n, token);
+ fixDESParity(encoded, 0);
+ break;
+ case (int)CKK_DES3:
+ keyLength =
+ P11KeyGenerator.checkKeySize(CKM_DES3_KEY_GEN, n, token);
+ fixDESParity(encoded, 0);
+ fixDESParity(encoded, 8);
+ if (keyLength == 112) {
+ keyType = CKK_DES2;
+ } else {
+ keyType = CKK_DES3;
+ fixDESParity(encoded, 16);
+ }
+ break;
+ case (int)CKK_AES:
+ keyLength =
+ P11KeyGenerator.checkKeySize(CKM_AES_KEY_GEN, n, token);
+ break;
+ case (int)CKK_RC4:
+ keyLength =
+ P11KeyGenerator.checkKeySize(CKM_RC4_KEY_GEN, n, token);
+ break;
+ case (int)CKK_BLOWFISH:
+ keyLength =
+ P11KeyGenerator.checkKeySize(CKM_BLOWFISH_KEY_GEN, n,
+ token);
+ break;
+ case (int)CKK_GENERIC_SECRET:
+ case (int)PCKK_TLSPREMASTER:
+ case (int)PCKK_TLSRSAPREMASTER:
+ case (int)PCKK_TLSMASTER:
+ keyType = CKK_GENERIC_SECRET;
+ break;
+ case (int)PCKK_SSLMAC:
+ case (int)PCKK_HMAC:
+ if (n == 0) {
+ throw new InvalidKeyException
+ ("MAC keys must not be empty");
+ }
+ keyType = CKK_GENERIC_SECRET;
+ break;
+ default:
+ throw new InvalidKeyException("Unknown algorithm " +
+ algorithm);
}
- fixDESParity(encoded, 0);
- fixDESParity(encoded, 8);
- keyLength = n * 7;
- break;
- case (int)CKK_AES:
- if ((n != 16) && (n != 24) && (n != 32)) {
- throw new InvalidKeyException
- ("AES key length must be 16, 24, or 32 bytes");
- }
- keyLength = n << 3;
- break;
- case (int)CKK_BLOWFISH:
- if ((n < 5) || (n > 56)) {
- throw new InvalidKeyException
- ("Blowfish key length must be between 5 and 56 bytes");
- }
- keyLength = n << 3;
- break;
- case (int)CKK_GENERIC_SECRET:
- case (int)PCKK_TLSPREMASTER:
- case (int)PCKK_TLSRSAPREMASTER:
- case (int)PCKK_TLSMASTER:
- keyType = CKK_GENERIC_SECRET;
- keyLength = n << 3;
- break;
- case (int)PCKK_SSLMAC:
- case (int)PCKK_HMAC:
- if (n == 0) {
- throw new InvalidKeyException
- ("MAC keys must not be empty");
- }
- keyType = CKK_GENERIC_SECRET;
- keyLength = n << 3;
- break;
- default:
- throw new InvalidKeyException("Unknown algorithm " + algorithm);
+ } catch (InvalidAlgorithmParameterException iape) {
+ throw new InvalidKeyException("Invalid key for " + algorithm,
+ iape);
+ } catch (ProviderException pe) {
+ throw new InvalidKeyException("Could not create key", pe);
}
Session session = null;
try {
- CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] {
- new CK_ATTRIBUTE(CKA_CLASS, CKO_SECRET_KEY),
- new CK_ATTRIBUTE(CKA_KEY_TYPE, keyType),
- new CK_ATTRIBUTE(CKA_VALUE, encoded),
- };
+ CK_ATTRIBUTE[] attributes;
+ if (extraAttrs != null) {
+ attributes = new CK_ATTRIBUTE[3 + extraAttrs.length];
+ System.arraycopy(extraAttrs, 0, attributes, 3,
+ extraAttrs.length);
+ } else {
+ attributes = new CK_ATTRIBUTE[3];
+ }
+ attributes[0] = new CK_ATTRIBUTE(CKA_CLASS, CKO_SECRET_KEY);
+ attributes[1] = new CK_ATTRIBUTE(CKA_KEY_TYPE, keyType);
+ attributes[2] = new CK_ATTRIBUTE(CKA_VALUE, encoded);
attributes = token.getAttributes
(O_IMPORT, CKO_SECRET_KEY, keyType, attributes);
session = token.getObjSession();
@@ -280,7 +307,7 @@
private byte[] getKeyBytes(SecretKey key) throws InvalidKeySpecException {
try {
key = engineTranslateKey(key);
- if ("RAW".equals(key.getFormat()) == false) {
+ if ("RAW".equalsIgnoreCase(key.getFormat()) == false) {
throw new InvalidKeySpecException
("Could not obtain key bytes");
}
--- a/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -601,14 +601,26 @@
// XXX attributes for Ciphers (supported modes, padding)
d(CIP, "ARCFOUR", P11Cipher, s("RC4"),
m(CKM_RC4));
- // XXX only CBC/NoPadding for block ciphers
d(CIP, "DES/CBC/NoPadding", P11Cipher,
m(CKM_DES_CBC));
+ d(CIP, "DES/CBC/PKCS5Padding", P11Cipher,
+ m(CKM_DES_CBC_PAD, CKM_DES_CBC));
+ d(CIP, "DES/ECB", P11Cipher, s("DES"),
+ m(CKM_DES_ECB));
+
d(CIP, "DESede/CBC/NoPadding", P11Cipher,
m(CKM_DES3_CBC));
+ d(CIP, "DESede/CBC/PKCS5Padding", P11Cipher,
+ m(CKM_DES3_CBC_PAD, CKM_DES3_CBC));
+ d(CIP, "DESede/ECB", P11Cipher, s("DESede"),
+ m(CKM_DES3_ECB));
d(CIP, "AES/CBC/NoPadding", P11Cipher,
m(CKM_AES_CBC));
- d(CIP, "Blowfish/CBC/NoPadding", P11Cipher,
+ d(CIP, "AES/CBC/PKCS5Padding", P11Cipher,
+ m(CKM_AES_CBC_PAD, CKM_AES_CBC));
+ d(CIP, "AES/ECB", P11Cipher, s("AES"),
+ m(CKM_AES_ECB));
+ d(CIP, "Blowfish/CBC", P11Cipher,
m(CKM_BLOWFISH_CBC));
// XXX RSA_X_509, RSA_OAEP not yet supported
--- a/jdk/src/share/classes/sun/security/validator/EndEntityChecker.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/classes/sun/security/validator/EndEntityChecker.java Tue Apr 15 17:48:22 2008 -0700
@@ -87,6 +87,9 @@
// the Microsoft Server-Gated-Cryptography EKU extension OID
private final static String OID_EKU_MS_SGC = "1.3.6.1.4.1.311.10.3.3";
+ // the recognized extension OIDs
+ private final static String OID_SUBJECT_ALT_NAME = "2.5.29.17";
+
private final static String NSCT_SSL_CLIENT =
NetscapeCertTypeExtension.SSL_CLIENT;
@@ -171,6 +174,13 @@
throws CertificateException {
// basic constraints irrelevant in EE certs
exts.remove(SimpleValidator.OID_BASIC_CONSTRAINTS);
+
+ // If the subject field contains an empty sequence, the subjectAltName
+ // extension MUST be marked critical.
+ // We do not check the validity of the critical extension, just mark
+ // it recognizable here.
+ exts.remove(OID_SUBJECT_ALT_NAME);
+
if (!exts.isEmpty()) {
throw new CertificateException("Certificate contains unsupported "
+ "critical extensions: " + exts);
--- a/jdk/src/share/instrument/InvocationAdapter.c Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/instrument/InvocationAdapter.c Tue Apr 15 17:48:22 2008 -0700
@@ -626,6 +626,7 @@
jvmtiError jvmtierr;
jvmtierr = (*jvmtienv)->AddToSystemClassLoaderSearch(jvmtienv, jarfile);
+ check_phase_ret_1(jvmtierr);
if (jvmtierr == JVMTI_ERROR_NONE) {
return 0;
@@ -634,6 +635,7 @@
jvmtiError err;
err = (*jvmtienv)->GetPhase(jvmtienv, &phase);
+ /* can be called from any phase */
jplis_assert(err == JVMTI_ERROR_NONE);
if (phase == JVMTI_PHASE_LIVE) {
@@ -805,6 +807,8 @@
/* print warning if boot class path not updated */
if (jvmtierr != JVMTI_ERROR_NONE) {
+ check_phase_blob_ret(jvmtierr, free(path));
+
fprintf(stderr, "WARNING: %s not added to bootstrap class loader search: ", path);
switch (jvmtierr) {
case JVMTI_ERROR_ILLEGAL_ARGUMENT :
--- a/jdk/src/share/instrument/JPLISAgent.c Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/instrument/JPLISAgent.c Tue Apr 15 17:48:22 2008 -0700
@@ -179,6 +179,7 @@
jvmtierror = (*jvmtienv)->GetEnvironmentLocalStorage(
jvmtienv,
(void**)&environment);
+ /* can be called from any phase */
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
if (jvmtierror == JVMTI_ERROR_NONE) {
@@ -230,6 +231,7 @@
/* don't leak envs */
if ( initerror != JPLIS_INIT_ERROR_NONE ) {
jvmtiError jvmtierror = (*jvmtienv)->DisposeEnvironment(jvmtienv);
+ /* can be called from any phase */
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
}
}
@@ -259,7 +261,7 @@
agent->mNormalEnvironment.mIsRetransformer = JNI_FALSE;
agent->mRetransformEnvironment.mJVMTIEnv = NULL; /* NULL until needed */
agent->mRetransformEnvironment.mAgent = agent;
- agent->mRetransformEnvironment.mIsRetransformer = JNI_TRUE;
+ agent->mRetransformEnvironment.mIsRetransformer = JNI_FALSE; /* JNI_FALSE until mJVMTIEnv is set */
agent->mAgentmainCaller = NULL;
agent->mInstrumentationImpl = NULL;
agent->mPremainCaller = NULL;
@@ -277,18 +279,25 @@
jvmtierror = (*jvmtienv)->SetEnvironmentLocalStorage(
jvmtienv,
&(agent->mNormalEnvironment));
+ /* can be called from any phase */
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
/* check what capabilities are available */
checkCapabilities(agent);
/* check phase - if live phase then we don't need the VMInit event */
- jvmtierror == (*jvmtienv)->GetPhase(jvmtienv, &phase);
+ jvmtierror = (*jvmtienv)->GetPhase(jvmtienv, &phase);
+ /* can be called from any phase */
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
if (phase == JVMTI_PHASE_LIVE) {
return JPLIS_INIT_ERROR_NONE;
}
+ if (phase != JVMTI_PHASE_ONLOAD) {
+ /* called too early or called too late; either way bail out */
+ return JPLIS_INIT_ERROR_FAILURE;
+ }
+
/* now turn on the VMInit event */
if ( jvmtierror == JVMTI_ERROR_NONE ) {
jvmtiEventCallbacks callbacks;
@@ -298,6 +307,7 @@
jvmtierror = (*jvmtienv)->SetEventCallbacks( jvmtienv,
&callbacks,
sizeof(callbacks));
+ check_phase_ret_blob(jvmtierror, JPLIS_INIT_ERROR_FAILURE);
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
}
@@ -307,6 +317,7 @@
JVMTI_ENABLE,
JVMTI_EVENT_VM_INIT,
NULL /* all threads */);
+ check_phase_ret_blob(jvmtierror, JPLIS_INIT_ERROR_FAILURE);
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
}
@@ -622,6 +633,7 @@
jvmtierror = (*jvmtienv)->SetEventCallbacks( jvmtienv,
&callbacks,
sizeof(callbacks));
+ check_phase_ret_false(jvmtierror);
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
@@ -632,6 +644,7 @@
JVMTI_DISABLE,
JVMTI_EVENT_VM_INIT,
NULL /* all threads */);
+ check_phase_ret_false(jvmtierror);
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
}
@@ -642,6 +655,7 @@
JVMTI_ENABLE,
JVMTI_EVENT_CLASS_FILE_LOAD_HOOK,
NULL /* all threads */);
+ check_phase_ret_false(jvmtierror);
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
}
@@ -660,6 +674,7 @@
memset(&potentialCapabilities, 0, sizeof(potentialCapabilities));
jvmtierror = (*jvmtienv)->GetPotentialCapabilities(jvmtienv, &potentialCapabilities);
+ check_phase_ret(jvmtierror);
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
if ( jvmtierror == JVMTI_ERROR_NONE ) {
@@ -681,9 +696,11 @@
jvmtiError jvmtierror;
jvmtierror = (*jvmtienv)->GetCapabilities(jvmtienv, &desiredCapabilities);
+ /* can be called from any phase */
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
desiredCapabilities.can_set_native_method_prefix = 1;
jvmtierror = (*jvmtienv)->AddCapabilities(jvmtienv, &desiredCapabilities);
+ check_phase_ret(jvmtierror);
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
}
@@ -715,9 +732,11 @@
jvmtiError jvmtierror;
jvmtierror = (*jvmtienv)->GetCapabilities(jvmtienv, &desiredCapabilities);
+ /* can be called from any phase */
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
desiredCapabilities.can_maintain_original_method_order = 1;
jvmtierror = (*jvmtienv)->AddCapabilities(jvmtienv, &desiredCapabilities);
+ check_phase_ret(jvmtierror);
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
}
@@ -732,9 +751,11 @@
if (agent->mRedefineAvailable && !agent->mRedefineAdded) {
jvmtierror = (*jvmtienv)->GetCapabilities(jvmtienv, &desiredCapabilities);
+ /* can be called from any phase */
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
desiredCapabilities.can_redefine_classes = 1;
jvmtierror = (*jvmtienv)->AddCapabilities(jvmtienv, &desiredCapabilities);
+ check_phase_ret(jvmtierror);
/*
* With mixed premain/agentmain agents then it's possible that the
@@ -998,6 +1019,7 @@
if (jvmtierror == JVMTI_ERROR_NONE) {
// install the retransforming environment
agent->mRetransformEnvironment.mJVMTIEnv = retransformerEnv;
+ agent->mRetransformEnvironment.mIsRetransformer = JNI_TRUE;
// Make it for ClassFileLoadHook handling
jvmtierror = (*retransformerEnv)->SetEnvironmentLocalStorage(
@@ -1025,6 +1047,7 @@
jvmtierror = (*jvmtienv)->IsModifiableClass( jvmtienv,
clazz,
&is_modifiable);
+ check_phase_ret_false(jvmtierror);
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
return is_modifiable;
@@ -1032,7 +1055,7 @@
jboolean
isRetransformClassesSupported(JNIEnv * jnienv, JPLISAgent * agent) {
- return retransformableEnvironment(agent) != NULL;
+ return agent->mRetransformEnvironment.mIsRetransformer;
}
void
@@ -1075,6 +1098,12 @@
numClasses = (*jnienv)->GetArrayLength(jnienv, classes);
errorOccurred = checkForThrowable(jnienv);
jplis_assert(!errorOccurred);
+
+ if (!errorOccurred && numClasses == 0) {
+ jplis_assert(numClasses != 0);
+ errorOccurred = JNI_TRUE;
+ errorCode = JVMTI_ERROR_NULL_POINTER;
+ }
}
if (!errorOccurred) {
@@ -1096,6 +1125,13 @@
if (errorOccurred) {
break;
}
+
+ if (classArray[index] == NULL) {
+ jplis_assert(classArray[index] != NULL);
+ errorOccurred = JNI_TRUE;
+ errorCode = JVMTI_ERROR_NULL_POINTER;
+ break;
+ }
}
}
@@ -1217,6 +1253,7 @@
if (!errorOccurred) {
jvmtiError errorCode = JVMTI_ERROR_NONE;
errorCode = (*jvmtienv)->RedefineClasses(jvmtienv, numDefs, classDefs);
+ check_phase_blob_ret(errorCode, deallocate(jvmtienv, (void*)classDefs));
errorOccurred = (errorCode != JVMTI_ERROR_NONE);
if ( errorOccurred ) {
createAndThrowThrowableFromJVMTIErrorCode(jnienv, errorCode);
@@ -1250,6 +1287,7 @@
classLoader,
&classCount,
&classes);
+ check_phase_ret_blob(jvmtierror, localArray);
errorOccurred = (jvmtierror != JVMTI_ERROR_NONE);
jplis_assert(!errorOccurred);
@@ -1311,6 +1349,7 @@
jvmtiError jvmtierror = JVMTI_ERROR_NONE;
jvmtierror = (*jvmtienv)->GetObjectSize(jvmtienv, objectToSize, &objectSize);
+ check_phase_ret_0(jvmtierror);
jplis_assert(jvmtierror == JVMTI_ERROR_NONE);
if ( jvmtierror != JVMTI_ERROR_NONE ) {
createAndThrowThrowableFromJVMTIErrorCode(jnienv, jvmtierror);
@@ -1360,6 +1399,7 @@
} else {
jvmtierror = (*jvmtienv)->AddToSystemClassLoaderSearch(jvmtienv, platformChars);
}
+ check_phase_ret(jvmtierror);
if ( jvmtierror != JVMTI_ERROR_NONE ) {
createAndThrowThrowableFromJVMTIErrorCode(jnienv, jvmtierror);
@@ -1450,6 +1490,7 @@
}
err = (*jvmtienv)->SetNativeMethodPrefixes(jvmtienv, inx, (char**)prefixes);
+ /* can be called from any phase */
jplis_assert(err == JVMTI_ERROR_NONE);
for (i = 0; i < inx; i++) {
--- a/jdk/src/share/instrument/JPLISAgent.h Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/instrument/JPLISAgent.h Tue Apr 15 17:48:22 2008 -0700
@@ -266,6 +266,48 @@
#define jvmti(a) a->mNormalEnvironment.mJVMTIEnv
+/*
+ * A set of macros for insulating the JLI method callers from
+ * JVMTI_ERROR_WRONG_PHASE return codes.
+ */
+
+/* for a JLI method where "blob" is executed before simply returning */
+#define check_phase_blob_ret(ret, blob) \
+ if ((ret) == JVMTI_ERROR_WRONG_PHASE) { \
+ blob; \
+ return; \
+ }
+
+/* for a JLI method where simply returning is benign */
+#define check_phase_ret(ret) \
+ if ((ret) == JVMTI_ERROR_WRONG_PHASE) { \
+ return; \
+ }
+
+/* for a JLI method where returning zero (0) is benign */
+#define check_phase_ret_0(ret) \
+ if ((ret) == JVMTI_ERROR_WRONG_PHASE) { \
+ return 0; \
+ }
+
+/* for a JLI method where returning one (1) is benign */
+#define check_phase_ret_1(ret) \
+ if ((ret) == JVMTI_ERROR_WRONG_PHASE) { \
+ return 1; \
+ }
+
+/* for a case where a specific "blob" must be returned */
+#define check_phase_ret_blob(ret, blob) \
+ if ((ret) == JVMTI_ERROR_WRONG_PHASE) { \
+ return (blob); \
+ }
+
+/* for a JLI method where returning false is benign */
+#define check_phase_ret_false(ret) \
+ if ((ret) == JVMTI_ERROR_WRONG_PHASE) { \
+ return (jboolean) 0; \
+ }
+
#ifdef __cplusplus
} /* extern "C" */
#endif /* __cplusplus */
--- a/jdk/src/share/instrument/JarFacade.c Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/instrument/JarFacade.c Tue Apr 15 17:48:22 2008 -0700
@@ -23,6 +23,14 @@
* have any questions.
*/
+#ifdef _WIN32
+/*
+ * Win* needs this include. However, Linux and Solaris do not.
+ * Having this include on Solaris SPARC breaks having non US-ASCII
+ * characters in the value of the Premain-Class attribute.
+ */
+#include <ctype.h>
+#endif /* _WIN32 */
#include <string.h>
#include <stdlib.h>
@@ -45,11 +53,37 @@
if (attribute->name == NULL) {
free(attribute);
} else {
- attribute->value = strdup(value);
+ char *begin = (char *)value;
+ char *end;
+ size_t value_len;
+
+ /* skip any leading white space */
+ while (isspace(*begin)) {
+ begin++;
+ }
+
+ /* skip any trailing white space */
+ end = &begin[strlen(begin)];
+ while (end > begin && isspace(end[-1])) {
+ end--;
+ }
+
+ if (begin == end) {
+ /* no value so skip this attribute */
+ free(attribute->name);
+ free(attribute);
+ return;
+ }
+
+ value_len = (size_t)(end - begin);
+ attribute->value = malloc(value_len + 1);
if (attribute->value == NULL) {
free(attribute->name);
free(attribute);
} else {
+ /* save the value without leading or trailing whitespace */
+ strncpy(attribute->value, begin, value_len);
+ attribute->value[value_len] = '\0';
attribute->next = NULL;
if (context->head == NULL) {
context->head = attribute;
--- a/jdk/src/share/instrument/Reentrancy.c Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/instrument/Reentrancy.c Tue Apr 15 17:48:22 2008 -0700
@@ -74,6 +74,7 @@
jvmtienv,
thread,
newValue);
+ check_phase_ret_blob(error, error);
#if JPLISASSERT_ENABLEASSERTIONS
assertTLSValue( jvmtienv,
@@ -96,6 +97,7 @@
jvmtienv,
thread,
&test);
+ check_phase_ret(error);
jplis_assert(error == JVMTI_ERROR_NONE);
jplis_assert(test == expected);
}
@@ -111,6 +113,7 @@
jvmtienv,
thread,
&storedValue);
+ check_phase_ret_false(error);
jplis_assert(error == JVMTI_ERROR_NONE);
if ( error == JVMTI_ERROR_NONE ) {
/* if this thread is already inside, just return false and short-circuit */
--- a/jdk/src/share/instrument/Utilities.c Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/share/instrument/Utilities.c Tue Apr 15 17:48:22 2008 -0700
@@ -46,6 +46,7 @@
error = (*jvmtienv)->Allocate(jvmtienv,
bytecount,
(unsigned char**) &resultBuffer);
+ /* may be called from any phase */
jplis_assert(error == JVMTI_ERROR_NONE);
if ( error != JVMTI_ERROR_NONE ) {
resultBuffer = NULL;
@@ -66,6 +67,7 @@
error = (*jvmtienv)->Deallocate(jvmtienv,
(unsigned char*)buffer);
+ /* may be called from any phase */
jplis_assert_msg(error == JVMTI_ERROR_NONE, "Can't deallocate memory");
return;
}
--- a/jdk/src/solaris/native/sun/security/pkcs11/wrapper/p11_md.c Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/src/solaris/native/sun/security/pkcs11/wrapper/p11_md.c Tue Apr 15 17:48:22 2008 -0700
@@ -123,7 +123,10 @@
C_GetFunctionList = (CK_C_GetFunctionList) dlsym(hModule, getFunctionListStr);
(*env)->ReleaseStringUTFChars(env, jGetFunctionList, getFunctionListStr);
}
- if ((C_GetFunctionList == NULL) || ((systemErrorMessage = dlerror()) != NULL)){
+ if (C_GetFunctionList == NULL) {
+ throwIOException(env, "ERROR: C_GetFunctionList == NULL");
+ return;
+ } else if ( (systemErrorMessage = dlerror()) != NULL ){
throwIOException(env, systemErrorMessage);
return;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/GetDiagnosticOptions.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6658779
+ * @summary Basic Test for HotSpotDiagnosticMXBean.getDiagnosticOptions()
+ * @author Daniel Fuchs
+ *
+ * @run main GetDiagnosticOptions
+ */
+
+import com.sun.management.HotSpotDiagnosticMXBean;
+import com.sun.management.VMOption;
+import java.lang.management.ManagementFactory;
+import java.util.List;
+import javax.management.MBeanServer;
+
+public class GetDiagnosticOptions {
+ private static String HOTSPOT_DIAGNOSTIC_MXBEAN_NAME =
+ "com.sun.management:type=HotSpotDiagnostic";
+
+ public static void main(String[] args) throws Exception {
+ HotSpotDiagnosticMXBean mbean =
+ sun.management.ManagementFactory.getDiagnosticMXBean();
+ checkDiagnosticOptions(mbean);
+
+ MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+ mbean = ManagementFactory.newPlatformMXBeanProxy(mbs,
+ HOTSPOT_DIAGNOSTIC_MXBEAN_NAME,
+ HotSpotDiagnosticMXBean.class);
+ checkDiagnosticOptions(mbean);
+ }
+
+ private static void checkDiagnosticOptions(HotSpotDiagnosticMXBean mbean) {
+ List<VMOption> options = mbean.getDiagnosticOptions();
+ for (VMOption opt : options) {
+ System.out.println("option: "+opt.getName()+"="+opt.getValue());
+ }
+ }
+}
--- a/jdk/test/java/lang/instrument/BootClassPath/BootClassPathTest.sh Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/lang/instrument/BootClassPath/BootClassPathTest.sh Tue Apr 15 17:48:22 2008 -0700
@@ -23,8 +23,10 @@
# @test
# @bug 5055293
-# @summary Test non US-ASCII characters in the value of the Boot-Class-Path
+# @summary Test non US-ASCII characters in the value of the Boot-Class-Path
# attribute.
+#
+# @run shell/timeout=240 BootClassPathTest.sh
if [ "${TESTJAVA}" = "" ]
then
@@ -72,7 +74,7 @@
echo "Running test..."
-"${JAVA}" -javaagent:"${TESTCLASSES}"/Agent.jar -classpath "${TESTCLASSES}" DummyMain
+"${JAVA}" ${TESTVMOPTS} -javaagent:"${TESTCLASSES}"/Agent.jar -classpath "${TESTCLASSES}" DummyMain
result=$?
echo "Cleanup..."
--- a/jdk/test/java/lang/instrument/MakeJAR2.sh Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/lang/instrument/MakeJAR2.sh Tue Apr 15 17:48:22 2008 -0700
@@ -70,9 +70,11 @@
cp ${TESTSRC}/${AGENT}.java .
cp ${TESTSRC}/${APP}.java .
rm -rf ilib
-cp -r ${TESTSRC}/ilib .
-mkdir bootpath
-cp -r ${TESTSRC}/bootreporter bootpath
+mkdir ilib
+cp ${TESTSRC}/ilib/*.java ilib
+rm -rf bootpath
+mkdir -p bootpath/bootreporter
+cp ${TESTSRC}/bootreporter/*.java bootpath/bootreporter
cd bootpath
${JAVAC} bootreporter/*.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/ManifestTest.sh Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,483 @@
+#
+# Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 6274276
+# @summary JLI JAR manifest processing should ignore leading and trailing white space.
+# @author Daniel D. Daugherty
+#
+# @run build ManifestTestApp
+# @run shell/timeout=900 ManifestTest.sh
+#
+
+make_a_JAR() {
+ # version_line and premain_line are required
+ version_line="Manifest-Version: 1.0"
+ premain_line="Premain-Class: ${AGENT}"
+ boot_cp_line=""
+ expect_boot_cp_line="ExampleForBootClassPath was not loaded."
+ can_redef_line=""
+ expect_redef_line="isRedefineClassesSupported()=false"
+ can_retrans_line=""
+ expect_retrans_line="isRetransformClassesSupported()=false"
+ can_set_nmp_line=""
+ expect_set_nmp_line="isNativeMethodPrefixSupported()=false"
+
+ while [ $# != 0 ] ; do
+ case "$1" in
+ defaults)
+ # just use the defaults for the test
+ ;;
+
+ boot_cp_line1)
+ boot_cp_line="Boot-Class-Path: no_white_space"
+ expect_boot_cp_line="ExampleForBootClassPath was loaded."
+ mkdir -p no_white_space
+ cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class no_white_space
+ ;;
+
+ boot_cp_line2)
+ boot_cp_line="Boot-Class-Path: has_leading_blank"
+ expect_boot_cp_line="ExampleForBootClassPath was loaded."
+ mkdir -p has_leading_blank " has_leading_blank"
+ # the good class is in the directory without the blank
+ cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class \
+ has_leading_blank
+ # the bad class is in the directory with the blank
+ cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class.bad \
+ " has_leading_blank"/ExampleForBootClassPath.class
+ ;;
+
+ boot_cp_line3)
+ boot_cp_line="Boot-Class-Path: has_trailing_blank "
+ expect_boot_cp_line="ExampleForBootClassPath was loaded."
+ mkdir -p has_trailing_blank "has_trailing_blank "
+ # the good class is in the directory without the blank
+ cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class \
+ has_trailing_blank
+ # the bad class is in the directory with the blank
+ cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class.bad \
+ "has_trailing_blank "/ExampleForBootClassPath.class
+ ;;
+
+ boot_cp_line4)
+ boot_cp_line="Boot-Class-Path: has_leading_and_trailing_blank "
+ expect_boot_cp_line="ExampleForBootClassPath was loaded."
+ mkdir -p has_leading_and_trailing_blank \
+ " has_leading_and_trailing_blank "
+ # the good class is in the directory without the blanks
+ cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class \
+ has_leading_and_trailing_blank
+ # the bad class is in the directory with the blanks
+ cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class.bad \
+ " has_leading_and_trailing_blank "/ExampleForBootClassPath.class
+ ;;
+
+ boot_cp_line5)
+ boot_cp_line="Boot-Class-Path: has_embedded blank"
+ expect_boot_cp_line="ExampleForBootClassPath was loaded."
+ mkdir -p has_embedded "has_embedded blank"
+ # the good class is in the first blank separated word
+ cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class has_embedded
+ # the bad class is in the directory with the blank
+ cp -p $OUT_OF_THE_WAY/ExampleForBootClassPath.class.bad \
+ "has_embedded blank"/ExampleForBootClassPath.class
+ ;;
+
+ can_redef_line1)
+ can_redef_line="Can-Redefine-Classes: true"
+ expect_redef_line="isRedefineClassesSupported()=true"
+ ;;
+
+ can_redef_line2)
+ can_redef_line="Can-Redefine-Classes: true"
+ expect_redef_line="isRedefineClassesSupported()=true"
+ ;;
+
+ can_redef_line3)
+ can_redef_line="Can-Redefine-Classes: true "
+ expect_redef_line="isRedefineClassesSupported()=true"
+ ;;
+
+ can_redef_line4)
+ can_redef_line="Can-Redefine-Classes: true "
+ expect_redef_line="isRedefineClassesSupported()=true"
+ ;;
+
+ can_redef_line5)
+ can_redef_line="Can-Redefine-Classes: false"
+ ;;
+
+ can_redef_line6)
+ can_redef_line="Can-Redefine-Classes: false"
+ ;;
+
+ can_redef_line7)
+ can_redef_line="Can-Redefine-Classes: false "
+ ;;
+
+ can_redef_line8)
+ can_redef_line="Can-Redefine-Classes: false "
+ ;;
+
+ can_redef_line9)
+ # this line makes the jar command unhappy and that's
+ # not what we're testing so skip this case
+ can_redef_line="Can-Redefine-Classes:"
+ ;;
+
+ can_redef_line10)
+ can_redef_line="Can-Redefine-Classes: "
+ ;;
+
+ can_redef_line11)
+ can_redef_line="Can-Redefine-Classes: "
+ ;;
+
+ can_retrans_line1)
+ can_retrans_line="Can-Retransform-Classes: true"
+ expect_retrans_line="isRetransformClassesSupported()=true"
+ ;;
+
+ can_retrans_line2)
+ can_retrans_line="Can-Retransform-Classes: true"
+ expect_retrans_line="isRetransformClassesSupported()=true"
+ ;;
+
+ can_retrans_line3)
+ can_retrans_line="Can-Retransform-Classes: true "
+ expect_retrans_line="isRetransformClassesSupported()=true"
+ ;;
+
+ can_retrans_line4)
+ can_retrans_line="Can-Retransform-Classes: true "
+ expect_retrans_line="isRetransformClassesSupported()=true"
+ ;;
+
+ can_retrans_line5)
+ can_retrans_line="Can-Retransform-Classes: false"
+ ;;
+
+ can_retrans_line6)
+ can_retrans_line="Can-Retransform-Classes: false"
+ ;;
+
+ can_retrans_line7)
+ can_retrans_line="Can-Retransform-Classes: false "
+ ;;
+
+ can_retrans_line8)
+ can_retrans_line="Can-Retransform-Classes: false "
+ ;;
+
+ can_retrans_line9)
+ # this line makes the jar command unhappy and that's
+ # not what we're testing so skip this case
+ can_retrans_line="Can-Retransform-Classes:"
+ ;;
+
+ can_retrans_line10)
+ can_retrans_line="Can-Retransform-Classes: "
+ ;;
+
+ can_retrans_line11)
+ can_retrans_line="Can-Retransform-Classes: "
+ ;;
+
+ can_set_nmp_line1)
+ can_set_nmp_line="Can-Set-Native-Method-Prefix: true"
+ expect_set_nmp_line="isNativeMethodPrefixSupported()=true"
+ ;;
+
+ can_set_nmp_line2)
+ can_set_nmp_line="Can-Set-Native-Method-Prefix: true"
+ expect_set_nmp_line="isNativeMethodPrefixSupported()=true"
+ ;;
+
+ can_set_nmp_line3)
+ can_set_nmp_line="Can-Set-Native-Method-Prefix: true "
+ expect_set_nmp_line="isNativeMethodPrefixSupported()=true"
+ ;;
+
+ can_set_nmp_line4)
+ can_set_nmp_line="Can-Set-Native-Method-Prefix: true "
+ expect_set_nmp_line="isNativeMethodPrefixSupported()=true"
+ ;;
+
+ can_set_nmp_line5)
+ can_set_nmp_line="Can-Set-Native-Method-Prefix: false"
+ ;;
+
+ can_set_nmp_line6)
+ can_set_nmp_line="Can-Set-Native-Method-Prefix: false"
+ ;;
+
+ can_set_nmp_line7)
+ can_set_nmp_line="Can-Set-Native-Method-Prefix: false "
+ ;;
+
+ can_set_nmp_line8)
+ can_set_nmp_line="Can-Set-Native-Method-Prefix: false "
+ ;;
+
+ can_set_nmp_line9)
+ # this line makes the jar command unhappy and that's
+ # not what we're testing so skip this case
+ can_set_nmp_line="Can-Set-Native-Method-Prefix:"
+ ;;
+
+ can_set_nmp_line10)
+ can_set_nmp_line="Can-Set-Native-Method-Prefix: "
+ ;;
+
+ can_set_nmp_line11)
+ can_set_nmp_line="Can-Set-Native-Method-Prefix: "
+ ;;
+
+ premain_line1)
+ premain_line="Premain-Class: ${AGENT}"
+ ;;
+
+ premain_line2)
+ premain_line="Premain-Class: ${AGENT} "
+ ;;
+
+ premain_line3)
+ premain_line="Premain-Class: ${AGENT} "
+ ;;
+
+ version_line1)
+ version_line="Manifest-Version: 1.0"
+ ;;
+
+ version_line2)
+ version_line="Manifest-Version: 1.0 "
+ ;;
+
+ version_line3)
+ version_line="Manifest-Version: 1.0 "
+ ;;
+
+ *)
+ echo "ERROR: invalid test token"
+ exit 1
+ esac
+ shift
+ done
+
+ echo "${version_line}" > ${AGENT}.mf
+ echo "${premain_line}" >> ${AGENT}.mf
+
+ if [ -n "$boot_cp_line" ]; then
+ echo "${boot_cp_line}" >> ${AGENT}.mf
+ fi
+
+ if [ -n "$can_redef_line" ]; then
+ echo "${can_redef_line}" >> ${AGENT}.mf
+ fi
+
+ if [ -n "$can_retrans_line" ]; then
+ echo "${can_retrans_line}" >> ${AGENT}.mf
+ fi
+
+ if [ -n "$can_set_nmp_line" ]; then
+ echo "${can_set_nmp_line}" >> ${AGENT}.mf
+ fi
+
+ rm -f ${AGENT}.jar
+ ${JAR} cvfm ${AGENT}.jar ${AGENT}.mf ${AGENT}.class
+
+ echo "$expect_boot_cp_line" > expect_boot_cp_line
+ echo "$expect_redef_line" > expect_redef_line
+ echo "$expect_retrans_line" > expect_retrans_line
+ echo "$expect_set_nmp_line" > expect_set_nmp_line
+}
+
+if [ "${TESTJAVA}" = "" ]
+then
+ echo "TESTJAVA not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTSRC}" = "" ]
+then
+ echo "TESTSRC not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTCLASSES}" = "" ]
+then
+ echo "TESTCLASSES not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+JAR="${TESTJAVA}/bin/jar"
+JAVAC="${TESTJAVA}"/bin/javac
+JAVA="${TESTJAVA}"/bin/java
+
+# Now that ManifestTestApp.class is built, we move
+# ExampleForBootClassPath.class so that it cannot be found
+# by default
+OUT_OF_THE_WAY=out_of_the_way
+mkdir $OUT_OF_THE_WAY
+mv "${TESTCLASSES}/ExampleForBootClassPath.class" $OUT_OF_THE_WAY
+
+# create a bad version of ExampleForBootClassPath.class
+# so we can tell when the wrong version is run
+sed 's/return 15/return 42/' "${TESTSRC}"/ExampleForBootClassPath.java \
+ > ExampleForBootClassPath.java
+"$JAVAC" ExampleForBootClassPath.java
+mv ExampleForBootClassPath.class \
+ $OUT_OF_THE_WAY/ExampleForBootClassPath.class.bad
+mv ExampleForBootClassPath.java \
+ $OUT_OF_THE_WAY/ExampleForBootClassPath.java.bad
+
+AGENT=ManifestTestAgent
+# We compile the agent in the working directory instead of with
+# a build task because we construct a different agent JAR file
+# for each test case.
+${JAVAC} -d . ${TESTSRC}/${AGENT}.java
+
+FAIL_MARKER=fail_marker
+rm -f $FAIL_MARKER
+
+while read token; do
+ echo
+ echo "===== begin test case: $token ====="
+ make_a_JAR "$token"
+
+ "${JAVA}" ${TESTVMOPTS} -javaagent:${AGENT}.jar \
+ -classpath "${TESTCLASSES}" ManifestTestApp > output.log 2>&1
+ result=$?
+
+ cat output.log
+
+ if [ "$result" = 0 ]; then
+ echo "PASS: ManifestTestApp exited with status of 0."
+ else
+ echo "FAIL: ManifestTestApp exited with status of $result"
+ touch $FAIL_MARKER
+ fi
+
+ MESG="Hello from ${AGENT}!"
+ grep -s "$MESG" output.log > /dev/null
+ result=$?
+ if [ "$result" = 0 ]; then
+ echo "PASS: found '$MESG' in the test output"
+ else
+ echo "FAIL: did NOT find '$MESG' in the test output"
+ touch $FAIL_MARKER
+ fi
+
+ MESG=`cat expect_boot_cp_line`
+ grep -s "$MESG" output.log > /dev/null
+ result=$?
+ if [ "$result" = 0 ]; then
+ echo "PASS: found '$MESG' in the test output"
+ else
+ echo "FAIL: did NOT find '$MESG' in the test output"
+ touch $FAIL_MARKER
+ fi
+
+ MESG=`cat expect_redef_line`
+ grep -s "$MESG" output.log > /dev/null
+ result=$?
+ if [ "$result" = 0 ]; then
+ echo "PASS: found '$MESG' in the test output"
+ else
+ echo "FAIL: did NOT find '$MESG' in the test output"
+ touch $FAIL_MARKER
+ fi
+
+ MESG=`cat expect_retrans_line`
+ grep -s "$MESG" output.log > /dev/null
+ result=$?
+ if [ "$result" = 0 ]; then
+ echo "PASS: found '$MESG' in the test output"
+ else
+ echo "FAIL: did NOT find '$MESG' in the test output"
+ touch $FAIL_MARKER
+ fi
+
+ MESG=`cat expect_set_nmp_line`
+ grep -s "$MESG" output.log > /dev/null
+ result=$?
+ if [ "$result" = 0 ]; then
+ echo "PASS: found '$MESG' in the test output"
+ else
+ echo "FAIL: did NOT find '$MESG' in the test output"
+ touch $FAIL_MARKER
+ fi
+
+ echo "===== end test case: $token ====="
+ echo
+done << EOF
+defaults
+version_line1
+version_line2
+version_line3
+premain_line1
+premain_line2
+premain_line3
+boot_cp_line1
+boot_cp_line2
+boot_cp_line3
+boot_cp_line4
+boot_cp_line5
+can_redef_line1
+can_redef_line2
+can_redef_line3
+can_redef_line4
+can_redef_line5
+can_redef_line6
+can_redef_line7
+can_redef_line8
+can_redef_line10
+can_redef_line11
+can_retrans_line1
+can_retrans_line2
+can_retrans_line3
+can_retrans_line4
+can_retrans_line5
+can_retrans_line6
+can_retrans_line7
+can_retrans_line8
+can_retrans_line10
+can_retrans_line11
+can_set_nmp_line1
+can_set_nmp_line2
+can_set_nmp_line3
+can_set_nmp_line4
+can_set_nmp_line5
+can_set_nmp_line6
+can_set_nmp_line7
+can_set_nmp_line8
+can_set_nmp_line10
+can_set_nmp_line11
+EOF
+
+if [ -f $FAIL_MARKER ]; then
+ exit 1
+else
+ exit 0
+fi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/ManifestTestAgent.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.lang.instrument.Instrumentation;
+
+public class ManifestTestAgent {
+ private static Instrumentation instrumentation;
+
+ private ManifestTestAgent() {
+ }
+
+ public static void premain(String agentArgs, Instrumentation inst) {
+ System.out.println("Hello from ManifestTestAgent!");
+ System.out.println("isNativeMethodPrefixSupported()=" +
+ inst.isNativeMethodPrefixSupported());
+ System.out.println("isRedefineClassesSupported()=" +
+ inst.isRedefineClassesSupported());
+ System.out.println("isRetransformClassesSupported()=" +
+ inst.isRetransformClassesSupported());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/ManifestTestApp.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+public class ManifestTestApp {
+ public static void main(String args[]) {
+ System.out.println("Hello from ManifestTestApp!");
+
+ new ManifestTestApp().doTest();
+ System.exit(0);
+ }
+
+ private void doTest() {
+ try {
+ // load the class only found via the Boot-Class-Path attribute
+ Object instance = loadExampleClass();
+ if (instance.getClass().getClassLoader() == null) {
+ System.out.println("PASS: ExampleForBootClassPath was loaded" +
+ " by the boot class path loader.");
+ } else {
+ System.out.println("FAIL: ExampleForBootClassPath was loaded" +
+ " by a non-boot class path loader.");
+ System.exit(1);
+ }
+ } catch (NoClassDefFoundError ncdfe) {
+ // This message just lets ManifestTest.sh know whether or
+ // not ExampleForBootClassPath was loaded. Depending on
+ // the current test case, that will be either a PASSing
+ // condition or a FAILing condition as determined by
+ // ManifestTest.sh.
+ System.out.println("ExampleForBootClassPath was not loaded.");
+ }
+ }
+
+ Object loadExampleClass() {
+ ExampleForBootClassPath instance = new ExampleForBootClassPath();
+ System.out.println("ExampleForBootClassPath was loaded.");
+ if (instance.fifteen() == 15) {
+ System.out.println("PASS: the correct" +
+ " ExampleForBootClassPath was loaded.");
+ } else {
+ System.out.println("FAIL: the wrong ExampleForBootClassPath" +
+ " was loaded.");
+ System.out.println("FAIL: instance.fifteen()=" +
+ instance.fifteen());
+ System.exit(1);
+ }
+ return instance;
+ }
+}
--- a/jdk/test/java/lang/instrument/NativeMethodPrefixAgent.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/lang/instrument/NativeMethodPrefixAgent.java Tue Apr 15 17:48:22 2008 -0700
@@ -27,7 +27,7 @@
* @summary test setNativeMethodPrefix
* @author Robert Field, Sun Microsystems
*
- * @run shell MakeJAR2.sh NativeMethodPrefixAgent NativeMethodPrefixApp 'Can-Retransform-Classes: true' 'Can-Set-Native-Method-Prefix: true'
+ * @run shell/timeout=240 MakeJAR2.sh NativeMethodPrefixAgent NativeMethodPrefixApp 'Can-Retransform-Classes: true' 'Can-Set-Native-Method-Prefix: true'
* @run main/othervm -javaagent:NativeMethodPrefixAgent.jar NativeMethodPrefixApp
*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/ParallelTransformerLoader.sh Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,72 @@
+#
+# Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 5088398
+# @summary Test parallel class loading by parallel transformers.
+# @author Daniel D. Daugherty as modified from the code of Daryl Puryear @ Wily
+#
+# @run shell MakeJAR3.sh ParallelTransformerLoaderAgent
+# @run build ParallelTransformerLoaderApp
+# @run shell/timeout=240 ParallelTransformerLoader.sh
+#
+
+if [ "${TESTJAVA}" = "" ]
+then
+ echo "TESTJAVA not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTSRC}" = "" ]
+then
+ echo "TESTSRC not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTCLASSES}" = "" ]
+then
+ echo "TESTCLASSES not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+JAR="${TESTJAVA}"/bin/jar
+JAVAC="${TESTJAVA}"/bin/javac
+JAVA="${TESTJAVA}"/bin/java
+
+"${JAVAC}" -d . \
+ "${TESTSRC}"/TestClass1.java \
+ "${TESTSRC}"/TestClass2.java \
+ "${TESTSRC}"/TestClass3.java
+
+"${JAR}" cvf Test.jar Test*.class
+# Removing the test class files is important. If these
+# .class files are available on the classpath other
+# than via Test.jar, then the deadlock will not reproduce.
+rm -f Test*.class
+
+"${JAVA}" ${TESTVMOPTS} -javaagent:ParallelTransformerLoaderAgent.jar=Test.jar \
+ -classpath "${TESTCLASSES}" ParallelTransformerLoaderApp
+result=$?
+echo "result=$result"
+
+exit $result
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/ParallelTransformerLoaderAgent.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.lang.instrument.*;
+import java.net.*;
+import java.io.*;
+import java.security.*;
+
+/**
+ * Test Java Agent
+ *
+ * @author Daryl Puryear
+ * @copyright 1999-2004 Wily Technology, Inc. All rights reserved.
+ */
+public class ParallelTransformerLoaderAgent
+{
+ private static URL sURL;
+ private static ClassLoader sClassLoader;
+
+ public static synchronized ClassLoader
+ getClassLoader()
+ {
+ return sClassLoader;
+ }
+
+ public static synchronized void
+ generateNewClassLoader()
+ {
+ sClassLoader = new URLClassLoader(new URL[] {sURL});
+ }
+
+ public static void
+ premain( String agentArgs,
+ Instrumentation instrumentation)
+ throws Exception
+ {
+ if (agentArgs == null || agentArgs == "")
+ {
+ System.err.println("Error: No jar file name provided, test will not run.");
+ return;
+ }
+
+ sURL = (new File(agentArgs)).toURL();
+ System.out.println("Using jar file: " + sURL);
+ generateNewClassLoader();
+
+ instrumentation.addTransformer(new TestTransformer());
+ }
+
+ private static class TestTransformer
+ implements ClassFileTransformer
+ {
+ public byte[]
+ transform( ClassLoader loader,
+ String className,
+ Class classBeingRedefined,
+ ProtectionDomain protectionDomain,
+ byte[] classfileBuffer)
+ throws IllegalClassFormatException
+ {
+ String tName = Thread.currentThread().getName();
+ // In 160_03 and older, transform() is called
+ // with the "system_loader_lock" held and that
+ // prevents the bootstrap class loaded from
+ // running in parallel. If we add a slight sleep
+ // delay here when the transform() call is not
+ // main or TestThread, then the deadlock in
+ // 160_03 and older is much more reproducible.
+ if (!tName.equals("main") && !tName.equals("TestThread")) {
+ System.out.println("Thread '" + tName +
+ "' has called transform()");
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException ie) {
+ }
+ }
+
+ // load additional classes when called from other threads
+ if (!tName.equals("main"))
+ {
+ loadClasses(3);
+ }
+ return null;
+ }
+
+ public static void
+ loadClasses( int index)
+ {
+ ClassLoader loader = ParallelTransformerLoaderAgent.getClassLoader();
+ try
+ {
+ Class.forName("TestClass" + index, true, loader);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/ParallelTransformerLoaderApp.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * Test Java Program
+ *
+ * @author Daryl Puryear
+ * @copyright 1999-2004 Wily Technology, Inc. All rights reserved.
+ */
+public class ParallelTransformerLoaderApp
+{
+ private static final int kNumIterations = 1000;
+
+ public static void
+ main( String[] args)
+ throws Exception
+ {
+ System.out.println();
+ System.out.print("Starting test with " + kNumIterations + " iterations");
+ for (int i = 0; i < kNumIterations; i++)
+ {
+ // load some classes from multiple threads (this thread and one other)
+ Thread testThread = new TestThread(2);
+ testThread.start();
+ loadClasses(1);
+
+ // log that it completed and reset for the next iteration
+ testThread.join();
+ System.out.print(".");
+ ParallelTransformerLoaderAgent.generateNewClassLoader();
+ }
+
+ System.out.println();
+ System.out.println("Test completed successfully");
+ }
+
+ private static class TestThread
+ extends Thread
+ {
+ private final int fIndex;
+
+ public
+ TestThread( int index)
+ {
+ super("TestThread");
+
+ fIndex = index;
+ }
+
+ public void
+ run()
+ {
+ loadClasses(fIndex);
+ }
+ }
+
+ public static void
+ loadClasses( int index)
+ {
+ ClassLoader loader = ParallelTransformerLoaderAgent.getClassLoader();
+ try
+ {
+ Class.forName("TestClass" + index, true, loader);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+}
--- a/jdk/test/java/lang/instrument/PremainClass/DummyMain.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/lang/instrument/PremainClass/DummyMain.java Tue Apr 15 17:48:22 2008 -0700
@@ -22,11 +22,10 @@
*/
/*
- *
- *
- * Used by PremainClassTest.sh - dummy "main application" which doesn't do anything
+ * dummy "Hello World"ish application for "premain" tests
*/
public class DummyMain {
public static void main(String[] args) {
+ System.out.println("Hello from DummyMain!");
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/InheritAgent0001.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6289149
+ * @summary test config (0,0,0,1): declared 1-arg in agent class
+ * @author Daniel D. Daugherty, Sun Microsystems
+ *
+ * @run shell ../MakeJAR3.sh InheritAgent0001
+ * @run main/othervm -javaagent:InheritAgent0001.jar DummyMain
+ */
+
+import java.lang.instrument.*;
+
+class InheritAgent0001 extends InheritAgent0001Super {
+
+ //
+ // This agent has a single argument premain() method which
+ // is the one that should be called.
+ //
+ public static void premain (String agentArgs) {
+ System.out.println("Hello from Single-Arg InheritAgent0001!");
+ }
+
+ // This agent does NOT have a double argument premain() method.
+}
+
+class InheritAgent0001Super {
+
+ // This agent does NOT have a single argument premain() method.
+
+ // This agent does NOT have a double argument premain() method.
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/InheritAgent0010.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6289149
+ * @summary test config (0,0,1,0): declared 2-arg in agent class
+ * @author Daniel D. Daugherty, Sun Microsystems
+ *
+ * @run shell ../MakeJAR3.sh InheritAgent0010
+ * @run main/othervm -javaagent:InheritAgent0010.jar DummyMain
+ */
+
+import java.lang.instrument.*;
+
+class InheritAgent0010 extends InheritAgent0010Super {
+
+ // This agent does NOT have a single argument premain() method.
+
+ //
+ // This agent has a double argument premain() method which
+ // is the one that should be called.
+ //
+ public static void premain (String agentArgs, Instrumentation instArg) {
+ System.out.println("Hello from Double-Arg InheritAgent0010!");
+ }
+}
+
+class InheritAgent0010Super {
+
+ // This agent does NOT have a single argument premain() method.
+
+ // This agent does NOT have a double argument premain() method.
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/InheritAgent0011.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6289149
+ * @summary test config (0,0,1,1): declared 2-arg and declared 1-arg in agent class
+ * @author Daniel D. Daugherty, Sun Microsystems
+ *
+ * @run shell ../MakeJAR3.sh InheritAgent0011
+ * @run main/othervm -javaagent:InheritAgent0011.jar DummyMain
+ */
+
+import java.lang.instrument.*;
+
+class InheritAgent0011 extends InheritAgent0011Super {
+
+ //
+ // This agent has a single argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs) {
+ System.out.println("Hello from Single-Arg InheritAgent0011!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+
+ //
+ // This agent has a double argument premain() method which
+ // is the one that should be called.
+ //
+ public static void premain (String agentArgs, Instrumentation instArg) {
+ System.out.println("Hello from Double-Arg InheritAgent0011!");
+ }
+}
+
+class InheritAgent0011Super {
+
+ // This agent does NOT have a single argument premain() method.
+
+ // This agent does NOT have a double argument premain() method.
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/InheritAgent0100.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6289149
+ * @summary test config (0,1,0,0): inherited 1-arg in agent class
+ * @author Daniel D. Daugherty, Sun Microsystems
+ *
+ * @run shell ../MakeJAR3.sh InheritAgent0100
+ * @run main/othervm -javaagent:InheritAgent0100.jar DummyMain
+ */
+
+import java.lang.instrument.*;
+
+class InheritAgent0100 extends InheritAgent0100Super {
+
+ // This agent does NOT have a single argument premain() method.
+
+ // This agent does NOT have a double argument premain() method.
+}
+
+class InheritAgent0100Super {
+
+ //
+ // This agent has a single argument premain() method which
+ // is the one that should be called.
+ //
+ public static void premain (String agentArgs) {
+ System.out.println("Hello from Single-Arg InheritAgent0100Super!");
+ }
+
+ // This agent does NOT have a double argument premain() method.
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/InheritAgent0101.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6289149
+ * @summary test config (0,1,0,1): inherited 1-arg and declared 1-arg in agent class
+ * @author Daniel D. Daugherty, Sun Microsystems
+ *
+ * @run shell ../MakeJAR3.sh InheritAgent0101
+ * @run main/othervm -javaagent:InheritAgent0101.jar DummyMain
+ */
+
+import java.lang.instrument.*;
+
+class InheritAgent0101 extends InheritAgent0101Super {
+
+ //
+ // This agent has a single argument premain() method which
+ // is the one that should be called.
+ //
+ public static void premain (String agentArgs) {
+ System.out.println("Hello from Single-Arg InheritAgent0101!");
+ }
+
+ // This agent does NOT have a double argument premain() method.
+}
+
+class InheritAgent0101Super {
+
+ //
+ // This agent has a single argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs) {
+ System.out.println("Hello from Single-Arg InheritAgent0101Super!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+
+ // This agent does NOT have a double argument premain() method.
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/InheritAgent0110.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6289149
+ * @summary test config (0,1,1,0): inherited 1-arg and declared 2-arg in agent class
+ * @author Daniel D. Daugherty, Sun Microsystems
+ *
+ * @run shell ../MakeJAR3.sh InheritAgent0110
+ * @run main/othervm -javaagent:InheritAgent0110.jar DummyMain
+ */
+
+import java.lang.instrument.*;
+
+class InheritAgent0110 extends InheritAgent0110Super {
+
+ // This agent does NOT have a one argument premain() method.
+
+ //
+ // This agent has a double argument premain() method which
+ // is the one that should be called.
+ //
+ public static void premain (String agentArgs, Instrumentation instArg) {
+ System.out.println("Hello from Double-Arg InheritAgent0110!");
+ }
+}
+
+class InheritAgent0110Super {
+
+ //
+ // This agent has a single argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs) {
+ System.out.println("Hello from Single-Arg InheritAgent0110Super!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+
+ // This agent does NOT have a double argument premain() method.
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/InheritAgent0111.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6289149
+ * @summary test config (0,1,1,1): inherited 1-arg, declared 2-arg and declared 1-arg in agent class
+ * @author Daniel D. Daugherty, Sun Microsystems
+ *
+ * @run shell ../MakeJAR3.sh InheritAgent0111
+ * @run main/othervm -javaagent:InheritAgent0111.jar DummyMain
+ */
+
+import java.lang.instrument.*;
+
+class InheritAgent0111 extends InheritAgent0111Super {
+
+ //
+ // This agent has a single argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs) {
+ System.out.println("Hello from Single-Arg InheritAgent0111!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+
+ //
+ // This agent has a double argument premain() method which
+ // is the one that should be called.
+ //
+ public static void premain (String agentArgs, Instrumentation instArg) {
+ System.out.println("Hello from Double-Arg InheritAgent0111!");
+ }
+
+}
+
+class InheritAgent0111Super {
+
+ //
+ // This agent has a single argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs) {
+ System.out.println("Hello from Single-Arg InheritAgent0111Super!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+
+ // This agent does NOT have a double argument premain() method.
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/InheritAgent1000.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6289149
+ * @summary test config (1,0,0,0): inherited 2-arg in agent class
+ * @author Daniel D. Daugherty, Sun Microsystems
+ *
+ * @run shell ../MakeJAR3.sh InheritAgent1000
+ * @run main/othervm -javaagent:InheritAgent1000.jar DummyMain
+ */
+
+import java.lang.instrument.*;
+
+class InheritAgent1000 extends InheritAgent1000Super {
+
+ // This agent does NOT have a single argument premain() method.
+
+ // This agent does NOT have a double argument premain() method.
+}
+
+class InheritAgent1000Super {
+
+ // This agent does NOT have a single argument premain() method.
+
+ //
+ // This agent has a double argument premain() method which
+ // is the one that should be called.
+ //
+ public static void premain (String agentArgs, Instrumentation instArg) {
+ System.out.println("Hello from Double-Arg InheritAgent1000Super!");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/InheritAgent1001.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6289149
+ * @summary test config (1,0,0,1): inherited 2-arg, and declared 1-arg in agent class
+ * @author Daniel D. Daugherty, Sun Microsystems
+ *
+ * @run shell ../MakeJAR3.sh InheritAgent1001
+ * @run main/othervm -javaagent:InheritAgent1001.jar DummyMain
+ */
+
+import java.lang.instrument.*;
+
+class InheritAgent1001 extends InheritAgent1001Super {
+
+ //
+ // This agent has a single argument premain() method which
+ // is the one that should be called.
+ //
+ public static void premain (String agentArgs) {
+ System.out.println("Hello from Single-Arg InheritAgent1001!");
+ }
+
+ // This agent does NOT have a double argument premain() method.
+}
+
+class InheritAgent1001Super {
+
+ // This agent does NOT have a single argument premain() method.
+
+ //
+ // This agent has a double argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs, Instrumentation instArg) {
+ System.out.println("Hello from Double-Arg InheritAgent1001Super!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/InheritAgent1010.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6289149
+ * @summary test config (1,0,1,0): inherited 2-arg, and declared 2-arg in agent class
+ * @author Daniel D. Daugherty, Sun Microsystems
+ *
+ * @run shell ../MakeJAR3.sh InheritAgent1010
+ * @run main/othervm -javaagent:InheritAgent1010.jar DummyMain
+ */
+
+import java.lang.instrument.*;
+
+class InheritAgent1010 extends InheritAgent1010Super {
+
+ // This agent does NOT have a single argument premain() method.
+
+ //
+ // This agent has a double argument premain() method which
+ // is the one that should be called.
+ //
+ public static void premain (String agentArgs, Instrumentation instArg) {
+ System.out.println("Hello from Double-Arg InheritAgent1010!");
+ }
+}
+
+class InheritAgent1010Super {
+
+ // This agent does NOT have a single argument premain() method.
+
+ //
+ // This agent has a double argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs, Instrumentation instArg) {
+ System.out.println("Hello from Double-Arg InheritAgent1010Super!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/InheritAgent1011.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6289149
+ * @summary test config (1,0,1,1): inherited 2-arg, declared 2-arg and declared 1-arg in agent class
+ * @author Daniel D. Daugherty, Sun Microsystems
+ *
+ * @run shell ../MakeJAR3.sh InheritAgent1011
+ * @run main/othervm -javaagent:InheritAgent1011.jar DummyMain
+ */
+
+import java.lang.instrument.*;
+
+class InheritAgent1011 extends InheritAgent1011Super {
+
+ //
+ // This agent has a single argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs) {
+ System.out.println("Hello from Single-Arg InheritAgent1011!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+
+ //
+ // This agent has a double argument premain() method which
+ // is the one that should be called.
+ //
+ public static void premain (String agentArgs, Instrumentation instArg) {
+ System.out.println("Hello from Double-Arg InheritAgent1011!");
+ }
+}
+
+class InheritAgent1011Super {
+
+ // This agent does NOT have a single argument premain() method.
+
+ //
+ // This agent has a double argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs, Instrumentation instArg) {
+ System.out.println("Hello from Double-Arg InheritAgent1011Super!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/InheritAgent1100.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6289149
+ * @summary test config (1,1,0,0): inherited 2-arg and inherited 1-arg in agent class
+ * @author Daniel D. Daugherty, Sun Microsystems
+ *
+ * @run shell ../MakeJAR3.sh InheritAgent1100
+ * @run main/othervm -javaagent:InheritAgent1100.jar DummyMain
+ */
+
+import java.lang.instrument.*;
+
+class InheritAgent1100 extends InheritAgent1100Super {
+
+ // This agent does NOT have a single argument premain() method.
+
+ // This agent does NOT have a double argument premain() method.
+}
+
+class InheritAgent1100Super {
+
+ //
+ // This agent has a single argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs) {
+ System.out.println("Hello from Single-Arg InheritAgent1100Super!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+
+ //
+ // This agent has a double argument premain() method which
+ // is the one that should be called.
+ //
+ public static void premain (String agentArgs, Instrumentation instArg) {
+ System.out.println("Hello from Double-Arg InheritAgent1100Super!");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/InheritAgent1101.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6289149
+ * @summary test config (1,1,0,1): inherited 2-arg, inherited 1-arg, and declared 1-arg in agent class
+ * @author Daniel D. Daugherty, Sun Microsystems
+ *
+ * @run shell ../MakeJAR3.sh InheritAgent1101
+ * @run main/othervm -javaagent:InheritAgent1101.jar DummyMain
+ */
+
+import java.lang.instrument.*;
+
+class InheritAgent1101 extends InheritAgent1101Super {
+
+ //
+ // This agent has a single argument premain() method which
+ // is the one that should be called.
+ //
+ public static void premain (String agentArgs) {
+ System.out.println("Hello from Single-Arg InheritAgent1101!");
+ }
+
+ // This agent does NOT have a double argument premain() method.
+}
+
+class InheritAgent1101Super {
+
+ //
+ // This agent has a single argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs) {
+ System.out.println("Hello from Single-Arg InheritAgent1101Super!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+
+ //
+ // This agent has a double argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs, Instrumentation instArg) {
+ System.out.println("Hello from Double-Arg InheritAgent1101Super!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/InheritAgent1110.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6289149
+ * @summary test config (1,1,1,0): inherited 2-arg, inherited 1-arg, and declared 2-arg in agent class
+ * @author Daniel D. Daugherty, Sun Microsystems
+ *
+ * @run shell ../MakeJAR3.sh InheritAgent1110
+ * @run main/othervm -javaagent:InheritAgent1110.jar DummyMain
+ */
+
+import java.lang.instrument.*;
+
+class InheritAgent1110 extends InheritAgent1110Super {
+
+ // This agent does NOT have a single argument premain() method.
+
+ //
+ // This agent has a double argument premain() method which
+ // is the one that should be called.
+ //
+ public static void premain (String agentArgs, Instrumentation instArg) {
+ System.out.println("Hello from Double-Arg InheritAgent1110!");
+ }
+}
+
+class InheritAgent1110Super {
+
+ //
+ // This agent has a single argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs) {
+ System.out.println("Hello from Single-Arg InheritAgent1110Super!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+
+ //
+ // This agent has a double argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs, Instrumentation instArg) {
+ System.out.println("Hello from Double-Arg InheritAgent1110Super!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/InheritAgent1111.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6289149
+ * @summary test config (1,1,1,1): inherited 2-arg, inherited 1-arg, declared 2-arg and declared 1-arg in agent class
+ * @author Daniel D. Daugherty, Sun Microsystems
+ *
+ * @run shell ../MakeJAR3.sh InheritAgent1111
+ * @run main/othervm -javaagent:InheritAgent1111.jar DummyMain
+ */
+
+import java.lang.instrument.*;
+
+class InheritAgent1111 extends InheritAgent1111Super {
+
+ //
+ // This agent has a single argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs) {
+ System.out.println("Hello from Single-Arg InheritAgent1111!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+
+ //
+ // This agent has a double argument premain() method which
+ // is the one that should be called.
+ //
+ public static void premain (String agentArgs, Instrumentation instArg) {
+ System.out.println("Hello from Double-Arg InheritAgent1111!");
+ }
+}
+
+class InheritAgent1111Super {
+
+ //
+ // This agent has a single argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs) {
+ System.out.println("Hello from Single-Arg InheritAgent1111Super!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+
+ //
+ // This agent has a double argument premain() method which
+ // is NOT the one that should be called.
+ //
+ public static void premain (String agentArgs, Instrumentation instArg) {
+ System.out.println("Hello from Double-Arg InheritAgent1111Super!");
+ throw new Error("ERROR: THIS AGENT SHOULD NOT HAVE BEEN CALLED.");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/NoPremainAgent.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.lang.instrument.*;
+
+class NoPremainAgent {
+
+ // This agent is missing the premain() function.
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/NoPremainAgent.sh Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,68 @@
+#
+# Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 6289149
+# @summary test when the agent's class is missing the premain() function.
+# @author Daniel D. Daugherty, Sun Microsystems
+#
+# @run build DummyMain
+# @run shell ../MakeJAR3.sh NoPremainAgent
+# @run shell NoPremainAgent.sh
+#
+
+if [ "${TESTJAVA}" = "" ]
+then
+ echo "TESTJAVA not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTSRC}" = "" ]
+then
+ echo "TESTSRC not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTCLASSES}" = "" ]
+then
+ echo "TESTCLASSES not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+JAVAC="${TESTJAVA}"/bin/javac
+JAVA="${TESTJAVA}"/bin/java
+
+"${JAVA}" ${TESTVMOPTS} -javaagent:NoPremainAgent.jar \
+ -classpath "${TESTCLASSES}" DummyMain > output.log 2>&1
+cat output.log
+
+MESG="java.lang.NoSuchMethodException"
+grep "$MESG" output.log
+result=$?
+if [ "$result" = 0 ]; then
+ echo "PASS: found '$MESG' in the test output"
+else
+ echo "FAIL: did NOT find '$MESG' in the test output"
+fi
+
+exit $result
--- a/jdk/test/java/lang/instrument/PremainClass/PremainClassTest.sh Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/lang/instrument/PremainClass/PremainClassTest.sh Tue Apr 15 17:48:22 2008 -0700
@@ -49,7 +49,7 @@
"$JAVAC" -d "${TESTCLASSES}" "${TESTSRC}"/DummyMain.java
-"${JAVA}" -javaagent:"${TESTSRC}"/Agent.jar -classpath "${TESTCLASSES}" DummyMain
+"${JAVA}" ${TESTVMOPTS} -javaagent:"${TESTSRC}"/Agent.jar -classpath "${TESTCLASSES}" DummyMain
result=$?
exit $result
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/ZeroArgPremainAgent.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.lang.instrument.*;
+
+class ZeroArgPremainAgent {
+
+ // This agent has a zero arg premain() function.
+ public static void premain () {
+ System.out.println("Hello from ZeroArgInheritAgent!");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/PremainClass/ZeroArgPremainAgent.sh Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,68 @@
+#
+# Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 6289149
+# @summary test when the agent's class has a zero arg premain() function.
+# @author Daniel D. Daugherty, Sun Microsystems
+#
+# @run build DummyMain
+# @run shell ../MakeJAR3.sh ZeroArgPremainAgent
+# @run shell ZeroArgPremainAgent.sh
+#
+
+if [ "${TESTJAVA}" = "" ]
+then
+ echo "TESTJAVA not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTSRC}" = "" ]
+then
+ echo "TESTSRC not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTCLASSES}" = "" ]
+then
+ echo "TESTCLASSES not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+JAVAC="${TESTJAVA}"/bin/javac
+JAVA="${TESTJAVA}"/bin/java
+
+"${JAVA}" ${TESTVMOPTS} -javaagent:ZeroArgPremainAgent.jar \
+ -classpath "${TESTCLASSES}" DummyMain > output.log 2>&1
+cat output.log
+
+MESG="java.lang.NoSuchMethodException"
+grep "$MESG" output.log
+result=$?
+if [ "$result" = 0 ]; then
+ echo "PASS: found '$MESG' in the test output"
+else
+ echo "FAIL: did NOT find '$MESG' in the test output"
+fi
+
+exit $result
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/RedefineClassWithNativeMethod.sh Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,81 @@
+#
+# Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 5003341 4917140 6545149
+# @summary Redefine a class with a native method.
+# @author Daniel D. Daugherty as modified from the test submitted by clovis@par.univie.ac.at
+#
+# @run shell MakeJAR3.sh RedefineClassWithNativeMethodAgent 'Can-Redefine-Classes: true'
+# @run build RedefineClassWithNativeMethodApp
+# @run shell RedefineClassWithNativeMethod.sh
+#
+
+if [ "${TESTJAVA}" = "" ]
+then
+ echo "TESTJAVA not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTSRC}" = "" ]
+then
+ echo "TESTSRC not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTCLASSES}" = "" ]
+then
+ echo "TESTCLASSES not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+JAVAC="${TESTJAVA}"/bin/javac
+JAVA="${TESTJAVA}"/bin/java
+
+"${JAVA}" ${TESTVMOPTS} \
+ -javaagent:RedefineClassWithNativeMethodAgent.jar=java/lang/Thread.class \
+ -classpath "${TESTCLASSES}" RedefineClassWithNativeMethodApp \
+ > output.log 2>&1
+result=$?
+
+cat output.log
+
+if [ "$result" = 0 ]; then
+ echo "PASS: RedefineClassWithNativeMethodApp exited with status of 0."
+else
+ echo "FAIL: RedefineClassWithNativeMethodApp exited with status of $result"
+ exit "$result"
+fi
+
+MESG="Exception"
+grep "$MESG" output.log
+result=$?
+if [ "$result" = 0 ]; then
+ echo "FAIL: found '$MESG' in the test output"
+ result=1
+else
+ echo "PASS: did NOT find '$MESG' in the test output"
+ result=0
+fi
+
+exit $result
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/RedefineClassWithNativeMethodAgent.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.lang.instrument.*;
+import java.net.*;
+import java.util.*;
+import java.io.*;
+
+public class RedefineClassWithNativeMethodAgent {
+ static Class clz;
+
+ // just read the original class and redefine it via a Timer
+ public static void premain(String agentArgs, final Instrumentation inst) throws Exception {
+ String s = agentArgs.substring(0, agentArgs.indexOf(".class"));
+ clz = Class.forName(s.replace('/', '.'));
+ ClassLoader loader =
+ RedefineClassWithNativeMethodAgent.class.getClassLoader();
+ URL classURL = loader.getResource(agentArgs);
+ if (classURL == null) {
+ throw new Exception("Cannot find class: " + agentArgs);
+ }
+
+ int redefineLength;
+ InputStream redefineStream;
+
+ System.out.println("Reading test class from " + classURL);
+ if (classURL.getProtocol().equals("file")) {
+ File f = new File(classURL.getFile());
+ redefineStream = new FileInputStream(f);
+ redefineLength = (int) f.length();
+ } else {
+ URLConnection conn = classURL.openConnection();
+ redefineStream = conn.getInputStream();
+ redefineLength = conn.getContentLength();
+ }
+
+ final byte[] buffer = new byte[redefineLength];
+ new BufferedInputStream(redefineStream).read(buffer);
+ new Timer(true).schedule(new TimerTask() {
+ public void run() {
+ try {
+ System.out.println("Instrumenting");
+ ClassDefinition cld = new ClassDefinition(clz, buffer);
+ inst.redefineClasses(new ClassDefinition[] { cld });
+ }
+ catch (Exception e) { e.printStackTrace(); }
+ }
+ }, 500);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/RedefineClassWithNativeMethodApp.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+public class RedefineClassWithNativeMethodApp {
+ public static void main(String[] args) throws Exception {
+ try {
+ // give the agent a chance to redefine the target class
+ Thread.sleep(2000);
+ } catch (InterruptedException ie) {
+ }
+
+ System.out.println("Creating instance of " +
+ RedefineClassWithNativeMethodAgent.clz);
+ RedefineClassWithNativeMethodAgent.clz.newInstance();
+
+ System.exit(0);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/RedefineMethodAddInvoke.sh Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,82 @@
+#
+# Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 6667089
+# @summary Reflexive invocation of newly added methods broken.
+# @author Daniel D. Daugherty
+#
+# @run shell MakeJAR3.sh RedefineMethodAddInvokeAgent 'Can-Redefine-Classes: true'
+# @run build RedefineMethodAddInvokeApp
+# @run shell RedefineMethodAddInvoke.sh
+#
+
+if [ "${TESTJAVA}" = "" ]
+then
+ echo "TESTJAVA not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTSRC}" = "" ]
+then
+ echo "TESTSRC not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTCLASSES}" = "" ]
+then
+ echo "TESTCLASSES not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+JAVAC="${TESTJAVA}"/bin/javac
+JAVA="${TESTJAVA}"/bin/java
+
+cp "${TESTSRC}"/RedefineMethodAddInvokeTarget_1.java \
+ RedefineMethodAddInvokeTarget.java
+"${JAVAC}" -d . RedefineMethodAddInvokeTarget.java
+mv RedefineMethodAddInvokeTarget.java RedefineMethodAddInvokeTarget_1.java
+mv RedefineMethodAddInvokeTarget.class RedefineMethodAddInvokeTarget_1.class
+
+cp "${TESTSRC}"/RedefineMethodAddInvokeTarget_2.java \
+ RedefineMethodAddInvokeTarget.java
+"${JAVAC}" -d . RedefineMethodAddInvokeTarget.java
+mv RedefineMethodAddInvokeTarget.java RedefineMethodAddInvokeTarget_2.java
+mv RedefineMethodAddInvokeTarget.class RedefineMethodAddInvokeTarget_2.class
+
+"${JAVA}" ${TESTVMOPTS} -javaagent:RedefineMethodAddInvokeAgent.jar \
+ -classpath "${TESTCLASSES}" RedefineMethodAddInvokeApp > output.log 2>&1
+cat output.log
+
+MESG="Exception"
+grep "$MESG" output.log
+result=$?
+if [ "$result" = 0 ]; then
+ echo "FAIL: found '$MESG' in the test output"
+ result=1
+else
+ echo "PASS: did NOT find '$MESG' in the test output"
+ result=0
+fi
+
+exit $result
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/RedefineMethodAddInvokeAgent.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.lang.instrument.Instrumentation;
+
+public class RedefineMethodAddInvokeAgent {
+ private static Instrumentation instrumentation;
+
+ private RedefineMethodAddInvokeAgent() {
+ }
+
+ public static void premain(String agentArgs, Instrumentation inst) {
+ System.out.println("Hello from RedefineMethodAddInvokeAgent!");
+ System.out.println("isRedefineClassesSupported()=" +
+ inst.isRedefineClassesSupported());
+
+ instrumentation = inst;
+ }
+
+ public static Instrumentation getInstrumentation() {
+ return instrumentation;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/RedefineMethodAddInvokeApp.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.io.*;
+import java.lang.instrument.*;
+
+public class RedefineMethodAddInvokeApp {
+ public static void main(String args[]) throws Exception {
+ System.out.println("Hello from RedefineMethodAddInvokeApp!");
+
+ new RedefineMethodAddInvokeApp().doTest();
+
+ System.exit(0);
+ }
+
+ private void doTest() throws Exception {
+ RedefineMethodAddInvokeTarget target =
+ new RedefineMethodAddInvokeTarget();
+
+ System.out.println("RedefineMethodAddInvokeApp: invoking myMethod()");
+ target.test(0); // invoke the original myMethod()
+
+ // add myMethod1()
+ do_redefine(1);
+
+ System.out.println("RedefineMethodAddInvokeApp: invoking myMethod1()");
+ target.test(1); // invoke myMethod1()
+
+ // add myMethod2()
+ do_redefine(2);
+
+ System.out.println("RedefineMethodAddInvokeApp: invoking myMethod2()");
+ target.test(2); // invoke myMethod2()
+ }
+
+ private static void do_redefine(int counter) throws Exception {
+ File f = new File("RedefineMethodAddInvokeTarget_" + counter +
+ ".class");
+ System.out.println("Reading test class from " + f);
+ InputStream redefineStream = new FileInputStream(f);
+
+ byte[] redefineBuffer = NamedBuffer.loadBufferFromStream(redefineStream);
+
+ ClassDefinition redefineParamBlock = new ClassDefinition(
+ RedefineMethodAddInvokeTarget.class, redefineBuffer);
+
+ RedefineMethodAddInvokeAgent.getInstrumentation().redefineClasses(
+ new ClassDefinition[] {redefineParamBlock});
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/RedefineMethodAddInvokeTarget.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.lang.reflect.Method;
+
+public class RedefineMethodAddInvokeTarget {
+ public void test(int counter) throws Exception {
+ Method method = getClass().getDeclaredMethod("myMethod" +
+ (counter == 0 ? "" : counter));
+ method.setAccessible(true);
+ method.invoke(this);
+ }
+
+ public void myMethod() {
+ System.out.println("Hello from the original myMethod()!");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/RedefineMethodAddInvokeTarget_1.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.lang.reflect.Method;
+
+public class RedefineMethodAddInvokeTarget {
+ public void test(int counter) throws Exception {
+ Method method = getClass().getDeclaredMethod("myMethod" +
+ (counter == 0 ? "" : counter));
+ method.setAccessible(true);
+ method.invoke(this);
+ }
+
+ public void myMethod() {
+ System.out.println("Hello from the non-EMCP myMethod()!");
+ }
+
+ private final void myMethod1() {
+ System.out.println("Hello from myMethod1()!");
+ System.out.println("Calling myMethod() from myMethod1():");
+ myMethod();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/RedefineMethodAddInvokeTarget_2.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.lang.reflect.Method;
+
+public class RedefineMethodAddInvokeTarget {
+ public void test(int counter) throws Exception {
+ Method method = getClass().getDeclaredMethod("myMethod" +
+ (counter == 0 ? "" : counter));
+ method.setAccessible(true);
+ method.invoke(this);
+ }
+
+ public void myMethod() {
+ System.out.println("Hello from the non-EMCP again myMethod()!");
+ }
+
+ private final void myMethod1() {
+ System.out.println("Hello from myMethod1()!");
+ System.out.println("Calling myMethod() from myMethod1():");
+ myMethod();
+ }
+
+ private final void myMethod2() {
+ System.out.println("Hello from myMethod2()!");
+ System.out.println("Calling myMethod1() from myMethod2():");
+ myMethod1();
+ }
+}
--- a/jdk/test/java/lang/instrument/RetransformAgent.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/lang/instrument/RetransformAgent.java Tue Apr 15 17:48:22 2008 -0700
@@ -27,7 +27,7 @@
* @summary test retransformClasses
* @author Robert Field, Sun Microsystems
*
- * @run shell MakeJAR2.sh RetransformAgent RetransformApp 'Can-Retransform-Classes: true'
+ * @run shell/timeout=240 MakeJAR2.sh RetransformAgent RetransformApp 'Can-Retransform-Classes: true'
* @run main/othervm -javaagent:RetransformAgent.jar RetransformApp
*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/StressGetObjectSizeApp.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.lang.instrument.Instrumentation;
+
+public class StressGetObjectSizeApp
+ extends ASimpleInstrumentationTestCase
+{
+
+ /**
+ * Constructor for StressGetObjectSizeApp.
+ * @param name
+ */
+ public StressGetObjectSizeApp(String name)
+ {
+ super(name);
+ }
+
+ public static void
+ main (String[] args)
+ throws Throwable {
+ ATestCaseScaffold test = new StressGetObjectSizeApp(args[0]);
+ test.runTest();
+ }
+
+ protected final void
+ doRunTest()
+ throws Throwable {
+ stressGetObjectSize();
+ }
+
+ public void stressGetObjectSize() {
+ System.out.println("main: an object size=" +
+ fInst.getObjectSize(new Object()));
+
+ RoundAndRound[] threads = new RoundAndRound[10];
+ for (int i = 0; i < threads.length; ++i) {
+ threads[i] = new RoundAndRound(fInst);
+ threads[i].start();
+ }
+ try {
+ Thread.sleep(500); // let all threads get going in their loops
+ } catch (InterruptedException ie) {
+ }
+ System.out.println("stressGetObjectSize: returning");
+ return;
+ }
+
+ private static class RoundAndRound extends Thread {
+ private final Instrumentation inst;
+ private final Object anObject;
+
+ public RoundAndRound(Instrumentation inst) {
+ this.inst = inst;
+ this.anObject = new Object();
+ setDaemon(true);
+ }
+
+ public void run() {
+ long sum = 0;
+ while (true) {
+ sum += inst.getObjectSize(anObject);
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/StressGetObjectSizeTest.sh Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,70 @@
+#
+# Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 6572160
+# @summary stress getObjectSize() API
+# @author Daniel D. Daugherty as modified from the code of fischman@google.com
+#
+# @run build StressGetObjectSizeApp
+# @run shell MakeJAR.sh basicAgent
+# @run shell StressGetObjectSizeTest.sh
+#
+
+if [ "${TESTJAVA}" = "" ]
+then
+ echo "TESTJAVA not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTSRC}" = "" ]
+then
+ echo "TESTSRC not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTCLASSES}" = "" ]
+then
+ echo "TESTCLASSES not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+JAVA="${TESTJAVA}"/bin/java
+
+"${JAVA}" ${TESTVMOPTS} -javaagent:basicAgent.jar \
+ -classpath "${TESTCLASSES}" StressGetObjectSizeApp StressGetObjectSizeApp \
+ > output.log 2>&1
+cat output.log
+
+MESG="ASSERTION FAILED"
+grep "$MESG" output.log
+result=$?
+if [ "$result" = 0 ]; then
+ echo "FAIL: found '$MESG' in the test output"
+ result=1
+else
+ echo "PASS: did NOT find '$MESG' in the test output"
+ result=0
+fi
+
+exit $result
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/TestClass1.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * Test Java Program
+ *
+ * @author Daryl Puryear
+ * @copyright 1999-2004 Wily Technology, Inc. All rights reserved.
+ */
+public class TestClass1
+{
+ public
+ TestClass1()
+ {
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/TestClass2.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * Test Java Program
+ *
+ * @author Daryl Puryear
+ * @copyright 1999-2004 Wily Technology, Inc. All rights reserved.
+ */
+public class TestClass2
+{
+ public
+ TestClass2()
+ {
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/TestClass3.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * Test Java Program
+ *
+ * @author Daryl Puryear
+ * @copyright 1999-2004 Wily Technology, Inc. All rights reserved.
+ */
+public class TestClass3
+{
+ public
+ TestClass3()
+ {
+ }
+}
--- a/jdk/test/java/lang/instrument/TransformerManagementThreadAddTests.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/lang/instrument/TransformerManagementThreadAddTests.java Tue Apr 15 17:48:22 2008 -0700
@@ -79,6 +79,12 @@
protected static final int TOTAL_THREADS = MAX_TRANS - MIN_TRANS + 1;
private byte[] fDummyClassBytes;
+ // fCheckedTransformers is a Vector that is used to verify
+ // that the transform() function is called in the same
+ // order in which the transformers were added to the
+ // TransformerManager. The test currently verifies that all
+ // transformers for a specific worker thread are in
+ // increasing order by index value.
private Vector fCheckedTransformers;
private Instrumentation fInstrumentation;
private int fFinished;
@@ -131,9 +137,16 @@
threads[i].start();
}
- while (!exec.fDone)
+ // Effective Java - Item 48: Synchronize access to shared mutable data
+ // Don't use a direct field getter.
+ while (!exec.isDone())
{
- Thread.currentThread().yield();
+ // Effective Java - Item 51: Don't depend on the thread scheduler
+ // Use sleep() instead of yield().
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException ie) {
+ }
}
assertTrue(finalCheck());
@@ -169,13 +182,17 @@
this.fExec = exec;
}
+ // Effective Java - Item 48: Synchronize access to shared mutable data
+ // Document a synchronized setter.
protected synchronized void
threadFinished(Thread t)
{
fFinished++;
}
- protected boolean
+ // Effective Java - Item 48: Synchronize access to shared mutable data
+ // Provide synchronized getter.
+ protected synchronized boolean
threadsDone()
{
return fFinished == TOTAL_THREADS;
@@ -188,7 +205,9 @@
protected boolean
testCompleted()
{
- return getExecThread().fDone;
+ // Effective Java - Item 48: Synchronize access to shared mutable data
+ // Don't use direct field getter.
+ return getExecThread().isDone();
}
/**
@@ -264,11 +283,19 @@
private void
executeTransform()
{
- fCheckedTransformers.clear();
-
try
{
ClassDefinition cd = new ClassDefinition(DummyClass.class, fDummyClassBytes);
+
+ // When the ClassDefinition above is created for the first
+ // time and every time redefineClasses() below is called,
+ // the transform() function is called for each registered
+ // transformer. We only want one complete set of calls to
+ // be logged in the fCheckedTransformers Vector so we clear
+ // any calls logged for ClassDefinition above and just use
+ // the ones logged for redefineClasses() below.
+ fCheckedTransformers.clear();
+
getInstrumentation().redefineClasses(new ClassDefinition[]{ cd });
}
catch (ClassNotFoundException e)
@@ -325,6 +352,18 @@
{
private boolean fDone = false;
+ // Effective Java - Item 48: Synchronize access to shared mutable data
+ // Provide a synchronized getter.
+ private synchronized boolean isDone() {
+ return fDone;
+ }
+
+ // Effective Java - Item 48: Synchronize access to shared mutable data
+ // Provide a synchronized setter.
+ private synchronized void setIsDone() {
+ fDone = true;
+ }
+
public void
run()
{
@@ -335,7 +374,9 @@
// Do a final check for good measure
executeTransform();
- fDone = true;
+ // Effective Java - Item 48: Synchronize access to shared mutable data
+ // Don't use direct field setter.
+ setIsDone();
}
}
--- a/jdk/test/java/lang/instrument/TransformerManagementThreadRemoveTests.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/lang/instrument/TransformerManagementThreadRemoveTests.java Tue Apr 15 17:48:22 2008 -0700
@@ -27,10 +27,9 @@
* @summary multi-thread test to exercise sync and contention for removes to transformer registry
* @author Gabriel Adauto, Wily Technology
*
- * @ignore Disabled until race condition which hangs test can be fixed.
* @run build TransformerManagementThreadRemoveTests
- * @run shell MakeJAR.sh basicAgent
- * @run main/othervm -javaagent:basicAgent.jar TransformerManagementThreadRemoveTests TransformerManagementThreadRemoveTests
+ * @run shell MakeJAR.sh redefineAgent
+ * @run main/othervm -javaagent:redefineAgent.jar TransformerManagementThreadRemoveTests TransformerManagementThreadRemoveTests
*/
import java.util.*;
@@ -87,7 +86,12 @@
while (!testCompleted())
{
- Thread.currentThread().yield();
+ // Effective Java - Item 51: Don't depend on the thread scheduler
+ // Use sleep() instead of yield().
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException ie) {
+ }
}
assertTrue(finalCheck());
--- a/jdk/test/java/lang/instrument/appendToClassLoaderSearch/CircularityErrorTest.sh Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/lang/instrument/appendToClassLoaderSearch/CircularityErrorTest.sh Tue Apr 15 17:48:22 2008 -0700
@@ -26,14 +26,14 @@
# @summary Unit tests for appendToBootstrapClassLoaderSearch and
# appendToSystemClasLoaderSearch methods.
#
-# @run shell CircularityErrorTest.sh
+# @run shell/timeout=240 CircularityErrorTest.sh
if [ "${TESTSRC}" = "" ]
then
echo "TESTSRC not set. Test cannot execute. Failed."
exit 1
fi
-
+
. ${TESTSRC}/CommonSetup.sh
# Setup to create circularity condition
@@ -71,5 +71,5 @@
-C "${TESTCLASSES}" CircularityErrorTest.class
# Finally we run the test
-(cd "${TESTCLASSES}";
- $JAVA -javaagent:CircularityErrorTest.jar CircularityErrorTest)
+(cd "${TESTCLASSES}";
+ $JAVA ${TESTVMOPTS} -javaagent:CircularityErrorTest.jar CircularityErrorTest)
--- a/jdk/test/java/lang/instrument/appendToClassLoaderSearch/ClassUnloadTest.sh Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/lang/instrument/appendToClassLoaderSearch/ClassUnloadTest.sh Tue Apr 15 17:48:22 2008 -0700
@@ -34,11 +34,11 @@
echo "TESTSRC not set. Test cannot execute. Failed."
exit 1
fi
-
+
. ${TESTSRC}/CommonSetup.sh
# Create Foo and Bar
-# Foo has a reference to Bar but we deleted Bar so that
+# Foo has a reference to Bar but we deleted Bar so that
# a NoClassDefFoundError will be thrown when Foo tries to
# resolve the reference to Bar
@@ -53,11 +53,11 @@
public class Foo {
public static boolean doSomething() {
try {
- Bar b = new Bar();
- return true;
- } catch (NoClassDefFoundError x) {
- return false;
- }
+ Bar b = new Bar();
+ return true;
+ } catch (NoClassDefFoundError x) {
+ return false;
+ }
}
}
EOF
@@ -79,5 +79,5 @@
# Finally we run the test
(cd "${TESTCLASSES}"; \
- $JAVA -Xverify:none -XX:+TraceClassUnloading -javaagent:ClassUnloadTest.jar \
- ClassUnloadTest "${OTHERDIR}" Bar.jar)
+ $JAVA ${TESTVMOPTS} -Xverify:none -XX:+TraceClassUnloading \
+ -javaagent:ClassUnloadTest.jar ClassUnloadTest "${OTHERDIR}" Bar.jar)
--- a/jdk/test/java/lang/instrument/appendToClassLoaderSearch/CommonSetup.sh Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/lang/instrument/appendToClassLoaderSearch/CommonSetup.sh Tue Apr 15 17:48:22 2008 -0700
@@ -24,7 +24,6 @@
#
-#%E
#
# Common setup for unit tests. Setups up the following variables:
#
@@ -66,7 +65,7 @@
echo "TESTSRC not set. Test cannot execute. Failed."
exit 1
fi
-
+
if [ "${TESTCLASSES}" = "" ]
then
echo "TESTCLASSES not set. Test cannot execute. Failed."
--- a/jdk/test/java/lang/instrument/appendToClassLoaderSearch/run_tests.sh Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/lang/instrument/appendToClassLoaderSearch/run_tests.sh Tue Apr 15 17:48:22 2008 -0700
@@ -23,24 +23,24 @@
# have any questions.
#
-
+
# @test
# @bug 6173575 6388987
-# @summary Unit tests for appendToBootstrapClassLoaderSearch and
+# @summary Unit tests for appendToBootstrapClassLoaderSearch and
# appendToSystemClasLoaderSearch methods.
#
# @build Agent AgentSupport BootSupport BasicTest PrematureLoadTest DynamicTest
-# @run shell run_tests.sh
+# @run shell/timeout=240 run_tests.sh
if [ "${TESTSRC}" = "" ]
then
echo "TESTSRC not set. Test cannot execute. Failed."
exit 1
fi
-
+
. ${TESTSRC}/CommonSetup.sh
-
+
# Simple tests
echo "Creating jar files for simple tests..."
@@ -50,13 +50,13 @@
"$JAR" -cfm Agent.jar "${TESTSRC}"/manifest.mf Agent.class
"$JAR" -cf AgentSupport.jar AgentSupport.class
"$JAR" -cf BootSupport.jar BootSupport.class
-"$JAR" -cf SimpleTests.jar BasicTest.class PrematureLoadTest.class
+"$JAR" -cf SimpleTests.jar BasicTest.class PrematureLoadTest.class
failures=0
go() {
echo ''
- sh -xc "$JAVA -javaagent:Agent.jar -classpath SimpleTests.jar $1 $2 $3" 2>&1
+ sh -xc "$JAVA ${TESTVMOPTS} -javaagent:Agent.jar -classpath SimpleTests.jar $1 $2 $3" 2>&1
if [ $? != 0 ]; then failures=`expr $failures + 1`; fi
}
@@ -75,7 +75,7 @@
"${JAVAC}" -d tmp "${TESTSRC}"/Tracer.java
(cd tmp; "${JAR}" cf ../Tracer.jar org/tools/Tracer.class)
-# InstrumentedApplication is Application+instrmentation - don't copy as
+# InstrumentedApplication is Application+instrmentation - don't copy as
# we don't want the original file permission
cat "${TESTSRC}"/InstrumentedApplication.java > ./Application.java
@@ -85,11 +85,11 @@
cp "${TESTSRC}"/Application.java .
"${JAVAC}" -d . Application.java
-sh -xc "$JAVA -classpath . -javaagent:Agent.jar DynamicTest" 2>&1
+sh -xc "$JAVA ${TESTVMOPTS} -classpath . -javaagent:Agent.jar DynamicTest" 2>&1
if [ $? != 0 ]; then failures=`expr $failures + 1`; fi
# Repeat test with security manager
-sh -xc "$JAVA -classpath . -javaagent:Agent.jar -Djava.security.manager DynamicTest" 2>&1
+sh -xc "$JAVA ${TESTVMOPTS} -classpath . -javaagent:Agent.jar -Djava.security.manager DynamicTest" 2>&1
if [ $? != 0 ]; then failures=`expr $failures + 1`; fi
#
--- a/jdk/test/java/rmi/activation/Activatable/createPrivateActivable/CreatePrivateActivatable.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/Activatable/createPrivateActivable/CreatePrivateActivatable.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999-2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -49,116 +49,116 @@
public class CreatePrivateActivatable
{
private static class PrivateActivatable extends Activatable
- implements ActivateMe, Runnable
+ implements ActivateMe, Runnable
{
- private PrivateActivatable(ActivationID id, MarshalledObject obj)
- throws ActivationException, RemoteException
- {
- super(id, 0);
- }
+ private PrivateActivatable(ActivationID id, MarshalledObject obj)
+ throws ActivationException, RemoteException
+ {
+ super(id, 0);
+ }
- public void ping()
- {}
+ public void ping()
+ {}
- /**
- * Spawns a thread to deactivate the object.
- */
- public void shutdown() throws Exception
- {
- (new Thread(this, "CreatePrivateActivatable$PrivateActivatable")).start();
- }
+ /**
+ * Spawns a thread to deactivate the object.
+ */
+ public void shutdown() throws Exception
+ {
+ (new Thread(this, "CreatePrivateActivatable$PrivateActivatable")).start();
+ }
- /**
- * Thread to deactivate object. First attempts to make object
- * inactive (via the inactive method). If that fails (the
- * object may still have pending/executing calls), then
- * unexport the object forcibly.
- */
- public void run() {
- ActivationLibrary.deactivate(this, getID());
- }
+ /**
+ * Thread to deactivate object. First attempts to make object
+ * inactive (via the inactive method). If that fails (the
+ * object may still have pending/executing calls), then
+ * unexport the object forcibly.
+ */
+ public void run() {
+ ActivationLibrary.deactivate(this, getID());
+ }
}
-
+
public static void main(String[] args) {
- /*
- * The following line is required with the JDK 1.2 VM so that the
- * VM can exit gracefully when this test completes. Otherwise, the
- * conservative garbage collector will find a handle to the server
- * object on the native stack and not clear the weak reference to
- * it in the RMI runtime's object table.
- */
- Object dummy = new Object();
- RMID rmid = null;
- ActivateMe obj;
+ /*
+ * The following line is required with the JDK 1.2 VM so that the
+ * VM can exit gracefully when this test completes. Otherwise, the
+ * conservative garbage collector will find a handle to the server
+ * object on the native stack and not clear the weak reference to
+ * it in the RMI runtime's object table.
+ */
+ Object dummy = new Object();
+ RMID rmid = null;
+ ActivateMe obj;
- System.err.println("\nRegression test for bug 4164971\n");
- System.err.println("java.security.policy = " +
- System.getProperty("java.security.policy", "no policy"));
+ System.err.println("\nRegression test for bug 4164971\n");
+ System.err.println("java.security.policy = " +
+ System.getProperty("java.security.policy", "no policy"));
- CreatePrivateActivatable server;
- try {
- TestLibrary.suggestSecurityManager(TestParams.defaultSecurityManager);
+ CreatePrivateActivatable server;
+ try {
+ TestLibrary.suggestSecurityManager(TestParams.defaultSecurityManager);
+
+ // start an rmid.
+ RMID.removeLog();
+ rmid = RMID.createRMID();
+ rmid.start();
- // start an rmid.
- RMID.removeLog();
- rmid = RMID.createRMID();
- rmid.start();
-
- /* Cause activation groups to have a security policy that will
- * allow security managers to be downloaded and installed
- */
- Properties p = new Properties();
- // this test must always set policies/managers in its
- // activation groups
- p.put("java.security.policy",
- TestParams.defaultGroupPolicy);
- p.put("java.security.manager",
- TestParams.defaultSecurityManager);
-
- /*
- * Activate an object by registering its object
- * descriptor and invoking a method on the
- * stub returned from the register call.
- */
- ActivationGroupDesc groupDesc =
- new ActivationGroupDesc(p, null);
- ActivationSystem system = ActivationGroup.getSystem();
- ActivationGroupID groupID = system.registerGroup(groupDesc);
+ /* Cause activation groups to have a security policy that will
+ * allow security managers to be downloaded and installed
+ */
+ Properties p = new Properties();
+ // this test must always set policies/managers in its
+ // activation groups
+ p.put("java.security.policy",
+ TestParams.defaultGroupPolicy);
+ p.put("java.security.manager",
+ TestParams.defaultSecurityManager);
+
+ /*
+ * Activate an object by registering its object
+ * descriptor and invoking a method on the
+ * stub returned from the register call.
+ */
+ ActivationGroupDesc groupDesc =
+ new ActivationGroupDesc(p, null);
+ ActivationSystem system = ActivationGroup.getSystem();
+ ActivationGroupID groupID = system.registerGroup(groupDesc);
+
+ System.err.println("Creating descriptor");
+ ActivationDesc desc =
+ new ActivationDesc(groupID,
+ "CreatePrivateActivatable$PrivateActivatable",
+ null, null);
- System.err.println("Creating descriptor");
- ActivationDesc desc =
- new ActivationDesc(groupID,
- "CreatePrivateActivatable$PrivateActivatable",
- null, null);
-
- System.err.println("Registering descriptor");
- obj = (ActivateMe) Activatable.register(desc);
-
- /*
- * Loop a bunch of times to force activator to
- * spawn VMs (groups)
- */
- System.err.println("Activate object via method call");
- obj.ping();
-
- /*
- * Clean up object too.
- */
- System.err.println("Deactivate object via method call");
- obj.shutdown();
-
- System.err.println("\nsuccess: CreatePrivateActivatable test passed ");
-
- } catch (Exception e) {
- if (e instanceof java.security.PrivilegedActionException) {
- e = ((java.security.PrivilegedActionException)e).getException();
- }
- TestLibrary.bomb("\nfailure: unexpected exception " +
- e.getClass().getName(), e);
-
- } finally {
- ActivationLibrary.rmidCleanup(rmid);
- obj = null;
- }
+ System.err.println("Registering descriptor");
+ obj = (ActivateMe) Activatable.register(desc);
+
+ /*
+ * Loop a bunch of times to force activator to
+ * spawn VMs (groups)
+ */
+ System.err.println("Activate object via method call");
+ obj.ping();
+
+ /*
+ * Clean up object too.
+ */
+ System.err.println("Deactivate object via method call");
+ obj.shutdown();
+
+ System.err.println("\nsuccess: CreatePrivateActivatable test passed ");
+
+ } catch (Exception e) {
+ if (e instanceof java.security.PrivilegedActionException) {
+ e = ((java.security.PrivilegedActionException)e).getException();
+ }
+ TestLibrary.bomb("\nfailure: unexpected exception " +
+ e.getClass().getName(), e);
+
+ } finally {
+ ActivationLibrary.rmidCleanup(rmid);
+ obj = null;
+ }
}
}
--- a/jdk/test/java/rmi/activation/ActivateFailedException/activateFails/ActivateFails.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivateFailedException/activateFails/ActivateFails.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -24,10 +24,10 @@
/* @test
* @bug 4097135
* @summary Need a specific subtype of RemoteException for activation failure.
- * If activation fails to happen during a call to a remote object,
- * then the call should end in an ActivateFailedException. In this
- * test, the actual "activatable" remote object fails to activate
- * since its * "activation" constructor throws an exception.
+ * If activation fails to happen during a call to a remote object,
+ * then the call should end in an ActivateFailedException. In this
+ * test, the actual "activatable" remote object fails to activate
+ * since its * "activation" constructor throws an exception.
* @author Ann Wollrath
*
* @library ../../../testlibrary
@@ -46,128 +46,127 @@
import java.util.Properties;
public class ActivateFails
- extends Activatable
- implements ActivateMe
+ extends Activatable
+ implements ActivateMe
{
public ActivateFails(ActivationID id, MarshalledObject obj)
- throws ActivationException, RemoteException
+ throws ActivationException, RemoteException
{
- super(id, 0);
+ super(id, 0);
- boolean refuseToActivate = false;
- try {
- refuseToActivate = ((Boolean)obj.get()).booleanValue();
- } catch (Exception impossible) {
- }
-
- if (refuseToActivate)
- throw new RemoteException("object refuses to activate");
+ boolean refuseToActivate = false;
+ try {
+ refuseToActivate = ((Boolean)obj.get()).booleanValue();
+ } catch (Exception impossible) {
+ }
+
+ if (refuseToActivate)
+ throw new RemoteException("object refuses to activate");
}
public void ping()
{}
-
+
/**
* Spawns a thread to deactivate the object.
*/
public ShutdownThread shutdown() throws Exception
{
- ShutdownThread shutdownThread = new ShutdownThread(this, getID());
- shutdownThread.start();
- return(shutdownThread);
+ ShutdownThread shutdownThread = new ShutdownThread(this, getID());
+ shutdownThread.start();
+ return(shutdownThread);
}
-
- public static void main(String[] args)
+
+ public static void main(String[] args)
{
- RMID rmid = null;
- ActivateMe obj1, obj2;
- ShutdownThread shutdownThread;
-
- System.err.println("\nRegression test for bug 4097135\n");
- try {
- TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
+ RMID rmid = null;
+ ActivateMe obj1, obj2;
+ ShutdownThread shutdownThread;
+
+ System.err.println("\nRegression test for bug 4097135\n");
+ try {
+ TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
+
+ /*
+ * First run "rmid" and wait for it to start up.
+ */
+ RMID.removeLog();
+ rmid = RMID.createRMID();
+ rmid.start();
- /*
- * First run "rmid" and wait for it to start up.
- */
- RMID.removeLog();
- rmid = RMID.createRMID();
- rmid.start();
+ /* Cause activation groups to have a security policy that will
+ * allow security managers to be downloaded and installed
+ */
+ Properties p = new Properties();
+ // this test must always set policies/managers in its
+ // activation groups
+ p.put("java.security.policy",
+ TestParams.defaultGroupPolicy);
+ p.put("java.security.manager",
+ TestParams.defaultSecurityManager);
- /* Cause activation groups to have a security policy that will
- * allow security managers to be downloaded and installed
- */
- Properties p = new Properties();
- // this test must always set policies/managers in its
- // activation groups
- p.put("java.security.policy",
- TestParams.defaultGroupPolicy);
- p.put("java.security.manager",
- TestParams.defaultSecurityManager);
+ /*
+ * Create activation descriptor...
+ */
+ System.err.println("creating activation descriptor...");
+ ActivationGroupDesc groupDesc =
+ new ActivationGroupDesc(p, null);
+ ActivationGroupID groupID =
+ ActivationGroup.getSystem().registerGroup(groupDesc);
+
+ ActivationDesc desc1 =
+ new ActivationDesc(groupID, "ActivateFails",
+ null,
+ new MarshalledObject(new Boolean(true)));
- /*
- * Create activation descriptor...
- */
- System.err.println("creating activation descriptor...");
- ActivationGroupDesc groupDesc =
- new ActivationGroupDesc(p, null);
- ActivationGroupID groupID =
- ActivationGroup.getSystem().registerGroup(groupDesc);
-
- ActivationDesc desc1 =
- new ActivationDesc(groupID, "ActivateFails",
- null,
- new MarshalledObject(new Boolean(true)));
-
- ActivationDesc desc2 =
- new ActivationDesc(groupID, "ActivateFails",
- null,
- new MarshalledObject(new Boolean(false)));
- /*
- * Register activation descriptor and make a call on
- * the stub. Activation should fail with an
- * ActivateFailedException. If not, report an
- * error as a RuntimeException
- */
+ ActivationDesc desc2 =
+ new ActivationDesc(groupID, "ActivateFails",
+ null,
+ new MarshalledObject(new Boolean(false)));
+ /*
+ * Register activation descriptor and make a call on
+ * the stub. Activation should fail with an
+ * ActivateFailedException. If not, report an
+ * error as a RuntimeException
+ */
- System.err.println("registering activation descriptor...");
- obj1 = (ActivateMe)Activatable.register(desc1);
- obj2 = (ActivateMe)Activatable.register(desc2);
+ System.err.println("registering activation descriptor...");
+ obj1 = (ActivateMe)Activatable.register(desc1);
+ obj2 = (ActivateMe)Activatable.register(desc2);
+
+ System.err.println("invoking method on activatable object...");
+ try {
+ obj1.ping();
+
+ } catch (ActivateFailedException e) {
- System.err.println("invoking method on activatable object...");
- try {
- obj1.ping();
-
- } catch (ActivateFailedException e) {
+ /*
+ * This is what is expected so exit with status 0
+ */
+ System.err.println("\nsuccess: ActivateFailedException " +
+ "generated");
+ e.getMessage();
+ }
- /*
- * This is what is expected so exit with status 0
- */
- System.err.println("\nsuccess: ActivateFailedException " +
- "generated");
- e.getMessage();
- }
+ obj2.ping();
+ shutdownThread = obj2.shutdown();
- obj2.ping();
- shutdownThread = obj2.shutdown();
+ // wait for shutdown to work
+ Thread.sleep(2000);
- // wait for shutdown to work
- Thread.sleep(2000);
+ shutdownThread = null;
- shutdownThread = null;
-
- } catch (Exception e) {
- /*
- * Test failed; unexpected exception generated.
- */
- TestLibrary.bomb("\nfailure: unexpected exception " +
- e.getClass().getName() + ": " + e.getMessage(), e);
-
- } finally {
- obj1 = obj2 = null;
- ActivationLibrary.rmidCleanup(rmid);
- }
+ } catch (Exception e) {
+ /*
+ * Test failed; unexpected exception generated.
+ */
+ TestLibrary.bomb("\nfailure: unexpected exception " +
+ e.getClass().getName() + ": " + e.getMessage(), e);
+
+ } finally {
+ obj1 = obj2 = null;
+ ActivationLibrary.rmidCleanup(rmid);
+ }
}
}
-
--- a/jdk/test/java/rmi/activation/ActivateFailedException/activateFails/ActivateFails_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivateFailedException/activateFails/ActivateFails_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,88 +29,88 @@
implements ActivateMe, java.rmi.Remote
{
private static final java.rmi.server.Operation[] operations = {
- new java.rmi.server.Operation("void ping()"),
- new java.rmi.server.Operation("ShutdownThread shutdown()")
+ new java.rmi.server.Operation("void ping()"),
+ new java.rmi.server.Operation("ShutdownThread shutdown()")
};
-
+
private static final long interfaceHash = -6632667923281093978L;
-
+
private static final long serialVersionUID = 2;
-
+
private static boolean useNewInvoke;
private static java.lang.reflect.Method $method_ping_0;
private static java.lang.reflect.Method $method_shutdown_1;
-
+
static {
- try {
- java.rmi.server.RemoteRef.class.getMethod("invoke",
- new java.lang.Class[] {
- java.rmi.Remote.class,
- java.lang.reflect.Method.class,
- java.lang.Object[].class,
- long.class
- });
- useNewInvoke = true;
- $method_ping_0 = ActivateMe.class.getMethod("ping", new java.lang.Class[] {});
- $method_shutdown_1 = ActivateMe.class.getMethod("shutdown", new java.lang.Class[] {});
- } catch (java.lang.NoSuchMethodException e) {
- useNewInvoke = false;
- }
+ try {
+ java.rmi.server.RemoteRef.class.getMethod("invoke",
+ new java.lang.Class[] {
+ java.rmi.Remote.class,
+ java.lang.reflect.Method.class,
+ java.lang.Object[].class,
+ long.class
+ });
+ useNewInvoke = true;
+ $method_ping_0 = ActivateMe.class.getMethod("ping", new java.lang.Class[] {});
+ $method_shutdown_1 = ActivateMe.class.getMethod("shutdown", new java.lang.Class[] {});
+ } catch (java.lang.NoSuchMethodException e) {
+ useNewInvoke = false;
+ }
}
-
+
// constructors
public ActivateFails_Stub() {
- super();
+ super();
}
public ActivateFails_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of ping()
public void ping()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- ref.invoke(this, $method_ping_0, null, 5866401369815527589L);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
- ref.invoke(call);
- ref.done(call);
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ ref.invoke(this, $method_ping_0, null, 5866401369815527589L);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
+ ref.invoke(call);
+ ref.done(call);
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of shutdown()
public ShutdownThread shutdown()
- throws java.lang.Exception
+ throws java.lang.Exception
{
- if (useNewInvoke) {
- Object $result = ref.invoke(this, $method_shutdown_1, null, -3616843253114182719L);
- return ((ShutdownThread) $result);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
- ref.invoke(call);
- ShutdownThread $result;
- try {
- java.io.ObjectInput in = call.getInputStream();
- $result = (ShutdownThread) in.readObject();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } catch (java.lang.ClassNotFoundException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } finally {
- ref.done(call);
- }
- return $result;
- }
+ if (useNewInvoke) {
+ Object $result = ref.invoke(this, $method_shutdown_1, null, -3616843253114182719L);
+ return ((ShutdownThread) $result);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
+ ref.invoke(call);
+ ShutdownThread $result;
+ try {
+ java.io.ObjectInput in = call.getInputStream();
+ $result = (ShutdownThread) in.readObject();
+ } catch (java.io.IOException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } catch (java.lang.ClassNotFoundException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } finally {
+ ref.done(call);
+ }
+ return $result;
+ }
}
}
--- a/jdk/test/java/rmi/activation/ActivateFailedException/activateFails/ActivateMe.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivateFailedException/activateFails/ActivateMe.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999-2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
--- a/jdk/test/java/rmi/activation/ActivateFailedException/activateFails/ShutdownThread.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivateFailedException/activateFails/ShutdownThread.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -31,21 +31,20 @@
ActivationID activationID = null;
public ShutdownThread(Remote remoteObject, ActivationID activationID) {
- remoteObject = remoteObject;
- activationID = activationID;
+ remoteObject = remoteObject;
+ activationID = activationID;
}
public void run() {
- try {
+ try {
- Activatable.unexportObject(remoteObject, true);
- Activatable.inactive(activationID);
+ Activatable.unexportObject(remoteObject, true);
+ Activatable.inactive(activationID);
- } catch (Exception e) {
- }
+ } catch (Exception e) {
+ }
}
}
-
--- a/jdk/test/java/rmi/activation/ActivationGroup/downloadActivationGroup/DownloadActivationGroup.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivationGroup/downloadActivationGroup/DownloadActivationGroup.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2002 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4510355
+ * @bug 4510355
* @summary ActivationGroup implementations cannot be downloaded by default;
* Creates a custom activation group without setting a security manager
* in activation group's descriptor. The custom activation group
@@ -49,28 +49,28 @@
import java.util.Properties;
public class DownloadActivationGroup
- implements Ping, Runnable
+ implements Ping, Runnable
{
private ActivationID id;
public DownloadActivationGroup(ActivationID id, MarshalledObject mobj)
- throws ActivationException, RemoteException
+ throws ActivationException, RemoteException
{
- this.id = id;
- Activatable.exportObject(this, id, 0);
- System.err.println("object activated in group");
+ this.id = id;
+ Activatable.exportObject(this, id, 0);
+ System.err.println("object activated in group");
}
public DownloadActivationGroup() throws RemoteException {
- UnicastRemoteObject.exportObject(this, 0);
+ UnicastRemoteObject.exportObject(this, 0);
}
/**
* Used to activate object.
*/
public void ping() {
- System.err.println("received ping");
+ System.err.println("received ping");
}
/**
@@ -79,87 +79,87 @@
*/
public void shutdown() throws Exception
{
- (new Thread(this,"DownloadActivationGroup")).start();
+ (new Thread(this,"DownloadActivationGroup")).start();
}
/**
* Thread to deactivate object.
*/
public void run() {
- ActivationLibrary.deactivate(this, getID());
+ ActivationLibrary.deactivate(this, getID());
}
-
+
public ActivationID getID() {
- return id;
+ return id;
}
public static void main(String[] args) {
- RMID rmid = null;
-
- System.out.println("\nRegression test for bug 4510355\n");
-
- try {
- TestLibrary.suggestSecurityManager("java.lang.SecurityManager");
+ RMID rmid = null;
+
+ System.out.println("\nRegression test for bug 4510355\n");
+
+ try {
+ TestLibrary.suggestSecurityManager("java.lang.SecurityManager");
+
+ /*
+ * Install group class file in codebase.
+ */
+ System.err.println("install class file in codebase");
+ URL groupURL = TestLibrary.installClassInCodebase(
+ "MyActivationGroupImpl", "group");
+ System.err.println("class file installed");
- /*
- * Install group class file in codebase.
- */
- System.err.println("install class file in codebase");
- URL groupURL = TestLibrary.installClassInCodebase(
- "MyActivationGroupImpl", "group");
- System.err.println("class file installed");
+ /*
+ * Start rmid.
+ */
+ RMID.removeLog();
+ rmid = RMID.createRMID();
+ String execPolicyOption = "-Dsun.rmi.activation.execPolicy=none";
+ rmid.addOptions(new String[] { execPolicyOption });
+ rmid.start();
- /*
- * Start rmid.
- */
- RMID.removeLog();
- rmid = RMID.createRMID();
- String execPolicyOption = "-Dsun.rmi.activation.execPolicy=none";
- rmid.addOptions(new String[] { execPolicyOption });
- rmid.start();
+ /*
+ * Create and register descriptors for custom group and an
+ * activatable object in that group.
+ */
+ System.err.println("register group");
- /*
- * Create and register descriptors for custom group and an
- * activatable object in that group.
- */
- System.err.println("register group");
-
- Properties p = new Properties();
- p.put("java.security.policy", TestParams.defaultGroupPolicy);
-
- ActivationGroupDesc groupDesc =
- new ActivationGroupDesc("MyActivationGroupImpl",
- groupURL.toExternalForm(),
- null, p, null);
- ActivationGroupID groupID =
- ActivationGroup.getSystem().registerGroup(groupDesc);
-
-
- System.err.println("register activatable object");
- ActivationDesc desc =
- new ActivationDesc(groupID, "DownloadActivationGroup",
- null, null);
- Ping obj = (Ping) Activatable.register(desc);
+ Properties p = new Properties();
+ p.put("java.security.policy", TestParams.defaultGroupPolicy);
+
+ ActivationGroupDesc groupDesc =
+ new ActivationGroupDesc("MyActivationGroupImpl",
+ groupURL.toExternalForm(),
+ null, p, null);
+ ActivationGroupID groupID =
+ ActivationGroup.getSystem().registerGroup(groupDesc);
+
+
+ System.err.println("register activatable object");
+ ActivationDesc desc =
+ new ActivationDesc(groupID, "DownloadActivationGroup",
+ null, null);
+ Ping obj = (Ping) Activatable.register(desc);
- /*
- * Start group (by calling ping).
- */
- System.err.println(
- "ping object (forces download of group's class)");
- obj.ping();
- System.err.println(
- "TEST PASSED: group's class downloaded successfully");
- System.err.println("shutdown object");
- obj.shutdown();
- System.err.println("TEST PASSED");
+ /*
+ * Start group (by calling ping).
+ */
+ System.err.println(
+ "ping object (forces download of group's class)");
+ obj.ping();
+ System.err.println(
+ "TEST PASSED: group's class downloaded successfully");
+ System.err.println("shutdown object");
+ obj.shutdown();
+ System.err.println("TEST PASSED");
- } catch (Exception e) {
- TestLibrary.bomb(e);
- } finally {
- ActivationLibrary.rmidCleanup(rmid);
- }
+ } catch (Exception e) {
+ TestLibrary.bomb(e);
+ } finally {
+ ActivationLibrary.rmidCleanup(rmid);
+ }
}
}
--- a/jdk/test/java/rmi/activation/ActivationGroup/downloadActivationGroup/DownloadActivationGroup_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivationGroup/downloadActivationGroup/DownloadActivationGroup_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2002 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,46 +29,46 @@
implements Ping
{
private static final long serialVersionUID = 2;
-
+
private static java.lang.reflect.Method $method_ping_0;
private static java.lang.reflect.Method $method_shutdown_1;
-
+
static {
- try {
- $method_ping_0 = Ping.class.getMethod("ping", new java.lang.Class[] {});
- $method_shutdown_1 = Ping.class.getMethod("shutdown", new java.lang.Class[] {});
- } catch (java.lang.NoSuchMethodException e) {
- throw new java.lang.NoSuchMethodError(
- "stub class initialization failed");
- }
+ try {
+ $method_ping_0 = Ping.class.getMethod("ping", new java.lang.Class[] {});
+ $method_shutdown_1 = Ping.class.getMethod("shutdown", new java.lang.Class[] {});
+ } catch (java.lang.NoSuchMethodException e) {
+ throw new java.lang.NoSuchMethodError(
+ "stub class initialization failed");
+ }
}
-
+
// constructors
public DownloadActivationGroup_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of ping()
public void ping()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- ref.invoke(this, $method_ping_0, null, 5866401369815527589L);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ ref.invoke(this, $method_ping_0, null, 5866401369815527589L);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of shutdown()
public void shutdown()
- throws java.lang.Exception
+ throws java.lang.Exception
{
- ref.invoke(this, $method_shutdown_1, null, -7207851917985848402L);
+ ref.invoke(this, $method_shutdown_1, null, -7207851917985848402L);
}
}
--- a/jdk/test/java/rmi/activation/ActivationGroup/downloadActivationGroup/MyActivationGroupImpl.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivationGroup/downloadActivationGroup/MyActivationGroupImpl.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2002 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -27,11 +27,11 @@
public class MyActivationGroupImpl extends ActivationGroupImpl {
-
+
public MyActivationGroupImpl(ActivationGroupID id, MarshalledObject mobj)
- throws RemoteException, ActivationException
+ throws RemoteException, ActivationException
{
- super(id, mobj);
- System.err.println("custom group implementation created");
+ super(id, mobj);
+ System.err.println("custom group implementation created");
}
}
--- a/jdk/test/java/rmi/activation/ActivationGroupDesc/checkDefaultGroupName/CheckDefaultGroupName.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivationGroupDesc/checkDefaultGroupName/CheckDefaultGroupName.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -42,19 +42,19 @@
*/
public class CheckDefaultGroupName {
public static void main(String[] args) {
- System.out.println("\n\nRegression test for, 4252236\n\n");
+ System.out.println("\n\nRegression test for, 4252236\n\n");
- ActivationGroupDesc groupDesc =
- new ActivationGroupDesc(null, null);
+ ActivationGroupDesc groupDesc =
+ new ActivationGroupDesc(null, null);
- String className = groupDesc.getClassName();
- if (className != null) {
- TestLibrary.bomb("ActivationGroupDesc had incorrect default" +
- " group implementation class name: " + className);
- } else {
- System.err.println("test passed, had correct default group" +
- " implementation class name: " + className +
- "\n\n");
- }
+ String className = groupDesc.getClassName();
+ if (className != null) {
+ TestLibrary.bomb("ActivationGroupDesc had incorrect default" +
+ " group implementation class name: " + className);
+ } else {
+ System.err.println("test passed, had correct default group" +
+ " implementation class name: " + className +
+ "\n\n");
+ }
}
}
--- a/jdk/test/java/rmi/activation/ActivationSystem/activeGroup/IdempotentActiveGroup.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivationSystem/activeGroup/IdempotentActiveGroup.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -49,81 +49,81 @@
import java.rmi.server.UnicastRemoteObject;
public class IdempotentActiveGroup {
-
+
public static void main(String[] args) {
- System.err.println("\nRegression test for bug 4720528\n");
-
- TestLibrary.suggestSecurityManager("java.lang.SecurityManager");
- RMID rmid = null;
- ActivationInstantiator inst1 = null;
- ActivationInstantiator inst2 = null;
-
- try {
- RMID.removeLog();
- rmid = RMID.createRMID();
- rmid.start();
+ System.err.println("\nRegression test for bug 4720528\n");
+
+ TestLibrary.suggestSecurityManager("java.lang.SecurityManager");
+ RMID rmid = null;
+ ActivationInstantiator inst1 = null;
+ ActivationInstantiator inst2 = null;
+
+ try {
+ RMID.removeLog();
+ rmid = RMID.createRMID();
+ rmid.start();
- System.err.println("Create group descriptor");
- ActivationGroupDesc groupDesc =
- new ActivationGroupDesc(null, null);
- ActivationSystem system = ActivationGroup.getSystem();
- System.err.println("Register group descriptor");
- ActivationGroupID groupID = system.registerGroup(groupDesc);
- inst1 = new FakeInstantiator();
- inst2 = new FakeInstantiator();
-
- System.err.println("Invoke activeGroup with inst1");
- system.activeGroup(groupID, inst1, 0);
+ System.err.println("Create group descriptor");
+ ActivationGroupDesc groupDesc =
+ new ActivationGroupDesc(null, null);
+ ActivationSystem system = ActivationGroup.getSystem();
+ System.err.println("Register group descriptor");
+ ActivationGroupID groupID = system.registerGroup(groupDesc);
+ inst1 = new FakeInstantiator();
+ inst2 = new FakeInstantiator();
+
+ System.err.println("Invoke activeGroup with inst1");
+ system.activeGroup(groupID, inst1, 0);
- try {
- System.err.println("Invoke activeGroup with inst2");
- system.activeGroup(groupID, inst2, 0);
- throw new RuntimeException(
- "TEST FAILED: activeGroup with unequal groups succeeded!");
- } catch (ActivationException expected) {
- System.err.println("Caught expected ActivationException");
- System.err.println("Test 1 (of 2) passed");
- }
+ try {
+ System.err.println("Invoke activeGroup with inst2");
+ system.activeGroup(groupID, inst2, 0);
+ throw new RuntimeException(
+ "TEST FAILED: activeGroup with unequal groups succeeded!");
+ } catch (ActivationException expected) {
+ System.err.println("Caught expected ActivationException");
+ System.err.println("Test 1 (of 2) passed");
+ }
- try {
- System.err.println("Invoke activeGroup with inst1");
- system.activeGroup(groupID, inst1, 0);
- System.err.println("activeGroup call succeeded");
- System.err.println("Test 2 (of 2) passed");
- } catch (ActivationException unexpected) {
- throw new RuntimeException(
- "TEST FAILED: activeGroup with equal groups failed!",
- unexpected);
- }
-
- } catch (Exception e) {
- TestLibrary.bomb("test failed", e);
- } finally {
- try {
- if (inst1 != null) {
- UnicastRemoteObject.unexportObject(inst1, true);
- }
- if (inst2 != null) {
- UnicastRemoteObject.unexportObject(inst2, true);
- }
- } catch (NoSuchObjectException unexpected) {
- throw new AssertionError(unexpected);
- }
- ActivationLibrary.rmidCleanup(rmid);
- }
+ try {
+ System.err.println("Invoke activeGroup with inst1");
+ system.activeGroup(groupID, inst1, 0);
+ System.err.println("activeGroup call succeeded");
+ System.err.println("Test 2 (of 2) passed");
+ } catch (ActivationException unexpected) {
+ throw new RuntimeException(
+ "TEST FAILED: activeGroup with equal groups failed!",
+ unexpected);
+ }
+
+ } catch (Exception e) {
+ TestLibrary.bomb("test failed", e);
+ } finally {
+ try {
+ if (inst1 != null) {
+ UnicastRemoteObject.unexportObject(inst1, true);
+ }
+ if (inst2 != null) {
+ UnicastRemoteObject.unexportObject(inst2, true);
+ }
+ } catch (NoSuchObjectException unexpected) {
+ throw new AssertionError(unexpected);
+ }
+ ActivationLibrary.rmidCleanup(rmid);
+ }
}
private static class FakeInstantiator
- extends UnicastRemoteObject
- implements ActivationInstantiator
+ extends UnicastRemoteObject
+ implements ActivationInstantiator
{
- FakeInstantiator() throws RemoteException {}
+ FakeInstantiator() throws RemoteException {}
- public MarshalledObject newInstance(ActivationID id,
- ActivationDesc desc)
- {
- throw new AssertionError();
- }
+ public MarshalledObject newInstance(ActivationID id,
+ ActivationDesc desc)
+ {
+ throw new AssertionError();
+ }
}
}
--- a/jdk/test/java/rmi/activation/ActivationSystem/modifyDescriptor/ActivateMe.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivationSystem/modifyDescriptor/ActivateMe.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
--- a/jdk/test/java/rmi/activation/ActivationSystem/modifyDescriptor/ModifyDescriptor.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivationSystem/modifyDescriptor/ModifyDescriptor.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -25,7 +25,7 @@
* @bug 4127754
*
* @summary synopsis: need to modify registered ActivationDesc and
- * ActivationGroupDesc
+ * ActivationGroupDesc
* @author Ann Wollrath
*
* @library ../../../testlibrary
@@ -43,7 +43,7 @@
import java.util.*;
public class ModifyDescriptor
- implements ActivateMe, Runnable
+ implements ActivateMe, Runnable
{
private ActivationID id;
@@ -54,28 +54,28 @@
public ModifyDescriptor(ActivationID id, MarshalledObject mobj)
- throws ActivationException, RemoteException
+ throws ActivationException, RemoteException
{
- this.id = id;
- Activatable.exportObject(this, id, 0);
-
- try {
- message = (String) mobj.get();
- } catch (Exception e) {
- System.err.println("unable to get message from marshalled object");
- }
+ this.id = id;
+ Activatable.exportObject(this, id, 0);
+
+ try {
+ message = (String) mobj.get();
+ } catch (Exception e) {
+ System.err.println("unable to get message from marshalled object");
+ }
}
public String getMessage() {
- return message;
+ return message;
}
public String getProperty(String name) {
- return TestLibrary.getProperty(name, null);
+ return TestLibrary.getProperty(name, null);
}
public ActivationID getID() {
- return id;
+ return id;
}
/**
@@ -83,7 +83,7 @@
*/
public void shutdown() throws Exception
{
- (new Thread(this,"ModifyDescriptor")).start();
+ (new Thread(this,"ModifyDescriptor")).start();
}
/**
@@ -93,165 +93,165 @@
* unexport the object forcibly.
*/
public void run() {
- ActivationLibrary.deactivate(this, getID());
+ ActivationLibrary.deactivate(this, getID());
}
-
+
public static void main(String[] args) {
- System.out.println("\nRegression test for bug 4127754\n");
-
- TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
+ System.out.println("\nRegression test for bug 4127754\n");
+
+ TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
+
+ RMID rmid = null;
- RMID rmid = null;
-
- try {
- RMID.removeLog();
- rmid = RMID.createRMID();
- rmid.start();
+ try {
+ RMID.removeLog();
+ rmid = RMID.createRMID();
+ rmid.start();
- /*
- * Create and register a group and activatable object
- */
+ /*
+ * Create and register a group and activatable object
+ */
- System.err.println("Creating group descriptor");
- Properties props = new Properties();
- props.put("java.security.policy",
- TestParams.defaultGroupPolicy);
- props.put("java.security.manager",
- TestParams.defaultSecurityManager);
- props.put("test.message", MESSAGE1);
- ActivationGroupDesc initialGroupDesc =
- new ActivationGroupDesc(props, null);
- System.err.println("Registering group");
- ActivationSystem system = ActivationGroup.getSystem();
- ActivationGroupID groupID = system.registerGroup(initialGroupDesc);
-
- System.err.println("Creating descriptor");
- ActivationDesc initialDesc =
- new ActivationDesc(groupID, "ModifyDescriptor", null,
- new MarshalledObject(MESSAGE1), false);
-
- System.err.println("Registering descriptor");
- ActivateMe obj = (ActivateMe) Activatable.register(initialDesc);
+ System.err.println("Creating group descriptor");
+ Properties props = new Properties();
+ props.put("java.security.policy",
+ TestParams.defaultGroupPolicy);
+ props.put("java.security.manager",
+ TestParams.defaultSecurityManager);
+ props.put("test.message", MESSAGE1);
+ ActivationGroupDesc initialGroupDesc =
+ new ActivationGroupDesc(props, null);
+ System.err.println("Registering group");
+ ActivationSystem system = ActivationGroup.getSystem();
+ ActivationGroupID groupID = system.registerGroup(initialGroupDesc);
+
+ System.err.println("Creating descriptor");
+ ActivationDesc initialDesc =
+ new ActivationDesc(groupID, "ModifyDescriptor", null,
+ new MarshalledObject(MESSAGE1), false);
+
+ System.err.println("Registering descriptor");
+ ActivateMe obj = (ActivateMe) Activatable.register(initialDesc);
- /*
- * Ping object and verify that MarshalledObject is okay.
- */
- System.err.println("Ping object");
- String message1 = obj.getMessage();
- System.err.println("message = " + message1);
+ /*
+ * Ping object and verify that MarshalledObject is okay.
+ */
+ System.err.println("Ping object");
+ String message1 = obj.getMessage();
+ System.err.println("message = " + message1);
- if (message1.equals(MESSAGE1)) {
- System.err.println("Test1a passed: initial MarshalledObject " +
- "correct");
- } else {
- TestLibrary.bomb("Test1 failed: unexpected MarshalledObject passed to " +
- "constructor", null);
- }
+ if (message1.equals(MESSAGE1)) {
+ System.err.println("Test1a passed: initial MarshalledObject " +
+ "correct");
+ } else {
+ TestLibrary.bomb("Test1 failed: unexpected MarshalledObject passed to " +
+ "constructor", null);
+ }
- /*
- * Get property from remote group and make sure it's okay
- */
- message1 = obj.getProperty("test.message");
- if (message1.equals(MESSAGE1)) {
- System.err.println("Test1b passed: initial group property " +
- "correct");
- } else {
- TestLibrary.bomb("Test1 failed: unexpected property passed to " +
- "group", null);
- }
+ /*
+ * Get property from remote group and make sure it's okay
+ */
+ message1 = obj.getProperty("test.message");
+ if (message1.equals(MESSAGE1)) {
+ System.err.println("Test1b passed: initial group property " +
+ "correct");
+ } else {
+ TestLibrary.bomb("Test1 failed: unexpected property passed to " +
+ "group", null);
+ }
- /*
- * Update activation descriptor for object and group
- */
- System.err.println("Update activation descriptor");
- ActivationDesc newDesc =
- new ActivationDesc(groupID, "ModifyDescriptor", null,
- new MarshalledObject(MESSAGE2), false);
- ActivationID id = obj.getID();
- ActivationDesc oldDesc = system.setActivationDesc(id, newDesc);
+ /*
+ * Update activation descriptor for object and group
+ */
+ System.err.println("Update activation descriptor");
+ ActivationDesc newDesc =
+ new ActivationDesc(groupID, "ModifyDescriptor", null,
+ new MarshalledObject(MESSAGE2), false);
+ ActivationID id = obj.getID();
+ ActivationDesc oldDesc = system.setActivationDesc(id, newDesc);
- if (oldDesc.equals(initialDesc)) {
- System.err.println("Test2a passed: desc returned from " +
- "setActivationDesc is okay");
- } else {
- TestLibrary.bomb("Test2a failed: desc returned from setActivationDesc " +
- "is not the initial descriptor!", null);
- }
+ if (oldDesc.equals(initialDesc)) {
+ System.err.println("Test2a passed: desc returned from " +
+ "setActivationDesc is okay");
+ } else {
+ TestLibrary.bomb("Test2a failed: desc returned from setActivationDesc " +
+ "is not the initial descriptor!", null);
+ }
- Properties props2 = new Properties();
- props2.put("test.message", MESSAGE2);
- props2.put("java.security.policy",
- TestParams.defaultGroupPolicy);
- props2.put("java.security.manager",
- TestParams.defaultSecurityManager);
- ActivationGroupDesc newGroupDesc =
- new ActivationGroupDesc(props2, null);
+ Properties props2 = new Properties();
+ props2.put("test.message", MESSAGE2);
+ props2.put("java.security.policy",
+ TestParams.defaultGroupPolicy);
+ props2.put("java.security.manager",
+ TestParams.defaultSecurityManager);
+ ActivationGroupDesc newGroupDesc =
+ new ActivationGroupDesc(props2, null);
- ActivationGroupDesc oldGroupDesc =
- system.setActivationGroupDesc(groupID, newGroupDesc);
+ ActivationGroupDesc oldGroupDesc =
+ system.setActivationGroupDesc(groupID, newGroupDesc);
- if (oldGroupDesc.equals(initialGroupDesc)) {
- System.err.println("Test2b passed: group desc returned from " +
- "setActivationGroupDesc is okay");
- } else {
- TestLibrary.bomb("Test2b failed: group desc returned from " +
- "setActivationGroupDesc is not the initial descriptor!",
- null);
- }
-
- /*
- * Restart rmid; and ping object to make sure that it has
- * new message.
- */
- rmid.restart();
+ if (oldGroupDesc.equals(initialGroupDesc)) {
+ System.err.println("Test2b passed: group desc returned from " +
+ "setActivationGroupDesc is okay");
+ } else {
+ TestLibrary.bomb("Test2b failed: group desc returned from " +
+ "setActivationGroupDesc is not the initial descriptor!",
+ null);
+ }
- System.err.println("Ping object after restart");
- String message2 = obj.getMessage();
+ /*
+ * Restart rmid; and ping object to make sure that it has
+ * new message.
+ */
+ rmid.restart();
+
+ System.err.println("Ping object after restart");
+ String message2 = obj.getMessage();
- if (message2.equals(MESSAGE2)) {
- System.err.println("Test3a passed: setActivationDesc takes " +
- "effect after a restart");
- } else {
- TestLibrary.bomb("Test3a failed: setActivationDesc did not take effect " +
- "after a restart", null);
- }
+ if (message2.equals(MESSAGE2)) {
+ System.err.println("Test3a passed: setActivationDesc takes " +
+ "effect after a restart");
+ } else {
+ TestLibrary.bomb("Test3a failed: setActivationDesc did not take effect " +
+ "after a restart", null);
+ }
+
+ message2 = obj.getProperty("test.message");
- message2 = obj.getProperty("test.message");
-
- if (message2.equals(MESSAGE2)) {
- System.err.println("Test3b passed: setActivationGroupDesc " +
- "takes effect after a restart");
- } else {
- TestLibrary.bomb("Test3b failed: setActivationGroupDesc did not take " +
- "effect after a restart", null);
- }
+ if (message2.equals(MESSAGE2)) {
+ System.err.println("Test3b passed: setActivationGroupDesc " +
+ "takes effect after a restart");
+ } else {
+ TestLibrary.bomb("Test3b failed: setActivationGroupDesc did not take " +
+ "effect after a restart", null);
+ }
- System.err.println("Get activation descriptor");
- ActivationDesc latestDesc = system.getActivationDesc(id);
+ System.err.println("Get activation descriptor");
+ ActivationDesc latestDesc = system.getActivationDesc(id);
- if (latestDesc.equals(newDesc)) {
- System.err.println("Test4a passed: desc is same as latest");
- } else {
- TestLibrary.bomb("Test4a failed: there is no way this would happen", null);
- }
+ if (latestDesc.equals(newDesc)) {
+ System.err.println("Test4a passed: desc is same as latest");
+ } else {
+ TestLibrary.bomb("Test4a failed: there is no way this would happen", null);
+ }
- System.err.println("Get activation group descriptor");
- ActivationGroupDesc latestGroupDesc =
- system.getActivationGroupDesc(groupID);
+ System.err.println("Get activation group descriptor");
+ ActivationGroupDesc latestGroupDesc =
+ system.getActivationGroupDesc(groupID);
- if (latestGroupDesc.equals(newGroupDesc)) {
- System.err.println("Test4b passed: group desc is same as " +
- "latest");
- } else {
- TestLibrary.bomb("Test4b failed: there is no way this would happen", null);
- }
-
- } catch (Exception e) {
- TestLibrary.bomb("test failed", e);
- } finally {
- ActivationLibrary.rmidCleanup(rmid);
- }
+ if (latestGroupDesc.equals(newGroupDesc)) {
+ System.err.println("Test4b passed: group desc is same as " +
+ "latest");
+ } else {
+ TestLibrary.bomb("Test4b failed: there is no way this would happen", null);
+ }
+
+ } catch (Exception e) {
+ TestLibrary.bomb("test failed", e);
+ } finally {
+ ActivationLibrary.rmidCleanup(rmid);
+ }
}
}
--- a/jdk/test/java/rmi/activation/ActivationSystem/modifyDescriptor/ModifyDescriptor_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivationSystem/modifyDescriptor/ModifyDescriptor_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,166 +29,166 @@
implements ActivateMe
{
private static final java.rmi.server.Operation[] operations = {
- new java.rmi.server.Operation("java.rmi.activation.ActivationID getID()"),
- new java.rmi.server.Operation("java.lang.String getMessage()"),
- new java.rmi.server.Operation("java.lang.String getProperty(java.lang.String)"),
- new java.rmi.server.Operation("void shutdown()")
+ new java.rmi.server.Operation("java.rmi.activation.ActivationID getID()"),
+ new java.rmi.server.Operation("java.lang.String getMessage()"),
+ new java.rmi.server.Operation("java.lang.String getProperty(java.lang.String)"),
+ new java.rmi.server.Operation("void shutdown()")
};
-
+
private static final long interfaceHash = 7998207954486691383L;
-
+
private static final long serialVersionUID = 2;
-
+
private static boolean useNewInvoke;
private static java.lang.reflect.Method $method_getID_0;
private static java.lang.reflect.Method $method_getMessage_1;
private static java.lang.reflect.Method $method_getProperty_2;
private static java.lang.reflect.Method $method_shutdown_3;
-
+
static {
- try {
- java.rmi.server.RemoteRef.class.getMethod("invoke",
- new java.lang.Class[] {
- java.rmi.Remote.class,
- java.lang.reflect.Method.class,
- java.lang.Object[].class,
- long.class
- });
- useNewInvoke = true;
- $method_getID_0 = ActivateMe.class.getMethod("getID", new java.lang.Class[] {});
- $method_getMessage_1 = ActivateMe.class.getMethod("getMessage", new java.lang.Class[] {});
- $method_getProperty_2 = ActivateMe.class.getMethod("getProperty", new java.lang.Class[] {java.lang.String.class});
- $method_shutdown_3 = ActivateMe.class.getMethod("shutdown", new java.lang.Class[] {});
- } catch (java.lang.NoSuchMethodException e) {
- useNewInvoke = false;
- }
+ try {
+ java.rmi.server.RemoteRef.class.getMethod("invoke",
+ new java.lang.Class[] {
+ java.rmi.Remote.class,
+ java.lang.reflect.Method.class,
+ java.lang.Object[].class,
+ long.class
+ });
+ useNewInvoke = true;
+ $method_getID_0 = ActivateMe.class.getMethod("getID", new java.lang.Class[] {});
+ $method_getMessage_1 = ActivateMe.class.getMethod("getMessage", new java.lang.Class[] {});
+ $method_getProperty_2 = ActivateMe.class.getMethod("getProperty", new java.lang.Class[] {java.lang.String.class});
+ $method_shutdown_3 = ActivateMe.class.getMethod("shutdown", new java.lang.Class[] {});
+ } catch (java.lang.NoSuchMethodException e) {
+ useNewInvoke = false;
+ }
}
-
+
// constructors
public ModifyDescriptor_Stub() {
- super();
+ super();
}
public ModifyDescriptor_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of getID()
public java.rmi.activation.ActivationID getID()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- Object $result = ref.invoke(this, $method_getID_0, null, -7795865521150345044L);
- return ((java.rmi.activation.ActivationID) $result);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
- ref.invoke(call);
- java.rmi.activation.ActivationID $result;
- try {
- java.io.ObjectInput in = call.getInputStream();
- $result = (java.rmi.activation.ActivationID) in.readObject();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } catch (java.lang.ClassNotFoundException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } finally {
- ref.done(call);
- }
- return $result;
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ Object $result = ref.invoke(this, $method_getID_0, null, -7795865521150345044L);
+ return ((java.rmi.activation.ActivationID) $result);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
+ ref.invoke(call);
+ java.rmi.activation.ActivationID $result;
+ try {
+ java.io.ObjectInput in = call.getInputStream();
+ $result = (java.rmi.activation.ActivationID) in.readObject();
+ } catch (java.io.IOException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } catch (java.lang.ClassNotFoundException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } finally {
+ ref.done(call);
+ }
+ return $result;
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of getMessage()
public java.lang.String getMessage()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- Object $result = ref.invoke(this, $method_getMessage_1, null, 5353407034680111516L);
- return ((java.lang.String) $result);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
- ref.invoke(call);
- java.lang.String $result;
- try {
- java.io.ObjectInput in = call.getInputStream();
- $result = (java.lang.String) in.readObject();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } catch (java.lang.ClassNotFoundException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } finally {
- ref.done(call);
- }
- return $result;
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ Object $result = ref.invoke(this, $method_getMessage_1, null, 5353407034680111516L);
+ return ((java.lang.String) $result);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
+ ref.invoke(call);
+ java.lang.String $result;
+ try {
+ java.io.ObjectInput in = call.getInputStream();
+ $result = (java.lang.String) in.readObject();
+ } catch (java.io.IOException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } catch (java.lang.ClassNotFoundException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } finally {
+ ref.done(call);
+ }
+ return $result;
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of getProperty(String)
public java.lang.String getProperty(java.lang.String $param_String_1)
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- Object $result = ref.invoke(this, $method_getProperty_2, new java.lang.Object[] {$param_String_1}, 77249282285080913L);
- return ((java.lang.String) $result);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 2, interfaceHash);
- try {
- java.io.ObjectOutput out = call.getOutputStream();
- out.writeObject($param_String_1);
- } catch (java.io.IOException e) {
- throw new java.rmi.MarshalException("error marshalling arguments", e);
- }
- ref.invoke(call);
- java.lang.String $result;
- try {
- java.io.ObjectInput in = call.getInputStream();
- $result = (java.lang.String) in.readObject();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } catch (java.lang.ClassNotFoundException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } finally {
- ref.done(call);
- }
- return $result;
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ Object $result = ref.invoke(this, $method_getProperty_2, new java.lang.Object[] {$param_String_1}, 77249282285080913L);
+ return ((java.lang.String) $result);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 2, interfaceHash);
+ try {
+ java.io.ObjectOutput out = call.getOutputStream();
+ out.writeObject($param_String_1);
+ } catch (java.io.IOException e) {
+ throw new java.rmi.MarshalException("error marshalling arguments", e);
+ }
+ ref.invoke(call);
+ java.lang.String $result;
+ try {
+ java.io.ObjectInput in = call.getInputStream();
+ $result = (java.lang.String) in.readObject();
+ } catch (java.io.IOException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } catch (java.lang.ClassNotFoundException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } finally {
+ ref.done(call);
+ }
+ return $result;
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of shutdown()
public void shutdown()
- throws java.lang.Exception
+ throws java.lang.Exception
{
- if (useNewInvoke) {
- ref.invoke(this, $method_shutdown_3, null, -7207851917985848402L);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 3, interfaceHash);
- ref.invoke(call);
- ref.done(call);
- }
+ if (useNewInvoke) {
+ ref.invoke(this, $method_shutdown_3, null, -7207851917985848402L);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 3, interfaceHash);
+ ref.invoke(call);
+ ref.done(call);
+ }
}
}
--- a/jdk/test/java/rmi/activation/ActivationSystem/stubClassesPermitted/CanCreateStubs.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivationSystem/stubClassesPermitted/CanCreateStubs.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -34,4 +34,3 @@
Object getForbiddenClass() throws Exception;
ActivationGroupID returnGroupID() throws RemoteException;
}
-
--- a/jdk/test/java/rmi/activation/ActivationSystem/stubClassesPermitted/StubClassesPermitted.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivationSystem/stubClassesPermitted/StubClassesPermitted.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -20,7 +20,7 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
-
+
/* @test
* @bug 4179055
* @summary Some java apps need to have access to read "accessClassInPackage.sun.rmi.server"
@@ -55,151 +55,151 @@
*
* The test causes the activation system to need to create each of
* these classes in turn. The test will fail if the activation system
- * does not allow these classes to be created.
+ * does not allow these classes to be created.
*/
public class StubClassesPermitted
extends Activatable implements Runnable, CanCreateStubs
{
public static boolean sameGroup = false;
-
+
private static CanCreateStubs canCreateStubs = null;
private static Registry registry = null;
- public static void main(String args[]) {
+ public static void main(String args[]) {
- sameGroup = true;
-
- RMID rmid = null;
+ sameGroup = true;
+
+ RMID rmid = null;
- System.err.println("\nRegression test for bug/rfe 4179055\n");
-
- try {
- TestLibrary.suggestSecurityManager("java.lang.SecurityManager");
+ System.err.println("\nRegression test for bug/rfe 4179055\n");
- registry = java.rmi.registry.LocateRegistry.
- createRegistry(TestLibrary.REGISTRY_PORT);
+ try {
+ TestLibrary.suggestSecurityManager("java.lang.SecurityManager");
+
+ registry = java.rmi.registry.LocateRegistry.
+ createRegistry(TestLibrary.REGISTRY_PORT);
- // must run with java.lang.SecurityManager or the test
- // result will be nullified if running with a build where
- // 4180392 has not been fixed.
- String smClassName =
- System.getSecurityManager().getClass().getName();
- if (!smClassName.equals("java.lang.SecurityManager")) {
- TestLibrary.bomb("Test must run with java.lang.SecurityManager");
- }
+ // must run with java.lang.SecurityManager or the test
+ // result will be nullified if running with a build where
+ // 4180392 has not been fixed.
+ String smClassName =
+ System.getSecurityManager().getClass().getName();
+ if (!smClassName.equals("java.lang.SecurityManager")) {
+ TestLibrary.bomb("Test must run with java.lang.SecurityManager");
+ }
- // start an rmid.
- RMID.removeLog();
- rmid = RMID.createRMID();
- rmid.start();
+ // start an rmid.
+ RMID.removeLog();
+ rmid = RMID.createRMID();
+ rmid.start();
- //rmid.addOptions(new String[] {"-C-Djava.rmi.server.logCalls=true"});
+ //rmid.addOptions(new String[] {"-C-Djava.rmi.server.logCalls=true"});
- // Ensure that activation groups run with the correct
- // security manager.
- //
- Properties p = new Properties();
- p.put("java.security.policy",
- TestParams.defaultGroupPolicy);
- p.put("java.security.manager",
- "java.lang.SecurityManager");
+ // Ensure that activation groups run with the correct
+ // security manager.
+ //
+ Properties p = new Properties();
+ p.put("java.security.policy",
+ TestParams.defaultGroupPolicy);
+ p.put("java.security.manager",
+ "java.lang.SecurityManager");
- // This action causes the following classes to be created
- // in this VM (RMI must permit the creation of these classes):
- //
- // sun.rmi.server.Activation$ActivationSystemImpl_Stub
- // sun.rmi.server.Activation$ActivationMonitorImpl_Stub
- //
- System.err.println("Create activation group, in a new VM");
- ActivationGroupDesc groupDesc =
- new ActivationGroupDesc(p, null);
- ActivationSystem system = ActivationGroup.getSystem();
- ActivationGroupID groupID = system.registerGroup(groupDesc);
-
- System.err.println("register activatable");
- // Fix for: 4271615: make sure activation group runs in a new VM
- ActivationDesc desc = new ActivationDesc
- (groupID, "StubClassesPermitted", null, null);
- canCreateStubs = (CanCreateStubs) Activatable.register(desc);
+ // This action causes the following classes to be created
+ // in this VM (RMI must permit the creation of these classes):
+ //
+ // sun.rmi.server.Activation$ActivationSystemImpl_Stub
+ // sun.rmi.server.Activation$ActivationMonitorImpl_Stub
+ //
+ System.err.println("Create activation group, in a new VM");
+ ActivationGroupDesc groupDesc =
+ new ActivationGroupDesc(p, null);
+ ActivationSystem system = ActivationGroup.getSystem();
+ ActivationGroupID groupID = system.registerGroup(groupDesc);
+
+ System.err.println("register activatable");
+ // Fix for: 4271615: make sure activation group runs in a new VM
+ ActivationDesc desc = new ActivationDesc
+ (groupID, "StubClassesPermitted", null, null);
+ canCreateStubs = (CanCreateStubs) Activatable.register(desc);
- // ensure registry stub can be passed in a remote call
- System.err.println("getting the registry");
- registry = canCreateStubs.getRegistry();
+ // ensure registry stub can be passed in a remote call
+ System.err.println("getting the registry");
+ registry = canCreateStubs.getRegistry();
+
+ // make sure a client cant load just any sun.* class, just
+ // as a sanity check, try to create a class we are not
+ // allowed to access but which was passed in a remote call
+ try {
+ System.err.println("accessing forbidden class");
+ Object secureRandom = canCreateStubs.getForbiddenClass();
- // make sure a client cant load just any sun.* class, just
- // as a sanity check, try to create a class we are not
- // allowed to access but which was passed in a remote call
- try {
- System.err.println("accessing forbidden class");
- Object secureRandom = canCreateStubs.getForbiddenClass();
-
- TestLibrary.bomb("test allowed to access forbidden class," +
- " sun.security.provider.SecureRandom");
- } catch (java.security.AccessControlException e) {
+ TestLibrary.bomb("test allowed to access forbidden class," +
+ " sun.security.provider.SecureRandom");
+ } catch (java.security.AccessControlException e) {
- // Make sure we received a *local* AccessControlException
- ByteArrayOutputStream bout = new ByteArrayOutputStream();
- PrintStream ps = new PrintStream(bout);
- e.printStackTrace(ps);
- ps.flush();
- String trace = new String(bout.toByteArray());
- if ((trace.indexOf("exceptionReceivedFromServer") >= 0) ||
- trace.equals(""))
+ // Make sure we received a *local* AccessControlException
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ PrintStream ps = new PrintStream(bout);
+ e.printStackTrace(ps);
+ ps.flush();
+ String trace = new String(bout.toByteArray());
+ if ((trace.indexOf("exceptionReceivedFromServer") >= 0) ||
+ trace.equals(""))
{
- throw e;
- }
- System.err.println("received expected local access control exception");
- }
+ throw e;
+ }
+ System.err.println("received expected local access control exception");
+ }
- // make sure that an ActivationGroupID can be passed in a
- // remote call; this is slightly more inclusive than
- // just passing a reference to the activation system
- System.err.println("returning group desc");
- canCreateStubs.returnGroupID();
-
- // Clean up object
- System.err.println
- ("Deactivate object via method call");
- canCreateStubs.shutdown();
+ // make sure that an ActivationGroupID can be passed in a
+ // remote call; this is slightly more inclusive than
+ // just passing a reference to the activation system
+ System.err.println("returning group desc");
+ canCreateStubs.returnGroupID();
+
+ // Clean up object
+ System.err.println
+ ("Deactivate object via method call");
+ canCreateStubs.shutdown();
+
+ System.err.println
+ ("\nsuccess: StubClassesPermitted test passed ");
- System.err.println
- ("\nsuccess: StubClassesPermitted test passed ");
-
- } catch (Exception e) {
- TestLibrary.bomb("\nfailure: unexpected exception ", e);
- } finally {
- try {
- Thread.sleep(4000);
- } catch (InterruptedException e) {
- }
-
- canCreateStubs = null;
- ActivationLibrary.rmidCleanup(rmid);
- System.err.println("rmid shut down");
- }
+ } catch (Exception e) {
+ TestLibrary.bomb("\nfailure: unexpected exception ", e);
+ } finally {
+ try {
+ Thread.sleep(4000);
+ } catch (InterruptedException e) {
+ }
+
+ canCreateStubs = null;
+ ActivationLibrary.rmidCleanup(rmid);
+ System.err.println("rmid shut down");
+ }
}
-
+
static ActivationGroupID GroupID = null;
/**
- * implementation of CanCreateStubs
+ * implementation of CanCreateStubs
*/
public StubClassesPermitted
- (ActivationID id, MarshalledObject mo) throws RemoteException
+ (ActivationID id, MarshalledObject mo) throws RemoteException
{
- // register/export anonymously
- super(id, 0);
+ // register/export anonymously
+ super(id, 0);
- // obtain reference to the test registry
- registry = java.rmi.registry.LocateRegistry.
- getRegistry(TestLibrary.REGISTRY_PORT);
+ // obtain reference to the test registry
+ registry = java.rmi.registry.LocateRegistry.
+ getRegistry(TestLibrary.REGISTRY_PORT);
}
-
+
/**
* Spawns a thread to deactivate the object.
*/
public void shutdown() throws Exception {
- (new Thread(this,"StubClassesPermitted")).start();
+ (new Thread(this,"StubClassesPermitted")).start();
}
/**
@@ -209,7 +209,7 @@
* unexport the object forcibly.
*/
public void run() {
- ActivationLibrary.deactivate(this, getID());
+ ActivationLibrary.deactivate(this, getID());
}
/**
@@ -217,12 +217,12 @@
* the stub for it can be deserialized in the test client VM.
*/
public Registry getRegistry() throws RemoteException {
- if (sameGroup) {
- System.out.println("in same group");
- } else {
- System.out.println("not in same group");
- }
- return registry;
+ if (sameGroup) {
+ System.out.println("in same group");
+ } else {
+ System.out.println("not in same group");
+ }
+ return registry;
}
/**
@@ -232,8 +232,8 @@
* can be resolved in a remote call.
*/
public Object getForbiddenClass() throws RemoteException {
- System.err.println("creating sun class");
- return new sun.security.provider.SecureRandom();
+ System.err.println("creating sun class");
+ return new sun.security.provider.SecureRandom();
}
/**
@@ -242,6 +242,6 @@
* system implementation).
*/
public ActivationGroupID returnGroupID() throws RemoteException {
- return ActivationGroup.currentGroupID();
+ return ActivationGroup.currentGroupID();
}
}
--- a/jdk/test/java/rmi/activation/ActivationSystem/stubClassesPermitted/StubClassesPermitted_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivationSystem/stubClassesPermitted/StubClassesPermitted_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,152 +29,152 @@
implements CanCreateStubs, java.rmi.Remote
{
private static final java.rmi.server.Operation[] operations = {
- new java.rmi.server.Operation("java.lang.Object getForbiddenClass()"),
- new java.rmi.server.Operation("java.rmi.registry.Registry getRegistry()"),
- new java.rmi.server.Operation("java.rmi.activation.ActivationGroupID returnGroupID()"),
- new java.rmi.server.Operation("void shutdown()")
+ new java.rmi.server.Operation("java.lang.Object getForbiddenClass()"),
+ new java.rmi.server.Operation("java.rmi.registry.Registry getRegistry()"),
+ new java.rmi.server.Operation("java.rmi.activation.ActivationGroupID returnGroupID()"),
+ new java.rmi.server.Operation("void shutdown()")
};
-
+
private static final long interfaceHash = 1677779850431817575L;
-
+
private static final long serialVersionUID = 2;
-
+
private static boolean useNewInvoke;
private static java.lang.reflect.Method $method_getForbiddenClass_0;
private static java.lang.reflect.Method $method_getRegistry_1;
private static java.lang.reflect.Method $method_returnGroupID_2;
private static java.lang.reflect.Method $method_shutdown_3;
-
+
static {
- try {
- java.rmi.server.RemoteRef.class.getMethod("invoke",
- new java.lang.Class[] {
- java.rmi.Remote.class,
- java.lang.reflect.Method.class,
- java.lang.Object[].class,
- long.class
- });
- useNewInvoke = true;
- $method_getForbiddenClass_0 = CanCreateStubs.class.getMethod("getForbiddenClass", new java.lang.Class[] {});
- $method_getRegistry_1 = CanCreateStubs.class.getMethod("getRegistry", new java.lang.Class[] {});
- $method_returnGroupID_2 = CanCreateStubs.class.getMethod("returnGroupID", new java.lang.Class[] {});
- $method_shutdown_3 = CanCreateStubs.class.getMethod("shutdown", new java.lang.Class[] {});
- } catch (java.lang.NoSuchMethodException e) {
- useNewInvoke = false;
- }
+ try {
+ java.rmi.server.RemoteRef.class.getMethod("invoke",
+ new java.lang.Class[] {
+ java.rmi.Remote.class,
+ java.lang.reflect.Method.class,
+ java.lang.Object[].class,
+ long.class
+ });
+ useNewInvoke = true;
+ $method_getForbiddenClass_0 = CanCreateStubs.class.getMethod("getForbiddenClass", new java.lang.Class[] {});
+ $method_getRegistry_1 = CanCreateStubs.class.getMethod("getRegistry", new java.lang.Class[] {});
+ $method_returnGroupID_2 = CanCreateStubs.class.getMethod("returnGroupID", new java.lang.Class[] {});
+ $method_shutdown_3 = CanCreateStubs.class.getMethod("shutdown", new java.lang.Class[] {});
+ } catch (java.lang.NoSuchMethodException e) {
+ useNewInvoke = false;
+ }
}
-
+
// constructors
public StubClassesPermitted_Stub() {
- super();
+ super();
}
public StubClassesPermitted_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of getForbiddenClass()
public java.lang.Object getForbiddenClass()
- throws java.lang.Exception
+ throws java.lang.Exception
{
- if (useNewInvoke) {
- Object $result = ref.invoke(this, $method_getForbiddenClass_0, null, -658265783646674294L);
- return ((java.lang.Object) $result);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
- ref.invoke(call);
- java.lang.Object $result;
- try {
- java.io.ObjectInput in = call.getInputStream();
- $result = (java.lang.Object) in.readObject();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } catch (java.lang.ClassNotFoundException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } finally {
- ref.done(call);
- }
- return $result;
- }
+ if (useNewInvoke) {
+ Object $result = ref.invoke(this, $method_getForbiddenClass_0, null, -658265783646674294L);
+ return ((java.lang.Object) $result);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
+ ref.invoke(call);
+ java.lang.Object $result;
+ try {
+ java.io.ObjectInput in = call.getInputStream();
+ $result = (java.lang.Object) in.readObject();
+ } catch (java.io.IOException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } catch (java.lang.ClassNotFoundException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } finally {
+ ref.done(call);
+ }
+ return $result;
+ }
}
-
+
// implementation of getRegistry()
public java.rmi.registry.Registry getRegistry()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- Object $result = ref.invoke(this, $method_getRegistry_1, null, 255311215504696981L);
- return ((java.rmi.registry.Registry) $result);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
- ref.invoke(call);
- java.rmi.registry.Registry $result;
- try {
- java.io.ObjectInput in = call.getInputStream();
- $result = (java.rmi.registry.Registry) in.readObject();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } catch (java.lang.ClassNotFoundException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } finally {
- ref.done(call);
- }
- return $result;
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ Object $result = ref.invoke(this, $method_getRegistry_1, null, 255311215504696981L);
+ return ((java.rmi.registry.Registry) $result);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
+ ref.invoke(call);
+ java.rmi.registry.Registry $result;
+ try {
+ java.io.ObjectInput in = call.getInputStream();
+ $result = (java.rmi.registry.Registry) in.readObject();
+ } catch (java.io.IOException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } catch (java.lang.ClassNotFoundException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } finally {
+ ref.done(call);
+ }
+ return $result;
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of returnGroupID()
public java.rmi.activation.ActivationGroupID returnGroupID()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- Object $result = ref.invoke(this, $method_returnGroupID_2, null, 6267304638191237098L);
- return ((java.rmi.activation.ActivationGroupID) $result);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 2, interfaceHash);
- ref.invoke(call);
- java.rmi.activation.ActivationGroupID $result;
- try {
- java.io.ObjectInput in = call.getInputStream();
- $result = (java.rmi.activation.ActivationGroupID) in.readObject();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } catch (java.lang.ClassNotFoundException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } finally {
- ref.done(call);
- }
- return $result;
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ Object $result = ref.invoke(this, $method_returnGroupID_2, null, 6267304638191237098L);
+ return ((java.rmi.activation.ActivationGroupID) $result);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 2, interfaceHash);
+ ref.invoke(call);
+ java.rmi.activation.ActivationGroupID $result;
+ try {
+ java.io.ObjectInput in = call.getInputStream();
+ $result = (java.rmi.activation.ActivationGroupID) in.readObject();
+ } catch (java.io.IOException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } catch (java.lang.ClassNotFoundException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } finally {
+ ref.done(call);
+ }
+ return $result;
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of shutdown()
public void shutdown()
- throws java.lang.Exception
+ throws java.lang.Exception
{
- if (useNewInvoke) {
- ref.invoke(this, $method_shutdown_3, null, -7207851917985848402L);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 3, interfaceHash);
- ref.invoke(call);
- ref.done(call);
- }
+ if (useNewInvoke) {
+ ref.invoke(this, $method_shutdown_3, null, -7207851917985848402L);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 3, interfaceHash);
+ ref.invoke(call);
+ ref.done(call);
+ }
}
}
--- a/jdk/test/java/rmi/activation/ActivationSystem/unregisterGroup/ActivateMe.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivationSystem/unregisterGroup/ActivateMe.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
--- a/jdk/test/java/rmi/activation/ActivationSystem/unregisterGroup/CallbackInterface.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivationSystem/unregisterGroup/CallbackInterface.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -27,4 +27,3 @@
public void inc() throws RemoteException;
public int getNumDeactivated() throws RemoteException;
}
-
--- a/jdk/test/java/rmi/activation/ActivationSystem/unregisterGroup/Callback_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivationSystem/unregisterGroup/Callback_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,94 +29,94 @@
implements CallbackInterface, java.rmi.Remote
{
private static final java.rmi.server.Operation[] operations = {
- new java.rmi.server.Operation("int getNumDeactivated()"),
- new java.rmi.server.Operation("void inc()")
+ new java.rmi.server.Operation("int getNumDeactivated()"),
+ new java.rmi.server.Operation("void inc()")
};
-
+
private static final long interfaceHash = -1008194523112388035L;
-
+
private static final long serialVersionUID = 2;
-
+
private static boolean useNewInvoke;
private static java.lang.reflect.Method $method_getNumDeactivated_0;
private static java.lang.reflect.Method $method_inc_1;
-
+
static {
- try {
- java.rmi.server.RemoteRef.class.getMethod("invoke",
- new java.lang.Class[] {
- java.rmi.Remote.class,
- java.lang.reflect.Method.class,
- java.lang.Object[].class,
- long.class
- });
- useNewInvoke = true;
- $method_getNumDeactivated_0 = CallbackInterface.class.getMethod("getNumDeactivated", new java.lang.Class[] {});
- $method_inc_1 = CallbackInterface.class.getMethod("inc", new java.lang.Class[] {});
- } catch (java.lang.NoSuchMethodException e) {
- useNewInvoke = false;
- }
+ try {
+ java.rmi.server.RemoteRef.class.getMethod("invoke",
+ new java.lang.Class[] {
+ java.rmi.Remote.class,
+ java.lang.reflect.Method.class,
+ java.lang.Object[].class,
+ long.class
+ });
+ useNewInvoke = true;
+ $method_getNumDeactivated_0 = CallbackInterface.class.getMethod("getNumDeactivated", new java.lang.Class[] {});
+ $method_inc_1 = CallbackInterface.class.getMethod("inc", new java.lang.Class[] {});
+ } catch (java.lang.NoSuchMethodException e) {
+ useNewInvoke = false;
+ }
}
-
+
// constructors
public Callback_Stub() {
- super();
+ super();
}
public Callback_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of getNumDeactivated()
public int getNumDeactivated()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- Object $result = ref.invoke(this, $method_getNumDeactivated_0, null, -761062487639949912L);
- return ((java.lang.Integer) $result).intValue();
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
- ref.invoke(call);
- int $result;
- try {
- java.io.ObjectInput in = call.getInputStream();
- $result = in.readInt();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } finally {
- ref.done(call);
- }
- return $result;
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ Object $result = ref.invoke(this, $method_getNumDeactivated_0, null, -761062487639949912L);
+ return ((java.lang.Integer) $result).intValue();
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
+ ref.invoke(call);
+ int $result;
+ try {
+ java.io.ObjectInput in = call.getInputStream();
+ $result = in.readInt();
+ } catch (java.io.IOException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } finally {
+ ref.done(call);
+ }
+ return $result;
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of inc()
public void inc()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- ref.invoke(this, $method_inc_1, null, 4394985085384332959L);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
- ref.invoke(call);
- ref.done(call);
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ ref.invoke(this, $method_inc_1, null, 4394985085384332959L);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
+ ref.invoke(call);
+ ref.done(call);
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/activation/ActivationSystem/unregisterGroup/UnregisterGroup.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivationSystem/unregisterGroup/UnregisterGroup.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -65,8 +65,8 @@
}
public class UnregisterGroup
- extends Activatable
- implements ActivateMe, Runnable
+ extends Activatable
+ implements ActivateMe, Runnable
{
private static Exception exception = null;
@@ -77,30 +77,30 @@
private static int PORT = 2006;
public UnregisterGroup(ActivationID id, MarshalledObject mobj)
- throws Exception
+ throws Exception
{
- super(id, 0);
+ super(id, 0);
}
public void ping()
{}
public void unregister() throws Exception {
- super.unregister(super.getID());
+ super.unregister(super.getID());
}
-
+
/**
* Spawns a thread to deactivate the object.
*/
public void shutdown() throws Exception {
- (new Thread(this,"UnregisterGroup")).start();
+ (new Thread(this,"UnregisterGroup")).start();
}
/**
* To support exiting of group VM as a last resort
*/
public void justGoAway() {
- System.exit(0);
+ System.exit(0);
}
/**
@@ -111,151 +111,151 @@
*/
public void run() {
- ActivationLibrary.deactivate(this, getID());
- System.err.println("\tActivationLibrary.deactivate returned");
+ ActivationLibrary.deactivate(this, getID());
+ System.err.println("\tActivationLibrary.deactivate returned");
- try {
- CallbackInterface cobj =
- (CallbackInterface)Naming.lookup("//:" + PORT + "/Callback");
- cobj.inc();
- } catch (Exception e) {
- System.err.println("cobj.inc exception");
- e.printStackTrace();
- }
+ try {
+ CallbackInterface cobj =
+ (CallbackInterface)Naming.lookup("//:" + PORT + "/Callback");
+ cobj.inc();
+ } catch (Exception e) {
+ System.err.println("cobj.inc exception");
+ e.printStackTrace();
+ }
}
public static void main(String[] args) {
- Registry registry;
+ Registry registry;
+
+ System.err.println("\nRegression test for bug 4134233\n");
+
+ TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
+ RMID rmid = null;
+
+ try {
+ RMID.removeLog();
+ rmid = RMID.createRMID();
+ rmid.start();
- System.err.println("\nRegression test for bug 4134233\n");
-
- TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
- RMID rmid = null;
-
- try {
- RMID.removeLog();
- rmid = RMID.createRMID();
- rmid.start();
+ /* Cause activation groups to have a security policy that will
+ * allow security managers to be downloaded and installed
+ */
+ final Properties p = new Properties();
+ // this test must always set policies/managers in its
+ // activation groups
+ p.put("java.security.policy",
+ TestParams.defaultGroupPolicy);
+ p.put("java.security.manager",
+ TestParams.defaultSecurityManager);
- /* Cause activation groups to have a security policy that will
- * allow security managers to be downloaded and installed
- */
- final Properties p = new Properties();
- // this test must always set policies/managers in its
- // activation groups
- p.put("java.security.policy",
- TestParams.defaultGroupPolicy);
- p.put("java.security.manager",
- TestParams.defaultSecurityManager);
+ //final int NUM_OBJECTS = 10;
- //final int NUM_OBJECTS = 10;
-
- Thread t = new Thread() {
- public void run () {
- try {
- System.err.println("Creating group descriptor");
- ActivationGroupDesc groupDesc =
- new ActivationGroupDesc(p, null);
- ActivationSystem system = ActivationGroup.getSystem();
- ActivationGroupID groupID =
- system.registerGroup(groupDesc);
+ Thread t = new Thread() {
+ public void run () {
+ try {
+ System.err.println("Creating group descriptor");
+ ActivationGroupDesc groupDesc =
+ new ActivationGroupDesc(p, null);
+ ActivationSystem system = ActivationGroup.getSystem();
+ ActivationGroupID groupID =
+ system.registerGroup(groupDesc);
- ActivateMe[] obj = new ActivateMe[NUM_OBJECTS];
+ ActivateMe[] obj = new ActivateMe[NUM_OBJECTS];
- for (int i = 0; i < NUM_OBJECTS; i++) {
- System.err.println("Creating descriptor: " + i);
- ActivationDesc desc =
- new ActivationDesc(groupID, "UnregisterGroup",
- null, null);
- System.err.println("Registering descriptor: " + i);
- obj[i] = (ActivateMe) Activatable.register(desc);
- System.err.println("Activating object: " + i);
- obj[i].ping();
- }
- lastResortExitObj = obj[0];
+ for (int i = 0; i < NUM_OBJECTS; i++) {
+ System.err.println("Creating descriptor: " + i);
+ ActivationDesc desc =
+ new ActivationDesc(groupID, "UnregisterGroup",
+ null, null);
+ System.err.println("Registering descriptor: " + i);
+ obj[i] = (ActivateMe) Activatable.register(desc);
+ System.err.println("Activating object: " + i);
+ obj[i].ping();
+ }
+ lastResortExitObj = obj[0];
- System.err.println("Unregistering group");
- system.unregisterGroup(groupID);
+ System.err.println("Unregistering group");
+ system.unregisterGroup(groupID);
- try {
- System.err.println("Get the group descriptor");
- system.getActivationGroupDesc(groupID);
- error = "test failed: group still registered";
- } catch (UnknownGroupException e) {
- System.err.println("Test passed: " +
- "group unregistered");
- }
+ try {
+ System.err.println("Get the group descriptor");
+ system.getActivationGroupDesc(groupID);
+ error = "test failed: group still registered";
+ } catch (UnknownGroupException e) {
+ System.err.println("Test passed: " +
+ "group unregistered");
+ }
- /*
- * Deactivate objects so group VM will exit.
- */
- for (int i = 0; i < NUM_OBJECTS; i++) {
- System.err.println("Deactivating object: " + i);
- obj[i].shutdown();
- obj[i] = null;
- }
- lastResortExitObj = null;
+ /*
+ * Deactivate objects so group VM will exit.
+ */
+ for (int i = 0; i < NUM_OBJECTS; i++) {
+ System.err.println("Deactivating object: " + i);
+ obj[i].shutdown();
+ obj[i] = null;
+ }
+ lastResortExitObj = null;
- } catch (Exception e) {
- exception = e;
- }
+ } catch (Exception e) {
+ exception = e;
+ }
- done = true;
- }
- };
+ done = true;
+ }
+ };
- t.start();
- t.join(120000);
+ t.start();
+ t.join(120000);
- if (exception != null) {
- TestLibrary.bomb("test failed", exception);
- } else if (error != null) {
- TestLibrary.bomb(error, null);
- } else if (!done) {
- TestLibrary.bomb("test failed: not completed before timeout", null);
- } else {
- System.err.println("Test passed");
- }
+ if (exception != null) {
+ TestLibrary.bomb("test failed", exception);
+ } else if (error != null) {
+ TestLibrary.bomb(error, null);
+ } else if (!done) {
+ TestLibrary.bomb("test failed: not completed before timeout", null);
+ } else {
+ System.err.println("Test passed");
+ }
+
-
- } catch (Exception e) {
- TestLibrary.bomb("test failed", e);
- } finally {
- if (lastResortExitObj != null) {
- try {
- lastResortExitObj.justGoAway();
- } catch (Exception munch) {
- }
- }
+ } catch (Exception e) {
+ TestLibrary.bomb("test failed", e);
+ } finally {
+ if (lastResortExitObj != null) {
+ try {
+ lastResortExitObj.justGoAway();
+ } catch (Exception munch) {
+ }
+ }
- // Wait for the object deactivation to take place first
- try {
+ // Wait for the object deactivation to take place first
+ try {
- // create reg and export callback object
- registry = LocateRegistry.createRegistry(PORT);
- Callback robj = new Callback();
- registry.bind("Callback", robj);
+ // create reg and export callback object
+ registry = LocateRegistry.createRegistry(PORT);
+ Callback robj = new Callback();
+ registry.bind("Callback", robj);
- //get the callback object
- int maxwait=30;
- int nd = robj.getNumDeactivated();
- while ((nd < NUM_OBJECTS) && (maxwait> 0)) {
- System.err.println("num_deactivated="+nd);
- try {
- Thread.sleep(1000);
- } catch (InterruptedException ie) {}
- maxwait--;
- nd = robj.getNumDeactivated();
- }
- } catch (Exception ce) {
- System.err.println("E:"+ce);
- ce.printStackTrace();
- }
+ //get the callback object
+ int maxwait=30;
+ int nd = robj.getNumDeactivated();
+ while ((nd < NUM_OBJECTS) && (maxwait> 0)) {
+ System.err.println("num_deactivated="+nd);
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException ie) {}
+ maxwait--;
+ nd = robj.getNumDeactivated();
+ }
+ } catch (Exception ce) {
+ System.err.println("E:"+ce);
+ ce.printStackTrace();
+ }
- ActivationLibrary.rmidCleanup(rmid);
- }
+ ActivationLibrary.rmidCleanup(rmid);
+ }
}
}
--- a/jdk/test/java/rmi/activation/ActivationSystem/unregisterGroup/UnregisterGroup_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/activation/ActivationSystem/unregisterGroup/UnregisterGroup_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,116 +29,116 @@
implements ActivateMe, java.rmi.Remote
{
private static final java.rmi.server.Operation[] operations = {
- new java.rmi.server.Operation("void justGoAway()"),
- new java.rmi.server.Operation("void ping()"),
- new java.rmi.server.Operation("void shutdown()"),
- new java.rmi.server.Operation("void unregister()")
+ new java.rmi.server.Operation("void justGoAway()"),
+ new java.rmi.server.Operation("void ping()"),
+ new java.rmi.server.Operation("void shutdown()"),
+ new java.rmi.server.Operation("void unregister()")
};
-
+
private static final long interfaceHash = -4733924075192691630L;
-
+
private static final long serialVersionUID = 2;
-
+
private static boolean useNewInvoke;
private static java.lang.reflect.Method $method_justGoAway_0;
private static java.lang.reflect.Method $method_ping_1;
private static java.lang.reflect.Method $method_shutdown_2;
private static java.lang.reflect.Method $method_unregister_3;
-
+
static {
- try {
- java.rmi.server.RemoteRef.class.getMethod("invoke",
- new java.lang.Class[] {
- java.rmi.Remote.class,
- java.lang.reflect.Method.class,
- java.lang.Object[].class,
- long.class
- });
- useNewInvoke = true;
- $method_justGoAway_0 = ActivateMe.class.getMethod("justGoAway", new java.lang.Class[] {});
- $method_ping_1 = ActivateMe.class.getMethod("ping", new java.lang.Class[] {});
- $method_shutdown_2 = ActivateMe.class.getMethod("shutdown", new java.lang.Class[] {});
- $method_unregister_3 = ActivateMe.class.getMethod("unregister", new java.lang.Class[] {});
- } catch (java.lang.NoSuchMethodException e) {
- useNewInvoke = false;
- }
+ try {
+ java.rmi.server.RemoteRef.class.getMethod("invoke",
+ new java.lang.Class[] {
+ java.rmi.Remote.class,
+ java.lang.reflect.Method.class,
+ java.lang.Object[].class,
+ long.class
+ });
+ useNewInvoke = true;
+ $method_justGoAway_0 = ActivateMe.class.getMethod("justGoAway", new java.lang.Class[] {});
+ $method_ping_1 = ActivateMe.class.getMethod("ping", new java.lang.Class[] {});
+ $method_shutdown_2 = ActivateMe.class.getMethod("shutdown", new java.lang.Class[] {});
+ $method_unregister_3 = ActivateMe.class.getMethod("unregister", new java.lang.Class[] {});
+ } catch (java.lang.NoSuchMethodException e) {
+ useNewInvoke = false;
+ }
}
-
+
// constructors
public UnregisterGroup_Stub() {
- super();
+ super();
}
public UnregisterGroup_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of justGoAway()
public void justGoAway()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- ref.invoke(this, $method_justGoAway_0, null, -5382478058620783904L);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
- ref.invoke(call);
- ref.done(call);
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ ref.invoke(this, $method_justGoAway_0, null, -5382478058620783904L);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
+ ref.invoke(call);
+ ref.done(call);
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of ping()
public void ping()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- ref.invoke(this, $method_ping_1, null, 5866401369815527589L);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
- ref.invoke(call);
- ref.done(call);
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ ref.invoke(this, $method_ping_1, null, 5866401369815527589L);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
+ ref.invoke(call);
+ ref.done(call);
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of shutdown()
public void shutdown()
- throws java.lang.Exception
+ throws java.lang.Exception
{
- if (useNewInvoke) {
- ref.invoke(this, $method_shutdown_2, null, -7207851917985848402L);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 2, interfaceHash);
- ref.invoke(call);
- ref.done(call);
- }
+ if (useNewInvoke) {
+ ref.invoke(this, $method_shutdown_2, null, -7207851917985848402L);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 2, interfaceHash);
+ ref.invoke(call);
+ ref.done(call);
+ }
}
-
+
// implementation of unregister()
public void unregister()
- throws java.lang.Exception
+ throws java.lang.Exception
{
- if (useNewInvoke) {
- ref.invoke(this, $method_unregister_3, null, -5366864281862648102L);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 3, interfaceHash);
- ref.invoke(call);
- ref.done(call);
- }
+ if (useNewInvoke) {
+ ref.invoke(this, $method_unregister_3, null, -5366864281862648102L);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 3, interfaceHash);
+ ref.invoke(call);
+ ref.done(call);
+ }
}
}
--- a/jdk/test/java/rmi/dgc/VMID/CheckVMID.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/dgc/VMID/CheckVMID.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -41,17 +41,17 @@
public static void main(String[] args) {
- System.err.println("\nRegression test for bug 4171370\n");
+ System.err.println("\nRegression test for bug 4171370\n");
- TestLibrary.suggestSecurityManager(null);
+ TestLibrary.suggestSecurityManager(null);
- try {
- System.err.println("Create a VMID");
- VMID vmid = new VMID();
- System.err.println("vmid = " + vmid);
- } catch (Exception e) {
- e.printStackTrace();
- throw new RuntimeException("TEST FAILED: " + e.toString());
- }
+ try {
+ System.err.println("Create a VMID");
+ VMID vmid = new VMID();
+ System.err.println("vmid = " + vmid);
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException("TEST FAILED: " + e.toString());
+ }
}
}
--- a/jdk/test/java/rmi/dgc/dgcAckFailure/DGCAckFailure.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/dgc/dgcAckFailure/DGCAckFailure.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -51,123 +51,123 @@
private static final long TIMEOUT = 20000;
public Object returnRemote() {
- return new Wrapper(this);
+ return new Wrapper(this);
}
public static void main(String[] args) throws Exception {
- System.setProperty("sun.rmi.dgc.ackTimeout", "10000");
+ System.setProperty("sun.rmi.dgc.ackTimeout", "10000");
- /*
- * Set a socket factory that has a hook for shutting down all client
- * output (writes from client-created sockets and new connection
- * attempts). We then use this hook right before a remote stub gets
- * deserialized, so that the client will not be able to send a DGC
- * dirty call, or a DGC acknowledgment. Without the DGC ack, we
- * hope that the RMI runtime will still eventually allow the remote
- * object to be garbage collected.
- */
- RMISocketFactory.setSocketFactory(new TestSF());
- System.err.println("test socket factory set");
+ /*
+ * Set a socket factory that has a hook for shutting down all client
+ * output (writes from client-created sockets and new connection
+ * attempts). We then use this hook right before a remote stub gets
+ * deserialized, so that the client will not be able to send a DGC
+ * dirty call, or a DGC acknowledgment. Without the DGC ack, we
+ * hope that the RMI runtime will still eventually allow the remote
+ * object to be garbage collected.
+ */
+ RMISocketFactory.setSocketFactory(new TestSF());
+ System.err.println("test socket factory set");
- Remote impl = new DGCAckFailure();
- ReferenceQueue refQueue = new ReferenceQueue();
- Reference weakRef = new WeakReference(impl, refQueue);
- ReturnRemote stub =
- (ReturnRemote) UnicastRemoteObject.exportObject(impl);
- System.err.println("remote object exported; stub = " + stub);
+ Remote impl = new DGCAckFailure();
+ ReferenceQueue refQueue = new ReferenceQueue();
+ Reference weakRef = new WeakReference(impl, refQueue);
+ ReturnRemote stub =
+ (ReturnRemote) UnicastRemoteObject.exportObject(impl);
+ System.err.println("remote object exported; stub = " + stub);
- try {
- Object wrappedStub = stub.returnRemote();
- System.err.println("invocation returned: " + wrappedStub);
+ try {
+ Object wrappedStub = stub.returnRemote();
+ System.err.println("invocation returned: " + wrappedStub);
- impl = null;
- stub = null; // in case 4114579 ever gets fixed
- System.err.println("strong references to impl cleared");
+ impl = null;
+ stub = null; // in case 4114579 ever gets fixed
+ System.err.println("strong references to impl cleared");
- System.err.println("waiting for weak reference notification:");
- Reference ref = null;
- for (int i = 0; i < 6; i++) {
- System.gc();
- ref = refQueue.remove(TIMEOUT / 5);
- if (ref != null) {
- break;
- }
- }
- if (ref == weakRef) {
- System.err.println("TEST PASSED");
- } else {
- throw new RuntimeException("TEST FAILED: " +
- "timed out, remote object not garbage collected");
- }
- } finally {
- try {
- UnicastRemoteObject.unexportObject((Remote) weakRef.get(),
- true);
- } catch (Exception e) {
- }
- }
+ System.err.println("waiting for weak reference notification:");
+ Reference ref = null;
+ for (int i = 0; i < 6; i++) {
+ System.gc();
+ ref = refQueue.remove(TIMEOUT / 5);
+ if (ref != null) {
+ break;
+ }
+ }
+ if (ref == weakRef) {
+ System.err.println("TEST PASSED");
+ } else {
+ throw new RuntimeException("TEST FAILED: " +
+ "timed out, remote object not garbage collected");
+ }
+ } finally {
+ try {
+ UnicastRemoteObject.unexportObject((Remote) weakRef.get(),
+ true);
+ } catch (Exception e) {
+ }
+ }
}
private static class Wrapper implements Serializable {
- private final Remote obj;
- Wrapper(Remote obj) { this.obj = obj; }
+ private final Remote obj;
+ Wrapper(Remote obj) { this.obj = obj; }
- private void readObject(ObjectInputStream in)
- throws IOException, ClassNotFoundException
- {
- TestSF.shutdownClientOutput();
- System.err.println(
- "Wrapper.readObject: SHUTTING DOWN CLIENT OUTPUT");
- in.defaultReadObject();
- }
+ private void readObject(ObjectInputStream in)
+ throws IOException, ClassNotFoundException
+ {
+ TestSF.shutdownClientOutput();
+ System.err.println(
+ "Wrapper.readObject: SHUTTING DOWN CLIENT OUTPUT");
+ in.defaultReadObject();
+ }
- public String toString() { return "Wrapper[" + obj + "]"; }
+ public String toString() { return "Wrapper[" + obj + "]"; }
}
private static class TestSF extends RMISocketFactory {
- private static volatile boolean shutdown = false;
- static void shutdownClientOutput() { shutdown = true; }
+ private static volatile boolean shutdown = false;
+ static void shutdownClientOutput() { shutdown = true; }
- public Socket createSocket(String host, int port) throws IOException {
- if (shutdown) {
- IOException e = new java.net.ConnectException(
- "test socket factory rejecting client connection");
- System.err.println(e);
-// e.printStackTrace();
- throw e;
- } else {
- return new TestSocket(host, port);
- }
- }
+ public Socket createSocket(String host, int port) throws IOException {
+ if (shutdown) {
+ IOException e = new java.net.ConnectException(
+ "test socket factory rejecting client connection");
+ System.err.println(e);
+// e.printStackTrace();
+ throw e;
+ } else {
+ return new TestSocket(host, port);
+ }
+ }
- public ServerSocket createServerSocket(int port) throws IOException {
- return new ServerSocket(port);
- }
+ public ServerSocket createServerSocket(int port) throws IOException {
+ return new ServerSocket(port);
+ }
- private static class TestSocket extends Socket {
- TestSocket(String host, int port) throws IOException {
- super(host, port);
- }
- public OutputStream getOutputStream() throws IOException {
- return new TestOutputStream(super.getOutputStream());
- }
- }
+ private static class TestSocket extends Socket {
+ TestSocket(String host, int port) throws IOException {
+ super(host, port);
+ }
+ public OutputStream getOutputStream() throws IOException {
+ return new TestOutputStream(super.getOutputStream());
+ }
+ }
- private static class TestOutputStream extends FilterOutputStream {
- TestOutputStream(OutputStream out) { super(out); }
- public void write(int b) throws IOException {
- if (shutdown) {
- IOException e = new IOException(
- "connection broken by test socket factory");
- System.err.println(e);
-// e.printStackTrace();
- throw e;
- } else {
- super.write(b);
- }
- }
- }
+ private static class TestOutputStream extends FilterOutputStream {
+ TestOutputStream(OutputStream out) { super(out); }
+ public void write(int b) throws IOException {
+ if (shutdown) {
+ IOException e = new IOException(
+ "connection broken by test socket factory");
+ System.err.println(e);
+// e.printStackTrace();
+ throw e;
+ } else {
+ super.write(b);
+ }
+ }
+ }
}
}
--- a/jdk/test/java/rmi/dgc/dgcAckFailure/DGCAckFailure_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/dgc/dgcAckFailure/DGCAckFailure_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,38 +29,38 @@
implements ReturnRemote
{
private static final long serialVersionUID = 2;
-
+
private static java.lang.reflect.Method $method_returnRemote_0;
-
+
static {
- try {
- $method_returnRemote_0 = ReturnRemote.class.getMethod("returnRemote", new java.lang.Class[] {});
- } catch (java.lang.NoSuchMethodException e) {
- throw new java.lang.NoSuchMethodError(
- "stub class initialization failed");
- }
+ try {
+ $method_returnRemote_0 = ReturnRemote.class.getMethod("returnRemote", new java.lang.Class[] {});
+ } catch (java.lang.NoSuchMethodException e) {
+ throw new java.lang.NoSuchMethodError(
+ "stub class initialization failed");
+ }
}
-
+
// constructors
public DGCAckFailure_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of returnRemote()
public java.lang.Object returnRemote()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- Object $result = ref.invoke(this, $method_returnRemote_0, null, -8981544221566403070L);
- return ((java.lang.Object) $result);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ Object $result = ref.invoke(this, $method_returnRemote_0, null, -8981544221566403070L);
+ return ((java.lang.Object) $result);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/dgc/dgcImplInsulation/DGCImplInsulation.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/dgc/dgcImplInsulation/DGCImplInsulation.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001-2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -57,55 +57,55 @@
public static void main(String[] args) throws Exception {
- TestLibrary.suggestSecurityManager(null);
+ TestLibrary.suggestSecurityManager(null);
- Permissions perms = new Permissions();
- perms.add(new SocketPermission("*:1024-", "listen"));
- AccessControlContext acc =
- new AccessControlContext(new ProtectionDomain[] {
- new ProtectionDomain(
- new CodeSource(null, (Certificate[]) null), perms) });
+ Permissions perms = new Permissions();
+ perms.add(new SocketPermission("*:1024-", "listen"));
+ AccessControlContext acc =
+ new AccessControlContext(new ProtectionDomain[] {
+ new ProtectionDomain(
+ new CodeSource(null, (Certificate[]) null), perms) });
- Remote impl = new DGCImplInsulation();;
+ Remote impl = new DGCImplInsulation();;
- try {
- Remote stub = (Remote) java.security.AccessController.doPrivileged(
- new ExportAction(impl));
- System.err.println("exported remote object; local stub: " + stub);
+ try {
+ Remote stub = (Remote) java.security.AccessController.doPrivileged(
+ new ExportAction(impl));
+ System.err.println("exported remote object; local stub: " + stub);
- MarshalledObject mobj = new MarshalledObject(stub);
- stub = (Remote) mobj.get();
- System.err.println("marshalled/unmarshalled stub: " + stub);
+ MarshalledObject mobj = new MarshalledObject(stub);
+ stub = (Remote) mobj.get();
+ System.err.println("marshalled/unmarshalled stub: " + stub);
- ReferenceQueue refQueue = new ReferenceQueue();
- Reference weakRef = new WeakReference(impl, refQueue);
- impl = null;
- System.gc();
- if (refQueue.remove(TIMEOUT) == weakRef) {
- throw new RuntimeException(
- "TEST FAILED: remote object garbage collected");
- } else {
- System.err.println("TEST PASSED");
- stub = null;
- System.gc();
- Thread.sleep(2000);
- System.gc();
- }
- } finally {
- try {
- UnicastRemoteObject.unexportObject(impl, true);
- } catch (Exception e) {
- }
- }
+ ReferenceQueue refQueue = new ReferenceQueue();
+ Reference weakRef = new WeakReference(impl, refQueue);
+ impl = null;
+ System.gc();
+ if (refQueue.remove(TIMEOUT) == weakRef) {
+ throw new RuntimeException(
+ "TEST FAILED: remote object garbage collected");
+ } else {
+ System.err.println("TEST PASSED");
+ stub = null;
+ System.gc();
+ Thread.sleep(2000);
+ System.gc();
+ }
+ } finally {
+ try {
+ UnicastRemoteObject.unexportObject(impl, true);
+ } catch (Exception e) {
+ }
+ }
}
private static class ExportAction implements PrivilegedExceptionAction {
- private final Remote impl;
- ExportAction(Remote impl) {
- this.impl = impl;
- }
- public Object run() throws Exception {
- return UnicastRemoteObject.exportObject(impl);
- }
+ private final Remote impl;
+ ExportAction(Remote impl) {
+ this.impl = impl;
+ }
+ public Object run() throws Exception {
+ return UnicastRemoteObject.exportObject(impl);
+ }
}
}
--- a/jdk/test/java/rmi/dgc/dgcImplInsulation/DGCImplInsulation_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/dgc/dgcImplInsulation/DGCImplInsulation_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,10 +29,10 @@
implements java.rmi.Remote
{
private static final long serialVersionUID = 2;
-
+
// constructors
public DGCImplInsulation_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
}
--- a/jdk/test/java/rmi/dgc/retryDirtyCalls/RetryDirtyCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/dgc/retryDirtyCalls/RetryDirtyCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -55,108 +55,108 @@
* Return this object. The need for this method is explained below.
*/
public Self getSelf() {
- return this;
+ return this;
}
public void unreferenced() {
- synchronized (this) {
- unreferenced = true;
- notifyAll();
- }
+ synchronized (this) {
+ unreferenced = true;
+ notifyAll();
+ }
}
public static void main(String[] args) {
- System.err.println("\nRegression test for bug 4268258\n");
+ System.err.println("\nRegression test for bug 4268258\n");
- /*
- * Set properties to tweak DGC behavior so that this test will execute
- * quickly: set the granted lease duration to 10 seconds, the interval
- * that leases are checked to 3 seconds.
- */
- System.setProperty("java.rmi.dgc.leaseValue", "10000");
- System.setProperty("sun.rmi.dgc.checkInterval", "3000");
+ /*
+ * Set properties to tweak DGC behavior so that this test will execute
+ * quickly: set the granted lease duration to 10 seconds, the interval
+ * that leases are checked to 3 seconds.
+ */
+ System.setProperty("java.rmi.dgc.leaseValue", "10000");
+ System.setProperty("sun.rmi.dgc.checkInterval", "3000");
- /*
- * Make idle connections time out almost instantly (0.1 seconds) so
- * that the DGC implementation will have to make a new connection for
- * each dirty call, thus going through the socket factory, where we
- * can easily cause the operation to fail.
- */
- System.setProperty("sun.rmi.transport.connectionTimeout", "100");
+ /*
+ * Make idle connections time out almost instantly (0.1 seconds) so
+ * that the DGC implementation will have to make a new connection for
+ * each dirty call, thus going through the socket factory, where we
+ * can easily cause the operation to fail.
+ */
+ System.setProperty("sun.rmi.transport.connectionTimeout", "100");
- RetryDirtyCalls impl = new RetryDirtyCalls();
+ RetryDirtyCalls impl = new RetryDirtyCalls();
- try {
- TestSF sf = new TestSF();
- RMISocketFactory.setSocketFactory(sf);
+ try {
+ TestSF sf = new TestSF();
+ RMISocketFactory.setSocketFactory(sf);
- /*
- * The stub returned by UnicastRemoteObject.exportObject() does
- * not participate in DGC, but it does allow us to invoke a method
- * on the remote object through RMI. Therefore, we invoke the
- * getSelf() method through RMI, which returns an equivalent stub
- * that does participate in DGC.
- */
- Self stub = (Self) UnicastRemoteObject.exportObject(impl);
- Self dgcStub = stub.getSelf();
- stub = null; // in case 4114579 has been fixed
+ /*
+ * The stub returned by UnicastRemoteObject.exportObject() does
+ * not participate in DGC, but it does allow us to invoke a method
+ * on the remote object through RMI. Therefore, we invoke the
+ * getSelf() method through RMI, which returns an equivalent stub
+ * that does participate in DGC.
+ */
+ Self stub = (Self) UnicastRemoteObject.exportObject(impl);
+ Self dgcStub = stub.getSelf();
+ stub = null; // in case 4114579 has been fixed
- /*
- * Set the socket factory to cause 3 connections attempts in a row
- * to fail before allowing a connection to succeed, expecting the
- * client-side DGC implementation to make at least four attempts.
- */
- final int FLAKE_FACTOR = 3;
- sf.setFlakeFactor(FLAKE_FACTOR);
+ /*
+ * Set the socket factory to cause 3 connections attempts in a row
+ * to fail before allowing a connection to succeed, expecting the
+ * client-side DGC implementation to make at least four attempts.
+ */
+ final int FLAKE_FACTOR = 3;
+ sf.setFlakeFactor(FLAKE_FACTOR);
- long deadline = System.currentTimeMillis() + TIMEOUT;
- boolean unreferenced;
+ long deadline = System.currentTimeMillis() + TIMEOUT;
+ boolean unreferenced;
- synchronized (impl) {
- while (!(unreferenced = impl.unreferenced)) {
- long timeToWait = deadline - System.currentTimeMillis();
- if (timeToWait > 0) {
- impl.wait(timeToWait);
- } else {
- break;
- }
- }
- }
+ synchronized (impl) {
+ while (!(unreferenced = impl.unreferenced)) {
+ long timeToWait = deadline - System.currentTimeMillis();
+ if (timeToWait > 0) {
+ impl.wait(timeToWait);
+ } else {
+ break;
+ }
+ }
+ }
- if (unreferenced) {
- throw new RuntimeException("remote object unreferenced");
- }
+ if (unreferenced) {
+ throw new RuntimeException("remote object unreferenced");
+ }
- int createCount = sf.getCreateCount();
- if (createCount == 0) {
- throw new RuntimeException("test socket factory never used");
- } else if (createCount < (FLAKE_FACTOR + 3)) {
- /*
- * The unreferenced method was not invoked for some reason,
- * but the dirty calls were clearly not retried well enough.
- */
- throw new RuntimeException(
- "test failed because dirty calls not retried enough, " +
- "but remote object not unreferenced");
- }
+ int createCount = sf.getCreateCount();
+ if (createCount == 0) {
+ throw new RuntimeException("test socket factory never used");
+ } else if (createCount < (FLAKE_FACTOR + 3)) {
+ /*
+ * The unreferenced method was not invoked for some reason,
+ * but the dirty calls were clearly not retried well enough.
+ */
+ throw new RuntimeException(
+ "test failed because dirty calls not retried enough, " +
+ "but remote object not unreferenced");
+ }
- System.err.println(
- "TEST PASSED: remote object not unreferenced");
+ System.err.println(
+ "TEST PASSED: remote object not unreferenced");
- } catch (Exception e) {
- e.printStackTrace();
- throw new RuntimeException("TEST FAILED: " + e.toString());
- } finally {
- /*
- * When all is said and done, try to unexport the remote object
- * so that the VM has a chance to exit.
- */
- try {
- UnicastRemoteObject.unexportObject(impl, true);
- } catch (Exception e) {
- }
- }
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException("TEST FAILED: " + e.toString());
+ } finally {
+ /*
+ * When all is said and done, try to unexport the remote object
+ * so that the VM has a chance to exit.
+ */
+ try {
+ UnicastRemoteObject.unexportObject(impl, true);
+ } catch (Exception e) {
+ }
+ }
}
}
@@ -169,30 +169,30 @@
private int createCount = 0;
public synchronized void setFlakeFactor(int newFlakeFactor) {
- flakeFactor = newFlakeFactor;
+ flakeFactor = newFlakeFactor;
}
public synchronized int getCreateCount() {
- return createCount;
+ return createCount;
}
public synchronized Socket createSocket(String host, int port)
- throws IOException
+ throws IOException
{
- createCount++;
+ createCount++;
- if (++flakeState > flakeFactor) {
- flakeState = 0;
- }
+ if (++flakeState > flakeFactor) {
+ flakeState = 0;
+ }
- if (flakeState == 0) {
- return new Socket(host, port);
- } else {
- throw new IOException("random network failure");
- }
+ if (flakeState == 0) {
+ return new Socket(host, port);
+ } else {
+ throw new IOException("random network failure");
+ }
}
public ServerSocket createServerSocket(int port) throws IOException {
- return new ServerSocket(port);
+ return new ServerSocket(port);
}
}
--- a/jdk/test/java/rmi/dgc/retryDirtyCalls/RetryDirtyCalls_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/dgc/retryDirtyCalls/RetryDirtyCalls_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,38 +29,38 @@
implements Self
{
private static final long serialVersionUID = 2;
-
+
private static java.lang.reflect.Method $method_getSelf_0;
-
+
static {
- try {
- $method_getSelf_0 = Self.class.getMethod("getSelf", new java.lang.Class[] {});
- } catch (java.lang.NoSuchMethodException e) {
- throw new java.lang.NoSuchMethodError(
- "stub class initialization failed");
- }
+ try {
+ $method_getSelf_0 = Self.class.getMethod("getSelf", new java.lang.Class[] {});
+ } catch (java.lang.NoSuchMethodException e) {
+ throw new java.lang.NoSuchMethodError(
+ "stub class initialization failed");
+ }
}
-
+
// constructors
public RetryDirtyCalls_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of getSelf()
public Self getSelf()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- Object $result = ref.invoke(this, $method_getSelf_0, null, 2868857108246021904L);
- return ((Self) $result);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ Object $result = ref.invoke(this, $method_getSelf_0, null, 2868857108246021904L);
+ return ((Self) $result);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/registry/altSecurityManager/AltSecurityManager.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/registry/altSecurityManager/AltSecurityManager.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -26,8 +26,8 @@
* @summary rmid and rmiregistry could allow alternate security manager
* @author Laird Dornin
*
- * @library ../../testlibrary
- * @build StreamPipe TestParams TestLibrary JavaVM
+ * @library ../../testlibrary
+ * @build StreamPipe TestParams TestLibrary JavaVM
* @build AltSecurityManager TestSecurityManager
* @run main/othervm AltSecurityManager
*/
@@ -38,7 +38,7 @@
* that throws a runtime exception in its checkListen method, this
* will cause rmiregistry and rmid to exit early because those
* utilities will be unable to export any remote objects; test fails
- * if registry and rmid take too long to exit.
+ * if registry and rmid take too long to exit.
*/
public class AltSecurityManager implements Runnable {
@@ -54,74 +54,74 @@
static long TIME_OUT = 15000;
public void run() {
- try {
- vm = new JavaVM(utilityToStart,
- " -Djava.security.manager=TestSecurityManager",
- "");
- System.err.println("starting " + utilityToStart);
- vm.start();
- vm.getVM().waitFor();
+ try {
+ vm = new JavaVM(utilityToStart,
+ " -Djava.security.manager=TestSecurityManager",
+ "");
+ System.err.println("starting " + utilityToStart);
+ vm.start();
+ vm.getVM().waitFor();
- } catch (Exception e) {
- TestLibrary.bomb(e);
- }
+ } catch (Exception e) {
+ TestLibrary.bomb(e);
+ }
}
-
+
/**
* Wait to make sure that the registry and rmid exit after
* their security manager is set.
*/
public static void ensureExit(String utility) throws Exception {
- utilityToStart = utility;
-
- try {
- Thread thread = new Thread(new AltSecurityManager());
- System.err.println("expecting RuntimeException for " +
- "checkListen in child process");
- long start = System.currentTimeMillis();
- thread.start();
- thread.join(TIME_OUT);
-
- long time = System.currentTimeMillis() - start;
- System.err.println("waited " + time + " millis for " +
- utilityToStart + " to die");
+ utilityToStart = utility;
- if (time >= TIME_OUT) {
-
- // dont pollute other tests; increase the likelihood
+ try {
+ Thread thread = new Thread(new AltSecurityManager());
+ System.err.println("expecting RuntimeException for " +
+ "checkListen in child process");
+ long start = System.currentTimeMillis();
+ thread.start();
+ thread.join(TIME_OUT);
+
+ long time = System.currentTimeMillis() - start;
+ System.err.println("waited " + time + " millis for " +
+ utilityToStart + " to die");
+
+ if (time >= TIME_OUT) {
+
+ // dont pollute other tests; increase the likelihood
// that rmid will go away if it did not exit already.
- if (utility.equals(rmid)) {
- RMID.shutdown();
- }
-
- TestLibrary.bomb(utilityToStart +
- " took too long to die...");
- } else {
- System.err.println(utilityToStart +
- " terminated on time");
- }
- } finally {
- vm.destroy();
- vm = null;
- }
+ if (utility.equals(rmid)) {
+ RMID.shutdown();
+ }
+
+ TestLibrary.bomb(utilityToStart +
+ " took too long to die...");
+ } else {
+ System.err.println(utilityToStart +
+ " terminated on time");
+ }
+ } finally {
+ vm.destroy();
+ vm = null;
+ }
}
-
+
public static void main(String[] args) {
- try {
- System.err.println("\nRegression test for bug 4183202\n");
+ try {
+ System.err.println("\nRegression test for bug 4183202\n");
- // make sure the registry exits early.
- ensureExit(registry);
+ // make sure the registry exits early.
+ ensureExit(registry);
- // make sure rmid exits early
- ensureExit(rmid);
+ // make sure rmid exits early
+ ensureExit(rmid);
- System.err.println("test passed");
+ System.err.println("test passed");
- } catch (Exception e) {
- TestLibrary.bomb(e);
- } finally {
- RMID.removeLog();
- }
+ } catch (Exception e) {
+ TestLibrary.bomb(e);
+ } finally {
+ RMID.removeLog();
+ }
}
}
--- a/jdk/test/java/rmi/registry/altSecurityManager/TestSecurityManager.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/registry/altSecurityManager/TestSecurityManager.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -28,18 +28,18 @@
}
public void checkListen(int port) {
- // 4269910: ok, now rmid and the regsitry will *really* go
- // away...
- //
- // rmid and the registry need to listen on sockets so they
- // will exit when they try to do so... this is used as a sign
- // by the main test process to detect that the proper security
- // manager has been installed in the relevant VMs.
- //
- System.exit(1);
+ // 4269910: ok, now rmid and the regsitry will *really* go
+ // away...
+ //
+ // rmid and the registry need to listen on sockets so they
+ // will exit when they try to do so... this is used as a sign
+ // by the main test process to detect that the proper security
+ // manager has been installed in the relevant VMs.
+ //
+ System.exit(1);
}
public void checkExit(int status) {
- // permit check exit for all code
+ // permit check exit for all code
}
}
--- a/jdk/test/java/rmi/registry/checkusage/CheckUsage.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/registry/checkusage/CheckUsage.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -36,48 +36,48 @@
/**
* Make sure that the rmiregistry prints out a correct usage statement
* when run with an incorrect command line; test written to conform to
- * new tighter bug fix/regression test guidelines.
+ * new tighter bug fix/regression test guidelines.
*/
public class CheckUsage {
public static void main(String[] args) {
- System.err.println("\nregression test for 4151966\n");
+ System.err.println("\nregression test for 4151966\n");
+
+ JavaVM registryVM = null;
- JavaVM registryVM = null;
+ try {
+ // make sure the registry exits with a proper usage statement
+ ByteArrayOutputStream berr = new ByteArrayOutputStream();
+
+ // run a VM to start the registry
+ registryVM = new JavaVM("sun.rmi.registry.RegistryImpl",
+ "", "foo",
+ System.out, berr);
+ System.err.println("starting registry");
+ registryVM.start();
- try {
- // make sure the registry exits with a proper usage statement
- ByteArrayOutputStream berr = new ByteArrayOutputStream();
-
- // run a VM to start the registry
- registryVM = new JavaVM("sun.rmi.registry.RegistryImpl",
- "", "foo",
- System.out, berr);
- System.err.println("starting registry");
- registryVM.start();
-
- // wait for registry exit
- System.err.println(" registry exited with status: " +
- registryVM.getVM().waitFor());
- try {
- Thread.sleep(7000);
- } catch (InterruptedException ie) {
- }
-
- String usage = new String(berr.toByteArray());
-
- System.err.println("rmiregistry usage: " + usage);
-
- if (usage.indexOf("-J") < 0) {
- TestLibrary.bomb("rmiregistry has incorrect usage statement");
- } else {
- System.err.println("test passed");
- }
- } catch (Exception e) {
- TestLibrary.bomb(e);
- } finally {
- registryVM.destroy();
- registryVM = null;
- }
+ // wait for registry exit
+ System.err.println(" registry exited with status: " +
+ registryVM.getVM().waitFor());
+ try {
+ Thread.sleep(7000);
+ } catch (InterruptedException ie) {
+ }
+
+ String usage = new String(berr.toByteArray());
+
+ System.err.println("rmiregistry usage: " + usage);
+
+ if (usage.indexOf("-J") < 0) {
+ TestLibrary.bomb("rmiregistry has incorrect usage statement");
+ } else {
+ System.err.println("test passed");
+ }
+ } catch (Exception e) {
+ TestLibrary.bomb(e);
+ } finally {
+ registryVM.destroy();
+ registryVM = null;
+ }
}
}
--- a/jdk/test/java/rmi/registry/classPathCodebase/ClassPathCodebase.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/registry/classPathCodebase/ClassPathCodebase.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999-2004 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -55,121 +55,121 @@
public static void main(String[] args) {
- System.err.println("\nRegression test for bug 4242317\n");
+ System.err.println("\nRegression test for bug 4242317\n");
- TestLibrary.suggestSecurityManager("java.lang.SecurityManager");
+ TestLibrary.suggestSecurityManager("java.lang.SecurityManager");
- Process rmiregistry = null;
+ Process rmiregistry = null;
- try {
- /*
- * Install a dummy class in two codebases: one that will be in
- * the rmiregistry's CLASSPATH (the "import" codebase) and one
- * that will be in the rmiregistry's "java.rmi.server.codebase"
- * property (the "export" codebase).
- */
- URL importCodebaseURL = TestLibrary.installClassInCodebase(
- dummyClassName, importCodebase, false);
- URL exportCodebaseURL = TestLibrary.installClassInCodebase(
- dummyClassName, exportCodebase, true);
+ try {
+ /*
+ * Install a dummy class in two codebases: one that will be in
+ * the rmiregistry's CLASSPATH (the "import" codebase) and one
+ * that will be in the rmiregistry's "java.rmi.server.codebase"
+ * property (the "export" codebase).
+ */
+ URL importCodebaseURL = TestLibrary.installClassInCodebase(
+ dummyClassName, importCodebase, false);
+ URL exportCodebaseURL = TestLibrary.installClassInCodebase(
+ dummyClassName, exportCodebase, true);
- /*
- * Spawn an rmiregistry in the "import" codebase directory.
- */
- File rmiregistryDir =
- new File(System.getProperty("user.dir", "."), importCodebase);
+ /*
+ * Spawn an rmiregistry in the "import" codebase directory.
+ */
+ File rmiregistryDir =
+ new File(System.getProperty("user.dir", "."), importCodebase);
+
+ String rmiregistryCommand =
+ System.getProperty("java.home") + File.separator +
+ "bin" + File.separator + "rmiregistry";
- String rmiregistryCommand =
- System.getProperty("java.home") + File.separator +
- "bin" + File.separator + "rmiregistry";
-
- String cmdarray[] = new String[] {
- rmiregistryCommand,
- "-J-Denv.class.path=.",
- "-J-Djava.rmi.server.codebase=" + exportCodebaseURL,
- Integer.toString(TestLibrary.REGISTRY_PORT) };
+ String cmdarray[] = new String[] {
+ rmiregistryCommand,
+ "-J-Denv.class.path=.",
+ "-J-Djava.rmi.server.codebase=" + exportCodebaseURL,
+ Integer.toString(TestLibrary.REGISTRY_PORT) };
- System.err.println("\nCommand used to spawn rmiregistry process:");
- System.err.println("\t" + Arrays.asList(cmdarray).toString());
+ System.err.println("\nCommand used to spawn rmiregistry process:");
+ System.err.println("\t" + Arrays.asList(cmdarray).toString());
- rmiregistry = Runtime.getRuntime().exec(cmdarray, null, rmiregistryDir);
+ rmiregistry = Runtime.getRuntime().exec(cmdarray, null, rmiregistryDir);
+
+ // pipe rmiregistry output to our output, for debugging failures
+ StreamPipe.plugTogether(rmiregistry.getInputStream(), System.err);
+ StreamPipe.plugTogether(rmiregistry.getErrorStream(), System.err);
- // pipe rmiregistry output to our output, for debugging failures
- StreamPipe.plugTogether(rmiregistry.getInputStream(), System.err);
- StreamPipe.plugTogether(rmiregistry.getErrorStream(), System.err);
+ /*
+ * Wait for the registry to initialize and be ready to call.
+ */
+ Thread.sleep(REGISTRY_WAIT);
+ System.err.println();
- /*
- * Wait for the registry to initialize and be ready to call.
- */
- Thread.sleep(REGISTRY_WAIT);
- System.err.println();
-
- /*
- * Create an instance of the dummy class, finding it from the
- * "import" codebase.
- */
- ClassLoader loader = URLClassLoader.newInstance(
- new URL[] { importCodebaseURL });
- Class dummyClass = Class.forName(dummyClassName, false, loader);
- Remote dummyObject = (Remote) dummyClass.newInstance();
+ /*
+ * Create an instance of the dummy class, finding it from the
+ * "import" codebase.
+ */
+ ClassLoader loader = URLClassLoader.newInstance(
+ new URL[] { importCodebaseURL });
+ Class dummyClass = Class.forName(dummyClassName, false, loader);
+ Remote dummyObject = (Remote) dummyClass.newInstance();
- /*
- * Find the registry that we created and bind the
- * dummy object to it.
- */
- Registry registry = LocateRegistry.getRegistry(
- "localhost", TestLibrary.REGISTRY_PORT);
+ /*
+ * Find the registry that we created and bind the
+ * dummy object to it.
+ */
+ Registry registry = LocateRegistry.getRegistry(
+ "localhost", TestLibrary.REGISTRY_PORT);
- try {
- registry.bind(dummyBinding, dummyObject);
- System.err.println("Bound dummy object in registry");
- } catch (java.rmi.ConnectException e) {
- System.err.println("Error: rmiregistry not started in time");
- throw e;
- } catch (ServerException e) {
- if (e.detail instanceof UnmarshalException &&
- ((UnmarshalException) e.detail).detail instanceof
- ClassNotFoundException)
- {
- System.err.println(
- "Error: another registry running on port " +
- TestLibrary.REGISTRY_PORT + "?");
- }
- throw e;
- }
+ try {
+ registry.bind(dummyBinding, dummyObject);
+ System.err.println("Bound dummy object in registry");
+ } catch (java.rmi.ConnectException e) {
+ System.err.println("Error: rmiregistry not started in time");
+ throw e;
+ } catch (ServerException e) {
+ if (e.detail instanceof UnmarshalException &&
+ ((UnmarshalException) e.detail).detail instanceof
+ ClassNotFoundException)
+ {
+ System.err.println(
+ "Error: another registry running on port " +
+ TestLibrary.REGISTRY_PORT + "?");
+ }
+ throw e;
+ }
- /*
- * Look up the dummy object from our registry and make sure
- * that its class was annotated with the "export" codebase.
- */
- Remote dummyLookup = registry.lookup(dummyBinding);
- System.err.println(
- "Looked up dummy object from registry: " + dummyLookup);
- Class dummyLookupClass = dummyLookup.getClass();
- String dummyLookupAnnotation =
- RMIClassLoader.getClassAnnotation(dummyLookupClass);
- System.err.println(
- "Class annotation from registry: " + dummyLookupAnnotation);
+ /*
+ * Look up the dummy object from our registry and make sure
+ * that its class was annotated with the "export" codebase.
+ */
+ Remote dummyLookup = registry.lookup(dummyBinding);
+ System.err.println(
+ "Looked up dummy object from registry: " + dummyLookup);
+ Class dummyLookupClass = dummyLookup.getClass();
+ String dummyLookupAnnotation =
+ RMIClassLoader.getClassAnnotation(dummyLookupClass);
+ System.err.println(
+ "Class annotation from registry: " + dummyLookupAnnotation);
- System.err.println();
- if (dummyLookupAnnotation.indexOf(exportCodebase) >= 0) {
- System.err.println("TEST PASSED");
- } else if (dummyLookupAnnotation.indexOf(importCodebase) >= 0) {
- throw new RuntimeException(
- "rmiregistry annotated with CLASSPATH element URL");
- } else {
- throw new RuntimeException(
- "rmiregistry used unexpected annotation: \"" +
- dummyLookupAnnotation + "\"");
- }
+ System.err.println();
+ if (dummyLookupAnnotation.indexOf(exportCodebase) >= 0) {
+ System.err.println("TEST PASSED");
+ } else if (dummyLookupAnnotation.indexOf(importCodebase) >= 0) {
+ throw new RuntimeException(
+ "rmiregistry annotated with CLASSPATH element URL");
+ } else {
+ throw new RuntimeException(
+ "rmiregistry used unexpected annotation: \"" +
+ dummyLookupAnnotation + "\"");
+ }
- } catch (Exception e) {
- e.printStackTrace();
- throw new RuntimeException("TEST FAILED: " + e.toString());
- } finally {
- if (rmiregistry != null) {
- rmiregistry.destroy();
- }
- }
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException("TEST FAILED: " + e.toString());
+ } finally {
+ if (rmiregistry != null) {
+ rmiregistry.destroy();
+ }
+ }
}
}
--- a/jdk/test/java/rmi/registry/classPathCodebase/Dummy.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/registry/classPathCodebase/Dummy.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -36,12 +36,12 @@
}
public void writeExternal(java.io.ObjectOutput out)
- throws java.io.IOException
+ throws java.io.IOException
{
}
public void readExternal(java.io.ObjectInput in)
- throws java.io.IOException, ClassNotFoundException
+ throws java.io.IOException, ClassNotFoundException
{
}
}
--- a/jdk/test/java/rmi/registry/emptyName/EmptyName.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/registry/emptyName/EmptyName.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -32,12 +32,12 @@
public class EmptyName {
public static void main(String[] args) throws Exception {
- Registry impl = LocateRegistry.createRegistry(0);
- Registry stub = (Registry) RemoteObject.toStub(impl);
- stub.bind("", stub);
- stub.lookup("");
- stub.rebind("", stub);
- stub.lookup("");
- stub.unbind("");
+ Registry impl = LocateRegistry.createRegistry(0);
+ Registry stub = (Registry) RemoteObject.toStub(impl);
+ stub.bind("", stub);
+ stub.lookup("");
+ stub.rebind("", stub);
+ stub.lookup("");
+ stub.unbind("");
}
}
--- a/jdk/test/java/rmi/registry/interfaceHash/InterfaceHash.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/registry/interfaceHash/InterfaceHash.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -62,157 +62,157 @@
private static final String NAME = "WMM";
public static void main(String[] args) throws Exception {
- System.err.println("\nRegression test for bug 4472769");
+ System.err.println("\nRegression test for bug 4472769");
- System.err.println(
- "\n=== verifying that J2SE registry's skeleton uses" +
- "\ncorrect interface hash and operation numbers:");
+ System.err.println(
+ "\n=== verifying that J2SE registry's skeleton uses" +
+ "\ncorrect interface hash and operation numbers:");
- Registry testImpl = LocateRegistry.createRegistry(PORT);
- System.err.println("created test registry on port " + PORT);
+ Registry testImpl = LocateRegistry.createRegistry(PORT);
+ System.err.println("created test registry on port " + PORT);
- RemoteRef ref = new UnicastRef(
- new LiveRef(new ObjID(ObjID.REGISTRY_ID),
- new TCPEndpoint("", PORT), false));
- Registry referenceStub = new ReferenceRegistryStub(ref);
- System.err.println("created reference registry stub: " +
- referenceStub);
+ RemoteRef ref = new UnicastRef(
+ new LiveRef(new ObjID(ObjID.REGISTRY_ID),
+ new TCPEndpoint("", PORT), false));
+ Registry referenceStub = new ReferenceRegistryStub(ref);
+ System.err.println("created reference registry stub: " +
+ referenceStub);
- referenceStub.bind(NAME, referenceStub);
- System.err.println("bound name \"" + NAME + "\" in registry");
+ referenceStub.bind(NAME, referenceStub);
+ System.err.println("bound name \"" + NAME + "\" in registry");
- String[] list = referenceStub.list();
- System.err.println("list of registry contents: " +
- Arrays.asList(list));
- if (list.length != 1 || !list[0].equals(NAME)) {
- throw new RuntimeException(
- "TEST FAILED: unexpected list contents");
- }
+ String[] list = referenceStub.list();
+ System.err.println("list of registry contents: " +
+ Arrays.asList(list));
+ if (list.length != 1 || !list[0].equals(NAME)) {
+ throw new RuntimeException(
+ "TEST FAILED: unexpected list contents");
+ }
- Registry result = (Registry) referenceStub.lookup(NAME);
- System.err.println("lookup of name \"" + NAME + "\" returned: " +
- result);
- if (!result.equals(referenceStub)) {
- throw new RuntimeException(
- "TEST FAILED: unexpected lookup result");
- }
+ Registry result = (Registry) referenceStub.lookup(NAME);
+ System.err.println("lookup of name \"" + NAME + "\" returned: " +
+ result);
+ if (!result.equals(referenceStub)) {
+ throw new RuntimeException(
+ "TEST FAILED: unexpected lookup result");
+ }
- referenceStub.rebind(NAME, referenceStub);
- referenceStub.unbind(NAME);
- System.err.println("unbound name \"" + NAME + "\"");
+ referenceStub.rebind(NAME, referenceStub);
+ referenceStub.unbind(NAME);
+ System.err.println("unbound name \"" + NAME + "\"");
- list = referenceStub.list();
- System.err.println("list of registry contents: " +
- Arrays.asList(list));
- if (list.length != 0) {
- throw new RuntimeException("TEST FAILED: list not empty");
- }
+ list = referenceStub.list();
+ System.err.println("list of registry contents: " +
+ Arrays.asList(list));
+ if (list.length != 0) {
+ throw new RuntimeException("TEST FAILED: list not empty");
+ }
- System.err.println("\n=== verifying that J2SE registry's stub uses" +
- "correct interface hash:");
+ System.err.println("\n=== verifying that J2SE registry's stub uses" +
+ "correct interface hash:");
- class FakeRemoteRef implements RemoteRef {
- long hash;
- int opnum;
- public RemoteCall newCall(RemoteObject obj, Operation[] op,
- int opnum, long hash)
- {
- this.hash = hash;
- this.opnum = opnum;
- throw new UnsupportedOperationException();
- }
- public void invoke(RemoteCall call) { }
- public void done(RemoteCall call) { }
- public Object invoke(Remote obj, Method method,
- Object[] args, long hash)
- {
- throw new UnsupportedOperationException();
- }
- public String getRefClass(java.io.ObjectOutput out) {
- return "FakeRemoteRef";
- }
- public int remoteHashCode() { return 1013; }
- public boolean remoteEquals(RemoteRef obj) { return false; }
- public String remoteToString() { return "FakeRemoteRef"; }
- public void writeExternal(java.io.ObjectOutput out) { }
- public void readExternal(java.io.ObjectInput in) { }
- }
- FakeRemoteRef f = new FakeRemoteRef();
+ class FakeRemoteRef implements RemoteRef {
+ long hash;
+ int opnum;
+ public RemoteCall newCall(RemoteObject obj, Operation[] op,
+ int opnum, long hash)
+ {
+ this.hash = hash;
+ this.opnum = opnum;
+ throw new UnsupportedOperationException();
+ }
+ public void invoke(RemoteCall call) { }
+ public void done(RemoteCall call) { }
+ public Object invoke(Remote obj, Method method,
+ Object[] args, long hash)
+ {
+ throw new UnsupportedOperationException();
+ }
+ public String getRefClass(java.io.ObjectOutput out) {
+ return "FakeRemoteRef";
+ }
+ public int remoteHashCode() { return 1013; }
+ public boolean remoteEquals(RemoteRef obj) { return false; }
+ public String remoteToString() { return "FakeRemoteRef"; }
+ public void writeExternal(java.io.ObjectOutput out) { }
+ public void readExternal(java.io.ObjectInput in) { }
+ }
+ FakeRemoteRef f = new FakeRemoteRef();
- Registry testRegistry = LocateRegistry.getRegistry(PORT);
- System.err.println("created original test registry stub: " +
- testRegistry);
+ Registry testRegistry = LocateRegistry.getRegistry(PORT);
+ System.err.println("created original test registry stub: " +
+ testRegistry);
- Class stubClass = testRegistry.getClass();
- System.err.println("test registry stub class: " + stubClass);
+ Class stubClass = testRegistry.getClass();
+ System.err.println("test registry stub class: " + stubClass);
- Constructor cons = stubClass.getConstructor(
- new Class[] { RemoteRef.class });
- Registry testStub = (Registry) cons.newInstance(
- new Object[] { f });
- System.err.println("created new instrumented test registry stub: " +
- testStub);
+ Constructor cons = stubClass.getConstructor(
+ new Class[] { RemoteRef.class });
+ Registry testStub = (Registry) cons.newInstance(
+ new Object[] { f });
+ System.err.println("created new instrumented test registry stub: " +
+ testStub);
- System.err.println("invoking bind:");
- try {
- testStub.bind(NAME, referenceStub);
- } catch (UnsupportedOperationException e) {
- }
- System.err.println("hash == " + f.hash + ", opnum == " + f.opnum);
- if (f.hash != 4905912898345647071L) {
- throw new RuntimeException("TEST FAILED: wrong interface hash");
- } else if (f.opnum != 0) {
- throw new RuntimeException("TEST FAILED: wrong operation number");
- }
+ System.err.println("invoking bind:");
+ try {
+ testStub.bind(NAME, referenceStub);
+ } catch (UnsupportedOperationException e) {
+ }
+ System.err.println("hash == " + f.hash + ", opnum == " + f.opnum);
+ if (f.hash != 4905912898345647071L) {
+ throw new RuntimeException("TEST FAILED: wrong interface hash");
+ } else if (f.opnum != 0) {
+ throw new RuntimeException("TEST FAILED: wrong operation number");
+ }
- System.err.println("invoking list:");
- try {
- testStub.list();
- } catch (UnsupportedOperationException e) {
- }
- System.err.println("hash == " + f.hash + ", opnum == " + f.opnum);
- if (f.hash != 4905912898345647071L) {
- throw new RuntimeException("TEST FAILED: wrong interface hash");
- } else if (f.opnum != 1) {
- throw new RuntimeException("TEST FAILED: wrong operation number");
- }
+ System.err.println("invoking list:");
+ try {
+ testStub.list();
+ } catch (UnsupportedOperationException e) {
+ }
+ System.err.println("hash == " + f.hash + ", opnum == " + f.opnum);
+ if (f.hash != 4905912898345647071L) {
+ throw new RuntimeException("TEST FAILED: wrong interface hash");
+ } else if (f.opnum != 1) {
+ throw new RuntimeException("TEST FAILED: wrong operation number");
+ }
- System.err.println("invoking lookup:");
- try {
- testStub.lookup(NAME);
- } catch (UnsupportedOperationException e) {
- }
- System.err.println("hash == " + f.hash + ", opnum == " + f.opnum);
- if (f.hash != 4905912898345647071L) {
- throw new RuntimeException("TEST FAILED: wrong interface hash");
- } else if (f.opnum != 2) {
- throw new RuntimeException("TEST FAILED: wrong operation number");
- }
+ System.err.println("invoking lookup:");
+ try {
+ testStub.lookup(NAME);
+ } catch (UnsupportedOperationException e) {
+ }
+ System.err.println("hash == " + f.hash + ", opnum == " + f.opnum);
+ if (f.hash != 4905912898345647071L) {
+ throw new RuntimeException("TEST FAILED: wrong interface hash");
+ } else if (f.opnum != 2) {
+ throw new RuntimeException("TEST FAILED: wrong operation number");
+ }
- System.err.println("invoking rebind:");
- try {
- testStub.rebind(NAME, referenceStub);
- } catch (UnsupportedOperationException e) {
- }
- System.err.println("hash == " + f.hash + ", opnum == " + f.opnum);
- if (f.hash != 4905912898345647071L) {
- throw new RuntimeException("TEST FAILED: wrong interface hash");
- } else if (f.opnum != 3) {
- throw new RuntimeException("TEST FAILED: wrong operation number");
- }
+ System.err.println("invoking rebind:");
+ try {
+ testStub.rebind(NAME, referenceStub);
+ } catch (UnsupportedOperationException e) {
+ }
+ System.err.println("hash == " + f.hash + ", opnum == " + f.opnum);
+ if (f.hash != 4905912898345647071L) {
+ throw new RuntimeException("TEST FAILED: wrong interface hash");
+ } else if (f.opnum != 3) {
+ throw new RuntimeException("TEST FAILED: wrong operation number");
+ }
- System.err.println("invoking unbind:");
- try {
- testStub.unbind(NAME);
- } catch (UnsupportedOperationException e) {
- }
- System.err.println("hash == " + f.hash + ", opnum == " + f.opnum);
- if (f.hash != 4905912898345647071L) {
- throw new RuntimeException("TEST FAILED: wrong interface hash");
- } else if (f.opnum != 4) {
- throw new RuntimeException("TEST FAILED: wrong operation number");
- }
+ System.err.println("invoking unbind:");
+ try {
+ testStub.unbind(NAME);
+ } catch (UnsupportedOperationException e) {
+ }
+ System.err.println("hash == " + f.hash + ", opnum == " + f.opnum);
+ if (f.hash != 4905912898345647071L) {
+ throw new RuntimeException("TEST FAILED: wrong interface hash");
+ } else if (f.opnum != 4) {
+ throw new RuntimeException("TEST FAILED: wrong operation number");
+ }
- System.err.println("TEST PASSED");
+ System.err.println("TEST PASSED");
}
}
--- a/jdk/test/java/rmi/registry/interfaceHash/ReferenceRegistryStub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/registry/interfaceHash/ReferenceRegistryStub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -26,161 +26,161 @@
implements java.rmi.registry.Registry, java.rmi.Remote
{
private static final java.rmi.server.Operation[] operations = {
- new java.rmi.server.Operation("void bind(java.lang.String, java.rmi.Remote)"),
- new java.rmi.server.Operation("java.lang.String list()[]"),
- new java.rmi.server.Operation("java.rmi.Remote lookup(java.lang.String)"),
- new java.rmi.server.Operation("void rebind(java.lang.String, java.rmi.Remote)"),
- new java.rmi.server.Operation("void unbind(java.lang.String)")
+ new java.rmi.server.Operation("void bind(java.lang.String, java.rmi.Remote)"),
+ new java.rmi.server.Operation("java.lang.String list()[]"),
+ new java.rmi.server.Operation("java.rmi.Remote lookup(java.lang.String)"),
+ new java.rmi.server.Operation("void rebind(java.lang.String, java.rmi.Remote)"),
+ new java.rmi.server.Operation("void unbind(java.lang.String)")
};
-
+
private static final long interfaceHash = 4905912898345647071L;
-
+
// constructors
public ReferenceRegistryStub() {
- super();
+ super();
}
public ReferenceRegistryStub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of bind(String, Remote)
public void bind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2)
- throws java.rmi.AccessException, java.rmi.AlreadyBoundException, java.rmi.RemoteException
+ throws java.rmi.AccessException, java.rmi.AlreadyBoundException, java.rmi.RemoteException
{
- try {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
- try {
- java.io.ObjectOutput out = call.getOutputStream();
- out.writeObject($param_String_1);
- out.writeObject($param_Remote_2);
- } catch (java.io.IOException e) {
- throw new java.rmi.MarshalException("error marshalling arguments", e);
- }
- ref.invoke(call);
- ref.done(call);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.rmi.AlreadyBoundException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
+ try {
+ java.io.ObjectOutput out = call.getOutputStream();
+ out.writeObject($param_String_1);
+ out.writeObject($param_Remote_2);
+ } catch (java.io.IOException e) {
+ throw new java.rmi.MarshalException("error marshalling arguments", e);
+ }
+ ref.invoke(call);
+ ref.done(call);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.rmi.AlreadyBoundException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of list()
public java.lang.String[] list()
- throws java.rmi.AccessException, java.rmi.RemoteException
+ throws java.rmi.AccessException, java.rmi.RemoteException
{
- try {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
- ref.invoke(call);
- java.lang.String[] $result;
- try {
- java.io.ObjectInput in = call.getInputStream();
- $result = (java.lang.String[]) in.readObject();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } catch (java.lang.ClassNotFoundException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } finally {
- ref.done(call);
- }
- return $result;
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
+ ref.invoke(call);
+ java.lang.String[] $result;
+ try {
+ java.io.ObjectInput in = call.getInputStream();
+ $result = (java.lang.String[]) in.readObject();
+ } catch (java.io.IOException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } catch (java.lang.ClassNotFoundException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } finally {
+ ref.done(call);
+ }
+ return $result;
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of lookup(String)
public java.rmi.Remote lookup(java.lang.String $param_String_1)
- throws java.rmi.AccessException, java.rmi.NotBoundException, java.rmi.RemoteException
+ throws java.rmi.AccessException, java.rmi.NotBoundException, java.rmi.RemoteException
{
- try {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 2, interfaceHash);
- try {
- java.io.ObjectOutput out = call.getOutputStream();
- out.writeObject($param_String_1);
- } catch (java.io.IOException e) {
- throw new java.rmi.MarshalException("error marshalling arguments", e);
- }
- ref.invoke(call);
- java.rmi.Remote $result;
- try {
- java.io.ObjectInput in = call.getInputStream();
- $result = (java.rmi.Remote) in.readObject();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } catch (java.lang.ClassNotFoundException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } finally {
- ref.done(call);
- }
- return $result;
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.rmi.NotBoundException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 2, interfaceHash);
+ try {
+ java.io.ObjectOutput out = call.getOutputStream();
+ out.writeObject($param_String_1);
+ } catch (java.io.IOException e) {
+ throw new java.rmi.MarshalException("error marshalling arguments", e);
+ }
+ ref.invoke(call);
+ java.rmi.Remote $result;
+ try {
+ java.io.ObjectInput in = call.getInputStream();
+ $result = (java.rmi.Remote) in.readObject();
+ } catch (java.io.IOException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } catch (java.lang.ClassNotFoundException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } finally {
+ ref.done(call);
+ }
+ return $result;
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.rmi.NotBoundException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of rebind(String, Remote)
public void rebind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2)
- throws java.rmi.AccessException, java.rmi.RemoteException
+ throws java.rmi.AccessException, java.rmi.RemoteException
{
- try {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 3, interfaceHash);
- try {
- java.io.ObjectOutput out = call.getOutputStream();
- out.writeObject($param_String_1);
- out.writeObject($param_Remote_2);
- } catch (java.io.IOException e) {
- throw new java.rmi.MarshalException("error marshalling arguments", e);
- }
- ref.invoke(call);
- ref.done(call);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 3, interfaceHash);
+ try {
+ java.io.ObjectOutput out = call.getOutputStream();
+ out.writeObject($param_String_1);
+ out.writeObject($param_Remote_2);
+ } catch (java.io.IOException e) {
+ throw new java.rmi.MarshalException("error marshalling arguments", e);
+ }
+ ref.invoke(call);
+ ref.done(call);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of unbind(String)
public void unbind(java.lang.String $param_String_1)
- throws java.rmi.AccessException, java.rmi.NotBoundException, java.rmi.RemoteException
+ throws java.rmi.AccessException, java.rmi.NotBoundException, java.rmi.RemoteException
{
- try {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 4, interfaceHash);
- try {
- java.io.ObjectOutput out = call.getOutputStream();
- out.writeObject($param_String_1);
- } catch (java.io.IOException e) {
- throw new java.rmi.MarshalException("error marshalling arguments", e);
- }
- ref.invoke(call);
- ref.done(call);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.rmi.NotBoundException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 4, interfaceHash);
+ try {
+ java.io.ObjectOutput out = call.getOutputStream();
+ out.writeObject($param_String_1);
+ } catch (java.io.IOException e) {
+ throw new java.rmi.MarshalException("error marshalling arguments", e);
+ }
+ ref.invoke(call);
+ ref.done(call);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.rmi.NotBoundException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/registry/multipleRegistries/MultipleRegistries.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/registry/multipleRegistries/MultipleRegistries.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -41,49 +41,49 @@
private static final String NAME = "MultipleRegistries";
public Object passObject(Object obj) {
- return obj;
+ return obj;
}
-
+
public static void main(String[] args) throws Exception {
-
- RemoteInterface server = null;
- RemoteInterface proxy = null;
-
- try {
- System.err.println("export object");
- server = new MultipleRegistries();
- proxy =
- (RemoteInterface) UnicastRemoteObject.exportObject(server, 0);
+
+ RemoteInterface server = null;
+ RemoteInterface proxy = null;
- System.err.println("proxy = " + proxy);
+ try {
+ System.err.println("export object");
+ server = new MultipleRegistries();
+ proxy =
+ (RemoteInterface) UnicastRemoteObject.exportObject(server, 0);
- System.err.println("export registries");
- Registry registryImpl1 = LocateRegistry.createRegistry(2030);
- Registry registryImpl2 = LocateRegistry.createRegistry(2040);
+ System.err.println("proxy = " + proxy);
+
+ System.err.println("export registries");
+ Registry registryImpl1 = LocateRegistry.createRegistry(2030);
+ Registry registryImpl2 = LocateRegistry.createRegistry(2040);
- System.err.println("bind remote object in registries");
- Registry registry1 = LocateRegistry.getRegistry(2030);
- Registry registry2 = LocateRegistry.getRegistry(2040);
+ System.err.println("bind remote object in registries");
+ Registry registry1 = LocateRegistry.getRegistry(2030);
+ Registry registry2 = LocateRegistry.getRegistry(2040);
- registry1.bind(NAME, proxy);
- registry2.bind(NAME, proxy);
+ registry1.bind(NAME, proxy);
+ registry2.bind(NAME, proxy);
- System.err.println("lookup remote object in registries");
+ System.err.println("lookup remote object in registries");
- RemoteInterface remote1 = (RemoteInterface) registry1.lookup(NAME);
- RemoteInterface remote2 = (RemoteInterface) registry2.lookup(NAME);
+ RemoteInterface remote1 = (RemoteInterface) registry1.lookup(NAME);
+ RemoteInterface remote2 = (RemoteInterface) registry2.lookup(NAME);
- System.err.println("invoke methods on remote objects");
- remote1.passObject(remote1);
- remote2.passObject(remote2);
+ System.err.println("invoke methods on remote objects");
+ remote1.passObject(remote1);
+ remote2.passObject(remote2);
+
+ System.err.println("TEST PASSED");
- System.err.println("TEST PASSED");
-
- } finally {
- if (proxy != null) {
- UnicastRemoteObject.unexportObject(server, true);
- }
- }
+ } finally {
+ if (proxy != null) {
+ UnicastRemoteObject.unexportObject(server, true);
+ }
+ }
}
}
--- a/jdk/test/java/rmi/registry/reexport/Reexport.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/registry/reexport/Reexport.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999-2004 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -25,13 +25,13 @@
* @bug 4120329
* @summary RMI registry creation is impossible if first attempt fails.
* @library ../../testlibrary
- * @build StreamPipe TestParams TestLibrary JavaVM
+ * @build StreamPipe TestParams TestLibrary JavaVM
* @build RegistryRunner RegistryRunner_Stub
* @build Reexport
* @run main/othervm Reexport
*/
-/*
+/*
* If a VM could not create an RMI registry because another registry
* usually in another process, was using the registry port, the next
* time the VM tried to create a registry (after the other registry
@@ -40,7 +40,7 @@
* use when it should never have been allocated.
*
* The test creates this conflict using Runtime.exec and ensures that
- * a registry can still be created after the conflict is resolved.
+ * a registry can still be created after the conflict is resolved.
*/
import java.io.*;
@@ -50,106 +50,106 @@
public class Reexport {
static public final int regport = TestLibrary.REGISTRY_PORT;
-
+
static public void main(String[] argv) {
- Registry reg = null;
+ Registry reg = null;
+
+ try {
+ System.err.println("\nregression test for 4120329\n");
+
+ // establish the registry (we hope)
+ System.err.println("Starting registry on port " + regport);
+ Reexport.makeRegistry(regport);
+
+ // Get a handle to the registry
+ System.err.println("Creating duplicate registry, this should fail...");
+ reg = createReg(true);
+
+ if (reg != null) {
+ TestLibrary.bomb("failed was able to duplicate the registry?!?");
+ }
+
+ // Kill the first registry.
+ System.err.println("Bringing down the first registry");
+ try {
+ Reexport.killRegistry();
+ } catch (Exception foo) {
+ }
+
+ // start another registry now that the first is gone; this should work
+ System.err.println("Trying again to start our own " +
+ "registry... this should work");
+
+ reg = createReg(false);
- try {
- System.err.println("\nregression test for 4120329\n");
-
- // establish the registry (we hope)
- System.err.println("Starting registry on port " + regport);
- Reexport.makeRegistry(regport);
-
- // Get a handle to the registry
- System.err.println("Creating duplicate registry, this should fail...");
- reg = createReg(true);
-
- if (reg != null) {
- TestLibrary.bomb("failed was able to duplicate the registry?!?");
- }
-
- // Kill the first registry.
- System.err.println("Bringing down the first registry");
- try {
- Reexport.killRegistry();
- } catch (Exception foo) {
- }
-
- // start another registry now that the first is gone; this should work
- System.err.println("Trying again to start our own " +
- "registry... this should work");
-
- reg = createReg(false);
-
- if (reg == null) {
- TestLibrary.bomb("Could not create registry on second try");
- }
-
- System.err.println("Test passed");
-
- } catch (Exception e) {
- TestLibrary.bomb(e);
- } finally {
- // dont leave the registry around to affect other tests.
- killRegistry();
+ if (reg == null) {
+ TestLibrary.bomb("Could not create registry on second try");
+ }
+
+ System.err.println("Test passed");
+
+ } catch (Exception e) {
+ TestLibrary.bomb(e);
+ } finally {
+ // dont leave the registry around to affect other tests.
+ killRegistry();
+
+ reg = null;
+ }
+ }
- reg = null;
- }
- }
-
static Registry createReg(boolean remoteOk) {
- Registry reg = null;
+ Registry reg = null;
- try {
- reg = LocateRegistry.createRegistry(regport);
- } catch (Throwable e) {
- if (remoteOk) {
- System.err.println("EXPECTING PORT IN USE EXCEPTION:");
- System.err.println(e.getMessage());
- e.printStackTrace();
- } else {
- TestLibrary.bomb((Exception) e);
- }
- }
+ try {
+ reg = LocateRegistry.createRegistry(regport);
+ } catch (Throwable e) {
+ if (remoteOk) {
+ System.err.println("EXPECTING PORT IN USE EXCEPTION:");
+ System.err.println(e.getMessage());
+ e.printStackTrace();
+ } else {
+ TestLibrary.bomb((Exception) e);
+ }
+ }
- return reg;
+ return reg;
}
public static void makeRegistry(int p) {
- // sadly, we can't kill a registry if we have too-close control
- // over it. We must make it in a subprocess, and then kill the
- // subprocess when it has served our needs.
+ // sadly, we can't kill a registry if we have too-close control
+ // over it. We must make it in a subprocess, and then kill the
+ // subprocess when it has served our needs.
- try {
- JavaVM jvm = new JavaVM("RegistryRunner", "", Integer.toString(p));
- jvm.start();
- Reexport.subreg = jvm.getVM();
+ try {
+ JavaVM jvm = new JavaVM("RegistryRunner", "", Integer.toString(p));
+ jvm.start();
+ Reexport.subreg = jvm.getVM();
- } catch (IOException e) {
- // one of these is summarily dropped, can't remember which one
- System.out.println ("Test setup failed - cannot run rmiregistry");
- TestLibrary.bomb("Test setup failed - cannot run test", e);
- }
- // Slop - wait for registry to come up. This is stupid.
- try {
- Thread.sleep (5000);
- } catch (Exception whatever) {
- }
+ } catch (IOException e) {
+ // one of these is summarily dropped, can't remember which one
+ System.out.println ("Test setup failed - cannot run rmiregistry");
+ TestLibrary.bomb("Test setup failed - cannot run test", e);
+ }
+ // Slop - wait for registry to come up. This is stupid.
+ try {
+ Thread.sleep (5000);
+ } catch (Exception whatever) {
+ }
}
private static Process subreg = null;
-
+
public static void killRegistry() {
- if (Reexport.subreg != null) {
+ if (Reexport.subreg != null) {
- RegistryRunner.requestExit();
+ RegistryRunner.requestExit();
- try {
- Reexport.subreg.waitFor();
- } catch (InterruptedException ie) {
- }
- }
- Reexport.subreg = null;
- }
+ try {
+ Reexport.subreg.waitFor();
+ } catch (InterruptedException ie) {
+ }
+ }
+ Reexport.subreg = null;
+ }
}
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/BenchServer.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/BenchServer.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -33,7 +33,7 @@
/**
* The RMI benchmark server is a simple compute-engine-like server which allows
- * client benchmarks to create/export and unexport objects off of the server,
+ * client benchmarks to create/export and unexport objects off of the server,
* or run arbitrary tasks.
*/
public interface BenchServer extends Remote {
@@ -41,41 +41,40 @@
* Interface used for creating server-side remote objects.
*/
public interface RemoteObjectFactory extends Serializable {
- Remote create() throws RemoteException;
+ Remote create() throws RemoteException;
}
-
+
/**
* Interface used for server-side tasks.
*/
public interface Task extends Serializable {
- Object execute() throws Exception;
+ Object execute() throws Exception;
}
/**
- * Uses the given remote object factory to create a new remote object on
+ * Uses the given remote object factory to create a new remote object on
* the server side.
*/
Remote create(RemoteObjectFactory factory) throws RemoteException;
-
+
/**
- * Unexports the specified remote object. Returns true if successful,
+ * Unexports the specified remote object. Returns true if successful,
* false otherwise.
*/
boolean unexport(Remote obj, boolean force) throws RemoteException;
-
+
/**
* Execute given task.
*/
Object execute(Task task) throws Exception;
-
+
/**
* Invoke the garbage collector.
*/
void gc() throws RemoteException;
-
+
/**
* Terminate the server.
*/
void terminate(int delay) throws RemoteException;
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/BenchServerImpl.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/BenchServerImpl.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -37,8 +37,8 @@
/**
* Benchmark server implementation.
*/
-public class BenchServerImpl
- extends UnicastRemoteObject implements BenchServer
+public class BenchServerImpl
+ extends UnicastRemoteObject implements BenchServer
{
HashMap implTable = new HashMap();
@@ -47,52 +47,51 @@
*/
public BenchServerImpl() throws RemoteException {
}
-
+
/**
- * Uses the given remote object factory to create a new remote object on
+ * Uses the given remote object factory to create a new remote object on
* the server side.
*/
- public Remote create(BenchServer.RemoteObjectFactory factory)
- throws RemoteException
+ public Remote create(BenchServer.RemoteObjectFactory factory)
+ throws RemoteException
{
- Remote impl = factory.create();
- implTable.put(RemoteObject.toStub(impl), new WeakReference(impl));
- return impl;
+ Remote impl = factory.create();
+ implTable.put(RemoteObject.toStub(impl), new WeakReference(impl));
+ return impl;
}
-
+
/**
- * Unexports the specified remote object. Returns true if successful,
+ * Unexports the specified remote object. Returns true if successful,
* false otherwise.
*/
public boolean unexport(Remote obj, boolean force) throws RemoteException {
- WeakReference iref = (WeakReference) implTable.get(obj);
- if (iref == null)
- return false;
- Remote impl = (Remote) iref.get();
- if (impl == null)
- return false;
- return UnicastRemoteObject.unexportObject(impl, force);
+ WeakReference iref = (WeakReference) implTable.get(obj);
+ if (iref == null)
+ return false;
+ Remote impl = (Remote) iref.get();
+ if (impl == null)
+ return false;
+ return UnicastRemoteObject.unexportObject(impl, force);
}
-
+
/**
* Execute given task.
*/
public Object execute(BenchServer.Task task) throws Exception {
- return task.execute();
+ return task.execute();
}
-
+
/**
* Invoke the garbage collector.
*/
public void gc() throws RemoteException {
- System.gc();
+ System.gc();
}
-
+
/**
* Terminate the server.
*/
public void terminate(int delay) throws RemoteException {
- System.exit(0);
+ System.exit(0);
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/BooleanArrayCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/BooleanArrayCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -39,42 +39,41 @@
public class BooleanArrayCalls implements Benchmark {
interface Server extends Remote {
- public boolean[] call(boolean[] a) throws RemoteException;
+ public boolean[] call(boolean[] a) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public boolean[] call(boolean[] a) throws RemoteException {
- return a;
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public boolean[] call(boolean[] a) throws RemoteException {
+ return a;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue boolean array calls.
* Arguments: <array size> <# calls>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int reps = Integer.parseInt(args[1]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
- boolean[] array = new boolean[size];
+ int size = Integer.parseInt(args[0]);
+ int reps = Integer.parseInt(args[1]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
+ boolean[] array = new boolean[size];
- long start = System.currentTimeMillis();
- for (int i = 0; i < reps; i++)
- stub.call(array);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < reps; i++)
+ stub.call(array);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/BooleanCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/BooleanCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -38,40 +38,39 @@
public class BooleanCalls implements Benchmark {
interface Server extends Remote {
- public boolean call(boolean val) throws RemoteException;
+ public boolean call(boolean val) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public boolean call(boolean val) throws RemoteException {
- return val;
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public boolean call(boolean val) throws RemoteException {
+ return val;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue boolean calls.
* Arguments: <# calls>
*/
public long run(String[] args) throws Exception {
- int cycles = Integer.parseInt(args[0]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
+ int cycles = Integer.parseInt(args[0]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
- long start = System.currentTimeMillis();
- for (int i = 0; i < cycles; i++)
- stub.call(true);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < cycles; i++)
+ stub.call(true);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ByteArrayCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ByteArrayCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -39,42 +39,41 @@
public class ByteArrayCalls implements Benchmark {
interface Server extends Remote {
- public byte[] call(byte[] a) throws RemoteException;
+ public byte[] call(byte[] a) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public byte[] call(byte[] a) throws RemoteException {
- return a;
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public byte[] call(byte[] a) throws RemoteException {
+ return a;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue byte array calls.
* Arguments: <array size> <# calls>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int reps = Integer.parseInt(args[1]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
- byte[] array = new byte[size];
+ int size = Integer.parseInt(args[0]);
+ int reps = Integer.parseInt(args[1]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
+ byte[] array = new byte[size];
- long start = System.currentTimeMillis();
- for (int i = 0; i < reps; i++)
- stub.call(array);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < reps; i++)
+ stub.call(array);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ByteCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ByteCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -38,40 +38,39 @@
public class ByteCalls implements Benchmark {
interface Server extends Remote {
- public byte call(byte val) throws RemoteException;
+ public byte call(byte val) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public byte call(byte val) throws RemoteException {
- return val;
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public byte call(byte val) throws RemoteException {
+ return val;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue byte calls.
* Arguments: <# calls>
*/
public long run(String[] args) throws Exception {
- int cycles = Integer.parseInt(args[0]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
+ int cycles = Integer.parseInt(args[0]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
- long start = System.currentTimeMillis();
- for (int i = 0; i < cycles; i++)
- stub.call((byte) 0);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < cycles; i++)
+ stub.call((byte) 0);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/CharArrayCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/CharArrayCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -39,42 +39,41 @@
public class CharArrayCalls implements Benchmark {
interface Server extends Remote {
- public char[] call(char[] a) throws RemoteException;
+ public char[] call(char[] a) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public char[] call(char[] a) throws RemoteException {
- return a;
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public char[] call(char[] a) throws RemoteException {
+ return a;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue char array calls.
* Arguments: <array size> <# calls>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int reps = Integer.parseInt(args[1]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
- char[] array = new char[size];
+ int size = Integer.parseInt(args[0]);
+ int reps = Integer.parseInt(args[1]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
+ char[] array = new char[size];
- long start = System.currentTimeMillis();
- for (int i = 0; i < reps; i++)
- stub.call(array);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < reps; i++)
+ stub.call(array);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/CharCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/CharCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -38,40 +38,39 @@
public class CharCalls implements Benchmark {
interface Server extends Remote {
- public char call(char val) throws RemoteException;
+ public char call(char val) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public char call(char val) throws RemoteException {
- return val;
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public char call(char val) throws RemoteException {
+ return val;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue char calls.
* Arguments: <# calls>
*/
public long run(String[] args) throws Exception {
- int cycles = Integer.parseInt(args[0]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
+ int cycles = Integer.parseInt(args[0]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
- long start = System.currentTimeMillis();
- for (int i = 0; i < cycles; i++)
- stub.call('0');
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < cycles; i++)
+ stub.call('0');
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ClassLoading.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ClassLoading.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -45,16 +45,15 @@
* Arguments: <# reps>
*/
public long run(String[] args) throws Exception {
- int reps = Integer.parseInt(args[0]);
- CodeSource csrc = getClass().getProtectionDomain().getCodeSource();
- String url = "jar:" + csrc.getLocation().toString() + ALTROOT;
-
- long start = System.currentTimeMillis();
- for (int i = 0; i < reps; i++)
- RMIClassLoader.loadClass(url, CLASSNAME);
- long time = System.currentTimeMillis() - start;
-
- return time;
+ int reps = Integer.parseInt(args[0]);
+ CodeSource csrc = getClass().getProtectionDomain().getCodeSource();
+ String url = "jar:" + csrc.getLocation().toString() + ALTROOT;
+
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < reps; i++)
+ RMIClassLoader.loadClass(url, CLASSNAME);
+ long time = System.currentTimeMillis() - start;
+
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/DoubleArrayCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/DoubleArrayCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -39,42 +39,41 @@
public class DoubleArrayCalls implements Benchmark {
interface Server extends Remote {
- public double[] call(double[] a) throws RemoteException;
+ public double[] call(double[] a) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public double[] call(double[] a) throws RemoteException {
- return a;
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public double[] call(double[] a) throws RemoteException {
+ return a;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue double array calls.
* Arguments: <array size> <# calls>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int reps = Integer.parseInt(args[1]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
- double[] array = new double[size];
+ int size = Integer.parseInt(args[0]);
+ int reps = Integer.parseInt(args[1]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
+ double[] array = new double[size];
- long start = System.currentTimeMillis();
- for (int i = 0; i < reps; i++)
- stub.call(array);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < reps; i++)
+ stub.call(array);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/DoubleCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/DoubleCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -38,40 +38,39 @@
public class DoubleCalls implements Benchmark {
interface Server extends Remote {
- public double call(double val) throws RemoteException;
+ public double call(double val) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public double call(double val) throws RemoteException {
- return val;
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public double call(double val) throws RemoteException {
+ return val;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue double calls.
* Arguments: <# calls>
*/
public long run(String[] args) throws Exception {
- int cycles = Integer.parseInt(args[0]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
+ int cycles = Integer.parseInt(args[0]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
- long start = System.currentTimeMillis();
- for (int i = 0; i < cycles; i++)
- stub.call(0.0);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < cycles; i++)
+ stub.call(0.0);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ExceptionCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ExceptionCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -41,43 +41,42 @@
}
interface Server extends Remote {
- public void call() throws RemoteException, FooException;
+ public void call() throws RemoteException, FooException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public void call() throws RemoteException, FooException {
- throw new FooException();
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public void call() throws RemoteException, FooException {
+ throw new FooException();
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue calls which throw exceptions.
* Arguments: <# calls>
*/
public long run(String[] args) throws Exception {
- int reps = Integer.parseInt(args[0]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
+ int reps = Integer.parseInt(args[0]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
- long start = System.currentTimeMillis();
- for (int i = 0; i < reps; i++) {
- try {
- stub.call();
- } catch (FooException e) {}
- }
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < reps; i++) {
+ try {
+ stub.call();
+ } catch (FooException e) {}
+ }
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ExportObjs.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ExportObjs.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000-2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of UnicastRemoteObject.exportObject().
*/
public class ExportObjs implements Benchmark {
-
+
static class RemoteObj implements Remote {
}
@@ -44,19 +44,18 @@
* Arguments: <# objects>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- Remote[] objs = new Remote[size];
- for (int i = 0; i < size; i++)
- objs[i] = new RemoteObj();
-
- long start = System.currentTimeMillis();
- for (int i = 0; i < size; i++)
- UnicastRemoteObject.exportObject(objs[i],0);
- long time = System.currentTimeMillis() - start;
-
- for (int i = 0; i < size; i++)
- UnicastRemoteObject.unexportObject(objs[i], true);
- return time;
+ int size = Integer.parseInt(args[0]);
+ Remote[] objs = new Remote[size];
+ for (int i = 0; i < size; i++)
+ objs[i] = new RemoteObj();
+
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < size; i++)
+ UnicastRemoteObject.exportObject(objs[i],0);
+ long time = System.currentTimeMillis() - start;
+
+ for (int i = 0; i < size; i++)
+ UnicastRemoteObject.unexportObject(objs[i], true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/FloatArrayCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/FloatArrayCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -39,42 +39,41 @@
public class FloatArrayCalls implements Benchmark {
interface Server extends Remote {
- public float[] call(float[] a) throws RemoteException;
+ public float[] call(float[] a) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public float[] call(float[] a) throws RemoteException {
- return a;
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public float[] call(float[] a) throws RemoteException {
+ return a;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue float array calls.
* Arguments: <array size> <# calls>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int reps = Integer.parseInt(args[1]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
- float[] array = new float[size];
+ int size = Integer.parseInt(args[0]);
+ int reps = Integer.parseInt(args[1]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
+ float[] array = new float[size];
- long start = System.currentTimeMillis();
- for (int i = 0; i < reps; i++)
- stub.call(array);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < reps; i++)
+ stub.call(array);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/FloatCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/FloatCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -38,40 +38,39 @@
public class FloatCalls implements Benchmark {
interface Server extends Remote {
- public float call(float val) throws RemoteException;
+ public float call(float val) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public float call(float val) throws RemoteException {
- return val;
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public float call(float val) throws RemoteException {
+ return val;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue float calls.
* Arguments: <# calls>
*/
public long run(String[] args) throws Exception {
- int cycles = Integer.parseInt(args[0]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
+ int cycles = Integer.parseInt(args[0]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
- long start = System.currentTimeMillis();
- for (int i = 0; i < cycles; i++)
- stub.call((float) 0.0);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < cycles; i++)
+ stub.call((float) 0.0);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/IntArrayCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/IntArrayCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -39,42 +39,41 @@
public class IntArrayCalls implements Benchmark {
interface Server extends Remote {
- public int[] call(int[] a) throws RemoteException;
+ public int[] call(int[] a) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public int[] call(int[] a) throws RemoteException {
- return a;
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public int[] call(int[] a) throws RemoteException {
+ return a;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue int array calls.
* Arguments: <array size> <# calls>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int reps = Integer.parseInt(args[1]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
- int[] array = new int[size];
+ int size = Integer.parseInt(args[0]);
+ int reps = Integer.parseInt(args[1]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
+ int[] array = new int[size];
- long start = System.currentTimeMillis();
- for (int i = 0; i < reps; i++)
- stub.call(array);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < reps; i++)
+ stub.call(array);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/IntCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/IntCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -38,40 +38,39 @@
public class IntCalls implements Benchmark {
interface Server extends Remote {
- public int call(int val) throws RemoteException;
+ public int call(int val) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public int call(int val) throws RemoteException {
- return val;
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public int call(int val) throws RemoteException {
+ return val;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue int calls.
* Arguments: <# calls>
*/
public long run(String[] args) throws Exception {
- int cycles = Integer.parseInt(args[0]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
+ int cycles = Integer.parseInt(args[0]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
- long start = System.currentTimeMillis();
- for (int i = 0; i < cycles; i++)
- stub.call(0);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < cycles; i++)
+ stub.call(0);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/LongArrayCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/LongArrayCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -39,42 +39,41 @@
public class LongArrayCalls implements Benchmark {
interface Server extends Remote {
- public long[] call(long[] a) throws RemoteException;
+ public long[] call(long[] a) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public long[] call(long[] a) throws RemoteException {
- return a;
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public long[] call(long[] a) throws RemoteException {
+ return a;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue long array calls.
* Arguments: <array size> <# calls>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int reps = Integer.parseInt(args[1]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
- long[] array = new long[size];
+ int size = Integer.parseInt(args[0]);
+ int reps = Integer.parseInt(args[1]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
+ long[] array = new long[size];
- long start = System.currentTimeMillis();
- for (int i = 0; i < reps; i++)
- stub.call(array);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < reps; i++)
+ stub.call(array);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/LongCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/LongCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -38,40 +38,39 @@
public class LongCalls implements Benchmark {
interface Server extends Remote {
- public long call(long val) throws RemoteException;
+ public long call(long val) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public long call(long val) throws RemoteException {
- return val;
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public long call(long val) throws RemoteException {
+ return val;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue long calls.
* Arguments: <# calls>
*/
public long run(String[] args) throws Exception {
- int cycles = Integer.parseInt(args[0]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
+ int cycles = Integer.parseInt(args[0]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
- long start = System.currentTimeMillis();
- for (int i = 0; i < cycles; i++)
- stub.call(0L);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < cycles; i++)
+ stub.call(0L);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/Main.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/Main.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -47,35 +47,35 @@
import java.util.Timer;
import java.util.TimerTask;
-/*
+/*
* RMI/Serialization benchmark tests.
*/
public class Main {
-
+
/**
* RMI-specific benchmark harness.
*/
static class RMIHarness extends Harness {
- /**
- * Construct new RMI benchmark harness.
- */
- RMIHarness(InputStream in) throws IOException, ConfigFormatException {
- super(in);
- }
-
- /**
- * Cleanup both client and server side in between each benchmark.
- */
- protected void cleanup() {
- System.gc();
- if (Main.runmode == CLIENT) {
- try {
- Main.server.gc();
- } catch (Exception e) {
- System.err.println("Warning: server gc failed: " + e);
- }
- }
- }
+ /**
+ * Construct new RMI benchmark harness.
+ */
+ RMIHarness(InputStream in) throws IOException, ConfigFormatException {
+ super(in);
+ }
+
+ /**
+ * Cleanup both client and server side in between each benchmark.
+ */
+ protected void cleanup() {
+ System.gc();
+ if (Main.runmode == CLIENT) {
+ try {
+ Main.server.gc();
+ } catch (Exception e) {
+ System.err.println("Warning: server gc failed: " + e);
+ }
+ }
+ }
}
static final String CONFFILE = "/bench/rmi/config";
@@ -85,7 +85,7 @@
static final int SAMEVM = 0;
static final int CLIENT = 1;
static final int SERVER = 2;
-
+
static final int TEXT = 0;
static final int HTML = 1;
static final int XML = 2;
@@ -111,7 +111,7 @@
* Returns reference to benchmark server.
*/
public static BenchServer getBenchServer() {
- return server;
+ return server;
}
/**
@@ -127,252 +127,252 @@
p.println(" -t <num hours> repeat benchmarks for specified number of hours");
p.println(" -o <file> specify output file");
p.println(" -c <file> specify (non-default) " +
- "configuration file");
+ "configuration file");
p.println(" -html format output as html " +
- "(default is text)");
+ "(default is text)");
p.println(" -xml format output as xml");
- p.println(" -client <host:port> run benchmark client using server " +
- "on specified host/port");
- p.println(" -server <port> run benchmark server on given port");
+ p.println(" -client <host:port> run benchmark client using server " +
+ "on specified host/port");
+ p.println(" -server <port> run benchmark server on given port");
}
-
+
/**
* Print error message and exit.
*/
static void die(String mesg) {
- System.err.println(mesg);
- System.exit(1);
+ System.err.println(mesg);
+ System.exit(1);
}
/**
* Stop server and exit.
*/
public static void exit() {
- switch (runmode) {
- case CLIENT:
- if (server != null) {
- try {
- server.terminate(0);
- } catch (RemoteException re) {
- // ignore
- }
- }
- default:
- System.exit(0);
- }
+ switch (runmode) {
+ case CLIENT:
+ if (server != null) {
+ try {
+ server.terminate(0);
+ } catch (RemoteException re) {
+ // ignore
+ }
+ }
+ default:
+ System.exit(0);
+ }
}
/**
* Benchmark mainline.
*/
public static void main(String[] args) {
- setupSecurity();
- parseArgs(args);
- setupStreams();
- if (list) {
- listConfig();
- } else {
- setupServer();
- if (runmode != SERVER) {
- setupHarness();
- setupReporter();
- if (exitOnTimer) {
- setupTimer(testDurationSeconds);
- while (true) {
- runBenchmarks();
- if (exitRequested) {
- exit();
- }
- }
- } else {
- runBenchmarks();
- exit();
- }
- }
- }
+ setupSecurity();
+ parseArgs(args);
+ setupStreams();
+ if (list) {
+ listConfig();
+ } else {
+ setupServer();
+ if (runmode != SERVER) {
+ setupHarness();
+ setupReporter();
+ if (exitOnTimer) {
+ setupTimer(testDurationSeconds);
+ while (true) {
+ runBenchmarks();
+ if (exitRequested) {
+ exit();
+ }
+ }
+ } else {
+ runBenchmarks();
+ exit();
+ }
+ }
+ }
}
-
+
/**
* Parse command-line arguments.
*/
static void parseArgs(String[] args) {
- for (int i = 0; i < args.length; i++) {
- if (args[i].equals("-h")) {
- usage();
- System.exit(0);
- } else if (args[i].equals("-v")) {
- verbose = true;
- } else if (args[i].equals("-l")) {
- list = true;
- } else if (args[i].equals("-t")) {
- if (++i >= args.length)
- die("Error: no timeout value specified");
- try {
- exitOnTimer = true;
- testDurationSeconds = Integer.parseInt(args[i]) * 3600;
- } catch (Exception e) {
- die("Error: unable to determine timeout value");
- }
- } else if (args[i].equals("-o")) {
- if (++i >= args.length)
- die("Error: no output file specified");
- try {
- repstr = new FileOutputStream(args[i]);
- } catch (IOException e) {
- die("Error: unable to open \"" + args[i] + "\"");
- }
- } else if (args[i].equals("-c")) {
- if (++i >= args.length)
- die("Error: no config file specified");
- try {
- confstr = new FileInputStream(args[i]);
- } catch (IOException e) {
- die("Error: unable to open \"" + args[i] + "\"");
- }
- } else if (args[i].equals("-html")) {
- if (format != TEXT)
- die("Error: conflicting formats");
- format = HTML;
- } else if (args[i].equals("-xml")) {
- if (format != TEXT)
- die("Error: conflicting formats");
- format = XML;
- } else if (args[i].equals("-client")) {
- if (runmode == CLIENT)
- die("Error: multiple -client options");
- if (runmode == SERVER)
- die("Error: -client and -server options conflict");
- if (++i >= args.length)
- die("Error: -client missing host/port");
- try {
- int sepi = args[i].indexOf(':');
- host = args[i].substring(0, sepi);
- port = Integer.parseInt(args[i].substring(sepi + 1));
- } catch (Exception e) {
- die("Error: illegal host/port specified for -client");
- }
- runmode = CLIENT;
- } else if (args[i].equals("-server")) {
- if (runmode == CLIENT)
- die("Error: -client and -server options conflict");
- if (runmode == SERVER)
- die("Error: multiple -server options");
- if (++i >= args.length)
- die("Error: -server missing port");
- try {
- port = Integer.parseInt(args[i]);
- } catch (Exception e) {
- die("Error: illegal port specified for -server");
- }
- runmode = SERVER;
- } else {
- System.err.println("Illegal option: \"" + args[i] + "\"");
- usage();
- System.exit(1);
- }
- }
+ for (int i = 0; i < args.length; i++) {
+ if (args[i].equals("-h")) {
+ usage();
+ System.exit(0);
+ } else if (args[i].equals("-v")) {
+ verbose = true;
+ } else if (args[i].equals("-l")) {
+ list = true;
+ } else if (args[i].equals("-t")) {
+ if (++i >= args.length)
+ die("Error: no timeout value specified");
+ try {
+ exitOnTimer = true;
+ testDurationSeconds = Integer.parseInt(args[i]) * 3600;
+ } catch (Exception e) {
+ die("Error: unable to determine timeout value");
+ }
+ } else if (args[i].equals("-o")) {
+ if (++i >= args.length)
+ die("Error: no output file specified");
+ try {
+ repstr = new FileOutputStream(args[i]);
+ } catch (IOException e) {
+ die("Error: unable to open \"" + args[i] + "\"");
+ }
+ } else if (args[i].equals("-c")) {
+ if (++i >= args.length)
+ die("Error: no config file specified");
+ try {
+ confstr = new FileInputStream(args[i]);
+ } catch (IOException e) {
+ die("Error: unable to open \"" + args[i] + "\"");
+ }
+ } else if (args[i].equals("-html")) {
+ if (format != TEXT)
+ die("Error: conflicting formats");
+ format = HTML;
+ } else if (args[i].equals("-xml")) {
+ if (format != TEXT)
+ die("Error: conflicting formats");
+ format = XML;
+ } else if (args[i].equals("-client")) {
+ if (runmode == CLIENT)
+ die("Error: multiple -client options");
+ if (runmode == SERVER)
+ die("Error: -client and -server options conflict");
+ if (++i >= args.length)
+ die("Error: -client missing host/port");
+ try {
+ int sepi = args[i].indexOf(':');
+ host = args[i].substring(0, sepi);
+ port = Integer.parseInt(args[i].substring(sepi + 1));
+ } catch (Exception e) {
+ die("Error: illegal host/port specified for -client");
+ }
+ runmode = CLIENT;
+ } else if (args[i].equals("-server")) {
+ if (runmode == CLIENT)
+ die("Error: -client and -server options conflict");
+ if (runmode == SERVER)
+ die("Error: multiple -server options");
+ if (++i >= args.length)
+ die("Error: -server missing port");
+ try {
+ port = Integer.parseInt(args[i]);
+ } catch (Exception e) {
+ die("Error: illegal port specified for -server");
+ }
+ runmode = SERVER;
+ } else {
+ System.err.println("Illegal option: \"" + args[i] + "\"");
+ usage();
+ System.exit(1);
+ }
+ }
}
-
+
/**
* Set up security manager and policy, if not set already.
*/
static void setupSecurity() {
- if (System.getSecurityManager() != null)
- return;
-
- /* As of 1.4, it is too late to set the security policy
- * file at this point so these line have been commented out.
- */
- //System.setProperty("java.security.policy",
- // Main.class.getResource("/bench/rmi/policy.all").toString());
- System.setSecurityManager(new RMISecurityManager());
+ if (System.getSecurityManager() != null)
+ return;
+
+ /* As of 1.4, it is too late to set the security policy
+ * file at this point so these line have been commented out.
+ */
+ //System.setProperty("java.security.policy",
+ // Main.class.getResource("/bench/rmi/policy.all").toString());
+ System.setSecurityManager(new RMISecurityManager());
}
/**
* Set up configuration file and report streams, if not set already.
*/
static void setupStreams() {
- if (repstr == null)
- repstr = System.out;
- if (confstr == null)
- confstr = (new Main()).getClass().getResourceAsStream(CONFFILE);
- if (confstr == null)
- die("Error: unable to find default config file");
+ if (repstr == null)
+ repstr = System.out;
+ if (confstr == null)
+ confstr = (new Main()).getClass().getResourceAsStream(CONFFILE);
+ if (confstr == null)
+ die("Error: unable to find default config file");
}
-
+
/**
* Print contents of configuration file to selected output stream.
*/
static void listConfig() {
- try {
- byte[] buf = new byte[256];
- int len;
- while ((len = confstr.read(buf)) != -1)
- repstr.write(buf, 0, len);
- } catch (IOException e) {
- die("Error: failed to list config file");
- }
+ try {
+ byte[] buf = new byte[256];
+ int len;
+ while ((len = confstr.read(buf)) != -1)
+ repstr.write(buf, 0, len);
+ } catch (IOException e) {
+ die("Error: failed to list config file");
+ }
}
-
+
/**
* Setup benchmark server.
*/
static void setupServer() {
- switch (runmode) {
- case SAMEVM:
- try {
- serverImpl = new BenchServerImpl();
- server = (BenchServer) RemoteObject.toStub(serverImpl);
- } catch (Exception e) {
- die("Error: failed to create local server: " + e);
- }
- if (verbose)
- System.out.println("Benchmark server created locally");
- break;
-
- case CLIENT:
- try {
- Registry reg = LocateRegistry.getRegistry(host, port);
- server = (BenchServer) reg.lookup(REGNAME);
- } catch (Exception e) {
- die("Error: failed to connect to server: " + e);
- }
- if (server == null) {
- die("Error: server not found");
- }
- if (verbose) {
- System.out.println("Connected to benchmark server on " +
- host + ":" + port);
- }
- break;
-
- case SERVER:
- try {
- Registry reg = LocateRegistry.createRegistry(port);
- serverImpl = new BenchServerImpl();
- reg.bind(REGNAME, serverImpl);
- } catch (Exception e) {
- die("Error: failed to initialize server: " + e);
- }
- if (verbose) {
- System.out.println("Benchmark server started on port " +
- port);
- }
- break;
-
- default:
- throw new InternalError("illegal runmode");
- }
+ switch (runmode) {
+ case SAMEVM:
+ try {
+ serverImpl = new BenchServerImpl();
+ server = (BenchServer) RemoteObject.toStub(serverImpl);
+ } catch (Exception e) {
+ die("Error: failed to create local server: " + e);
+ }
+ if (verbose)
+ System.out.println("Benchmark server created locally");
+ break;
+
+ case CLIENT:
+ try {
+ Registry reg = LocateRegistry.getRegistry(host, port);
+ server = (BenchServer) reg.lookup(REGNAME);
+ } catch (Exception e) {
+ die("Error: failed to connect to server: " + e);
+ }
+ if (server == null) {
+ die("Error: server not found");
+ }
+ if (verbose) {
+ System.out.println("Connected to benchmark server on " +
+ host + ":" + port);
+ }
+ break;
+
+ case SERVER:
+ try {
+ Registry reg = LocateRegistry.createRegistry(port);
+ serverImpl = new BenchServerImpl();
+ reg.bind(REGNAME, serverImpl);
+ } catch (Exception e) {
+ die("Error: failed to initialize server: " + e);
+ }
+ if (verbose) {
+ System.out.println("Benchmark server started on port " +
+ port);
+ }
+ break;
+
+ default:
+ throw new InternalError("illegal runmode");
+ }
}
/**
* Set up the timer to end the test.
*
- * @param delay the amount of delay, in seconds, before requesting
+ * @param delay the amount of delay, in seconds, before requesting
* the process exit
*/
static void setupTimer(int delay) {
- timer = new Timer(true);
+ timer = new Timer(true);
timer.schedule(
new TimerTask() {
public void run() {
@@ -391,12 +391,12 @@
} catch (ConfigFormatException e) {
String errmsg = e.getMessage();
if (errmsg != null) {
- die("Error parsing config file: " + errmsg);
- } else {
+ die("Error parsing config file: " + errmsg);
+ } else {
die("Error: illegal config file syntax");
- }
+ }
} catch (IOException e) {
- die("Error: failed to read config file");
+ die("Error: failed to read config file");
}
}
@@ -405,24 +405,24 @@
*/
static void setupReporter() {
String title = "RMI Benchmark, v" + VERSION;
- switch (format) {
- case TEXT:
- reporter = new TextReporter(repstr, title);
- break;
-
- case HTML:
- reporter = new HtmlReporter(repstr, title);
- break;
+ switch (format) {
+ case TEXT:
+ reporter = new TextReporter(repstr, title);
+ break;
+
+ case HTML:
+ reporter = new HtmlReporter(repstr, title);
+ break;
- case XML:
- reporter = new XmlReporter(repstr, title);
- break;
-
- default:
- die("Error: unrecognized format type");
- }
+ case XML:
+ reporter = new XmlReporter(repstr, title);
+ break;
+
+ default:
+ die("Error: unrecognized format type");
+ }
}
-
+
/**
* Run benchmarks.
*/
@@ -430,4 +430,3 @@
harness.runBenchmarks(reporter, verbose);
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/NullCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/NullCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -38,39 +38,38 @@
public class NullCalls implements Benchmark {
interface Server extends Remote {
- public void call() throws RemoteException;
+ public void call() throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public void call() throws RemoteException {
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public void call() throws RemoteException {
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue null calls.
* Arguments: <# calls>
*/
public long run(String[] args) throws Exception {
- int reps = Integer.parseInt(args[0]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
+ int reps = Integer.parseInt(args[0]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
- long start = System.currentTimeMillis();
- for (int i = 0; i < reps; i++)
- stub.call();
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < reps; i++)
+ stub.call();
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ObjArrayCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ObjArrayCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -41,16 +41,16 @@
static class Node implements Serializable {
boolean z;
- byte b;
- char c;
- short s;
- int i;
- float f;
- long j;
- double d;
- String str = "bodega";
+ byte b;
+ char c;
+ short s;
+ int i;
+ float f;
+ long j;
+ double d;
+ String str = "bodega";
Object parent, left, right;
-
+
Node(Object parent, int depth) {
this.parent = parent;
if (depth > 0) {
@@ -61,44 +61,43 @@
}
interface Server extends Remote {
- public Node[] call(Node[] a) throws RemoteException;
+ public Node[] call(Node[] a) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
+ public ServerImpl() throws RemoteException {
+ }
- public Node[] call(Node[] a) throws RemoteException {
- return a;
- }
+ public Node[] call(Node[] a) throws RemoteException {
+ return a;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue calls using arrays of objects as parameters/return values.
* Arguments: <array size> <# calls>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int reps = Integer.parseInt(args[1]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
- Node[] nodes = new Node[size];
- for (int i = 0; i < size; i++)
- nodes[i] = new Node(null, 0);
+ int size = Integer.parseInt(args[0]);
+ int reps = Integer.parseInt(args[1]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
+ Node[] nodes = new Node[size];
+ for (int i = 0; i < size; i++)
+ nodes[i] = new Node(null, 0);
- long start = System.currentTimeMillis();
- for (int i = 0; i < reps; i++)
- stub.call(nodes);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < reps; i++)
+ stub.call(nodes);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ObjTreeCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ObjTreeCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -41,16 +41,16 @@
static class Node implements Serializable {
boolean z;
- byte b;
- char c;
- short s;
- int i;
- float f;
- long j;
- double d;
- String str = "bodega";
+ byte b;
+ char c;
+ short s;
+ int i;
+ float f;
+ long j;
+ double d;
+ String str = "bodega";
Object parent, left, right;
-
+
Node(Object parent, int depth) {
this.parent = parent;
if (depth > 0) {
@@ -61,42 +61,41 @@
}
interface Server extends Remote {
- public Node call(Node val) throws RemoteException;
+ public Node call(Node val) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
+ public ServerImpl() throws RemoteException {
+ }
- public Node call(Node val) throws RemoteException {
- return val;
- }
+ public Node call(Node val) throws RemoteException {
+ return val;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue calls using trees of objects as parameters/return values.
* Arguments: <tree depth> <# calls>
*/
public long run(String[] args) throws Exception {
- int depth = Integer.parseInt(args[0]);
- int reps = Integer.parseInt(args[1]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
- Node node = new Node(null, depth);
+ int depth = Integer.parseInt(args[0]);
+ int reps = Integer.parseInt(args[1]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
+ Node node = new Node(null, depth);
- long start = System.currentTimeMillis();
- for (int i = 0; i < reps; i++)
- stub.call(node);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < reps; i++)
+ stub.call(node);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ProxyArrayCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ProxyArrayCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -44,52 +44,52 @@
public class ProxyArrayCalls implements Benchmark {
static class DummyHandler implements InvocationHandler, Serializable {
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable
- {
- return null;
- }
+ public Object invoke(Object proxy, Method method, Object[] args)
+ throws Throwable
+ {
+ return null;
+ }
}
-
+
public static interface DummyInterface {
- public void foo();
+ public void foo();
}
interface Server extends Remote {
- public Proxy[] call(Proxy[] a) throws RemoteException;
+ public Proxy[] call(Proxy[] a) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
+ public ServerImpl() throws RemoteException {
+ }
- public Proxy[] call(Proxy[] a) throws RemoteException {
- return a;
- }
+ public Proxy[] call(Proxy[] a) throws RemoteException {
+ return a;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Generate proxy object array of the given size.
*/
Proxy[] genProxies(int size) throws Exception {
- Class proxyClass =
- Proxy.getProxyClass(DummyInterface.class.getClassLoader(),
- new Class[] { DummyInterface.class });
- Constructor proxyCons =
- proxyClass.getConstructor(new Class[] { InvocationHandler.class });
- Object[] consArgs = new Object[] { new DummyHandler() };
- Proxy[] proxies = new Proxy[size];
+ Class proxyClass =
+ Proxy.getProxyClass(DummyInterface.class.getClassLoader(),
+ new Class[] { DummyInterface.class });
+ Constructor proxyCons =
+ proxyClass.getConstructor(new Class[] { InvocationHandler.class });
+ Object[] consArgs = new Object[] { new DummyHandler() };
+ Proxy[] proxies = new Proxy[size];
- for (int i = 0; i < size; i++)
- proxies[i] = (Proxy) proxyCons.newInstance(consArgs);
+ for (int i = 0; i < size; i++)
+ proxies[i] = (Proxy) proxyCons.newInstance(consArgs);
- return proxies;
+ return proxies;
}
/**
@@ -97,19 +97,18 @@
* Arguments: <array size> <# calls>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int reps = Integer.parseInt(args[1]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
- Proxy[] proxies = genProxies(size);
+ int size = Integer.parseInt(args[0]);
+ int reps = Integer.parseInt(args[1]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
+ Proxy[] proxies = genProxies(size);
- long start = System.currentTimeMillis();
- for (int i = 0; i < reps; i++)
- stub.call(proxies);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < reps; i++)
+ stub.call(proxies);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/RemoteObjArrayCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/RemoteObjArrayCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -39,49 +39,48 @@
public class RemoteObjArrayCalls implements Benchmark {
static class RemoteObj extends UnicastRemoteObject implements Remote {
- RemoteObj() throws RemoteException {
- }
+ RemoteObj() throws RemoteException {
+ }
}
interface Server extends Remote {
- public Remote[] call(Remote[] a) throws RemoteException;
+ public Remote[] call(Remote[] a) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
+ public ServerImpl() throws RemoteException {
+ }
- public Remote[] call(Remote[] a) throws RemoteException {
- return a;
- }
+ public Remote[] call(Remote[] a) throws RemoteException {
+ return a;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue calls using arrays of remote objects as parameters/return values.
* Arguments: <array size> <# calls>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int reps = Integer.parseInt(args[1]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
- Remote[] objs = new Remote[size];
- for (int i = 0; i < size; i++)
- objs[i] = new RemoteObj();
+ int size = Integer.parseInt(args[0]);
+ int reps = Integer.parseInt(args[1]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
+ Remote[] objs = new Remote[size];
+ for (int i = 0; i < size; i++)
+ objs[i] = new RemoteObj();
- long start = System.currentTimeMillis();
- for (int i = 0; i < reps; i++)
- stub.call(objs);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < reps; i++)
+ stub.call(objs);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ShortArrayCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ShortArrayCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -20,7 +20,7 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
-
+
/*
*
*/
@@ -39,42 +39,41 @@
public class ShortArrayCalls implements Benchmark {
interface Server extends Remote {
- public short[] call(short[] a) throws RemoteException;
+ public short[] call(short[] a) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public short[] call(short[] a) throws RemoteException {
- return a;
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public short[] call(short[] a) throws RemoteException {
+ return a;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue short array calls.
* Arguments: <array size> <# calls>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int reps = Integer.parseInt(args[1]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
- short[] array = new short[size];
+ int size = Integer.parseInt(args[0]);
+ int reps = Integer.parseInt(args[1]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
+ short[] array = new short[size];
- long start = System.currentTimeMillis();
- for (int i = 0; i < reps; i++)
- stub.call(array);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < reps; i++)
+ stub.call(array);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ShortCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/ShortCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -38,40 +38,39 @@
public class ShortCalls implements Benchmark {
interface Server extends Remote {
- public short call(short val) throws RemoteException;
+ public short call(short val) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
-
- public short call(short val) throws RemoteException {
- return val;
- }
+ public ServerImpl() throws RemoteException {
+ }
+
+ public short call(short val) throws RemoteException {
+ return val;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue short calls.
* Arguments: <# calls>
*/
public long run(String[] args) throws Exception {
- int cycles = Integer.parseInt(args[0]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
+ int cycles = Integer.parseInt(args[0]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
- long start = System.currentTimeMillis();
- for (int i = 0; i < cycles; i++)
- stub.call((short) 0);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < cycles; i++)
+ stub.call((short) 0);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/rmi/SmallObjTreeCalls.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/rmi/SmallObjTreeCalls.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -41,7 +41,7 @@
static class Node implements Serializable {
Object parent, left, right;
-
+
Node(Object parent, int depth) {
this.parent = parent;
if (depth > 0) {
@@ -52,42 +52,41 @@
}
interface Server extends Remote {
- public Node call(Node val) throws RemoteException;
+ public Node call(Node val) throws RemoteException;
}
static class ServerImpl extends UnicastRemoteObject implements Server {
- public ServerImpl() throws RemoteException {
- }
+ public ServerImpl() throws RemoteException {
+ }
- public Node call(Node val) throws RemoteException {
- return val;
- }
+ public Node call(Node val) throws RemoteException {
+ return val;
+ }
}
-
+
static class ServerFactory implements BenchServer.RemoteObjectFactory {
- public Remote create() throws RemoteException {
- return new ServerImpl();
- }
+ public Remote create() throws RemoteException {
+ return new ServerImpl();
+ }
}
-
+
/**
* Issue calls using trees of small objects as parameters/return values.
* Arguments: <tree depth> <# calls>
*/
public long run(String[] args) throws Exception {
- int depth = Integer.parseInt(args[0]);
- int reps = Integer.parseInt(args[1]);
- BenchServer bsrv = Main.getBenchServer();
- Server stub = (Server) bsrv.create(new ServerFactory());
- Node node = new Node(null, depth);
+ int depth = Integer.parseInt(args[0]);
+ int reps = Integer.parseInt(args[1]);
+ BenchServer bsrv = Main.getBenchServer();
+ Server stub = (Server) bsrv.create(new ServerFactory());
+ Node node = new Node(null, depth);
- long start = System.currentTimeMillis();
- for (int i = 0; i < reps; i++)
- stub.call(node);
- long time = System.currentTimeMillis() - start;
-
- bsrv.unexport(stub, true);
- return time;
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < reps; i++)
+ stub.call(node);
+ long time = System.currentTimeMillis() - start;
+
+ bsrv.unexport(stub, true);
+ return time;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/BooleanArrays.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/BooleanArrays.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of boolean array reads/writes.
*/
public class BooleanArrays implements Benchmark {
-
+
/**
* Write and read boolean arrays to/from a stream. The benchmark is run in
* batches, with each batch consisting of a fixed number of read/write
@@ -44,44 +44,42 @@
* Arguments: <array size> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- boolean[][] arrays = new boolean[ncycles][size];
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
+ int size = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ boolean[][] arrays = new boolean[ncycles][size];
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- doReps(oout, oin, sbuf, arrays, 1); // warmup
+ doReps(oout, oin, sbuf, arrays, 1); // warmup
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, arrays, nbatches);
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, arrays, nbatches);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of batches, with given number of cycles
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, boolean[][] arrays, int nbatches)
- throws Exception
+ StreamBuffer sbuf, boolean[][] arrays, int nbatches)
+ throws Exception
{
- int ncycles = arrays.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(arrays[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = arrays.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(arrays[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/Booleans.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/Booleans.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of boolean reads/writes.
*/
public class Booleans implements Benchmark {
-
+
/**
* Write and read boolean values to/from a stream. The benchmark is run in
* batches: each "batch" consists of a fixed number of read/write cycles,
@@ -44,40 +44,38 @@
* Arguments: <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int nbatches = Integer.parseInt(args[0]);
- int ncycles = Integer.parseInt(args[1]);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, 1, ncycles); // warmup
+ int nbatches = Integer.parseInt(args[0]);
+ int ncycles = Integer.parseInt(args[1]);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, nbatches, ncycles);
+ doReps(oout, oin, sbuf, 1, ncycles); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, nbatches, ncycles);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of batches, with given number of cycles
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, int nbatches, int ncycles)
- throws Exception
+ StreamBuffer sbuf, int nbatches, int ncycles)
+ throws Exception
{
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeBoolean(false);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readBoolean();
- }
- }
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeBoolean(false);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readBoolean();
+ }
+ }
}
}
-
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/ByteArrays.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/ByteArrays.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of byte array reads/writes.
*/
public class ByteArrays implements Benchmark {
-
+
/**
* Write and read byte arrays to/from a stream. The benchmark is run in
* batches, with each batch consisting of a fixed number of read/write
@@ -44,44 +44,42 @@
* Arguments: <array size> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- byte[][] arrays = new byte[ncycles][size];
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
+ int size = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ byte[][] arrays = new byte[ncycles][size];
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- doReps(oout, oin, sbuf, arrays, 1); // warmup
+ doReps(oout, oin, sbuf, arrays, 1); // warmup
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, arrays, nbatches);
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, arrays, nbatches);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of batches, with given number of cycles
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, byte[][] arrays, int nbatches)
- throws Exception
+ StreamBuffer sbuf, byte[][] arrays, int nbatches)
+ throws Exception
{
- int ncycles = arrays.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(arrays[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = arrays.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(arrays[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/Bytes.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/Bytes.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of byte reads/writes.
*/
public class Bytes implements Benchmark {
-
+
/**
* Write and read byte values to/from a stream. The benchmark is run in
* batches: each "batch" consists of a fixed number of read/write cycles,
@@ -44,39 +44,38 @@
* Arguments: <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int nbatches = Integer.parseInt(args[0]);
- int ncycles = Integer.parseInt(args[1]);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, 1, ncycles); // warmup
+ int nbatches = Integer.parseInt(args[0]);
+ int ncycles = Integer.parseInt(args[1]);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, nbatches, ncycles);
+ doReps(oout, oin, sbuf, 1, ncycles); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, nbatches, ncycles);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of batches, with given number of cycles
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, int nbatches, int ncycles)
- throws Exception
+ StreamBuffer sbuf, int nbatches, int ncycles)
+ throws Exception
{
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeByte(0);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readByte();
- }
- }
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeByte(0);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readByte();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/CharArrays.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/CharArrays.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of char array reads/writes.
*/
public class CharArrays implements Benchmark {
-
+
/**
* Write and read char arrays to/from a stream. The benchmark is run in
* batches, with each batch consisting of a fixed number of read/write
@@ -44,44 +44,42 @@
* Arguments: <array size> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- char[][] arrays = new char[ncycles][size];
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
+ int size = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ char[][] arrays = new char[ncycles][size];
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- doReps(oout, oin, sbuf, arrays, 1); // warmup
+ doReps(oout, oin, sbuf, arrays, 1); // warmup
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, arrays, nbatches);
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, arrays, nbatches);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of batches, with given number of cycles
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, char[][] arrays, int nbatches)
- throws Exception
+ StreamBuffer sbuf, char[][] arrays, int nbatches)
+ throws Exception
{
- int ncycles = arrays.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(arrays[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = arrays.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(arrays[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/Chars.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/Chars.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of char reads/writes.
*/
public class Chars implements Benchmark {
-
+
/**
* Write and read char values to/from a stream. The benchmark is run in
* batches: each "batch" consists of a fixed number of read/write cycles,
@@ -44,39 +44,38 @@
* Arguments: <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int nbatches = Integer.parseInt(args[0]);
- int ncycles = Integer.parseInt(args[1]);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, 1, ncycles); // warmup
+ int nbatches = Integer.parseInt(args[0]);
+ int ncycles = Integer.parseInt(args[1]);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, nbatches, ncycles);
+ doReps(oout, oin, sbuf, 1, ncycles); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, nbatches, ncycles);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of batches, with given number of cycles
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, int nbatches, int ncycles)
- throws Exception
+ StreamBuffer sbuf, int nbatches, int ncycles)
+ throws Exception
{
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeChar('0');
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readChar();
- }
- }
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeChar('0');
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readChar();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/ClassDesc.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/ClassDesc.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -89,41 +89,40 @@
static class Dummy48 extends Dummy47 { Dummy48 i48; }
static class Dummy49 extends Dummy48 { Dummy49 i49; }
static class Dummy50 extends Dummy49 { Dummy50 i50; }
-
+
/**
* Write and read class descriptors to/from a stream.
* Arguments: <# cycles>
*/
public long run(String[] args) throws Exception {
- int ncycles = Integer.parseInt(args[0]);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
- ObjectStreamClass desc = ObjectStreamClass.lookup(Dummy50.class);
-
- doReps(oout, oin, sbuf, desc, 1); // warmup
+ int ncycles = Integer.parseInt(args[0]);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
+ ObjectStreamClass desc = ObjectStreamClass.lookup(Dummy50.class);
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, desc, ncycles);
+ doReps(oout, oin, sbuf, desc, 1); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, desc, ncycles);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of cycles.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, ObjectStreamClass desc, int ncycles)
- throws Exception
+ StreamBuffer sbuf, ObjectStreamClass desc, int ncycles)
+ throws Exception
{
- for (int i = 0; i < ncycles; i++) {
- sbuf.reset();
- oout.reset();
- oout.writeObject(desc);
- oout.flush();
- oin.readObject();
- }
+ for (int i = 0; i < ncycles; i++) {
+ sbuf.reset();
+ oout.reset();
+ oout.writeObject(desc);
+ oout.flush();
+ oin.readObject();
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/Cons.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/Cons.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -53,29 +53,28 @@
public long run(String[] args) throws Exception {
int reps = Integer.parseInt(args[0]);
Dummy dummy = new Dummy();
- StreamBuffer sbuf = new StreamBuffer();
-
- doReps(sbuf, dummy, 1); // warmup
+ StreamBuffer sbuf = new StreamBuffer();
- long start = System.currentTimeMillis();
- doReps(sbuf, dummy, reps);
+ doReps(sbuf, dummy, 1); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(sbuf, dummy, reps);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of cycles.
*/
void doReps(StreamBuffer sbuf, Dummy dummy, int reps) throws Exception {
- OutputStream out = sbuf.getOutputStream();
- InputStream in = sbuf.getInputStream();
- for (int i = 0; i < reps; i++) {
- sbuf.reset();
- ObjectOutputStream oout = new ObjectOutputStream(out);
- oout.writeObject(dummy);
- oout.flush();
- ObjectInputStream oin = new ObjectInputStream(in);
- oin.readObject();
- }
+ OutputStream out = sbuf.getOutputStream();
+ InputStream in = sbuf.getInputStream();
+ for (int i = 0; i < reps; i++) {
+ sbuf.reset();
+ ObjectOutputStream oout = new ObjectOutputStream(out);
+ oout.writeObject(dummy);
+ oout.flush();
+ ObjectInputStream oin = new ObjectInputStream(in);
+ oin.readObject();
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/CustomDefaultObjTrees.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/CustomDefaultObjTrees.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -39,19 +39,19 @@
* defaultWriteObject() and defaultReadObject().
*/
public class CustomDefaultObjTrees implements Benchmark {
-
+
static class Node implements Serializable {
boolean z;
- byte b;
- char c;
- short s;
- int i;
- float f;
- long j;
- double d;
- String str = "bodega";
+ byte b;
+ char c;
+ short s;
+ int i;
+ float f;
+ long j;
+ double d;
+ String str = "bodega";
Object parent, left, right;
-
+
Node(Object parent, int depth) {
this.parent = parent;
if (depth > 0) {
@@ -61,13 +61,13 @@
}
private void writeObject(ObjectOutputStream out) throws IOException {
- out.defaultWriteObject();
+ out.defaultWriteObject();
}
-
- private void readObject(ObjectInputStream in)
+
+ private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException
{
- in.defaultReadObject();
+ in.defaultReadObject();
}
}
@@ -79,20 +79,20 @@
* Arguments: <tree depth> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int depth = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- Node[] trees = genTrees(depth, ncycles);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, trees, 1); // warmup
+ int depth = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ Node[] trees = genTrees(depth, ncycles);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, trees, nbatches);
+ doReps(oout, oin, sbuf, trees, 1); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, trees, nbatches);
return System.currentTimeMillis() - start;
}
@@ -100,33 +100,32 @@
* Generate object trees.
*/
Node[] genTrees(int depth, int ntrees) {
- Node[] trees = new Node[ntrees];
- for (int i = 0; i < ntrees; i++) {
- trees[i] = new Node(null, depth);
- }
- return trees;
+ Node[] trees = new Node[ntrees];
+ for (int i = 0; i < ntrees; i++) {
+ trees[i] = new Node(null, depth);
+ }
+ return trees;
}
/**
- * Run benchmark for given number of batches, with each batch containing
+ * Run benchmark for given number of batches, with each batch containing
* the given number of cycles.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, Node[] trees, int nbatches)
- throws Exception
+ StreamBuffer sbuf, Node[] trees, int nbatches)
+ throws Exception
{
- int ncycles = trees.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(trees[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = trees.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(trees[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/CustomObjTrees.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/CustomObjTrees.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -38,19 +38,19 @@
* nodes contain custom writeObject() and readObject() methods.
*/
public class CustomObjTrees implements Benchmark {
-
+
static class Node implements Serializable {
boolean z;
- byte b;
- char c;
- short s;
- int i;
- float f;
- long j;
- double d;
- String str = "bodega";
+ byte b;
+ char c;
+ short s;
+ int i;
+ float f;
+ long j;
+ double d;
+ String str = "bodega";
Object parent, left, right;
-
+
Node(Object parent, int depth) {
this.parent = parent;
if (depth > 0) {
@@ -60,35 +60,35 @@
}
private void writeObject(ObjectOutputStream out) throws IOException {
- out.writeBoolean(z);
- out.writeByte(b);
- out.writeChar(c);
- out.writeShort(s);
- out.writeInt(i);
- out.writeFloat(f);
- out.writeLong(j);
- out.writeDouble(d);
- out.writeObject(str);
- out.writeObject(parent);
- out.writeObject(left);
- out.writeObject(right);
+ out.writeBoolean(z);
+ out.writeByte(b);
+ out.writeChar(c);
+ out.writeShort(s);
+ out.writeInt(i);
+ out.writeFloat(f);
+ out.writeLong(j);
+ out.writeDouble(d);
+ out.writeObject(str);
+ out.writeObject(parent);
+ out.writeObject(left);
+ out.writeObject(right);
}
-
- private void readObject(ObjectInputStream in)
+
+ private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException
{
- z = in.readBoolean();
- b = in.readByte();
- c = in.readChar();
- s = in.readShort();
- i = in.readInt();
- f = in.readFloat();
- j = in.readLong();
- d = in.readDouble();
- str = (String) in.readObject();
- parent = in.readObject();
- left = in.readObject();
- right = in.readObject();
+ z = in.readBoolean();
+ b = in.readByte();
+ c = in.readChar();
+ s = in.readShort();
+ i = in.readInt();
+ f = in.readFloat();
+ j = in.readLong();
+ d = in.readDouble();
+ str = (String) in.readObject();
+ parent = in.readObject();
+ left = in.readObject();
+ right = in.readObject();
}
}
@@ -100,20 +100,20 @@
* Arguments: <tree depth> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int depth = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- Node[] trees = genTrees(depth, ncycles);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, trees, 1); // warmup
+ int depth = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ Node[] trees = genTrees(depth, ncycles);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, trees, nbatches);
+ doReps(oout, oin, sbuf, trees, 1); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, trees, nbatches);
return System.currentTimeMillis() - start;
}
@@ -121,33 +121,32 @@
* Generate object trees.
*/
Node[] genTrees(int depth, int ntrees) {
- Node[] trees = new Node[ntrees];
- for (int i = 0; i < ntrees; i++) {
- trees[i] = new Node(null, depth);
- }
- return trees;
+ Node[] trees = new Node[ntrees];
+ for (int i = 0; i < ntrees; i++) {
+ trees[i] = new Node(null, depth);
+ }
+ return trees;
}
/**
- * Run benchmark for given number of batches, with each batch containing
+ * Run benchmark for given number of batches, with each batch containing
* the given number of cycles.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, Node[] trees, int nbatches)
- throws Exception
+ StreamBuffer sbuf, Node[] trees, int nbatches)
+ throws Exception
{
- int ncycles = trees.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(trees[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = trees.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(trees[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/DoubleArrays.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/DoubleArrays.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of double array reads/writes.
*/
public class DoubleArrays implements Benchmark {
-
+
/**
* Write and read double arrays to/from a stream. The benchmark is run in
* batches, with each batch consisting of a fixed number of read/write
@@ -44,44 +44,42 @@
* Arguments: <array size> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- double[][] arrays = new double[ncycles][size];
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
+ int size = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ double[][] arrays = new double[ncycles][size];
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- doReps(oout, oin, sbuf, arrays, 1); // warmup
+ doReps(oout, oin, sbuf, arrays, 1); // warmup
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, arrays, nbatches);
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, arrays, nbatches);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of batches, with given number of cycles
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, double[][] arrays, int nbatches)
- throws Exception
+ StreamBuffer sbuf, double[][] arrays, int nbatches)
+ throws Exception
{
- int ncycles = arrays.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(arrays[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = arrays.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(arrays[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/Doubles.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/Doubles.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of double reads/writes.
*/
public class Doubles implements Benchmark {
-
+
/**
* Write and read double values to/from a stream. The benchmark is run in
* batches: each "batch" consists of a fixed number of read/write cycles,
@@ -44,39 +44,38 @@
* Arguments: <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int nbatches = Integer.parseInt(args[0]);
- int ncycles = Integer.parseInt(args[1]);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, 1, ncycles); // warmup
+ int nbatches = Integer.parseInt(args[0]);
+ int ncycles = Integer.parseInt(args[1]);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, nbatches, ncycles);
+ doReps(oout, oin, sbuf, 1, ncycles); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, nbatches, ncycles);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of batches, with given number of cycles
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, int nbatches, int ncycles)
- throws Exception
+ StreamBuffer sbuf, int nbatches, int ncycles)
+ throws Exception
{
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeDouble(0.0);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readDouble();
- }
- }
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeDouble(0.0);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readDouble();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/ExternObjTrees.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/ExternObjTrees.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -40,19 +40,19 @@
* objects.
*/
public class ExternObjTrees implements Benchmark {
-
+
static class Node implements Externalizable {
boolean z;
- byte b;
- char c;
- short s;
- int i;
- float f;
- long j;
- double d;
- String str = "bodega";
+ byte b;
+ char c;
+ short s;
+ int i;
+ float f;
+ long j;
+ double d;
+ String str = "bodega";
Object parent, left, right;
-
+
Node(Object parent, int depth) {
this.parent = parent;
if (depth > 0) {
@@ -61,40 +61,40 @@
}
}
- public Node() {
- }
-
- public void writeExternal(ObjectOutput out) throws IOException {
- out.writeBoolean(z);
- out.writeByte(b);
- out.writeChar(c);
- out.writeShort(s);
- out.writeInt(i);
- out.writeFloat(f);
- out.writeLong(j);
- out.writeDouble(d);
- out.writeObject(str);
- out.writeObject(parent);
- out.writeObject(left);
- out.writeObject(right);
- }
-
- public void readExternal(ObjectInput in)
- throws IOException, ClassNotFoundException
- {
- z = in.readBoolean();
- b = in.readByte();
- c = in.readChar();
- s = in.readShort();
- i = in.readInt();
- f = in.readFloat();
- j = in.readLong();
- d = in.readDouble();
- str = (String) in.readObject();
- parent = in.readObject();
- left = in.readObject();
- right = in.readObject();
- }
+ public Node() {
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeBoolean(z);
+ out.writeByte(b);
+ out.writeChar(c);
+ out.writeShort(s);
+ out.writeInt(i);
+ out.writeFloat(f);
+ out.writeLong(j);
+ out.writeDouble(d);
+ out.writeObject(str);
+ out.writeObject(parent);
+ out.writeObject(left);
+ out.writeObject(right);
+ }
+
+ public void readExternal(ObjectInput in)
+ throws IOException, ClassNotFoundException
+ {
+ z = in.readBoolean();
+ b = in.readByte();
+ c = in.readChar();
+ s = in.readShort();
+ i = in.readInt();
+ f = in.readFloat();
+ j = in.readLong();
+ d = in.readDouble();
+ str = (String) in.readObject();
+ parent = in.readObject();
+ left = in.readObject();
+ right = in.readObject();
+ }
}
/**
@@ -105,20 +105,20 @@
* Arguments: <tree depth> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int depth = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- Node[] trees = genTrees(depth, ncycles);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, trees, 1); // warmup
+ int depth = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ Node[] trees = genTrees(depth, ncycles);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, trees, nbatches);
+ doReps(oout, oin, sbuf, trees, 1); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, trees, nbatches);
return System.currentTimeMillis() - start;
}
@@ -126,33 +126,32 @@
* Generate object trees.
*/
Node[] genTrees(int depth, int ntrees) {
- Node[] trees = new Node[ntrees];
- for (int i = 0; i < ntrees; i++) {
- trees[i] = new Node(null, depth);
- }
- return trees;
+ Node[] trees = new Node[ntrees];
+ for (int i = 0; i < ntrees; i++) {
+ trees[i] = new Node(null, depth);
+ }
+ return trees;
}
/**
- * Run benchmark for given number of batches, with each batch containing
+ * Run benchmark for given number of batches, with each batch containing
* the given number of cycles.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, Node[] trees, int nbatches)
- throws Exception
+ StreamBuffer sbuf, Node[] trees, int nbatches)
+ throws Exception
{
- int ncycles = trees.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(trees[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = trees.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(trees[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/FloatArrays.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/FloatArrays.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of float array reads/writes.
*/
public class FloatArrays implements Benchmark {
-
+
/**
* Write and read float arrays to/from a stream. The benchmark is run in
* batches, with each batch consisting of a fixed number of read/write
@@ -44,44 +44,42 @@
* Arguments: <array size> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- float[][] arrays = new float[ncycles][size];
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
+ int size = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ float[][] arrays = new float[ncycles][size];
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- doReps(oout, oin, sbuf, arrays, 1); // warmup
+ doReps(oout, oin, sbuf, arrays, 1); // warmup
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, arrays, nbatches);
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, arrays, nbatches);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of batches, with given number of cycles
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, float[][] arrays, int nbatches)
- throws Exception
+ StreamBuffer sbuf, float[][] arrays, int nbatches)
+ throws Exception
{
- int ncycles = arrays.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(arrays[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = arrays.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(arrays[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/Floats.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/Floats.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of float reads/writes.
*/
public class Floats implements Benchmark {
-
+
/**
* Write and read float values to/from a stream. The benchmark is run in
* batches: each "batch" consists of a fixed number of read/write cycles,
@@ -44,39 +44,38 @@
* Arguments: <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int nbatches = Integer.parseInt(args[0]);
- int ncycles = Integer.parseInt(args[1]);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, 1, ncycles); // warmup
+ int nbatches = Integer.parseInt(args[0]);
+ int ncycles = Integer.parseInt(args[1]);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, nbatches, ncycles);
+ doReps(oout, oin, sbuf, 1, ncycles); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, nbatches, ncycles);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of batches, with given number of cycles
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, int nbatches, int ncycles)
- throws Exception
+ StreamBuffer sbuf, int nbatches, int ncycles)
+ throws Exception
{
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeFloat((float) 0.0);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readFloat();
- }
- }
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeFloat((float) 0.0);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readFloat();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/GetPutFieldTrees.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/GetPutFieldTrees.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -39,19 +39,19 @@
* GetField()/PutField() API.
*/
public class GetPutFieldTrees implements Benchmark {
-
+
static class Node implements Serializable {
boolean z;
- byte b;
- char c;
- short s;
- int i;
- float f;
- long j;
- double d;
- String str = "bodega";
+ byte b;
+ char c;
+ short s;
+ int i;
+ float f;
+ long j;
+ double d;
+ String str = "bodega";
Object parent, left, right;
-
+
Node(Object parent, int depth) {
this.parent = parent;
if (depth > 0) {
@@ -76,19 +76,19 @@
fields.put("right", right);
out.writeFields();
}
-
- private void readObject(ObjectInputStream in)
+
+ private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException
{
ObjectInputStream.GetField fields = in.readFields();
- z = fields.get("z", false);
- b = fields.get("b", (byte) 0);
- c = fields.get("c", (char) 0);
- s = fields.get("s", (short) 0);
- i = fields.get("i", (int) 0);
- f = fields.get("f", (float) 0.0);
- j = fields.get("j", (long) 0);
- d = fields.get("d", (double) 0.0);
+ z = fields.get("z", false);
+ b = fields.get("b", (byte) 0);
+ c = fields.get("c", (char) 0);
+ s = fields.get("s", (short) 0);
+ i = fields.get("i", (int) 0);
+ f = fields.get("f", (float) 0.0);
+ j = fields.get("j", (long) 0);
+ d = fields.get("d", (double) 0.0);
str = (String) fields.get("str", null);
parent = fields.get("parent", null);
left = fields.get("left", null);
@@ -104,20 +104,20 @@
* Arguments: <tree depth> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int depth = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- Node[] trees = genTrees(depth, ncycles);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, trees, 1); // warmup
+ int depth = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ Node[] trees = genTrees(depth, ncycles);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, trees, nbatches);
+ doReps(oout, oin, sbuf, trees, 1); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, trees, nbatches);
return System.currentTimeMillis() - start;
}
@@ -125,33 +125,32 @@
* Generate object trees.
*/
Node[] genTrees(int depth, int ntrees) {
- Node[] trees = new Node[ntrees];
- for (int i = 0; i < ntrees; i++) {
- trees[i] = new Node(null, depth);
- }
- return trees;
+ Node[] trees = new Node[ntrees];
+ for (int i = 0; i < ntrees; i++) {
+ trees[i] = new Node(null, depth);
+ }
+ return trees;
}
/**
- * Run benchmark for given number of batches, with each batch containing
+ * Run benchmark for given number of batches, with each batch containing
* the given number of cycles.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, Node[] trees, int nbatches)
- throws Exception
+ StreamBuffer sbuf, Node[] trees, int nbatches)
+ throws Exception
{
- int ncycles = trees.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(trees[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = trees.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(trees[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/IntArrays.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/IntArrays.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of int array reads/writes.
*/
public class IntArrays implements Benchmark {
-
+
/**
* Write and read int arrays to/from a stream. The benchmark is run in
* batches, with each batch consisting of a fixed number of read/write
@@ -44,44 +44,42 @@
* Arguments: <array size> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- int[][] arrays = new int[ncycles][size];
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
+ int size = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ int[][] arrays = new int[ncycles][size];
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- doReps(oout, oin, sbuf, arrays, 1); // warmup
+ doReps(oout, oin, sbuf, arrays, 1); // warmup
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, arrays, nbatches);
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, arrays, nbatches);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of batches, with given number of cycles
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, int[][] arrays, int nbatches)
- throws Exception
+ StreamBuffer sbuf, int[][] arrays, int nbatches)
+ throws Exception
{
- int ncycles = arrays.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(arrays[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = arrays.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(arrays[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/Ints.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/Ints.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of int reads/writes.
*/
public class Ints implements Benchmark {
-
+
/**
* Write and read int values to/from a stream. The benchmark is run in
* batches: each "batch" consists of a fixed number of read/write cycles,
@@ -44,39 +44,38 @@
* Arguments: <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int nbatches = Integer.parseInt(args[0]);
- int ncycles = Integer.parseInt(args[1]);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, 1, ncycles); // warmup
+ int nbatches = Integer.parseInt(args[0]);
+ int ncycles = Integer.parseInt(args[1]);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, nbatches, ncycles);
+ doReps(oout, oin, sbuf, 1, ncycles); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, nbatches, ncycles);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of batches, with given number of cycles
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, int nbatches, int ncycles)
- throws Exception
+ StreamBuffer sbuf, int nbatches, int ncycles)
+ throws Exception
{
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeInt(0);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readInt();
- }
- }
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeInt(0);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readInt();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/LongArrays.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/LongArrays.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of long array reads/writes.
*/
public class LongArrays implements Benchmark {
-
+
/**
* Write and read long arrays to/from a stream. The benchmark is run in
* batches, with each batch consisting of a fixed number of read/write
@@ -44,44 +44,42 @@
* Arguments: <array size> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- long[][] arrays = new long[ncycles][size];
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
+ int size = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ long[][] arrays = new long[ncycles][size];
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- doReps(oout, oin, sbuf, arrays, 1); // warmup
+ doReps(oout, oin, sbuf, arrays, 1); // warmup
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, arrays, nbatches);
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, arrays, nbatches);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of batches, with given number of cycles
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, long[][] arrays, int nbatches)
- throws Exception
+ StreamBuffer sbuf, long[][] arrays, int nbatches)
+ throws Exception
{
- int ncycles = arrays.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(arrays[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = arrays.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(arrays[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/Longs.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/Longs.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of long reads/writes.
*/
public class Longs implements Benchmark {
-
+
/**
* Write and read long values to/from a stream. The benchmark is run in
* batches: each "batch" consists of a fixed number of read/write cycles,
@@ -44,39 +44,38 @@
* Arguments: <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int nbatches = Integer.parseInt(args[0]);
- int ncycles = Integer.parseInt(args[1]);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, 1, ncycles); // warmup
+ int nbatches = Integer.parseInt(args[0]);
+ int ncycles = Integer.parseInt(args[1]);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, nbatches, ncycles);
+ doReps(oout, oin, sbuf, 1, ncycles); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, nbatches, ncycles);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of batches, with given number of cycles
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, int nbatches, int ncycles)
- throws Exception
+ StreamBuffer sbuf, int nbatches, int ncycles)
+ throws Exception
{
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeLong(0);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readLong();
- }
- }
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeLong(0);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readLong();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/Main.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/Main.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -46,7 +46,7 @@
* Object serialization benchmark mainline.
*/
public class Main {
-
+
static final String CONFFILE = "/bench/serial/config";
static final String VERSION = "1.3";
@@ -80,55 +80,55 @@
p.println(" -o <file> specify output file");
p.println(" -c <file> specify (non-default) configuration file");
p.println(" -html format output as html (default is text)");
- p.println(" -xml format output as xml");
+ p.println(" -xml format output as xml");
}
/**
* Print error message and exit.
*/
static void die(String mesg) {
- System.err.println(mesg);
- System.exit(1);
+ System.err.println(mesg);
+ System.exit(1);
}
/**
* Mainline parses command line, then hands off to benchmark harness.
*/
public static void main(String[] args) {
- parseArgs(args);
- setupStreams();
- if (list) {
- listConfig();
- } else {
- setupHarness();
- setupReporter();
- if (exitOnTimer) {
- setupTimer(testDurationSeconds);
- while (true) {
- runBenchmarks();
- if (exitRequested) {
- System.exit(0);
- }
- }
- } else {
- runBenchmarks();
- System.exit(0);
- }
- }
+ parseArgs(args);
+ setupStreams();
+ if (list) {
+ listConfig();
+ } else {
+ setupHarness();
+ setupReporter();
+ if (exitOnTimer) {
+ setupTimer(testDurationSeconds);
+ while (true) {
+ runBenchmarks();
+ if (exitRequested) {
+ System.exit(0);
+ }
+ }
+ } else {
+ runBenchmarks();
+ System.exit(0);
+ }
+ }
}
-
+
/**
* Parse command-line arguments.
*/
static void parseArgs(String[] args) {
- for (int i = 0; i < args.length; i++) {
- if (args[i].equals("-h")) {
- usage();
- System.exit(0);
- } else if (args[i].equals("-v")) {
- verbose = true;
- } else if (args[i].equals("-l")) {
- list = true;
+ for (int i = 0; i < args.length; i++) {
+ if (args[i].equals("-h")) {
+ usage();
+ System.exit(0);
+ } else if (args[i].equals("-v")) {
+ verbose = true;
+ } else if (args[i].equals("-l")) {
+ list = true;
} else if (args[i].equals("-t")) {
if (++i >= args.length)
die("Error: no timeout value specified");
@@ -138,64 +138,64 @@
} catch (Exception e) {
die("Error: unable to determine timeout value");
}
- } else if (args[i].equals("-o")) {
- if (++i >= args.length)
- die("Error: no output file specified");
- try {
- repstr = new FileOutputStream(args[i]);
- } catch (IOException e) {
- die("Error: unable to open \"" + args[i] + "\"");
- }
- } else if (args[i].equals("-c")) {
- if (++i >= args.length)
- die("Error: no config file specified");
- try {
- confstr = new FileInputStream(args[i]);
- } catch (IOException e) {
- die("Error: unable to open \"" + args[i] + "\"");
- }
- } else if (args[i].equals("-html")) {
- if (format != TEXT)
- die("Error: conflicting formats");
- format = HTML;
- } else if (args[i].equals("-xml")) {
- if (format != TEXT)
- die("Error: conflicting formats");
- format = XML;
- } else {
- System.err.println("Illegal option: \"" + args[i] + "\"");
- usage();
- System.exit(1);
- }
- }
+ } else if (args[i].equals("-o")) {
+ if (++i >= args.length)
+ die("Error: no output file specified");
+ try {
+ repstr = new FileOutputStream(args[i]);
+ } catch (IOException e) {
+ die("Error: unable to open \"" + args[i] + "\"");
+ }
+ } else if (args[i].equals("-c")) {
+ if (++i >= args.length)
+ die("Error: no config file specified");
+ try {
+ confstr = new FileInputStream(args[i]);
+ } catch (IOException e) {
+ die("Error: unable to open \"" + args[i] + "\"");
+ }
+ } else if (args[i].equals("-html")) {
+ if (format != TEXT)
+ die("Error: conflicting formats");
+ format = HTML;
+ } else if (args[i].equals("-xml")) {
+ if (format != TEXT)
+ die("Error: conflicting formats");
+ format = XML;
+ } else {
+ System.err.println("Illegal option: \"" + args[i] + "\"");
+ usage();
+ System.exit(1);
+ }
+ }
}
-
+
/**
* Set up configuration file and report streams, if not set already.
*/
static void setupStreams() {
- if (repstr == null)
- repstr = System.out;
- if (confstr == null)
- confstr = (new Main()).getClass().getResourceAsStream(CONFFILE);
- if (confstr == null)
- die("Error: unable to find default config file");
+ if (repstr == null)
+ repstr = System.out;
+ if (confstr == null)
+ confstr = (new Main()).getClass().getResourceAsStream(CONFFILE);
+ if (confstr == null)
+ die("Error: unable to find default config file");
}
-
+
/**
* Print contents of configuration file to selected output stream.
*/
static void listConfig() {
- try {
- byte[] buf = new byte[256];
- int len;
- while ((len = confstr.read(buf)) != -1)
- repstr.write(buf, 0, len);
- } catch (IOException e) {
- die("Error: failed to list config file");
- }
+ try {
+ byte[] buf = new byte[256];
+ int len;
+ while ((len = confstr.read(buf)) != -1)
+ repstr.write(buf, 0, len);
+ } catch (IOException e) {
+ die("Error: failed to list config file");
+ }
}
-
+
/**
* Set up the timer to end the test.
*
@@ -222,12 +222,12 @@
} catch (ConfigFormatException e) {
String errmsg = e.getMessage();
if (errmsg != null) {
- die("Error parsing config file: " + errmsg);
- } else {
+ die("Error parsing config file: " + errmsg);
+ } else {
die("Error: illegal config file syntax");
- }
+ }
} catch (IOException e) {
- die("Error: failed to read config file");
+ die("Error: failed to read config file");
}
}
@@ -236,22 +236,22 @@
*/
static void setupReporter() {
String title = "Object Serialization Benchmark, v" + VERSION;
- switch (format) {
- case TEXT:
- reporter = new TextReporter(repstr, title);
- break;
-
- case HTML:
- reporter = new HtmlReporter(repstr, title);
- break;
+ switch (format) {
+ case TEXT:
+ reporter = new TextReporter(repstr, title);
+ break;
- case XML:
- reporter = new XmlReporter(repstr, title);
- break;
-
- default:
- die("Error: unrecognized format type");
- }
+ case HTML:
+ reporter = new HtmlReporter(repstr, title);
+ break;
+
+ case XML:
+ reporter = new XmlReporter(repstr, title);
+ break;
+
+ default:
+ die("Error: unrecognized format type");
+ }
}
/**
@@ -261,4 +261,3 @@
harness.runBenchmarks(reporter, verbose);
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/ObjArrays.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/ObjArrays.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -39,16 +39,16 @@
static class Node implements Serializable {
boolean z;
- byte b;
- char c;
- short s;
- int i;
- float f;
- long j;
- double d;
- String str = "bodega";
+ byte b;
+ char c;
+ short s;
+ int i;
+ float f;
+ long j;
+ double d;
+ String str = "bodega";
Object parent, left, right;
-
+
Node(Object parent, int depth) {
this.parent = parent;
if (depth > 0) {
@@ -57,7 +57,7 @@
}
}
}
-
+
/**
* Write and read object arrays to/from a stream. The benchmark is run in
* batches, with each batch consisting of a fixed number of read/write
@@ -66,34 +66,34 @@
* Arguments: <array size> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- Node[][] arrays = genArrays(size, ncycles);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
+ int size = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ Node[][] arrays = genArrays(size, ncycles);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- doReps(oout, oin, sbuf, arrays, 1); // warmup
+ doReps(oout, oin, sbuf, arrays, 1); // warmup
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, arrays, nbatches);
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, arrays, nbatches);
return System.currentTimeMillis() - start;
}
-
+
/**
* Generate object arrays.
*/
Node[][] genArrays(int size, int narrays) {
- Node[][] arrays = new Node[narrays][size];
- for (int i = 0; i < narrays; i++) {
- for (int j = 0; j < size; j++) {
- arrays[i][j] = new Node(null, 0);
- }
- }
- return arrays;
+ Node[][] arrays = new Node[narrays][size];
+ for (int i = 0; i < narrays; i++) {
+ for (int j = 0; j < size; j++) {
+ arrays[i][j] = new Node(null, 0);
+ }
+ }
+ return arrays;
}
/**
@@ -101,22 +101,20 @@
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, Node[][] arrays, int nbatches)
- throws Exception
+ StreamBuffer sbuf, Node[][] arrays, int nbatches)
+ throws Exception
{
- int ncycles = arrays.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(arrays[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = arrays.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(arrays[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/ObjTrees.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/ObjTrees.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -36,19 +36,19 @@
* Benchmark for testing speed of writes and reads of an object tree.
*/
public class ObjTrees implements Benchmark {
-
+
static class Node implements Serializable {
boolean z;
- byte b;
- char c;
- short s;
- int i;
- float f;
- long j;
- double d;
- String str = "bodega";
+ byte b;
+ char c;
+ short s;
+ int i;
+ float f;
+ long j;
+ double d;
+ String str = "bodega";
Object parent, left, right;
-
+
Node(Object parent, int depth) {
this.parent = parent;
if (depth > 0) {
@@ -66,20 +66,20 @@
* Arguments: <tree depth> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int depth = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- Node[] trees = genTrees(depth, ncycles);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, trees, 1); // warmup
+ int depth = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ Node[] trees = genTrees(depth, ncycles);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, trees, nbatches);
+ doReps(oout, oin, sbuf, trees, 1); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, trees, nbatches);
return System.currentTimeMillis() - start;
}
@@ -87,33 +87,32 @@
* Generate object trees.
*/
Node[] genTrees(int depth, int ntrees) {
- Node[] trees = new Node[ntrees];
- for (int i = 0; i < ntrees; i++) {
- trees[i] = new Node(null, depth);
- }
- return trees;
+ Node[] trees = new Node[ntrees];
+ for (int i = 0; i < ntrees; i++) {
+ trees[i] = new Node(null, depth);
+ }
+ return trees;
}
/**
- * Run benchmark for given number of batches, with each batch containing
+ * Run benchmark for given number of batches, with each batch containing
* the given number of cycles.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, Node[] trees, int nbatches)
- throws Exception
+ StreamBuffer sbuf, Node[] trees, int nbatches)
+ throws Exception
{
- int ncycles = trees.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(trees[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = trees.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(trees[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/ProxyArrays.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/ProxyArrays.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -42,15 +42,15 @@
public class ProxyArrays implements Benchmark {
static class DummyHandler implements InvocationHandler, Serializable {
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable
- {
- return null;
- }
+ public Object invoke(Object proxy, Method method, Object[] args)
+ throws Throwable
+ {
+ return null;
+ }
}
-
+
static interface DummyInterface {
- public void foo();
+ public void foo();
}
/**
@@ -61,40 +61,40 @@
* Arguments: <array size> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- Proxy[][] arrays = genArrays(size, ncycles);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
+ int size = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ Proxy[][] arrays = genArrays(size, ncycles);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- doReps(oout, oin, sbuf, arrays, 1); // warmup
+ doReps(oout, oin, sbuf, arrays, 1); // warmup
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, arrays, nbatches);
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, arrays, nbatches);
return System.currentTimeMillis() - start;
}
-
+
/**
* Generate proxy arrays.
*/
Proxy[][] genArrays(int size, int narrays) throws Exception {
- Class proxyClass =
- Proxy.getProxyClass(DummyInterface.class.getClassLoader(),
- new Class[] { DummyInterface.class });
- Constructor proxyCons =
- proxyClass.getConstructor(new Class[] { InvocationHandler.class });
- Object[] consArgs = new Object[] { new DummyHandler() };
- Proxy[][] arrays = new Proxy[narrays][size];
- for (int i = 0; i < narrays; i++) {
- for (int j = 0; j < size; j++) {
- arrays[i][j] = (Proxy) proxyCons.newInstance(consArgs);
- }
- }
- return arrays;
+ Class proxyClass =
+ Proxy.getProxyClass(DummyInterface.class.getClassLoader(),
+ new Class[] { DummyInterface.class });
+ Constructor proxyCons =
+ proxyClass.getConstructor(new Class[] { InvocationHandler.class });
+ Object[] consArgs = new Object[] { new DummyHandler() };
+ Proxy[][] arrays = new Proxy[narrays][size];
+ for (int i = 0; i < narrays; i++) {
+ for (int j = 0; j < size; j++) {
+ arrays[i][j] = (Proxy) proxyCons.newInstance(consArgs);
+ }
+ }
+ return arrays;
}
/**
@@ -102,22 +102,20 @@
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, Proxy[][] arrays, int nbatches)
- throws Exception
+ StreamBuffer sbuf, Proxy[][] arrays, int nbatches)
+ throws Exception
{
- int ncycles = arrays.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(arrays[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = arrays.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(arrays[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/ProxyClassDesc.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/ProxyClassDesc.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -38,7 +38,7 @@
* Benchmark for testing speed of proxy class descriptor reads/writes.
*/
public class ProxyClassDesc implements Benchmark {
-
+
static interface A1 {};
static interface A2 {};
static interface A3 {};
@@ -54,75 +54,74 @@
static interface C3 {};
static interface C4 {};
static interface C5 {};
-
+
/**
* Write and read proxy class descriptors to/from a stream.
* Arguments: <# cycles>
*/
public long run(String[] args) throws Exception {
- int ncycles = Integer.parseInt(args[0]);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
- ObjectStreamClass[] descs = genDescs();
+ int ncycles = Integer.parseInt(args[0]);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
+ ObjectStreamClass[] descs = genDescs();
- doReps(oout, oin, sbuf, descs, 1); // warmup
+ doReps(oout, oin, sbuf, descs, 1); // warmup
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, descs, ncycles);
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, descs, ncycles);
return System.currentTimeMillis() - start;
}
-
+
/**
* Generate proxy class descriptors.
*/
ObjectStreamClass[] genDescs() {
- ClassLoader ldr = ProxyClassDesc.class.getClassLoader();
- Class[] ifaces = new Class[3];
- Class[] a =
- new Class[] { A1.class, A2.class, A3.class, A4.class, A5.class };
- Class[] b =
- new Class[] { B1.class, B2.class, B3.class, B4.class, B5.class };
- Class[] c =
- new Class[] { C1.class, C2.class, C3.class, C4.class, C5.class };
- ObjectStreamClass[] descs =
- new ObjectStreamClass[a.length * b.length * c.length];
- int n = 0;
- for (int i = 0; i < a.length; i++) {
- ifaces[0] = a[i];
- for (int j = 0; j < b.length; j++) {
- ifaces[1] = b[j];
- for (int k = 0; k < c.length; k++) {
- ifaces[2] = c[k];
- Class proxyClass = Proxy.getProxyClass(ldr, ifaces);
- descs[n++] = ObjectStreamClass.lookup(proxyClass);
- }
- }
- }
- return descs;
+ ClassLoader ldr = ProxyClassDesc.class.getClassLoader();
+ Class[] ifaces = new Class[3];
+ Class[] a =
+ new Class[] { A1.class, A2.class, A3.class, A4.class, A5.class };
+ Class[] b =
+ new Class[] { B1.class, B2.class, B3.class, B4.class, B5.class };
+ Class[] c =
+ new Class[] { C1.class, C2.class, C3.class, C4.class, C5.class };
+ ObjectStreamClass[] descs =
+ new ObjectStreamClass[a.length * b.length * c.length];
+ int n = 0;
+ for (int i = 0; i < a.length; i++) {
+ ifaces[0] = a[i];
+ for (int j = 0; j < b.length; j++) {
+ ifaces[1] = b[j];
+ for (int k = 0; k < c.length; k++) {
+ ifaces[2] = c[k];
+ Class proxyClass = Proxy.getProxyClass(ldr, ifaces);
+ descs[n++] = ObjectStreamClass.lookup(proxyClass);
+ }
+ }
+ }
+ return descs;
}
/**
* Run benchmark for given number of cycles.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, ObjectStreamClass[] descs, int ncycles)
- throws Exception
+ StreamBuffer sbuf, ObjectStreamClass[] descs, int ncycles)
+ throws Exception
{
- int ndescs = descs.length;
- for (int i = 0; i < ncycles; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ndescs; j++) {
- oout.writeObject(descs[j]);
- }
- oout.flush();
- for (int j = 0; j < ndescs; j++) {
- oin.readObject();
- }
- }
+ int ndescs = descs.length;
+ for (int i = 0; i < ncycles; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ndescs; j++) {
+ oout.writeObject(descs[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ndescs; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/RepeatObjs.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/RepeatObjs.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -36,7 +36,7 @@
* Benchmark for testing speed of reads/writes of repeated objects.
*/
public class RepeatObjs implements Benchmark {
-
+
static class Node implements Serializable {
}
@@ -49,50 +49,49 @@
* Arguments: <# objects> <# cycles>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- Node[] objs = genObjs(size);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, objs, 1); // warmup
+ int size = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ Node[] objs = genObjs(size);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, objs, nbatches);
+ doReps(oout, oin, sbuf, objs, 1); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, objs, nbatches);
return System.currentTimeMillis() - start;
}
-
+
/**
* Generate objects.
*/
Node[] genObjs(int nobjs) {
- Node[] objs = new Node[nobjs];
- for (int i = 0; i < nobjs; i++)
- objs[i] = new Node();
- return objs;
+ Node[] objs = new Node[nobjs];
+ for (int i = 0; i < nobjs; i++)
+ objs[i] = new Node();
+ return objs;
}
-
+
/**
* Run benchmark for given number of batches.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, Node[] objs, int nbatches)
- throws Exception
+ StreamBuffer sbuf, Node[] objs, int nbatches)
+ throws Exception
{
- int nobjs = objs.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- for (int j = 0; j < nobjs; j++) {
- oout.writeObject(objs[j]);
- }
- oout.flush();
- for (int j = 0; j < nobjs; j++) {
- oin.readObject();
- }
- }
+ int nobjs = objs.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ for (int j = 0; j < nobjs; j++) {
+ oout.writeObject(objs[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < nobjs; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/ReplaceTrees.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/ReplaceTrees.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -37,15 +37,15 @@
* objects.
*/
public class ReplaceTrees implements Benchmark {
-
+
static class Node implements Serializable {
Object parent, left, right;
-
- Node(Object parent, Object left, Object right) {
- this.parent = parent;
- this.left = left;
- this.right = right;
- }
+
+ Node(Object parent, Object left, Object right) {
+ this.parent = parent;
+ this.left = left;
+ this.right = right;
+ }
Node(Object parent, int depth) {
this.parent = parent;
@@ -54,26 +54,26 @@
right = new Node(this, depth - 1);
}
}
-
- Object writeReplace() {
- return new RepNode(parent, left, right);
- }
+
+ Object writeReplace() {
+ return new RepNode(parent, left, right);
+ }
}
-
+
static class RepNode implements Serializable {
- Object parent, left, right;
-
- RepNode(Object parent, Object left, Object right) {
- this.parent = parent;
- this.left = left;
- this.right = right;
- }
-
- Object readResolve() {
- return new Node(parent, left, right);
- }
+ Object parent, left, right;
+
+ RepNode(Object parent, Object left, Object right) {
+ this.parent = parent;
+ this.left = left;
+ this.right = right;
+ }
+
+ Object readResolve() {
+ return new Node(parent, left, right);
+ }
}
-
+
/**
* Write and read a tree of replaceable objects from a stream. The
* benchmark is run in batches: each "batch" consists of a fixed number of
@@ -82,20 +82,20 @@
* Arguments: <tree depth> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int depth = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- Node[] trees = genTrees(depth, ncycles);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, trees, 1); // warmup
+ int depth = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ Node[] trees = genTrees(depth, ncycles);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, trees, nbatches);
+ doReps(oout, oin, sbuf, trees, 1); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, trees, nbatches);
return System.currentTimeMillis() - start;
}
@@ -103,11 +103,11 @@
* Generate object trees.
*/
Node[] genTrees(int depth, int ntrees) {
- Node[] trees = new Node[ntrees];
- for (int i = 0; i < ntrees; i++) {
- trees[i] = new Node(null, depth);
- }
- return trees;
+ Node[] trees = new Node[ntrees];
+ for (int i = 0; i < ntrees; i++) {
+ trees[i] = new Node(null, depth);
+ }
+ return trees;
}
/**
@@ -115,21 +115,20 @@
* the given number of cycles.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, Node[] trees, int nbatches)
- throws Exception
+ StreamBuffer sbuf, Node[] trees, int nbatches)
+ throws Exception
{
- int ncycles = trees.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(trees[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = trees.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(trees[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/ShortArrays.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/ShortArrays.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of short array reads/writes.
*/
public class ShortArrays implements Benchmark {
-
+
/**
* Write and read short arrays to/from a stream. The benchmark is run in
* batches, with each batch consisting of a fixed number of read/write
@@ -44,44 +44,42 @@
* Arguments: <array size> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int size = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- short[][] arrays = new short[ncycles][size];
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
+ int size = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ short[][] arrays = new short[ncycles][size];
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- doReps(oout, oin, sbuf, arrays, 1); // warmup
+ doReps(oout, oin, sbuf, arrays, 1); // warmup
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, arrays, nbatches);
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, arrays, nbatches);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of batches, with given number of cycles
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, short[][] arrays, int nbatches)
- throws Exception
+ StreamBuffer sbuf, short[][] arrays, int nbatches)
+ throws Exception
{
- int ncycles = arrays.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(arrays[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = arrays.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(arrays[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/Shorts.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/Shorts.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -35,7 +35,7 @@
* Benchmark for testing speed of short reads/writes.
*/
public class Shorts implements Benchmark {
-
+
/**
* Write and read short values to/from a stream. The benchmark is run in
* batches: each "batch" consists of a fixed number of read/write cycles,
@@ -44,39 +44,38 @@
* Arguments: <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int nbatches = Integer.parseInt(args[0]);
- int ncycles = Integer.parseInt(args[1]);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, 1, ncycles); // warmup
+ int nbatches = Integer.parseInt(args[0]);
+ int ncycles = Integer.parseInt(args[1]);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, nbatches, ncycles);
+ doReps(oout, oin, sbuf, 1, ncycles); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, nbatches, ncycles);
return System.currentTimeMillis() - start;
}
-
+
/**
* Run benchmark for given number of batches, with given number of cycles
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, int nbatches, int ncycles)
- throws Exception
+ StreamBuffer sbuf, int nbatches, int ncycles)
+ throws Exception
{
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeShort(0);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readShort();
- }
- }
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeShort(0);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readShort();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/SmallObjTrees.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/SmallObjTrees.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -36,10 +36,10 @@
* Benchmark for testing speed of writes and reads of a tree of small objects.
*/
public class SmallObjTrees implements Benchmark {
-
+
static class Node implements Serializable {
Object parent, left, right;
-
+
Node(Object parent, int depth) {
this.parent = parent;
if (depth > 0) {
@@ -57,20 +57,20 @@
* Arguments: <tree depth> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int depth = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- Node[] trees = genTrees(depth, ncycles);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, trees, 1); // warmup
+ int depth = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ Node[] trees = genTrees(depth, ncycles);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, trees, nbatches);
+ doReps(oout, oin, sbuf, trees, 1); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, trees, nbatches);
return System.currentTimeMillis() - start;
}
@@ -78,11 +78,11 @@
* Generate object trees.
*/
Node[] genTrees(int depth, int ntrees) {
- Node[] trees = new Node[ntrees];
- for (int i = 0; i < ntrees; i++) {
- trees[i] = new Node(null, depth);
- }
- return trees;
+ Node[] trees = new Node[ntrees];
+ for (int i = 0; i < ntrees; i++) {
+ trees[i] = new Node(null, depth);
+ }
+ return trees;
}
/**
@@ -90,21 +90,20 @@
* given number of cycles.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, Node[] trees, int nbatches)
- throws Exception
+ StreamBuffer sbuf, Node[] trees, int nbatches)
+ throws Exception
{
- int ncycles = trees.length;
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(trees[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ int ncycles = trees.length;
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(trees[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/StreamBuffer.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/StreamBuffer.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -47,85 +47,85 @@
* StreamBufferInputStream.read().
*/
public class StreamBuffer {
-
+
/**
* Output stream for writing to stream buffer.
*/
private class StreamBufferOutputStream extends OutputStream {
-
- private int pos;
+
+ private int pos;
+
+ public void write(int b) throws IOException {
+ if (mode != WRITE_MODE)
+ throw new IOException();
+ while (pos >= buf.length)
+ grow();
+ buf[pos++] = (byte) b;
+ }
- public void write(int b) throws IOException {
- if (mode != WRITE_MODE)
- throw new IOException();
- while (pos >= buf.length)
- grow();
- buf[pos++] = (byte) b;
- }
-
- public void write(byte[] b, int off, int len) throws IOException {
- if (mode != WRITE_MODE)
- throw new IOException();
- while (pos + len > buf.length)
- grow();
- System.arraycopy(b, off, buf, pos, len);
- pos += len;
- }
-
- public void close() throws IOException {
- if (mode != WRITE_MODE)
- throw new IOException();
- mode = READ_MODE;
- }
+ public void write(byte[] b, int off, int len) throws IOException {
+ if (mode != WRITE_MODE)
+ throw new IOException();
+ while (pos + len > buf.length)
+ grow();
+ System.arraycopy(b, off, buf, pos, len);
+ pos += len;
+ }
+
+ public void close() throws IOException {
+ if (mode != WRITE_MODE)
+ throw new IOException();
+ mode = READ_MODE;
+ }
}
-
+
/**
* Input stream for reading from stream buffer.
*/
private class StreamBufferInputStream extends InputStream {
-
- private int pos;
+
+ private int pos;
+
+ public int read() throws IOException {
+ if (mode == CLOSED_MODE)
+ throw new IOException();
+ mode = READ_MODE;
+ return (pos < out.pos) ? (buf[pos++] & 0xFF) : -1;
+ }
+
+ public int read(byte[] b, int off, int len) throws IOException {
+ if (mode == CLOSED_MODE)
+ throw new IOException();
+ mode = READ_MODE;
+ int avail = out.pos - pos;
+ int rlen = (avail < len) ? avail : len;
+ System.arraycopy(buf, pos, b, off, rlen);
+ pos += rlen;
+ return rlen;
+ }
- public int read() throws IOException {
- if (mode == CLOSED_MODE)
- throw new IOException();
- mode = READ_MODE;
- return (pos < out.pos) ? (buf[pos++] & 0xFF) : -1;
- }
-
- public int read(byte[] b, int off, int len) throws IOException {
- if (mode == CLOSED_MODE)
- throw new IOException();
- mode = READ_MODE;
- int avail = out.pos - pos;
- int rlen = (avail < len) ? avail : len;
- System.arraycopy(buf, pos, b, off, rlen);
- pos += rlen;
- return rlen;
- }
-
- public long skip(long len) throws IOException {
- if (mode == CLOSED_MODE)
- throw new IOException();
- mode = READ_MODE;
- int avail = out.pos - pos;
- long slen = (avail < len) ? avail : len;
- pos += slen;
- return slen;
- }
+ public long skip(long len) throws IOException {
+ if (mode == CLOSED_MODE)
+ throw new IOException();
+ mode = READ_MODE;
+ int avail = out.pos - pos;
+ long slen = (avail < len) ? avail : len;
+ pos += slen;
+ return slen;
+ }
- public int available() throws IOException {
- if (mode == CLOSED_MODE)
- throw new IOException();
- mode = READ_MODE;
- return out.pos - pos;
- }
-
- public void close() throws IOException {
- if (mode == CLOSED_MODE)
- throw new IOException();
- mode = CLOSED_MODE;
- }
+ public int available() throws IOException {
+ if (mode == CLOSED_MODE)
+ throw new IOException();
+ mode = READ_MODE;
+ return out.pos - pos;
+ }
+
+ public void close() throws IOException {
+ if (mode == CLOSED_MODE)
+ throw new IOException();
+ mode = CLOSED_MODE;
+ }
}
private static final int START_BUFSIZE = 256;
@@ -140,30 +140,29 @@
private int mode = WRITE_MODE;
public StreamBuffer() {
- this(START_BUFSIZE);
+ this(START_BUFSIZE);
}
-
+
public StreamBuffer(int size) {
- buf = new byte[size];
+ buf = new byte[size];
}
-
+
public OutputStream getOutputStream() {
- return out;
+ return out;
}
-
+
public InputStream getInputStream() {
- return in;
+ return in;
}
-
+
public void reset() {
- in.pos = out.pos = 0;
- mode = WRITE_MODE;
+ in.pos = out.pos = 0;
+ mode = WRITE_MODE;
}
-
+
private void grow() {
- byte[] newbuf = new byte[buf.length * GROW_FACTOR];
- System.arraycopy(buf, 0, newbuf, 0, buf.length);
- buf = newbuf;
+ byte[] newbuf = new byte[buf.length * GROW_FACTOR];
+ System.arraycopy(buf, 0, newbuf, 0, buf.length);
+ buf = newbuf;
}
}
-
--- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/Strings.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/Strings.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -45,20 +45,20 @@
* Arguments: <string length> <# batches> <# cycles per batch>
*/
public long run(String[] args) throws Exception {
- int slen = Integer.parseInt(args[0]);
- int nbatches = Integer.parseInt(args[1]);
- int ncycles = Integer.parseInt(args[2]);
- String[] strs = genStrings(slen, ncycles);
- StreamBuffer sbuf = new StreamBuffer();
- ObjectOutputStream oout =
- new ObjectOutputStream(sbuf.getOutputStream());
- ObjectInputStream oin =
- new ObjectInputStream(sbuf.getInputStream());
-
- doReps(oout, oin, sbuf, strs, 1, ncycles); // warmup
+ int slen = Integer.parseInt(args[0]);
+ int nbatches = Integer.parseInt(args[1]);
+ int ncycles = Integer.parseInt(args[2]);
+ String[] strs = genStrings(slen, ncycles);
+ StreamBuffer sbuf = new StreamBuffer();
+ ObjectOutputStream oout =
+ new ObjectOutputStream(sbuf.getOutputStream());
+ ObjectInputStream oin =
+ new ObjectInputStream(sbuf.getInputStream());
- long start = System.currentTimeMillis();
- doReps(oout, oin, sbuf, strs, nbatches, ncycles);
+ doReps(oout, oin, sbuf, strs, 1, ncycles); // warmup
+
+ long start = System.currentTimeMillis();
+ doReps(oout, oin, sbuf, strs, nbatches, ncycles);
return System.currentTimeMillis() - start;
}
@@ -66,16 +66,16 @@
* Generate nstrings random strings, each of length len.
*/
String[] genStrings(int len, int nstrings) {
- String[] strs = new String[nstrings];
- char[] ca = new char[len];
- Random rand = new Random(System.currentTimeMillis());
- for (int i = 0; i < nstrings; i++) {
- for (int j = 0; j < len; j++) {
- ca[j] = (char) rand.nextInt();
- }
- strs[i] = new String(ca);
- }
- return strs;
+ String[] strs = new String[nstrings];
+ char[] ca = new char[len];
+ Random rand = new Random(System.currentTimeMillis());
+ for (int i = 0; i < nstrings; i++) {
+ for (int j = 0; j < len; j++) {
+ ca[j] = (char) rand.nextInt();
+ }
+ strs[i] = new String(ca);
+ }
+ return strs;
}
/**
@@ -83,20 +83,19 @@
* for each batch.
*/
void doReps(ObjectOutputStream oout, ObjectInputStream oin,
- StreamBuffer sbuf, String[] strs, int nbatches, int ncycles)
- throws Exception
+ StreamBuffer sbuf, String[] strs, int nbatches, int ncycles)
+ throws Exception
{
- for (int i = 0; i < nbatches; i++) {
- sbuf.reset();
- oout.reset();
- for (int j = 0; j < ncycles; j++) {
- oout.writeObject(strs[j]);
- }
- oout.flush();
- for (int j = 0; j < ncycles; j++) {
- oin.readObject();
- }
- }
+ for (int i = 0; i < nbatches; i++) {
+ sbuf.reset();
+ oout.reset();
+ for (int j = 0; j < ncycles; j++) {
+ oout.writeObject(strs[j]);
+ }
+ oout.flush();
+ for (int j = 0; j < ncycles; j++) {
+ oin.readObject();
+ }
+ }
}
}
-
--- a/jdk/test/java/rmi/reliability/juicer/Apple.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/juicer/Apple.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -25,7 +25,7 @@
import java.rmi.RemoteException;
/**
- * A remote factory for Orange instances. This interface also
+ * A remote factory for Orange instances. This interface also
* includes a method to test object array serialization.
*/
public interface Apple extends Remote {
--- a/jdk/test/java/rmi/reliability/juicer/AppleEvent.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/juicer/AppleEvent.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -26,7 +26,7 @@
/**
* The AppleEvent class is simply an object to be passed to a
- * remote object exported by an applet. The intent is to verify
+ * remote object exported by an applet. The intent is to verify
* proper object serialization of arrays.
*/
public class AppleEvent implements Serializable {
@@ -39,24 +39,24 @@
private final Date when;
public AppleEvent(int what) {
- this.what = what;
- this.when = new Date();
+ this.what = what;
+ this.when = new Date();
}
public String toString() {
- String desc = "[";
- switch (what) {
- case BUY:
- desc += "BUY";
- break;
- case EAT:
- desc += "EAT";
- break;
- case THROW:
- desc += "THROW";
- break;
- }
- desc += " @ " + when + "]";
- return desc;
+ String desc = "[";
+ switch (what) {
+ case BUY:
+ desc += "BUY";
+ break;
+ case EAT:
+ desc += "EAT";
+ break;
+ case THROW:
+ desc += "THROW";
+ break;
+ }
+ desc += " @ " + when + "]";
+ return desc;
}
}
--- a/jdk/test/java/rmi/reliability/juicer/AppleImpl.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/juicer/AppleImpl.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -34,46 +34,46 @@
private static final Logger logger = Logger.getLogger("reliability.apple");
private final String name;
-
+
public AppleImpl(String name) throws RemoteException {
- this.name = name;
+ this.name = name;
}
/**
* Receive an array of AppleEvent objects.
*/
public void notify(AppleEvent[] events) {
- String threadName = Thread.currentThread().getName();
- logger.log(Level.FINEST,
- threadName + ": " + toString() + ".notify: BEGIN");
+ String threadName = Thread.currentThread().getName();
+ logger.log(Level.FINEST,
+ threadName + ": " + toString() + ".notify: BEGIN");
- for (int i = 0; i < events.length; i++) {
- logger.log(Level.FINEST,
- threadName + ": " + toString() + ".notify(): events["
- + i + "] = " + events[i].toString());
- }
+ for (int i = 0; i < events.length; i++) {
+ logger.log(Level.FINEST,
+ threadName + ": " + toString() + ".notify(): events["
+ + i + "] = " + events[i].toString());
+ }
- logger.log(Level.FINEST,
- threadName + ": " + toString() + ".notify(): END");
+ logger.log(Level.FINEST,
+ threadName + ": " + toString() + ".notify(): END");
}
/**
* Return a newly created and exported orange implementation.
*/
public Orange newOrange(String name) throws RemoteException {
- String threadName = Thread.currentThread().getName();
- logger.log(Level.FINEST,
- threadName + ": " + toString() + ".newOrange(" + name + "): BEGIN");
+ String threadName = Thread.currentThread().getName();
+ logger.log(Level.FINEST,
+ threadName + ": " + toString() + ".newOrange(" + name + "): BEGIN");
- Orange orange = new OrangeImpl(name);
-
- logger.log(Level.FINEST,
- threadName + ": " + toString() + ".newOrange(" + name + "): END");
+ Orange orange = new OrangeImpl(name);
- return orange;
+ logger.log(Level.FINEST,
+ threadName + ": " + toString() + ".newOrange(" + name + "): END");
+
+ return orange;
}
public String toString() {
- return name;
+ return name;
}
}
--- a/jdk/test/java/rmi/reliability/juicer/AppleUser.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/juicer/AppleUser.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
--- a/jdk/test/java/rmi/reliability/juicer/AppleUserImpl.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/juicer/AppleUserImpl.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -27,30 +27,30 @@
* a large number of concurrent, long running, remote method invocations
* between many threads which have exported remote objects. These
* threads use remote objects that carry on deep "two party"
- * recursion. The juicer relies on Distributed Garbage Collection to
- * unexport these remote objects when no more references are held to them.
+ * recursion. The juicer relies on Distributed Garbage Collection to
+ * unexport these remote objects when no more references are held to them.
* The two parties in the recursion are OrangeImpl and
* OrangeEchoImpl. OrangeImpl checks the base case of the recursion
* so that the program will exit.
*
* When the AppleUserImpl.main() method is invoked, the class binds an
* instance of itself in a registry. A second server process,
- * an ApplicationServer, is started which looks up the recently
+ * an ApplicationServer, is started which looks up the recently
* bound AppleUser object. This server is either started up in
* the same VM or can optionally be started in a separate VM on the
- * same host or on a different host. When this test is run on the
- * RMI profile, ApplicationServer must be started by AppleUserImpl
+ * same host or on a different host. When this test is run on the
+ * RMI profile, ApplicationServer must be started by AppleUserImpl
* and the complete juicer runs in a single process.
*
* The second server process instructs the AppleUserImpl to "use" some apples.
* AppleUserImpl creates a new thread for each apple. These threads
* initiate the two party recursion.
- *
+ *
* Each recursive call nests to a depth determined by this
- * expression: (2 + Math.abs(random.nextInt() % (maxLevel + 1)),
+ * expression: (2 + Math.abs(random.nextInt() % (maxLevel + 1)),
* where maxLevel is a command line parameter. Thus each recursive
* call nests a random number of levels between 2 and maxLevel.
- *
+ *
* The test ends when an exception is encountered or the stop time
* has been reached.
*
@@ -81,8 +81,8 @@
*/
public class AppleUserImpl extends UnicastRemoteObject implements AppleUser {
- private static final Logger logger =
- Logger.getLogger("reliability.appleuser");
+ private static final Logger logger =
+ Logger.getLogger("reliability.appleuser");
private static int threadNum = 0;
private static long testDuration = 0;
private static int maxLevel = 7;
@@ -91,7 +91,7 @@
private static boolean startTestNotified = false;
private static final Random random = new Random();
private static final Object lock = new Object();
-
+
public AppleUserImpl() throws RemoteException {
}
@@ -100,7 +100,7 @@
* to start "juicing".
*/
public synchronized void startTest() throws RemoteException {
- startTestNotified = true;
+ startTestNotified = true;
this.notifyAll();
}
@@ -109,9 +109,9 @@
* process and thereby terminate the test.
*/
public void reportException(Exception status) throws RemoteException {
- synchronized (lock) {
- this.status = status;
- lock.notifyAll();
+ synchronized (lock) {
+ this.status = status;
+ lock.notifyAll();
}
}
@@ -120,136 +120,136 @@
* stress it out.
*/
public synchronized void useApple(Apple apple) throws RemoteException {
- String threadName = Thread.currentThread().getName();
- logger.log(Level.FINEST,
- threadName + ": AppleUserImpl.useApple(): BEGIN");
+ String threadName = Thread.currentThread().getName();
+ logger.log(Level.FINEST,
+ threadName + ": AppleUserImpl.useApple(): BEGIN");
- AppleUserThread t =
- new AppleUserThread("AppleUserThread-" + (++threadNum), apple);
- t.start();
+ AppleUserThread t =
+ new AppleUserThread("AppleUserThread-" + (++threadNum), apple);
+ t.start();
- logger.log(Level.FINEST,
- threadName + ": AppleUserImpl.useApple(): END");
+ logger.log(Level.FINEST,
+ threadName + ": AppleUserImpl.useApple(): END");
}
-
+
/**
* The AppleUserThread class repeatedly invokes calls on its associated
* Apple object to stress the RMI system.
*/
class AppleUserThread extends Thread {
- final Apple apple;
+ final Apple apple;
- public AppleUserThread(String name, Apple apple) {
- super(name);
- this.apple = apple;
- }
+ public AppleUserThread(String name, Apple apple) {
+ super(name);
+ this.apple = apple;
+ }
- public void run() {
- int orangeNum = 0;
+ public void run() {
+ int orangeNum = 0;
long stopTime = System.currentTimeMillis() + testDuration;
Logger logger = Logger.getLogger("reliability.appleuserthread");
-
- try {
- do { // loop until stopTime is reached
- /*
- * Notify apple with some apple events. This tests
+ try {
+ do { // loop until stopTime is reached
+
+ /*
+ * Notify apple with some apple events. This tests
* serialization of arrays.
- */
- int numEvents = Math.abs(random.nextInt() % 5);
- AppleEvent[] events = new AppleEvent[numEvents];
- for (int i = 0; i < events.length; i++) {
- events[i] = new AppleEvent(orangeNum % 3);
- }
- apple.notify(events);
+ */
+ int numEvents = Math.abs(random.nextInt() % 5);
+ AppleEvent[] events = new AppleEvent[numEvents];
+ for (int i = 0; i < events.length; i++) {
+ events[i] = new AppleEvent(orangeNum % 3);
+ }
+ apple.notify(events);
- /*
- * Request a new orange object be created in
+ /*
+ * Request a new orange object be created in
* the application server.
- */
- Orange orange = apple.newOrange(
- "Orange(" + getName() + ")-" + (++orangeNum));
+ */
+ Orange orange = apple.newOrange(
+ "Orange(" + getName() + ")-" + (++orangeNum));
- /*
- * Create a large message of random ints to pass to orange.
- */
+ /*
+ * Create a large message of random ints to pass to orange.
+ */
int msgLength = 1000 + Math.abs(random.nextInt() % 3000);
- int[] message = new int[msgLength];
- for (int i = 0; i < message.length; i++) {
- message[i] = random.nextInt();
- }
+ int[] message = new int[msgLength];
+ for (int i = 0; i < message.length; i++) {
+ message[i] = random.nextInt();
+ }
- /*
- * Invoke recursive call on the orange. Base case
+ /*
+ * Invoke recursive call on the orange. Base case
* of recursion inverts messgage.
- */
- OrangeEchoImpl echo = new OrangeEchoImpl(
- "OrangeEcho(" + getName() + ")-" + orangeNum);
- int[] response = orange.recurse(echo, message,
- 2 + Math.abs(random.nextInt() % (maxLevel + 1)));
+ */
+ OrangeEchoImpl echo = new OrangeEchoImpl(
+ "OrangeEcho(" + getName() + ")-" + orangeNum);
+ int[] response = orange.recurse(echo, message,
+ 2 + Math.abs(random.nextInt() % (maxLevel + 1)));
- /*
- * Verify message was properly inverted and not corrupted
- * through all the recursive method invocations.
- */
- if (response.length != message.length) {
- throw new RuntimeException(
- "ERROR: CORRUPTED RESPONSE: " +
- "wrong length of returned array " + "(should be " +
- message.length + ", is " + response.length + ")");
- }
- for (int i = 0; i < message.length; i++) {
- if (~message[i] != response[i]) {
- throw new RuntimeException(
- "ERROR: CORRUPTED RESPONSE: " +
- "at element " + i + "/" + message.length +
- " of returned array (should be " +
- Integer.toHexString(~message[i]) + ", is " +
- Integer.toHexString(response[i]) + ")");
- }
- }
+ /*
+ * Verify message was properly inverted and not corrupted
+ * through all the recursive method invocations.
+ */
+ if (response.length != message.length) {
+ throw new RuntimeException(
+ "ERROR: CORRUPTED RESPONSE: " +
+ "wrong length of returned array " + "(should be " +
+ message.length + ", is " + response.length + ")");
+ }
+ for (int i = 0; i < message.length; i++) {
+ if (~message[i] != response[i]) {
+ throw new RuntimeException(
+ "ERROR: CORRUPTED RESPONSE: " +
+ "at element " + i + "/" + message.length +
+ " of returned array (should be " +
+ Integer.toHexString(~message[i]) + ", is " +
+ Integer.toHexString(response[i]) + ")");
+ }
+ }
- try {
- Thread.sleep(Math.abs(random.nextInt() % 10) * 1000);
- } catch (InterruptedException e) {
- }
+ try {
+ Thread.sleep(Math.abs(random.nextInt() % 10) * 1000);
+ } catch (InterruptedException e) {
+ }
- } while (System.currentTimeMillis() < stopTime);
+ } while (System.currentTimeMillis() < stopTime);
- } catch (Exception e) {
- status = e;
- }
- finished = true;
- synchronized (lock) {
- lock.notifyAll();
- }
- }
+ } catch (Exception e) {
+ status = e;
+ }
+ finished = true;
+ synchronized (lock) {
+ lock.notifyAll();
+ }
+ }
}
private static void usage() {
- System.err.println("Usage: AppleUserImpl [-hours <hours> | " +
- "-seconds <seconds>]");
- System.err.println(" [-maxLevel <maxLevel>]");
- System.err.println(" [-othervm]");
- System.err.println(" [-exit]");
- System.err.println(" hours The number of hours to run the juicer.");
- System.err.println(" The default is 0 hours.");
- System.err.println(" seconds The number of seconds to run the juicer.");
- System.err.println(" The default is 0 seconds.");
- System.err.println(" maxLevel The maximum number of levels to ");
- System.err.println(" recurse on each call.");
- System.err.println(" The default is 7 levels.");
- System.err.println(" othervm If present, the VM will wait for the");
- System.err.println(" ApplicationServer to start in");
- System.err.println(" another process.");
- System.err.println(" The default is to run everything in");
- System.err.println(" a single VM.");
- System.err.println(" exit If present, the VM will call");
- System.err.println(" System.exit() when main() finishes.");
- System.err.println(" The default is to not call");
- System.err.println(" System.exit().");
- System.err.println();
+ System.err.println("Usage: AppleUserImpl [-hours <hours> | " +
+ "-seconds <seconds>]");
+ System.err.println(" [-maxLevel <maxLevel>]");
+ System.err.println(" [-othervm]");
+ System.err.println(" [-exit]");
+ System.err.println(" hours The number of hours to run the juicer.");
+ System.err.println(" The default is 0 hours.");
+ System.err.println(" seconds The number of seconds to run the juicer.");
+ System.err.println(" The default is 0 seconds.");
+ System.err.println(" maxLevel The maximum number of levels to ");
+ System.err.println(" recurse on each call.");
+ System.err.println(" The default is 7 levels.");
+ System.err.println(" othervm If present, the VM will wait for the");
+ System.err.println(" ApplicationServer to start in");
+ System.err.println(" another process.");
+ System.err.println(" The default is to run everything in");
+ System.err.println(" a single VM.");
+ System.err.println(" exit If present, the VM will call");
+ System.err.println(" System.exit() when main() finishes.");
+ System.err.println(" The default is to not call");
+ System.err.println(" System.exit().");
+ System.err.println();
}
/**
@@ -257,122 +257,122 @@
* an apple user implementation in an rmiregistry running on localhost.
*/
public static void main(String[] args) {
- String durationString = null;
+ String durationString = null;
boolean othervm = false;
boolean exit = false;
- try {
- // parse command line args
- for (int i = 0; i < args.length ; i++ ) {
+ try {
+ // parse command line args
+ for (int i = 0; i < args.length ; i++ ) {
String arg = args[i];
if (arg.equals("-hours")) {
- if (durationString != null) {
- usage();
- }
- i++;
- int hours = Integer.parseInt(args[i]);
- durationString = hours + " hours";
- testDuration = hours * 60 * 60 * 1000;
+ if (durationString != null) {
+ usage();
+ }
+ i++;
+ int hours = Integer.parseInt(args[i]);
+ durationString = hours + " hours";
+ testDuration = hours * 60 * 60 * 1000;
} else if (arg.equals("-seconds")) {
- if (durationString != null) {
- usage();
- }
- i++;
- long seconds = Long.parseLong(args[i]);
- durationString = seconds + " seconds";
- testDuration = seconds * 1000;
+ if (durationString != null) {
+ usage();
+ }
+ i++;
+ long seconds = Long.parseLong(args[i]);
+ durationString = seconds + " seconds";
+ testDuration = seconds * 1000;
} else if (arg.equals("-maxLevel")) {
- i++;
- maxLevel = Integer.parseInt(args[i]);
+ i++;
+ maxLevel = Integer.parseInt(args[i]);
} else if (arg.equals("-othervm")) {
- othervm = true;
+ othervm = true;
} else if (arg.equals("-exit")) {
- exit = true;
+ exit = true;
} else {
- usage();
+ usage();
}
}
if (durationString == null) {
durationString = testDuration + " milliseconds";
}
- } catch (Throwable t) {
- usage();
- throw new RuntimeException("TEST FAILED: Bad argument");
- }
+ } catch (Throwable t) {
+ usage();
+ throw new RuntimeException("TEST FAILED: Bad argument");
+ }
- AppleUserImpl user = null;
- long startTime = 0;
- Thread server = null;
- int exitValue = 0;
- try {
- user = new AppleUserImpl();
+ AppleUserImpl user = null;
+ long startTime = 0;
+ Thread server = null;
+ int exitValue = 0;
+ try {
+ user = new AppleUserImpl();
- synchronized (user) {
- // create new registry and bind new AppleUserImpl in registry
+ synchronized (user) {
+ // create new registry and bind new AppleUserImpl in registry
LocateRegistry.createRegistry(2006);
LocateRegistry.getRegistry(2006).rebind("AppleUser",user);
-
- // start the other server if applicable
- if (othervm) {
- // the other server must be running in a separate process
- logger.log(Level.INFO, "Application server must be " +
- "started in separate process");
- } else {
- Class app = Class.forName("ApplicationServer");
- server = new Thread((Runnable) app.newInstance());
- logger.log(Level.INFO, "Starting application server " +
+
+ // start the other server if applicable
+ if (othervm) {
+ // the other server must be running in a separate process
+ logger.log(Level.INFO, "Application server must be " +
+ "started in separate process");
+ } else {
+ Class app = Class.forName("ApplicationServer");
+ server = new Thread((Runnable) app.newInstance());
+ logger.log(Level.INFO, "Starting application server " +
"in same process");
- server.start();
- }
+ server.start();
+ }
- // wait for other server to call startTest method
- logger.log(Level.INFO, "Waiting for application server " +
+ // wait for other server to call startTest method
+ logger.log(Level.INFO, "Waiting for application server " +
"process to start");
- while (!startTestNotified) {
- user.wait();
- }
- }
+ while (!startTestNotified) {
+ user.wait();
+ }
+ }
- startTime = System.currentTimeMillis();
- logger.log(Level.INFO, "Test starting");
+ startTime = System.currentTimeMillis();
+ logger.log(Level.INFO, "Test starting");
- // wait for exception to be reported or first thread to complete
- logger.log(Level.INFO, "Waiting " + durationString + " for " +
- "test to complete or exception to be thrown");
+ // wait for exception to be reported or first thread to complete
+ logger.log(Level.INFO, "Waiting " + durationString + " for " +
+ "test to complete or exception to be thrown");
- synchronized (lock) {
- while (status == null && !finished) {
- lock.wait();
- }
- }
+ synchronized (lock) {
+ while (status == null && !finished) {
+ lock.wait();
+ }
+ }
- if (status != null) {
- throw new RuntimeException("TEST FAILED: "
- + "juicer server reported an exception", status);
- } else {
- logger.log(Level.INFO, "TEST PASSED");
+ if (status != null) {
+ throw new RuntimeException("TEST FAILED: "
+ + "juicer server reported an exception", status);
+ } else {
+ logger.log(Level.INFO, "TEST PASSED");
}
- } catch (Exception e) {
- logger.log(Level.INFO, "TEST FAILED");
- exitValue = 1;
- if (exit) {
- e.printStackTrace();
- }
- throw new RuntimeException("TEST FAILED: "
- + "unexpected exception", e);
- } finally {
- long actualDuration = System.currentTimeMillis() - startTime;
- logger.log(Level.INFO, "Test finished");
- try {
- UnicastRemoteObject.unexportObject(user, true);
+ } catch (Exception e) {
+ logger.log(Level.INFO, "TEST FAILED");
+ exitValue = 1;
+ if (exit) {
+ e.printStackTrace();
+ }
+ throw new RuntimeException("TEST FAILED: "
+ + "unexpected exception", e);
+ } finally {
+ long actualDuration = System.currentTimeMillis() - startTime;
+ logger.log(Level.INFO, "Test finished");
+ try {
+ UnicastRemoteObject.unexportObject(user, true);
} catch (NoSuchObjectException ignore) {
- }
- logger.log(Level.INFO, "Test duration was " +
- (actualDuration/1000) + " seconds " +
- "(" + (actualDuration/3600000) + " hours)");
- System.gc(); System.gc();
- if (exit) {
- System.exit(exitValue);
- }
+ }
+ logger.log(Level.INFO, "Test duration was " +
+ (actualDuration/1000) + " seconds " +
+ "(" + (actualDuration/3600000) + " hours)");
+ System.gc(); System.gc();
+ if (exit) {
+ System.exit(exitValue);
+ }
}
}
}
--- a/jdk/test/java/rmi/reliability/juicer/ApplicationServer.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/juicer/ApplicationServer.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -32,7 +32,7 @@
* stress test of RMI.
*/
public class ApplicationServer implements Runnable {
-
+
/** number of remote Apple objects to export */
private static final Logger logger = Logger.getLogger("reliability.orange");
private static final int LOOKUP_ATTEMPTS = 5;
@@ -58,102 +58,102 @@
* them with server.
*/
public void run() {
- try {
- int i = 0;
+ try {
+ int i = 0;
- /*
- * Locate apple user object in registry. The lookup will
- * occur until it is successful or fails LOOKUP_ATTEMPTS times.
- * These repeated attempts allow the ApplicationServer
- * to be started before the AppleUserImpl.
- */
- Exception exc = null;
- for (i = 0; i < LOOKUP_ATTEMPTS; i++) {
- try {
- Registry registry = LocateRegistry.getRegistry(
- registryHost, 2006);
- user = (AppleUser) registry.lookup("AppleUser");
- user.startTest();
- break; //successfully obtained AppleUser
- } catch (Exception e) {
- exc = e;
- Thread.sleep(10000); //sleep 10 seconds and try again
- }
- }
- if (user == null) {
- logger.log(Level.SEVERE, "Failed to lookup AppleUser:", exc);
- return;
- }
+ /*
+ * Locate apple user object in registry. The lookup will
+ * occur until it is successful or fails LOOKUP_ATTEMPTS times.
+ * These repeated attempts allow the ApplicationServer
+ * to be started before the AppleUserImpl.
+ */
+ Exception exc = null;
+ for (i = 0; i < LOOKUP_ATTEMPTS; i++) {
+ try {
+ Registry registry = LocateRegistry.getRegistry(
+ registryHost, 2006);
+ user = (AppleUser) registry.lookup("AppleUser");
+ user.startTest();
+ break; //successfully obtained AppleUser
+ } catch (Exception e) {
+ exc = e;
+ Thread.sleep(10000); //sleep 10 seconds and try again
+ }
+ }
+ if (user == null) {
+ logger.log(Level.SEVERE, "Failed to lookup AppleUser:", exc);
+ return;
+ }
- /*
- * Create and export apple implementations.
- */
- try {
- for (i = 0; i < numApples; i++) {
- apples[i] = new AppleImpl("AppleImpl #" + (i + 1));
- }
- } catch (RemoteException e) {
- logger.log(Level.SEVERE,
- "Failed to create AppleImpl #" + (i + 1) + ":", e);
- user.reportException(e);
- return;
- }
+ /*
+ * Create and export apple implementations.
+ */
+ try {
+ for (i = 0; i < numApples; i++) {
+ apples[i] = new AppleImpl("AppleImpl #" + (i + 1));
+ }
+ } catch (RemoteException e) {
+ logger.log(Level.SEVERE,
+ "Failed to create AppleImpl #" + (i + 1) + ":", e);
+ user.reportException(e);
+ return;
+ }
- /*
- * Hand apple objects to apple user.
- */
- try {
- for (i = 0; i < numApples; i++) {
- user.useApple(apples[i]);
+ /*
+ * Hand apple objects to apple user.
+ */
+ try {
+ for (i = 0; i < numApples; i++) {
+ user.useApple(apples[i]);
}
- } catch (RemoteException e) {
- logger.log(Level.SEVERE,
- "Failed to register callbacks for " + apples[i] + ":", e);
- user.reportException(e);
- return;
- }
- } catch (Exception e) {
- logger.log(Level.SEVERE, "Unexpected exception:", e);
- }
+ } catch (RemoteException e) {
+ logger.log(Level.SEVERE,
+ "Failed to register callbacks for " + apples[i] + ":", e);
+ user.reportException(e);
+ return;
+ }
+ } catch (Exception e) {
+ logger.log(Level.SEVERE, "Unexpected exception:", e);
+ }
}
private static void usage() {
- System.err.println("Usage: ApplicationServer [-numApples <numApples>]");
- System.err.println(" [-registryHost <host>]");
- System.err.println(" numApples The number of apples (threads) to use.");
- System.err.println(" The default is 10 apples.");
- System.err.println(" host The host running rmiregistry " +
- "which contains AppleUser.");
- System.err.println(" The default is \"localhost\".");
- System.err.println();
+ System.err.println("Usage: ApplicationServer [-numApples <numApples>]");
+ System.err.println(" [-registryHost <host>]");
+ System.err.println(" numApples The number of apples (threads) to use.");
+ System.err.println(" The default is 10 apples.");
+ System.err.println(" host The host running rmiregistry " +
+ "which contains AppleUser.");
+ System.err.println(" The default is \"localhost\".");
+ System.err.println();
}
public static void main(String[] args) {
int num = DEFAULT_NUMAPPLES;
String host = DEFAULT_REGISTRYHOST;
- // parse command line args
- try {
+ // parse command line args
+ try {
for (int i = 0; i < args.length ; i++ ) {
- String arg = args[i];
- if (arg.equals("-numApples")) {
+ String arg = args[i];
+ if (arg.equals("-numApples")) {
i++;
num = Integer.parseInt(args[i]);
- } else if (arg.equals("-registryHost")) {
+ } else if (arg.equals("-registryHost")) {
i++;
host = args[i];
- } else {
+ } else {
usage();
- }
+ }
}
- } catch (Throwable t) {
+ } catch (Throwable t) {
usage();
- throw new RuntimeException("TEST FAILED: Bad argument");
- }
+ throw new RuntimeException("TEST FAILED: Bad argument");
+ }
- // start the client server
- Thread server = new Thread(new ApplicationServer(num,host));
- server.start();
- // main should exit once all exported remote objects are gc'd
+ // start the client server
+ Thread server = new Thread(new ApplicationServer(num,host));
+ server.start();
+ // main should exit once all exported remote objects are gc'd
}
}
--- a/jdk/test/java/rmi/reliability/juicer/Orange.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/juicer/Orange.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -26,11 +26,11 @@
/**
* Represents one remote party of the deep 2-party recursion implemented by
- * this RMI reliability test. An Orange instance recursively calls back
+ * this RMI reliability test. An Orange instance recursively calls back
* to it's caller, typically an OrangeEcho instance.
* The recursion stops when it reaches a given 'level'.
*/
public interface Orange extends Remote {
- int[] recurse(OrangeEcho echo, int[] message, int level)
- throws RemoteException;
+ int[] recurse(OrangeEcho echo, int[] message, int level)
+ throws RemoteException;
}
--- a/jdk/test/java/rmi/reliability/juicer/OrangeEcho.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/juicer/OrangeEcho.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -26,11 +26,11 @@
/**
* Represents one remote party of the deep 2-party recursion implemented by
- * this RMI reliability test. An OrangeEcho instance recursively calls back
+ * this RMI reliability test. An OrangeEcho instance recursively calls back
* to it's caller, an Orange instance.
* The recursion stops when it reaches a given 'level'.
*/
public interface OrangeEcho extends Remote {
int[] recurse(Orange orange, int[] message, int level)
- throws RemoteException;
+ throws RemoteException;
}
--- a/jdk/test/java/rmi/reliability/juicer/OrangeEchoImpl.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/juicer/OrangeEchoImpl.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -33,12 +33,12 @@
*/
public class OrangeEchoImpl extends UnicastRemoteObject implements OrangeEcho {
- private static final Logger logger =
- Logger.getLogger("reliability.orangeecho");
+ private static final Logger logger =
+ Logger.getLogger("reliability.orangeecho");
private final String name;
public OrangeEchoImpl(String name) throws RemoteException {
- this.name = name;
+ this.name = name;
}
/**
@@ -46,24 +46,24 @@
* with the same message data and a decremented recursion level.
*/
public int[] recurse(Orange orange, int[] message, int level)
- throws RemoteException
+ throws RemoteException
{
- String threadName = Thread.currentThread().getName();
+ String threadName = Thread.currentThread().getName();
- logger.log(Level.FINEST,
- threadName + ": " + toString() + ".recurse(message["
- + message.length + "], " + level + "): BEGIN");
+ logger.log(Level.FINEST,
+ threadName + ": " + toString() + ".recurse(message["
+ + message.length + "], " + level + "): BEGIN");
- int[] response = orange.recurse(this, message, level - 1);
+ int[] response = orange.recurse(this, message, level - 1);
- logger.log(Level.FINEST,
- threadName + ": " + toString() + ".recurse(message["
- + message.length + "], " + level + "): END");
+ logger.log(Level.FINEST,
+ threadName + ": " + toString() + ".recurse(message["
+ + message.length + "], " + level + "): END");
- return response;
+ return response;
}
public String toString() {
- return name;
+ return name;
}
}
--- a/jdk/test/java/rmi/reliability/juicer/OrangeImpl.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/reliability/juicer/OrangeImpl.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -36,7 +36,7 @@
private final String name;
public OrangeImpl(String name) throws RemoteException {
- this.name = name;
+ this.name = name;
}
/**
@@ -44,31 +44,31 @@
* object if not at recursion level zero.
*/
public int[] recurse(OrangeEcho echo, int[] message, int level)
- throws RemoteException
+ throws RemoteException
{
- String threadName = Thread.currentThread().getName();
- logger.log(Level.FINEST,
- threadName + ": " + toString() + ".recurse(message["
- + message.length + "], " + level + "): BEGIN");
+ String threadName = Thread.currentThread().getName();
+ logger.log(Level.FINEST,
+ threadName + ": " + toString() + ".recurse(message["
+ + message.length + "], " + level + "): BEGIN");
- int[] response;
- if (level > 0) {
- response = echo.recurse(this, message, level);
- } else {
- for (int i = 0; i < message.length; i++) {
- message[i] = ~message[i];
- }
- response = message;
- }
+ int[] response;
+ if (level > 0) {
+ response = echo.recurse(this, message, level);
+ } else {
+ for (int i = 0; i < message.length; i++) {
+ message[i] = ~message[i];
+ }
+ response = message;
+ }
- logger.log(Level.FINEST,
- threadName + ": " + toString() + ".recurse(message["
- + message.length + "], " + level + "): END");
+ logger.log(Level.FINEST,
+ threadName + ": " + toString() + ".recurse(message["
+ + message.length + "], " + level + "): END");
- return response;
+ return response;
}
public String toString() {
- return name;
+ return name;
}
}
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/activatable/CompressConstants.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/activatable/CompressConstants.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -27,9 +27,9 @@
interface CompressConstants {
// constants for 6-bit code values
- static final int NOP = 0; // no operation: used to pad words on flush()
- static final int RAW = 1; // introduces raw byte format
- static final int BASE = 2; // base for codes found in lookup table
+ static final int NOP = 0; // no operation: used to pad words on flush()
+ static final int RAW = 1; // introduces raw byte format
+ static final int BASE = 2; // base for codes found in lookup table
static final String codeTable =
- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ,.!?\"'()";
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ,.!?\"'()";
}
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/activatable/CompressInputStream.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/activatable/CompressInputStream.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -31,7 +31,7 @@
{
public CompressInputStream(InputStream in) {
- super(in);
+ super(in);
}
// buffer of unpacked 6-bit codes from last 32-word read
@@ -41,70 +41,70 @@
int bufPos = 5;
public int read() throws IOException {
- try {
- int code;
- do {
- code = readCode();
- } while (code == NOP); // ignore NOP codes
+ try {
+ int code;
+ do {
+ code = readCode();
+ } while (code == NOP); // ignore NOP codes
- if (code >= BASE)
- return codeTable.charAt(code - BASE);
- else if (code == RAW) {
- int high = readCode();
- int low = readCode();
- return (high << 4) | low;
- } else
- throw new IOException("unknown compression code: " + code);
- } catch (EOFException e) {
- return -1;
- }
+ if (code >= BASE)
+ return codeTable.charAt(code - BASE);
+ else if (code == RAW) {
+ int high = readCode();
+ int low = readCode();
+ return (high << 4) | low;
+ } else
+ throw new IOException("unknown compression code: " + code);
+ } catch (EOFException e) {
+ return -1;
+ }
}
public int read(byte b[], int off, int len) throws IOException {
- if (len <= 0) {
- return 0;
- }
+ if (len <= 0) {
+ return 0;
+ }
- int c = read();
- if (c == -1) {
- return -1;
- }
- b[off] = (byte)c;
+ int c = read();
+ if (c == -1) {
+ return -1;
+ }
+ b[off] = (byte)c;
- int i = 1;
+ int i = 1;
/*****
- try {
- for (; i < len ; i++) {
- c = read();
- if (c == -1) {
- break;
- }
- if (b != null) {
- b[off + i] = (byte)c;
- }
- }
- } catch (IOException ee) {
- }
+ try {
+ for (; i < len ; i++) {
+ c = read();
+ if (c == -1) {
+ break;
+ }
+ if (b != null) {
+ b[off + i] = (byte)c;
+ }
+ }
+ } catch (IOException ee) {
+ }
*****/
- return i;
+ return i;
}
private int readCode() throws IOException {
- if (bufPos == 5) {
- int b1 = in.read();
- int b2 = in.read();
- int b3 = in.read();
- int b4 = in.read();
- if ((b1 | b2 | b3 | b4) < 0)
- throw new EOFException();
- int pack = (b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
- buf[0] = (pack >>> 24) & 0x3F;
- buf[1] = (pack >>> 18) & 0x3F;
- buf[2] = (pack >>> 12) & 0x3F;
- buf[3] = (pack >>> 6) & 0x3F;
- buf[4] = (pack >>> 0) & 0x3F;
- bufPos = 0;
- }
- return buf[bufPos++];
+ if (bufPos == 5) {
+ int b1 = in.read();
+ int b2 = in.read();
+ int b3 = in.read();
+ int b4 = in.read();
+ if ((b1 | b2 | b3 | b4) < 0)
+ throw new EOFException();
+ int pack = (b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
+ buf[0] = (pack >>> 24) & 0x3F;
+ buf[1] = (pack >>> 18) & 0x3F;
+ buf[2] = (pack >>> 12) & 0x3F;
+ buf[3] = (pack >>> 6) & 0x3F;
+ buf[4] = (pack >>> 0) & 0x3F;
+ bufPos = 0;
+ }
+ return buf[bufPos++];
}
}
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/activatable/CompressOutputStream.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/activatable/CompressOutputStream.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -31,7 +31,7 @@
{
public CompressOutputStream(OutputStream out) {
- super(out);
+ super(out);
}
// buffer of 6-bit codes to pack into next 32-bit word
@@ -41,44 +41,44 @@
int bufPos = 0;
public void write(int b) throws IOException {
- b &= 0xFF; // force argument to a byte
+ b &= 0xFF; // force argument to a byte
- int pos = codeTable.indexOf((char)b);
- if (pos != -1)
- writeCode(BASE + pos);
- else {
- writeCode(RAW);
- writeCode(b >> 4);
- writeCode(b & 0xF);
- }
+ int pos = codeTable.indexOf((char)b);
+ if (pos != -1)
+ writeCode(BASE + pos);
+ else {
+ writeCode(RAW);
+ writeCode(b >> 4);
+ writeCode(b & 0xF);
+ }
}
public void write(byte b[], int off, int len) throws IOException {
- /*
- * This is quite an inefficient implementation, because it has to
- * call the other write method for every byte in the array. It
+ /*
+ * This is quite an inefficient implementation, because it has to
+ * call the other write method for every byte in the array. It
* could be optimized for performance by doing all the processing
- * in this method.
- */
- for (int i = 0; i < len; i++)
- write(b[off + i]);
+ * in this method.
+ */
+ for (int i = 0; i < len; i++)
+ write(b[off + i]);
}
public void flush() throws IOException {
- while (bufPos > 0)
- writeCode(NOP);
+ while (bufPos > 0)
+ writeCode(NOP);
}
private void writeCode(int c) throws IOException {
- buf[bufPos++] = c;
- if (bufPos == 5) { // write next word when we have 5 codes
- int pack = (buf[0] << 24) | (buf[1] << 18) | (buf[2] << 12) |
- (buf[3] << 6) | buf[4];
- out.write((pack >>> 24) & 0xFF);
- out.write((pack >>> 16) & 0xFF);
- out.write((pack >>> 8) & 0xFF);
- out.write((pack >>> 0) & 0xFF);
- bufPos = 0;
- }
+ buf[bufPos++] = c;
+ if (bufPos == 5) { // write next word when we have 5 codes
+ int pack = (buf[0] << 24) | (buf[1] << 18) | (buf[2] << 12) |
+ (buf[3] << 6) | buf[4];
+ out.write((pack >>> 24) & 0xFF);
+ out.write((pack >>> 16) & 0xFF);
+ out.write((pack >>> 8) & 0xFF);
+ out.write((pack >>> 0) & 0xFF);
+ bufPos = 0;
+ }
}
}
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/activatable/Echo.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/activatable/Echo.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/activatable/EchoImpl.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/activatable/EchoImpl.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -39,49 +39,49 @@
* Initialization constructor.
*/
public EchoImpl(String protocol)
- throws ActivationException, RemoteException
+ throws ActivationException, RemoteException
{
- super(null, makeMarshalledObject(protocol), false, 0,
- new MultiSocketFactory.ClientFactory(protocol, pattern),
- new MultiSocketFactory.ServerFactory(protocol, pattern));
+ super(null, makeMarshalledObject(protocol), false, 0,
+ new MultiSocketFactory.ClientFactory(protocol, pattern),
+ new MultiSocketFactory.ServerFactory(protocol, pattern));
}
/**
* Activation constructor.
*/
public EchoImpl(ActivationID id, MarshalledObject obj)
- throws RemoteException
+ throws RemoteException
{
- super(id, 0,
- new MultiSocketFactory.ClientFactory(getProtocol(obj), pattern),
- new MultiSocketFactory.ServerFactory(getProtocol(obj), pattern));
+ super(id, 0,
+ new MultiSocketFactory.ClientFactory(getProtocol(obj), pattern),
+ new MultiSocketFactory.ServerFactory(getProtocol(obj), pattern));
}
private static MarshalledObject makeMarshalledObject(String protocol) {
- MarshalledObject obj = null;
- try {
- obj = new MarshalledObject(protocol);
- } catch (Exception willNotHappen) {
- }
+ MarshalledObject obj = null;
+ try {
+ obj = new MarshalledObject(protocol);
+ } catch (Exception willNotHappen) {
+ }
- return obj;
+ return obj;
}
private static String getProtocol(MarshalledObject obj) {
- String protocol = "";
- try {
- protocol = (String) obj.get();
- } catch (Exception willNotHappen) {
- }
+ String protocol = "";
+ try {
+ protocol = (String) obj.get();
+ } catch (Exception willNotHappen) {
+ }
- return protocol;
+ return protocol;
}
-
+
public byte[] echoNot(byte[] data) {
- byte[] result = new byte[data.length];
- for (int i = 0; i < data.length; i++)
- result[i] = (byte) ~data[i];
- return result;
+ byte[] result = new byte[data.length];
+ for (int i = 0; i < data.length; i++)
+ result[i] = (byte) ~data[i];
+ return result;
}
/**
@@ -89,7 +89,7 @@
*/
public void shutdown() throws Exception
{
- (new Thread(this,"Echo.shutdown")).start();
+ (new Thread(this,"Echo.shutdown")).start();
}
/**
@@ -98,43 +98,43 @@
* object may still have pending/executing calls), then
* unexport the object forcibly.
*/
- public void run()
+ public void run()
{
- ActivationLibrary.deactivate(this, getID());
+ ActivationLibrary.deactivate(this, getID());
}
public static void main(String[] args) {
- /*
- * The following line is required with the JDK 1.2 VM so that the
- * VM can exit gracefully when this test completes. Otherwise, the
- * conservative garbage collector will find a handle to the server
- * object on the native stack and not clear the weak reference to
- * it in the RMI runtime's object table.
- */
- Object dummy = new Object();
-
- System.setSecurityManager(new RMISecurityManager());
-
- try {
- String protocol = "";
- if (args.length >= 1)
- protocol = args[0];
+ /*
+ * The following line is required with the JDK 1.2 VM so that the
+ * VM can exit gracefully when this test completes. Otherwise, the
+ * conservative garbage collector will find a handle to the server
+ * object on the native stack and not clear the weak reference to
+ * it in the RMI runtime's object table.
+ */
+ Object dummy = new Object();
+
+ System.setSecurityManager(new RMISecurityManager());
+
+ try {
+ String protocol = "";
+ if (args.length >= 1)
+ protocol = args[0];
- System.out.println("EchoServer: creating remote object");
- ActivationGroupDesc groupDesc =
- new ActivationGroupDesc(null, null);
- ActivationSystem system = ActivationGroup.getSystem();
- ActivationGroupID groupID = system.registerGroup(groupDesc);
- ActivationGroup.createGroup(groupID, groupDesc, 0);
-
- EchoImpl impl = new EchoImpl(protocol);
- System.out.println("EchoServer: binding in registry");
- Naming.rebind("//:" + UseCustomSocketFactory.REGISTRY_PORT +
- "/EchoServer", impl);
- System.out.println("EchoServer ready.");
- } catch (Exception e) {
- System.err.println("EXCEPTION OCCURRED:");
- e.printStackTrace();
- }
+ System.out.println("EchoServer: creating remote object");
+ ActivationGroupDesc groupDesc =
+ new ActivationGroupDesc(null, null);
+ ActivationSystem system = ActivationGroup.getSystem();
+ ActivationGroupID groupID = system.registerGroup(groupDesc);
+ ActivationGroup.createGroup(groupID, groupDesc, 0);
+
+ EchoImpl impl = new EchoImpl(protocol);
+ System.out.println("EchoServer: binding in registry");
+ Naming.rebind("//:" + UseCustomSocketFactory.REGISTRY_PORT +
+ "/EchoServer", impl);
+ System.out.println("EchoServer ready.");
+ } catch (Exception e) {
+ System.err.println("EXCEPTION OCCURRED:");
+ e.printStackTrace();
+ }
}
}
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/activatable/EchoImpl_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/activatable/EchoImpl_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,47 +29,47 @@
implements Echo, java.rmi.Remote
{
private static final long serialVersionUID = 2;
-
+
private static java.lang.reflect.Method $method_echoNot_0;
private static java.lang.reflect.Method $method_shutdown_1;
-
+
static {
- try {
- $method_echoNot_0 = Echo.class.getMethod("echoNot", new java.lang.Class[] {byte[].class});
- $method_shutdown_1 = Echo.class.getMethod("shutdown", new java.lang.Class[] {});
- } catch (java.lang.NoSuchMethodException e) {
- throw new java.lang.NoSuchMethodError(
- "stub class initialization failed");
- }
+ try {
+ $method_echoNot_0 = Echo.class.getMethod("echoNot", new java.lang.Class[] {byte[].class});
+ $method_shutdown_1 = Echo.class.getMethod("shutdown", new java.lang.Class[] {});
+ } catch (java.lang.NoSuchMethodException e) {
+ throw new java.lang.NoSuchMethodError(
+ "stub class initialization failed");
+ }
}
-
+
// constructors
public EchoImpl_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of echoNot(byte[])
public byte[] echoNot(byte[] $param_arrayOf_byte_1)
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- Object $result = ref.invoke(this, $method_echoNot_0, new java.lang.Object[] {$param_arrayOf_byte_1}, -4295721514897591756L);
- return ((byte[]) $result);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ Object $result = ref.invoke(this, $method_echoNot_0, new java.lang.Object[] {$param_arrayOf_byte_1}, -4295721514897591756L);
+ return ((byte[]) $result);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of shutdown()
public void shutdown()
- throws java.lang.Exception
+ throws java.lang.Exception
{
- ref.invoke(this, $method_shutdown_1, null, -7207851917985848402L);
+ ref.invoke(this, $method_shutdown_1, null, -7207851917985848402L);
}
}
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/activatable/MultiSocketFactory.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/activatable/MultiSocketFactory.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -34,194 +34,193 @@
public class MultiSocketFactory {
private static RMISocketFactory def =
- RMISocketFactory.getDefaultSocketFactory();
+ RMISocketFactory.getDefaultSocketFactory();
+
-
public static class ServerFactory
- implements RMIServerSocketFactory, Serializable
+ implements RMIServerSocketFactory, Serializable
{
- private String protocol;
- private byte[] data;
+ private String protocol;
+ private byte[] data;
- public ServerFactory(String protocol, byte[] data) {
- this.protocol = protocol;
- this.data = data;
- }
+ public ServerFactory(String protocol, byte[] data) {
+ this.protocol = protocol;
+ this.data = data;
+ }
- public ServerSocket createServerSocket(int port) throws IOException
- {
- if (protocol.equals("compress")) {
- return new CompressServerSocket(port);
-
- } else if (protocol.equals("xor")) {
- if (data == null || data.length != 1)
- throw new IOException("invalid argument for XOR protocol");
- return new XorServerSocket(port, data[0]);
+ public ServerSocket createServerSocket(int port) throws IOException
+ {
+ if (protocol.equals("compress")) {
+ return new CompressServerSocket(port);
- }
-
- return def.createServerSocket(port);
- }
+ } else if (protocol.equals("xor")) {
+ if (data == null || data.length != 1)
+ throw new IOException("invalid argument for XOR protocol");
+ return new XorServerSocket(port, data[0]);
+
+ }
+
+ return def.createServerSocket(port);
+ }
}
public static class ClientFactory
- implements RMIClientSocketFactory, Serializable
+ implements RMIClientSocketFactory, Serializable
{
- private String protocol;
- private byte[] data;
+ private String protocol;
+ private byte[] data;
+
+ public ClientFactory(String protocol, byte[] data) {
+ this.protocol = protocol;
+ this.data = data;
+ }
- public ClientFactory(String protocol, byte[] data) {
- this.protocol = protocol;
- this.data = data;
- }
-
- public Socket createSocket(String host, int port)
- throws IOException
- {
- if (protocol.equals("compress")) {
- return new CompressSocket(host, port);
-
- } else if (protocol.equals("xor")) {
- if (data == null || data.length != 1)
- throw new IOException("invalid argument for XOR protocol");
- return new XorSocket(host, port, data[0]);
+ public Socket createSocket(String host, int port)
+ throws IOException
+ {
+ if (protocol.equals("compress")) {
+ return new CompressSocket(host, port);
- }
+ } else if (protocol.equals("xor")) {
+ if (data == null || data.length != 1)
+ throw new IOException("invalid argument for XOR protocol");
+ return new XorSocket(host, port, data[0]);
- return def.createSocket(host, port);
- }
+ }
+
+ return def.createSocket(host, port);
+ }
}
static class CompressSocket extends Socket {
- private InputStream in;
- private OutputStream out;
- public CompressSocket() { super(); }
- public CompressSocket(String host, int port) throws IOException {
- super(host, port);
- }
- public InputStream getInputStream() throws IOException {
- if (in == null) {
- in = new CompressInputStream(super.getInputStream());
- }
- return in;
+ private InputStream in;
+ private OutputStream out;
+ public CompressSocket() { super(); }
+ public CompressSocket(String host, int port) throws IOException {
+ super(host, port);
}
- public OutputStream getOutputStream() throws IOException {
- if (out == null) {
- out = new CompressOutputStream(super.getOutputStream());
- }
- return out;
- }
+ public InputStream getInputStream() throws IOException {
+ if (in == null) {
+ in = new CompressInputStream(super.getInputStream());
+ }
+ return in;
+ }
+ public OutputStream getOutputStream() throws IOException {
+ if (out == null) {
+ out = new CompressOutputStream(super.getOutputStream());
+ }
+ return out;
+ }
}
static class CompressServerSocket extends ServerSocket {
- public CompressServerSocket(int port) throws IOException {
- super(port);
- }
- public Socket accept() throws IOException {
- Socket s = new CompressSocket();
- implAccept(s);
- return s;
- }
+ public CompressServerSocket(int port) throws IOException {
+ super(port);
+ }
+ public Socket accept() throws IOException {
+ Socket s = new CompressSocket();
+ implAccept(s);
+ return s;
+ }
}
static class XorSocket extends Socket {
- private byte pattern;
- private InputStream in;
- private OutputStream out;
- public XorSocket(byte pattern) { super(); this.pattern = pattern; }
- public XorSocket(String host, int port, byte pattern)
- throws IOException
- {
- super(host, port);
- this.pattern = pattern;
- }
- public InputStream getInputStream() throws IOException {
- if (in == null) {
- in = new XorInputStream(super.getInputStream(), pattern);
- }
- return in;
+ private byte pattern;
+ private InputStream in;
+ private OutputStream out;
+ public XorSocket(byte pattern) { super(); this.pattern = pattern; }
+ public XorSocket(String host, int port, byte pattern)
+ throws IOException
+ {
+ super(host, port);
+ this.pattern = pattern;
}
- public OutputStream getOutputStream() throws IOException {
- if (out == null) {
- out = new XorOutputStream(super.getOutputStream(), pattern);
- }
- return out;
- }
+ public InputStream getInputStream() throws IOException {
+ if (in == null) {
+ in = new XorInputStream(super.getInputStream(), pattern);
+ }
+ return in;
+ }
+ public OutputStream getOutputStream() throws IOException {
+ if (out == null) {
+ out = new XorOutputStream(super.getOutputStream(), pattern);
+ }
+ return out;
+ }
}
static class XorServerSocket extends ServerSocket {
- private byte pattern;
- public XorServerSocket(int port, byte pattern) throws IOException {
- super(port);
- this.pattern = pattern;
- }
- public Socket accept() throws IOException {
- Socket s = new XorSocket(pattern);
- implAccept(s);
- return s;
- }
+ private byte pattern;
+ public XorServerSocket(int port, byte pattern) throws IOException {
+ super(port);
+ this.pattern = pattern;
+ }
+ public Socket accept() throws IOException {
+ Socket s = new XorSocket(pattern);
+ implAccept(s);
+ return s;
+ }
}
static class XorOutputStream extends FilterOutputStream {
- private byte pattern;
- public XorOutputStream(OutputStream out, byte pattern) {
- super(out);
- this.pattern = pattern;
- }
- public void write(int b) throws IOException {
- out.write(b ^ pattern);
- out.flush();
- }
- public void write(byte b[], int off, int len) throws IOException {
- for (int i = 0; i < len; i++)
- write(b[off + i]);
- }
+ private byte pattern;
+ public XorOutputStream(OutputStream out, byte pattern) {
+ super(out);
+ this.pattern = pattern;
+ }
+ public void write(int b) throws IOException {
+ out.write(b ^ pattern);
+ out.flush();
+ }
+ public void write(byte b[], int off, int len) throws IOException {
+ for (int i = 0; i < len; i++)
+ write(b[off + i]);
+ }
}
static class XorInputStream extends FilterInputStream {
- private byte pattern;
- public XorInputStream(InputStream in, byte pattern) {
- super(in);
- this.pattern = pattern;
- }
- public int read() throws IOException {
- int b = in.read();
-// System.out.print("BEFORE: " + Integer.toHexString(b));
- if (b != -1)
- b = (b ^ pattern) & 0xFF;
-// System.out.println("\tAFTER: " + Integer.toHexString(b));
- return b;
- }
- public int read(byte b[], int off, int len) throws IOException {
- if (len <= 0) {
- return 0;
- }
+ private byte pattern;
+ public XorInputStream(InputStream in, byte pattern) {
+ super(in);
+ this.pattern = pattern;
+ }
+ public int read() throws IOException {
+ int b = in.read();
+// System.out.print("BEFORE: " + Integer.toHexString(b));
+ if (b != -1)
+ b = (b ^ pattern) & 0xFF;
+// System.out.println("\tAFTER: " + Integer.toHexString(b));
+ return b;
+ }
+ public int read(byte b[], int off, int len) throws IOException {
+ if (len <= 0) {
+ return 0;
+ }
- int c = read();
- if (c == -1) {
- return -1;
- }
- b[off] = (byte)c;
+ int c = read();
+ if (c == -1) {
+ return -1;
+ }
+ b[off] = (byte)c;
- int i = 1;
+ int i = 1;
/*****
- try {
- for (; i < len ; i++) {
- c = read();
- if (c == -1) {
- break;
- }
- if (b != null) {
- b[off + i] = (byte)c;
- }
- }
- } catch (IOException ee) {
- }
+ try {
+ for (; i < len ; i++) {
+ c = read();
+ if (c == -1) {
+ break;
+ }
+ if (b != null) {
+ b[off + i] = (byte)c;
+ }
+ }
+ } catch (IOException ee) {
+ }
*****/
- return i;
- }
+ return i;
+ }
}
}
-
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/activatable/UseCustomSocketFactory.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/activatable/UseCustomSocketFactory.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -45,124 +45,124 @@
final static int REGISTRY_PORT = 2006;
static String[] protocol = new String[] { "", "compress", "xor" };
-
+
public static void main(String[] args) {
- System.out.println("\nRegression test for bug 4115696\n");
-
- TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
+ System.out.println("\nRegression test for bug 4115696\n");
+
+ TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
- try {
- LocateRegistry.createRegistry(REGISTRY_PORT);
- } catch (Exception e) {
- TestLibrary.bomb("creating registry", e);
- }
+ try {
+ LocateRegistry.createRegistry(REGISTRY_PORT);
+ } catch (Exception e) {
+ TestLibrary.bomb("creating registry", e);
+ }
+
+ RMID rmid = null;
- RMID rmid = null;
-
- try {
- rmid = RMID.createRMID(true);
- rmid.addArguments(new String[] {
- "-C-Djava.security.policy=" +
- TestParams.defaultGroupPolicy +
- " -C-Djava.security.manager=java.rmi.RMISecurityManager "});
- rmid.start();
+ try {
+ rmid = RMID.createRMID(true);
+ rmid.addArguments(new String[] {
+ "-C-Djava.security.policy=" +
+ TestParams.defaultGroupPolicy +
+ " -C-Djava.security.manager=java.rmi.RMISecurityManager "});
+ rmid.start();
- Echo[] echo = spawnAndTest();
- reactivateAndTest(echo);
- } catch (IOException e) {
- TestLibrary.bomb("creating rmid", e);
- } finally {
- if (rmid != null)
- rmid.destroy();
- }
+ Echo[] echo = spawnAndTest();
+ reactivateAndTest(echo);
+ } catch (IOException e) {
+ TestLibrary.bomb("creating rmid", e);
+ } finally {
+ if (rmid != null)
+ rmid.destroy();
+ }
}
private static Echo[] spawnAndTest() {
-
- System.err.println("\nCreate Test-->");
+
+ System.err.println("\nCreate Test-->");
+
+ Echo[] echo = new Echo[protocol.length];
+
+ for (int i = 0; i < protocol.length; i++) {
- Echo[] echo = new Echo[protocol.length];
-
- for (int i = 0; i < protocol.length; i++) {
-
- JavaVM serverVM = new JavaVM("EchoImpl",
- "-Djava.security.policy=" +
- TestParams.defaultPolicy,
- protocol[i]);
+ JavaVM serverVM = new JavaVM("EchoImpl",
+ "-Djava.security.policy=" +
+ TestParams.defaultPolicy,
+ protocol[i]);
- System.err.println("\nusing protocol: " +
- (protocol[i] == "" ? "none" : protocol[i]));
-
- try {
- /* spawn VM for EchoServer */
- serverVM.start();
+ System.err.println("\nusing protocol: " +
+ (protocol[i] == "" ? "none" : protocol[i]));
+
+ try {
+ /* spawn VM for EchoServer */
+ serverVM.start();
- /* lookup server */
- int tries = 12; // need enough tries for slow machine.
- echo[i] = null;
- do {
- try {
- echo[i] = (Echo) Naming.lookup("//:" + REGISTRY_PORT +
- "/EchoServer");
- break;
- } catch (NotBoundException e) {
- try {
- Thread.sleep(2000);
- } catch (Exception ignore) {
- }
- continue;
- }
- } while (--tries > 0);
+ /* lookup server */
+ int tries = 12; // need enough tries for slow machine.
+ echo[i] = null;
+ do {
+ try {
+ echo[i] = (Echo) Naming.lookup("//:" + REGISTRY_PORT +
+ "/EchoServer");
+ break;
+ } catch (NotBoundException e) {
+ try {
+ Thread.sleep(2000);
+ } catch (Exception ignore) {
+ }
+ continue;
+ }
+ } while (--tries > 0);
- if (echo[i] == null)
- TestLibrary.bomb("server not bound in 12 tries", null);
+ if (echo[i] == null)
+ TestLibrary.bomb("server not bound in 12 tries", null);
- /* invoke remote method and print result*/
- System.err.println("Bound to " + echo[i]);
- byte[] data = ("Greetings, citizen " +
- System.getProperty("user.name") + "!"). getBytes();
- byte[] result = echo[i].echoNot(data);
- for (int j = 0; j < result.length; j++)
- result[j] = (byte) ~result[j];
- System.err.println("Result: " + new String(result));
- echo[i].shutdown();
-
- } catch (Exception e) {
- TestLibrary.bomb("test failed", e);
-
- } finally {
- serverVM.destroy();
- try {
- Naming.unbind("//:" + REGISTRY_PORT + "/EchoServer");
- } catch (Exception e) {
- TestLibrary.bomb("unbinding EchoServer", e);
-
- }
- }
- }
- return echo;
+ /* invoke remote method and print result*/
+ System.err.println("Bound to " + echo[i]);
+ byte[] data = ("Greetings, citizen " +
+ System.getProperty("user.name") + "!"). getBytes();
+ byte[] result = echo[i].echoNot(data);
+ for (int j = 0; j < result.length; j++)
+ result[j] = (byte) ~result[j];
+ System.err.println("Result: " + new String(result));
+ echo[i].shutdown();
+
+ } catch (Exception e) {
+ TestLibrary.bomb("test failed", e);
+
+ } finally {
+ serverVM.destroy();
+ try {
+ Naming.unbind("//:" + REGISTRY_PORT + "/EchoServer");
+ } catch (Exception e) {
+ TestLibrary.bomb("unbinding EchoServer", e);
+
+ }
+ }
+ }
+ return echo;
}
private static void reactivateAndTest(Echo[] echo) {
- System.err.println("\nReactivate Test-->");
+ System.err.println("\nReactivate Test-->");
- for (int i = 0; i < echo.length; i++) {
- try {
- System.err.println("\nusing protocol: " +
- (protocol[i] == "" ? "none" : protocol[i]));
- byte[] data = ("Greetings, citizen " +
- System.getProperty("user.name") + "!").getBytes();
- byte[] result = echo[i].echoNot(data);
- for (int j = 0; j < result.length; j++)
- result[j] = (byte) ~result[j];
- System.err.println("Result: " + new String(result));
- echo[i].shutdown();
- } catch (Exception e) {
- TestLibrary.bomb("activating EchoServer for protocol " + protocol[i], e);
- }
- }
+ for (int i = 0; i < echo.length; i++) {
+ try {
+ System.err.println("\nusing protocol: " +
+ (protocol[i] == "" ? "none" : protocol[i]));
+ byte[] data = ("Greetings, citizen " +
+ System.getProperty("user.name") + "!").getBytes();
+ byte[] result = echo[i].echoNot(data);
+ for (int j = 0; j < result.length; j++)
+ result[j] = (byte) ~result[j];
+ System.err.println("Result: " + new String(result));
+ echo[i].shutdown();
+ } catch (Exception e) {
+ TestLibrary.bomb("activating EchoServer for protocol " + protocol[i], e);
+ }
+ }
}
}
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/registry/Compress.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/registry/Compress.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -31,204 +31,204 @@
public class Compress {
interface CompressConstants {
- // constants for 6-bit code values
- static final int NOP = 0; // no operation: used to pad words on flush()
- static final int RAW = 1; // introduces raw byte format
- static final int BASE = 2; // base for codes found in lookup table
- static final String codeTable =
- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ,.!?\"'()";
+ // constants for 6-bit code values
+ static final int NOP = 0; // no operation: used to pad words on flush()
+ static final int RAW = 1; // introduces raw byte format
+ static final int BASE = 2; // base for codes found in lookup table
+ static final String codeTable =
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ,.!?\"'()";
}
-
- public static class CompressRMIClientSocketFactory
- implements java.rmi.server.RMIClientSocketFactory, Serializable {
+
+ public static class CompressRMIClientSocketFactory
+ implements java.rmi.server.RMIClientSocketFactory, Serializable {
- public Socket createSocket(String host, int port)
- throws IOException {
-
- return ((Socket) new CompressSocket(host, port));
- }
+ public Socket createSocket(String host, int port)
+ throws IOException {
+
+ return ((Socket) new CompressSocket(host, port));
+ }
}
- public static class CompressRMIServerSocketFactory
- implements RMIServerSocketFactory,
- Serializable {
-
- public ServerSocket createServerSocket(int port)
- throws IOException {
+ public static class CompressRMIServerSocketFactory
+ implements RMIServerSocketFactory,
+ Serializable {
- return ((ServerSocket) new CompressServerSocket(port));
- }
+ public ServerSocket createServerSocket(int port)
+ throws IOException {
+
+ return ((ServerSocket) new CompressServerSocket(port));
+ }
}
-
+
public static class CompressSocket extends Socket {
- private InputStream in;
- private OutputStream out;
- public CompressSocket() { super(); }
- public CompressSocket(String host, int port) throws IOException {
- super(host, port);
- }
- public InputStream getInputStream() throws IOException {
- if (in == null) {
- in = new CompressInputStream(super.getInputStream());
- }
- return in;
+ private InputStream in;
+ private OutputStream out;
+ public CompressSocket() { super(); }
+ public CompressSocket(String host, int port) throws IOException {
+ super(host, port);
}
- public OutputStream getOutputStream() throws IOException {
- if (out == null) {
- out = new CompressOutputStream(super.getOutputStream());
- }
- return out;
- }
+ public InputStream getInputStream() throws IOException {
+ if (in == null) {
+ in = new CompressInputStream(super.getInputStream());
+ }
+ return in;
+ }
+ public OutputStream getOutputStream() throws IOException {
+ if (out == null) {
+ out = new CompressOutputStream(super.getOutputStream());
+ }
+ return out;
+ }
}
public static class CompressServerSocket extends ServerSocket {
- public CompressServerSocket(int port) throws IOException {
- super(port);
- }
- public Socket accept() throws IOException {
- Socket s = new CompressSocket();
- implAccept(s);
- return s;
- }
+ public CompressServerSocket(int port) throws IOException {
+ super(port);
+ }
+ public Socket accept() throws IOException {
+ Socket s = new CompressSocket();
+ implAccept(s);
+ return s;
+ }
}
public static class CompressInputStream extends FilterInputStream
- implements CompressConstants
+ implements CompressConstants
{
-
- public CompressInputStream(InputStream in) {
- super(in);
- }
-
- // buffer of unpacked 6-bit codes from last 32-word read
- int buf[] = new int[5];
-
- // position of next code to read in buffer (5 == end of buffer)
- int bufPos = 5;
-
- public int read() throws IOException {
- try {
- int code;
- do {
- code = readCode();
- } while (code == NOP); // ignore NOP codes
-
- if (code >= BASE)
- return codeTable.charAt(code - BASE);
- else if (code == RAW) {
- int high = readCode();
- int low = readCode();
- return (high << 4) | low;
- } else
- throw new IOException("unknown compression code: " + code);
- } catch (EOFException e) {
- return -1;
- }
- }
-
- public int read(byte b[], int off, int len) throws IOException {
- if (len <= 0) {
- return 0;
- }
-
- int c = read();
- if (c == -1) {
- return -1;
- }
- b[off] = (byte)c;
-
- int i = 1;
- /*****
- try {
- for (; i < len ; i++) {
- c = read();
- if (c == -1) {
- break;
- }
- if (b != null) {
- b[off + i] = (byte)c;
- }
- }
- } catch (IOException ee) {
- }
- *****/
- return i;
- }
-
- private int readCode() throws IOException {
- if (bufPos == 5) {
- int b1 = in.read();
- int b2 = in.read();
- int b3 = in.read();
- int b4 = in.read();
- if ((b1 | b2 | b3 | b4) < 0)
- throw new EOFException();
- int pack = (b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
- buf[0] = (pack >>> 24) & 0x3F;
- buf[1] = (pack >>> 18) & 0x3F;
- buf[2] = (pack >>> 12) & 0x3F;
- buf[3] = (pack >>> 6) & 0x3F;
- buf[4] = (pack >>> 0) & 0x3F;
- bufPos = 0;
- }
- return buf[bufPos++];
- }
+
+ public CompressInputStream(InputStream in) {
+ super(in);
+ }
+
+ // buffer of unpacked 6-bit codes from last 32-word read
+ int buf[] = new int[5];
+
+ // position of next code to read in buffer (5 == end of buffer)
+ int bufPos = 5;
+
+ public int read() throws IOException {
+ try {
+ int code;
+ do {
+ code = readCode();
+ } while (code == NOP); // ignore NOP codes
+
+ if (code >= BASE)
+ return codeTable.charAt(code - BASE);
+ else if (code == RAW) {
+ int high = readCode();
+ int low = readCode();
+ return (high << 4) | low;
+ } else
+ throw new IOException("unknown compression code: " + code);
+ } catch (EOFException e) {
+ return -1;
+ }
+ }
+
+ public int read(byte b[], int off, int len) throws IOException {
+ if (len <= 0) {
+ return 0;
+ }
+
+ int c = read();
+ if (c == -1) {
+ return -1;
+ }
+ b[off] = (byte)c;
+
+ int i = 1;
+ /*****
+ try {
+ for (; i < len ; i++) {
+ c = read();
+ if (c == -1) {
+ break;
+ }
+ if (b != null) {
+ b[off + i] = (byte)c;
+ }
+ }
+ } catch (IOException ee) {
+ }
+ *****/
+ return i;
+ }
+
+ private int readCode() throws IOException {
+ if (bufPos == 5) {
+ int b1 = in.read();
+ int b2 = in.read();
+ int b3 = in.read();
+ int b4 = in.read();
+ if ((b1 | b2 | b3 | b4) < 0)
+ throw new EOFException();
+ int pack = (b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
+ buf[0] = (pack >>> 24) & 0x3F;
+ buf[1] = (pack >>> 18) & 0x3F;
+ buf[2] = (pack >>> 12) & 0x3F;
+ buf[3] = (pack >>> 6) & 0x3F;
+ buf[4] = (pack >>> 0) & 0x3F;
+ bufPos = 0;
+ }
+ return buf[bufPos++];
+ }
}
public static class CompressOutputStream extends FilterOutputStream
- implements CompressConstants
+ implements CompressConstants
{
-
- public CompressOutputStream(OutputStream out) {
- super(out);
- }
-
- // buffer of 6-bit codes to pack into next 32-bit word
- int buf[] = new int[5];
-
- // number of valid codes pending in buffer
- int bufPos = 0;
-
- public void write(int b) throws IOException {
- b &= 0xFF; // force argument to a byte
-
- int pos = codeTable.indexOf((char)b);
- if (pos != -1)
- writeCode(BASE + pos);
- else {
- writeCode(RAW);
- writeCode(b >> 4);
- writeCode(b & 0xF);
- }
- }
-
- public void write(byte b[], int off, int len) throws IOException {
- /*
- * This is quite an inefficient implementation, because it has to
- * call the other write method for every byte in the array. It
- * could be optimized for performance by doing all the processing
- * in this method.
- */
- for (int i = 0; i < len; i++)
- write(b[off + i]);
- }
-
- public void flush() throws IOException {
- while (bufPos > 0)
- writeCode(NOP);
- }
-
- private void writeCode(int c) throws IOException {
- buf[bufPos++] = c;
- if (bufPos == 5) { // write next word when we have 5 codes
- int pack = (buf[0] << 24) | (buf[1] << 18) | (buf[2] << 12) |
- (buf[3] << 6) | buf[4];
- out.write((pack >>> 24) & 0xFF);
- out.write((pack >>> 16) & 0xFF);
- out.write((pack >>> 8) & 0xFF);
- out.write((pack >>> 0) & 0xFF);
- bufPos = 0;
- }
- }
+
+ public CompressOutputStream(OutputStream out) {
+ super(out);
+ }
+
+ // buffer of 6-bit codes to pack into next 32-bit word
+ int buf[] = new int[5];
+
+ // number of valid codes pending in buffer
+ int bufPos = 0;
+
+ public void write(int b) throws IOException {
+ b &= 0xFF; // force argument to a byte
+
+ int pos = codeTable.indexOf((char)b);
+ if (pos != -1)
+ writeCode(BASE + pos);
+ else {
+ writeCode(RAW);
+ writeCode(b >> 4);
+ writeCode(b & 0xF);
+ }
+ }
+
+ public void write(byte b[], int off, int len) throws IOException {
+ /*
+ * This is quite an inefficient implementation, because it has to
+ * call the other write method for every byte in the array. It
+ * could be optimized for performance by doing all the processing
+ * in this method.
+ */
+ for (int i = 0; i < len; i++)
+ write(b[off + i]);
+ }
+
+ public void flush() throws IOException {
+ while (bufPos > 0)
+ writeCode(NOP);
+ }
+
+ private void writeCode(int c) throws IOException {
+ buf[bufPos++] = c;
+ if (bufPos == 5) { // write next word when we have 5 codes
+ int pack = (buf[0] << 24) | (buf[1] << 18) | (buf[2] << 12) |
+ (buf[3] << 6) | buf[4];
+ out.write((pack >>> 24) & 0xFF);
+ out.write((pack >>> 16) & 0xFF);
+ out.write((pack >>> 8) & 0xFF);
+ out.write((pack >>> 0) & 0xFF);
+ bufPos = 0;
+ }
+ }
}
}
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/registry/Hello.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/registry/Hello.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/registry/HelloImpl.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/registry/HelloImpl.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -36,49 +36,49 @@
public static boolean clientCalledSuccessfully = false;
public HelloImpl() throws RemoteException {
- super(0);
+ super(0);
}
-
+
public synchronized String sayHello() {
- HelloImpl.clientCalledSuccessfully = true;
- System.out.println("hello method called");
- this.notifyAll();
- return "hello";
+ HelloImpl.clientCalledSuccessfully = true;
+ System.out.println("hello method called");
+ this.notifyAll();
+ return "hello";
}
public static void main(String[] args) {
- /*
- * The following line is required with the JDK 1.2 VM so that the
- * VM can exit gracefully when this test completes. Otherwise, the
- * conservative garbage collector will find a handle to the server
- * object on the native stack and not clear the weak reference to
- * it in the RMI runtime's object table.
- */
- Object dummy = new Object();
- Hello hello = null;
- Registry registry = null;
+ /*
+ * The following line is required with the JDK 1.2 VM so that the
+ * VM can exit gracefully when this test completes. Otherwise, the
+ * conservative garbage collector will find a handle to the server
+ * object on the native stack and not clear the weak reference to
+ * it in the RMI runtime's object table.
+ */
+ Object dummy = new Object();
+ Hello hello = null;
+ Registry registry = null;
- TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
+ TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
- try {
- String protocol = "";
- if (args.length >= 1)
- protocol = args[0];
+ try {
+ String protocol = "";
+ if (args.length >= 1)
+ protocol = args[0];
- registry = java.rmi.registry.LocateRegistry.
- getRegistry("localhost", TestLibrary.REGISTRY_PORT,
- new Compress.CompressRMIClientSocketFactory());
- UseCustomSocketFactory.checkStub(registry, "RMIClientSocket");
- hello = (Hello) registry.lookup("/HelloServer");
+ registry = java.rmi.registry.LocateRegistry.
+ getRegistry("localhost", TestLibrary.REGISTRY_PORT,
+ new Compress.CompressRMIClientSocketFactory());
+ UseCustomSocketFactory.checkStub(registry, "RMIClientSocket");
+ hello = (Hello) registry.lookup("/HelloServer");
- /* lookup server */
- System.err.println(hello.sayHello() +
- ", remote greeting.");
- } catch (Exception e) {
- System.err.println("EXCEPTION OCCURRED:");
- e.printStackTrace();
- } finally {
- hello = null;
- }
+ /* lookup server */
+ System.err.println(hello.sayHello() +
+ ", remote greeting.");
+ } catch (Exception e) {
+ System.err.println("EXCEPTION OCCURRED:");
+ e.printStackTrace();
+ } finally {
+ hello = null;
+ }
}
}
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/registry/HelloImpl_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/registry/HelloImpl_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,72 +29,72 @@
implements Hello, java.rmi.Remote
{
private static java.rmi.server.Operation[] operations = {
- new java.rmi.server.Operation("java.lang.String sayHello()")
+ new java.rmi.server.Operation("java.lang.String sayHello()")
};
-
+
private static final long interfaceHash = 6486744599627128933L;
-
+
private static final long serialVersionUID = 2;
-
+
private static boolean useNewInvoke;
private static java.lang.reflect.Method $method_sayHello_0;
-
+
static {
- try {
- java.rmi.server.RemoteRef.class.getMethod("invoke",
- new java.lang.Class[] {
- java.rmi.Remote.class,
- java.lang.reflect.Method.class,
- java.lang.Object[].class,
- long.class
- });
- useNewInvoke = true;
- $method_sayHello_0 = Hello.class.getMethod("sayHello", new java.lang.Class[] {});
- } catch (java.lang.NoSuchMethodException e) {
- useNewInvoke = false;
- }
+ try {
+ java.rmi.server.RemoteRef.class.getMethod("invoke",
+ new java.lang.Class[] {
+ java.rmi.Remote.class,
+ java.lang.reflect.Method.class,
+ java.lang.Object[].class,
+ long.class
+ });
+ useNewInvoke = true;
+ $method_sayHello_0 = Hello.class.getMethod("sayHello", new java.lang.Class[] {});
+ } catch (java.lang.NoSuchMethodException e) {
+ useNewInvoke = false;
+ }
}
-
+
// constructors
public HelloImpl_Stub() {
- super();
+ super();
}
public HelloImpl_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of sayHello()
public java.lang.String sayHello()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- Object $result = ref.invoke(this, $method_sayHello_0, null, 6043973830760146143L);
- return ((java.lang.String) $result);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
- ref.invoke(call);
- java.lang.String $result;
- try {
- java.io.ObjectInput in = call.getInputStream();
- $result = (java.lang.String) in.readObject();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } catch (java.lang.ClassNotFoundException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } finally {
- ref.done(call);
- }
- return $result;
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ Object $result = ref.invoke(this, $method_sayHello_0, null, 6043973830760146143L);
+ return ((java.lang.String) $result);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
+ ref.invoke(call);
+ java.lang.String $result;
+ try {
+ java.io.ObjectInput in = call.getInputStream();
+ $result = (java.lang.String) in.readObject();
+ } catch (java.io.IOException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } catch (java.lang.ClassNotFoundException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } finally {
+ ref.done(call);
+ }
+ return $result;
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/registry/UseCustomSocketFactory.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/registry/UseCustomSocketFactory.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -47,86 +47,86 @@
* (i.e. compression) client and server socket factories.
*/
public class UseCustomSocketFactory {
-
+
Hello hello = null;
-
+
public static void main(String[] args) {
-
- Registry registry = null;
- HelloImpl impl = null;
+
+ Registry registry = null;
+ HelloImpl impl = null;
- System.out.println("\nRegression test for bug 4148850\n");
-
- TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
+ System.out.println("\nRegression test for bug 4148850\n");
- try {
- impl = new HelloImpl();
+ TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
+
+ try {
+ impl = new HelloImpl();
- /* Make sure that the rmiregistry can communicate over a
- * custom socket. Ensure that the functionality exists to
- * allow the rmiregistry to be secure.
- */
- registry = LocateRegistry.
- createRegistry(TestLibrary.REGISTRY_PORT,
- new Compress.CompressRMIClientSocketFactory(),
- new Compress.CompressRMIServerSocketFactory());
- registry.rebind("/HelloServer", impl);
- checkStub(registry, "RMIServerSocket");
-
- } catch (Exception e) {
- TestLibrary.bomb("creating registry", e);
- }
-
- JavaVM serverVM = new JavaVM("HelloImpl", "-Djava.security.policy=" +
- TestParams.defaultPolicy, "");
+ /* Make sure that the rmiregistry can communicate over a
+ * custom socket. Ensure that the functionality exists to
+ * allow the rmiregistry to be secure.
+ */
+ registry = LocateRegistry.
+ createRegistry(TestLibrary.REGISTRY_PORT,
+ new Compress.CompressRMIClientSocketFactory(),
+ new Compress.CompressRMIServerSocketFactory());
+ registry.rebind("/HelloServer", impl);
+ checkStub(registry, "RMIServerSocket");
- try {
+ } catch (Exception e) {
+ TestLibrary.bomb("creating registry", e);
+ }
+
+ JavaVM serverVM = new JavaVM("HelloImpl", "-Djava.security.policy=" +
+ TestParams.defaultPolicy, "");
+
+ try {
- /*
- * spawn VM for HelloServer which will download a client socket
- * factory
- */
- serverVM.start();
+ /*
+ * spawn VM for HelloServer which will download a client socket
+ * factory
+ */
+ serverVM.start();
- synchronized (impl) {
+ synchronized (impl) {
+
+ System.out.println("waiting for remote notification");
+
+ if (!HelloImpl.clientCalledSuccessfully) {
+ impl.wait(75 * 1000);
+ }
- System.out.println("waiting for remote notification");
-
- if (!HelloImpl.clientCalledSuccessfully) {
- impl.wait(75 * 1000);
- }
-
- if (!HelloImpl.clientCalledSuccessfully) {
- throw new RuntimeException("Client did not execute call in time...");
- }
- }
+ if (!HelloImpl.clientCalledSuccessfully) {
+ throw new RuntimeException("Client did not execute call in time...");
+ }
+ }
- System.err.println("\nRegression test for bug 4148850 passed.\n ");
+ System.err.println("\nRegression test for bug 4148850 passed.\n ");
+
+ } catch (Exception e) {
+ TestLibrary.bomb("test failed", e);
- } catch (Exception e) {
- TestLibrary.bomb("test failed", e);
-
- } finally {
- serverVM.destroy();
- try {
- registry.unbind("/HelloServer");
- } catch (Exception e) {
- TestLibrary.bomb("unbinding HelloServer", e);
- }
- TestLibrary.unexport(registry);
- TestLibrary.unexport(impl);
- impl = null;
- registry = null;
- }
+ } finally {
+ serverVM.destroy();
+ try {
+ registry.unbind("/HelloServer");
+ } catch (Exception e) {
+ TestLibrary.bomb("unbinding HelloServer", e);
+ }
+ TestLibrary.unexport(registry);
+ TestLibrary.unexport(impl);
+ impl = null;
+ registry = null;
+ }
}
static void checkStub(Object stub, String toCheck) throws RemoteException {
- System.err.println("Ensuring that the stub contains a socket factory string: " +
- toCheck);
- System.err.println(stub);
- if (stub.toString().indexOf(toCheck) < 0) {
- throw new RemoteException("RemoteStub.toString() did not contain instance of "
- + toCheck);
- }
+ System.err.println("Ensuring that the stub contains a socket factory string: " +
+ toCheck);
+ System.err.println(stub);
+ if (stub.toString().indexOf(toCheck) < 0) {
+ throw new RemoteException("RemoteStub.toString() did not contain instance of "
+ + toCheck);
+ }
}
}
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/unicast/CompressConstants.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/unicast/CompressConstants.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -27,9 +27,9 @@
interface CompressConstants {
// constants for 6-bit code values
- static final int NOP = 0; // no operation: used to pad words on flush()
- static final int RAW = 1; // introduces raw byte format
- static final int BASE = 2; // base for codes found in lookup table
+ static final int NOP = 0; // no operation: used to pad words on flush()
+ static final int RAW = 1; // introduces raw byte format
+ static final int BASE = 2; // base for codes found in lookup table
static final String codeTable =
- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ,.!?\"'()";
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ,.!?\"'()";
}
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/unicast/CompressInputStream.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/unicast/CompressInputStream.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -31,7 +31,7 @@
{
public CompressInputStream(InputStream in) {
- super(in);
+ super(in);
}
// buffer of unpacked 6-bit codes from last 32-word read
@@ -41,70 +41,70 @@
int bufPos = 5;
public int read() throws IOException {
- try {
- int code;
- do {
- code = readCode();
- } while (code == NOP); // ignore NOP codes
+ try {
+ int code;
+ do {
+ code = readCode();
+ } while (code == NOP); // ignore NOP codes
- if (code >= BASE)
- return codeTable.charAt(code - BASE);
- else if (code == RAW) {
- int high = readCode();
- int low = readCode();
- return (high << 4) | low;
- } else
- throw new IOException("unknown compression code: " + code);
- } catch (EOFException e) {
- return -1;
- }
+ if (code >= BASE)
+ return codeTable.charAt(code - BASE);
+ else if (code == RAW) {
+ int high = readCode();
+ int low = readCode();
+ return (high << 4) | low;
+ } else
+ throw new IOException("unknown compression code: " + code);
+ } catch (EOFException e) {
+ return -1;
+ }
}
public int read(byte b[], int off, int len) throws IOException {
- if (len <= 0) {
- return 0;
- }
+ if (len <= 0) {
+ return 0;
+ }
- int c = read();
- if (c == -1) {
- return -1;
- }
- b[off] = (byte)c;
+ int c = read();
+ if (c == -1) {
+ return -1;
+ }
+ b[off] = (byte)c;
- int i = 1;
+ int i = 1;
/*****
- try {
- for (; i < len ; i++) {
- c = read();
- if (c == -1) {
- break;
- }
- if (b != null) {
- b[off + i] = (byte)c;
- }
- }
- } catch (IOException ee) {
- }
+ try {
+ for (; i < len ; i++) {
+ c = read();
+ if (c == -1) {
+ break;
+ }
+ if (b != null) {
+ b[off + i] = (byte)c;
+ }
+ }
+ } catch (IOException ee) {
+ }
*****/
- return i;
+ return i;
}
private int readCode() throws IOException {
- if (bufPos == 5) {
- int b1 = in.read();
- int b2 = in.read();
- int b3 = in.read();
- int b4 = in.read();
- if ((b1 | b2 | b3 | b4) < 0)
- throw new EOFException();
- int pack = (b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
- buf[0] = (pack >>> 24) & 0x3F;
- buf[1] = (pack >>> 18) & 0x3F;
- buf[2] = (pack >>> 12) & 0x3F;
- buf[3] = (pack >>> 6) & 0x3F;
- buf[4] = (pack >>> 0) & 0x3F;
- bufPos = 0;
- }
- return buf[bufPos++];
+ if (bufPos == 5) {
+ int b1 = in.read();
+ int b2 = in.read();
+ int b3 = in.read();
+ int b4 = in.read();
+ if ((b1 | b2 | b3 | b4) < 0)
+ throw new EOFException();
+ int pack = (b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
+ buf[0] = (pack >>> 24) & 0x3F;
+ buf[1] = (pack >>> 18) & 0x3F;
+ buf[2] = (pack >>> 12) & 0x3F;
+ buf[3] = (pack >>> 6) & 0x3F;
+ buf[4] = (pack >>> 0) & 0x3F;
+ bufPos = 0;
+ }
+ return buf[bufPos++];
}
}
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/unicast/CompressOutputStream.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/unicast/CompressOutputStream.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -31,7 +31,7 @@
{
public CompressOutputStream(OutputStream out) {
- super(out);
+ super(out);
}
// buffer of 6-bit codes to pack into next 32-bit word
@@ -41,44 +41,44 @@
int bufPos = 0;
public void write(int b) throws IOException {
- b &= 0xFF; // force argument to a byte
+ b &= 0xFF; // force argument to a byte
- int pos = codeTable.indexOf((char)b);
- if (pos != -1)
- writeCode(BASE + pos);
- else {
- writeCode(RAW);
- writeCode(b >> 4);
- writeCode(b & 0xF);
- }
+ int pos = codeTable.indexOf((char)b);
+ if (pos != -1)
+ writeCode(BASE + pos);
+ else {
+ writeCode(RAW);
+ writeCode(b >> 4);
+ writeCode(b & 0xF);
+ }
}
public void write(byte b[], int off, int len) throws IOException {
- /*
- * This is quite an inefficient implementation, because it has to
- * call the other write method for every byte in the array. It
+ /*
+ * This is quite an inefficient implementation, because it has to
+ * call the other write method for every byte in the array. It
* could be optimized for performance by doing all the processing
- * in this method.
- */
- for (int i = 0; i < len; i++)
- write(b[off + i]);
+ * in this method.
+ */
+ for (int i = 0; i < len; i++)
+ write(b[off + i]);
}
public void flush() throws IOException {
- while (bufPos > 0)
- writeCode(NOP);
+ while (bufPos > 0)
+ writeCode(NOP);
}
private void writeCode(int c) throws IOException {
- buf[bufPos++] = c;
- if (bufPos == 5) { // write next word when we have 5 codes
- int pack = (buf[0] << 24) | (buf[1] << 18) | (buf[2] << 12) |
- (buf[3] << 6) | buf[4];
- out.write((pack >>> 24) & 0xFF);
- out.write((pack >>> 16) & 0xFF);
- out.write((pack >>> 8) & 0xFF);
- out.write((pack >>> 0) & 0xFF);
- bufPos = 0;
- }
+ buf[bufPos++] = c;
+ if (bufPos == 5) { // write next word when we have 5 codes
+ int pack = (buf[0] << 24) | (buf[1] << 18) | (buf[2] << 12) |
+ (buf[3] << 6) | buf[4];
+ out.write((pack >>> 24) & 0xFF);
+ out.write((pack >>> 16) & 0xFF);
+ out.write((pack >>> 8) & 0xFF);
+ out.write((pack >>> 0) & 0xFF);
+ bufPos = 0;
+ }
}
}
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/unicast/Echo.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/unicast/Echo.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/unicast/EchoImpl.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/unicast/EchoImpl.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -33,44 +33,44 @@
private static final byte[] pattern = { (byte) 'A' };
public EchoImpl(String protocol) throws RemoteException {
- super(0,
- new MultiSocketFactory.ClientFactory(protocol, pattern),
- new MultiSocketFactory.ServerFactory(protocol, pattern));
+ super(0,
+ new MultiSocketFactory.ClientFactory(protocol, pattern),
+ new MultiSocketFactory.ServerFactory(protocol, pattern));
}
-
+
public byte[] echoNot(byte[] data) {
- byte[] result = new byte[data.length];
- for (int i = 0; i < data.length; i++)
- result[i] = (byte) ~data[i];
- return result;
+ byte[] result = new byte[data.length];
+ for (int i = 0; i < data.length; i++)
+ result[i] = (byte) ~data[i];
+ return result;
}
public static void main(String[] args) {
- /*
- * The following line is required with the JDK 1.2 VM so that the
- * VM can exit gracefully when this test completes. Otherwise, the
- * conservative garbage collector will find a handle to the server
- * object on the native stack and not clear the weak reference to
- * it in the RMI runtime's object table.
- */
- Object dummy = new Object();
-
- TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
-
- try {
- String protocol = "";
- if (args.length >= 1)
- protocol = args[0];
+ /*
+ * The following line is required with the JDK 1.2 VM so that the
+ * VM can exit gracefully when this test completes. Otherwise, the
+ * conservative garbage collector will find a handle to the server
+ * object on the native stack and not clear the weak reference to
+ * it in the RMI runtime's object table.
+ */
+ Object dummy = new Object();
+
+ TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
- System.out.println("EchoServer: creating remote object");
- EchoImpl impl = new EchoImpl(protocol);
- System.out.println("EchoServer: binding in registry");
- Naming.rebind("//:" + TestLibrary.REGISTRY_PORT +
- "/EchoServer", impl);
- System.out.println("EchoServer ready.");
- } catch (Exception e) {
- System.err.println("EXCEPTION OCCURRED:");
- e.printStackTrace();
- }
+ try {
+ String protocol = "";
+ if (args.length >= 1)
+ protocol = args[0];
+
+ System.out.println("EchoServer: creating remote object");
+ EchoImpl impl = new EchoImpl(protocol);
+ System.out.println("EchoServer: binding in registry");
+ Naming.rebind("//:" + TestLibrary.REGISTRY_PORT +
+ "/EchoServer", impl);
+ System.out.println("EchoServer ready.");
+ } catch (Exception e) {
+ System.err.println("EXCEPTION OCCURRED:");
+ e.printStackTrace();
+ }
}
}
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/unicast/EchoImpl_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/unicast/EchoImpl_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,38 +29,38 @@
implements Echo, java.rmi.Remote
{
private static final long serialVersionUID = 2;
-
+
private static java.lang.reflect.Method $method_echoNot_0;
-
+
static {
- try {
- $method_echoNot_0 = Echo.class.getMethod("echoNot", new java.lang.Class[] {byte[].class});
- } catch (java.lang.NoSuchMethodException e) {
- throw new java.lang.NoSuchMethodError(
- "stub class initialization failed");
- }
+ try {
+ $method_echoNot_0 = Echo.class.getMethod("echoNot", new java.lang.Class[] {byte[].class});
+ } catch (java.lang.NoSuchMethodException e) {
+ throw new java.lang.NoSuchMethodError(
+ "stub class initialization failed");
+ }
}
-
+
// constructors
public EchoImpl_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of echoNot(byte[])
public byte[] echoNot(byte[] $param_arrayOf_byte_1)
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- Object $result = ref.invoke(this, $method_echoNot_0, new java.lang.Object[] {$param_arrayOf_byte_1}, -4295721514897591756L);
- return ((byte[]) $result);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ Object $result = ref.invoke(this, $method_echoNot_0, new java.lang.Object[] {$param_arrayOf_byte_1}, -4295721514897591756L);
+ return ((byte[]) $result);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/unicast/MultiSocketFactory.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/unicast/MultiSocketFactory.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -34,194 +34,193 @@
public class MultiSocketFactory {
private static RMISocketFactory def =
- RMISocketFactory.getDefaultSocketFactory();
+ RMISocketFactory.getDefaultSocketFactory();
+
-
public static class ServerFactory
- implements RMIServerSocketFactory, Serializable
+ implements RMIServerSocketFactory, Serializable
{
- private String protocol;
- private byte[] data;
+ private String protocol;
+ private byte[] data;
- public ServerFactory(String protocol, byte[] data) {
- this.protocol = protocol;
- this.data = data;
- }
+ public ServerFactory(String protocol, byte[] data) {
+ this.protocol = protocol;
+ this.data = data;
+ }
- public ServerSocket createServerSocket(int port) throws IOException
- {
- if (protocol.equals("compress")) {
- return new CompressServerSocket(port);
-
- } else if (protocol.equals("xor")) {
- if (data == null || data.length != 1)
- throw new IOException("invalid argument for XOR protocol");
- return new XorServerSocket(port, data[0]);
+ public ServerSocket createServerSocket(int port) throws IOException
+ {
+ if (protocol.equals("compress")) {
+ return new CompressServerSocket(port);
- }
-
- return def.createServerSocket(port);
- }
+ } else if (protocol.equals("xor")) {
+ if (data == null || data.length != 1)
+ throw new IOException("invalid argument for XOR protocol");
+ return new XorServerSocket(port, data[0]);
+
+ }
+
+ return def.createServerSocket(port);
+ }
}
public static class ClientFactory
- implements RMIClientSocketFactory, Serializable
+ implements RMIClientSocketFactory, Serializable
{
- private String protocol;
- private byte[] data;
+ private String protocol;
+ private byte[] data;
+
+ public ClientFactory(String protocol, byte[] data) {
+ this.protocol = protocol;
+ this.data = data;
+ }
- public ClientFactory(String protocol, byte[] data) {
- this.protocol = protocol;
- this.data = data;
- }
-
- public Socket createSocket(String host, int port)
- throws IOException
- {
- if (protocol.equals("compress")) {
- return new CompressSocket(host, port);
-
- } else if (protocol.equals("xor")) {
- if (data == null || data.length != 1)
- throw new IOException("invalid argument for XOR protocol");
- return new XorSocket(host, port, data[0]);
+ public Socket createSocket(String host, int port)
+ throws IOException
+ {
+ if (protocol.equals("compress")) {
+ return new CompressSocket(host, port);
- }
+ } else if (protocol.equals("xor")) {
+ if (data == null || data.length != 1)
+ throw new IOException("invalid argument for XOR protocol");
+ return new XorSocket(host, port, data[0]);
- return def.createSocket(host, port);
- }
+ }
+
+ return def.createSocket(host, port);
+ }
}
static class CompressSocket extends Socket {
- private InputStream in;
- private OutputStream out;
- public CompressSocket() { super(); }
- public CompressSocket(String host, int port) throws IOException {
- super(host, port);
- }
- public InputStream getInputStream() throws IOException {
- if (in == null) {
- in = new CompressInputStream(super.getInputStream());
- }
- return in;
+ private InputStream in;
+ private OutputStream out;
+ public CompressSocket() { super(); }
+ public CompressSocket(String host, int port) throws IOException {
+ super(host, port);
}
- public OutputStream getOutputStream() throws IOException {
- if (out == null) {
- out = new CompressOutputStream(super.getOutputStream());
- }
- return out;
- }
+ public InputStream getInputStream() throws IOException {
+ if (in == null) {
+ in = new CompressInputStream(super.getInputStream());
+ }
+ return in;
+ }
+ public OutputStream getOutputStream() throws IOException {
+ if (out == null) {
+ out = new CompressOutputStream(super.getOutputStream());
+ }
+ return out;
+ }
}
static class CompressServerSocket extends ServerSocket {
- public CompressServerSocket(int port) throws IOException {
- super(port);
- }
- public Socket accept() throws IOException {
- Socket s = new CompressSocket();
- implAccept(s);
- return s;
- }
+ public CompressServerSocket(int port) throws IOException {
+ super(port);
+ }
+ public Socket accept() throws IOException {
+ Socket s = new CompressSocket();
+ implAccept(s);
+ return s;
+ }
}
static class XorSocket extends Socket {
- private byte pattern;
- private InputStream in;
- private OutputStream out;
- public XorSocket(byte pattern) { super(); this.pattern = pattern; }
- public XorSocket(String host, int port, byte pattern)
- throws IOException
- {
- super(host, port);
- this.pattern = pattern;
- }
- public InputStream getInputStream() throws IOException {
- if (in == null) {
- in = new XorInputStream(super.getInputStream(), pattern);
- }
- return in;
+ private byte pattern;
+ private InputStream in;
+ private OutputStream out;
+ public XorSocket(byte pattern) { super(); this.pattern = pattern; }
+ public XorSocket(String host, int port, byte pattern)
+ throws IOException
+ {
+ super(host, port);
+ this.pattern = pattern;
}
- public OutputStream getOutputStream() throws IOException {
- if (out == null) {
- out = new XorOutputStream(super.getOutputStream(), pattern);
- }
- return out;
- }
+ public InputStream getInputStream() throws IOException {
+ if (in == null) {
+ in = new XorInputStream(super.getInputStream(), pattern);
+ }
+ return in;
+ }
+ public OutputStream getOutputStream() throws IOException {
+ if (out == null) {
+ out = new XorOutputStream(super.getOutputStream(), pattern);
+ }
+ return out;
+ }
}
static class XorServerSocket extends ServerSocket {
- private byte pattern;
- public XorServerSocket(int port, byte pattern) throws IOException {
- super(port);
- this.pattern = pattern;
- }
- public Socket accept() throws IOException {
- Socket s = new XorSocket(pattern);
- implAccept(s);
- return s;
- }
+ private byte pattern;
+ public XorServerSocket(int port, byte pattern) throws IOException {
+ super(port);
+ this.pattern = pattern;
+ }
+ public Socket accept() throws IOException {
+ Socket s = new XorSocket(pattern);
+ implAccept(s);
+ return s;
+ }
}
static class XorOutputStream extends FilterOutputStream {
- private byte pattern;
- public XorOutputStream(OutputStream out, byte pattern) {
- super(out);
- this.pattern = pattern;
- }
- public void write(int b) throws IOException {
- out.write(b ^ pattern);
- out.flush();
- }
- public void write(byte b[], int off, int len) throws IOException {
- for (int i = 0; i < len; i++)
- write(b[off + i]);
- }
+ private byte pattern;
+ public XorOutputStream(OutputStream out, byte pattern) {
+ super(out);
+ this.pattern = pattern;
+ }
+ public void write(int b) throws IOException {
+ out.write(b ^ pattern);
+ out.flush();
+ }
+ public void write(byte b[], int off, int len) throws IOException {
+ for (int i = 0; i < len; i++)
+ write(b[off + i]);
+ }
}
static class XorInputStream extends FilterInputStream {
- private byte pattern;
- public XorInputStream(InputStream in, byte pattern) {
- super(in);
- this.pattern = pattern;
- }
- public int read() throws IOException {
- int b = in.read();
-// System.out.print("BEFORE: " + Integer.toHexString(b));
- if (b != -1)
- b = (b ^ pattern) & 0xFF;
-// System.out.println("\tAFTER: " + Integer.toHexString(b));
- return b;
- }
- public int read(byte b[], int off, int len) throws IOException {
- if (len <= 0) {
- return 0;
- }
+ private byte pattern;
+ public XorInputStream(InputStream in, byte pattern) {
+ super(in);
+ this.pattern = pattern;
+ }
+ public int read() throws IOException {
+ int b = in.read();
+// System.out.print("BEFORE: " + Integer.toHexString(b));
+ if (b != -1)
+ b = (b ^ pattern) & 0xFF;
+// System.out.println("\tAFTER: " + Integer.toHexString(b));
+ return b;
+ }
+ public int read(byte b[], int off, int len) throws IOException {
+ if (len <= 0) {
+ return 0;
+ }
- int c = read();
- if (c == -1) {
- return -1;
- }
- b[off] = (byte)c;
+ int c = read();
+ if (c == -1) {
+ return -1;
+ }
+ b[off] = (byte)c;
- int i = 1;
+ int i = 1;
/*****
- try {
- for (; i < len ; i++) {
- c = read();
- if (c == -1) {
- break;
- }
- if (b != null) {
- b[off + i] = (byte)c;
- }
- }
- } catch (IOException ee) {
- }
+ try {
+ for (; i < len ; i++) {
+ c = read();
+ if (c == -1) {
+ break;
+ }
+ if (b != null) {
+ b[off + i] = (byte)c;
+ }
+ }
+ } catch (IOException ee) {
+ }
*****/
- return i;
- }
+ return i;
+ }
}
}
-
--- a/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/unicast/UseCustomSocketFactory.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RMISocketFactory/useSocketFactory/unicast/UseCustomSocketFactory.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -25,7 +25,7 @@
* @bug 4127826
*
* @summary synopsis: need to download factories for use with custom socket
- * types
+ * types
* @author Ann Wollrath
*
* @library ../../../../testlibrary
@@ -45,77 +45,77 @@
public class UseCustomSocketFactory {
public static void main(String[] args) {
-
- String[] protocol = new String[] { "", "compress", "xor" };
+
+ String[] protocol = new String[] { "", "compress", "xor" };
+
+ System.out.println("\nRegression test for bug 4127826\n");
- System.out.println("\nRegression test for bug 4127826\n");
-
- TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
+ TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
- try {
- LocateRegistry.createRegistry(TestLibrary.REGISTRY_PORT);
- } catch (Exception e) {
- TestLibrary.bomb("creating registry", e);
- }
+ try {
+ LocateRegistry.createRegistry(TestLibrary.REGISTRY_PORT);
+ } catch (Exception e) {
+ TestLibrary.bomb("creating registry", e);
+ }
- for (int i = 0; i < protocol.length; i++) {
+ for (int i = 0; i < protocol.length; i++) {
- System.err.println("test policy: " +
- TestParams.defaultPolicy);
+ System.err.println("test policy: " +
+ TestParams.defaultPolicy);
- JavaVM serverVM = new JavaVM("EchoImpl",
- "-Djava.security.policy=" +
- TestParams.defaultPolicy,
- protocol[i]);
- System.err.println("\nusing protocol: " +
- (protocol[i] == "" ? "none" : protocol[i]));
-
- try {
- /* spawn VM for EchoServer */
- serverVM.start();
+ JavaVM serverVM = new JavaVM("EchoImpl",
+ "-Djava.security.policy=" +
+ TestParams.defaultPolicy,
+ protocol[i]);
+ System.err.println("\nusing protocol: " +
+ (protocol[i] == "" ? "none" : protocol[i]));
+
+ try {
+ /* spawn VM for EchoServer */
+ serverVM.start();
- /* lookup server */
- int tries = 8;
- Echo obj = null;
- do {
- try {
- obj = (Echo) Naming.lookup("//:" + TestLibrary.REGISTRY_PORT +
- "/EchoServer");
- break;
- } catch (NotBoundException e) {
- try {
- Thread.sleep(2000);
- } catch (Exception ignore) {
- }
- continue;
- }
- } while (--tries > 0);
+ /* lookup server */
+ int tries = 8;
+ Echo obj = null;
+ do {
+ try {
+ obj = (Echo) Naming.lookup("//:" + TestLibrary.REGISTRY_PORT +
+ "/EchoServer");
+ break;
+ } catch (NotBoundException e) {
+ try {
+ Thread.sleep(2000);
+ } catch (Exception ignore) {
+ }
+ continue;
+ }
+ } while (--tries > 0);
- if (obj == null)
- TestLibrary.bomb("server not bound in 8 tries", null);
+ if (obj == null)
+ TestLibrary.bomb("server not bound in 8 tries", null);
- /* invoke remote method and print result*/
- System.err.println("Bound to " + obj);
- byte[] data = ("Greetings, citizen " +
- System.getProperty("user.name") + "!"). getBytes();
- byte[] result = obj.echoNot(data);
- for (int j = 0; j < result.length; j++)
- result[j] = (byte) ~result[j];
- System.err.println("Result: " + new String(result));
-
- } catch (Exception e) {
- TestLibrary.bomb("test failed", e);
-
- } finally {
- serverVM.destroy();
- try {
- Naming.unbind("//:" + TestLibrary.REGISTRY_PORT +
- "/EchoServer");
- } catch (Exception e) {
- TestLibrary.bomb("unbinding EchoServer", e);
-
- }
- }
- }
+ /* invoke remote method and print result*/
+ System.err.println("Bound to " + obj);
+ byte[] data = ("Greetings, citizen " +
+ System.getProperty("user.name") + "!"). getBytes();
+ byte[] result = obj.echoNot(data);
+ for (int j = 0; j < result.length; j++)
+ result[j] = (byte) ~result[j];
+ System.err.println("Result: " + new String(result));
+
+ } catch (Exception e) {
+ TestLibrary.bomb("test failed", e);
+
+ } finally {
+ serverVM.destroy();
+ try {
+ Naming.unbind("//:" + TestLibrary.REGISTRY_PORT +
+ "/EchoServer");
+ } catch (Exception e) {
+ TestLibrary.bomb("unbinding EchoServer", e);
+
+ }
+ }
+ }
}
}
--- a/jdk/test/java/rmi/server/RemoteServer/setLogPermission/SetLogPermission.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/RemoteServer/setLogPermission/SetLogPermission.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2002-2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -25,7 +25,7 @@
* @bug 4533390
* @summary SecurityException can be obtained but is not specified.
* The RemoteServer.setLog method requires
- * java.util.log.LoggingPermission("control").
+ * java.util.log.LoggingPermission("control").
* @author Ann Wollrath
* @run main/othervm/policy=java.policy SetLogPermission
*/
@@ -40,42 +40,42 @@
public static void main(String[] args) throws Exception {
- System.err.println("\nRegression test for bug 4533390\n");
+ System.err.println("\nRegression test for bug 4533390\n");
+
+ if (System.getSecurityManager() == null) {
+ System.setSecurityManager(new SecurityManager());
+ }
+
+ CodeSource codesource = new CodeSource(null, (Certificate[]) null);
+ Permissions perms = null;
+ ProtectionDomain pd = new ProtectionDomain(codesource, perms);
+ AccessControlContext acc =
+ new AccessControlContext(new ProtectionDomain[] { pd });
- if (System.getSecurityManager() == null) {
- System.setSecurityManager(new SecurityManager());
- }
-
- CodeSource codesource = new CodeSource(null, (Certificate[]) null);
- Permissions perms = null;
- ProtectionDomain pd = new ProtectionDomain(codesource, perms);
- AccessControlContext acc =
- new AccessControlContext(new ProtectionDomain[] { pd });
-
- java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction() {
- public Object run() {
- try {
- System.err.println(
- "Attempt to set log without permission");
- RemoteServer.setLog(new ByteArrayOutputStream());
- throw new RuntimeException(
- "TEST FAILED: set log without permission");
- } catch (SecurityException e) {
- System.err.println(
- "TEST PASSED: unable to set log without permission");
- }
- return null;
- }}, acc);
+ java.security.AccessController.doPrivileged(
+ new java.security.PrivilegedAction() {
+ public Object run() {
+ try {
+ System.err.println(
+ "Attempt to set log without permission");
+ RemoteServer.setLog(new ByteArrayOutputStream());
+ throw new RuntimeException(
+ "TEST FAILED: set log without permission");
+ } catch (SecurityException e) {
+ System.err.println(
+ "TEST PASSED: unable to set log without permission");
+ }
+ return null;
+ }}, acc);
- try {
- System.err.println("Attempt to set log with permission");
- RemoteServer.setLog(new ByteArrayOutputStream());
- System.err.println(
- "TEST PASSED: sufficient permission to set log");
- } catch (SecurityException e) {
- System.err.println("TEST FAILED: unable to set log");
- throw e;
- }
+ try {
+ System.err.println("Attempt to set log with permission");
+ RemoteServer.setLog(new ByteArrayOutputStream());
+ System.err.println(
+ "TEST PASSED: sufficient permission to set log");
+ } catch (SecurityException e) {
+ System.err.println("TEST FAILED: unable to set log");
+ throw e;
+ }
}
}
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/changeHostName/ChangeHostName.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/changeHostName/ChangeHostName.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -50,40 +50,40 @@
}
public void receive(Remote obj) {
- System.err.println("received: " + obj.toString());
+ System.err.println("received: " + obj.toString());
}
public static void main(String[] args) throws Exception {
- InetAddress localAddress = InetAddress.getLocalHost();
- String[] hostlist = new String[] {
- localAddress.getHostAddress(), localAddress.getHostName() };
+ InetAddress localAddress = InetAddress.getLocalHost();
+ String[] hostlist = new String[] {
+ localAddress.getHostAddress(), localAddress.getHostName() };
+
+ for (int i = 0; i < hostlist.length; i++) {
- for (int i = 0; i < hostlist.length; i++) {
-
- System.setProperty("java.rmi.server.hostname", hostlist[i]);
- Remote impl = new ChangeHostName();
- System.err.println("\ncreated impl extending URO: " + impl);
-
- Receiver stub = (Receiver) RemoteObject.toStub(impl);
- System.err.println("stub for impl: " + stub);
+ System.setProperty("java.rmi.server.hostname", hostlist[i]);
+ Remote impl = new ChangeHostName();
+ System.err.println("\ncreated impl extending URO: " + impl);
+
+ Receiver stub = (Receiver) RemoteObject.toStub(impl);
+ System.err.println("stub for impl: " + stub);
- System.err.println("invoking method on stub");
- stub.receive(stub);
+ System.err.println("invoking method on stub");
+ stub.receive(stub);
- UnicastRemoteObject.unexportObject(impl, true);
- System.err.println("unexported impl");
+ UnicastRemoteObject.unexportObject(impl, true);
+ System.err.println("unexported impl");
- if (stub.toString().indexOf(hostlist[i]) >= 0) {
- System.err.println("stub's ref contains hostname: " +
- hostlist[i]);
- } else {
- throw new RuntimeException(
- "TEST FAILED: stub's ref doesn't contain hostname: " +
- hostlist[i]);
- }
- }
- System.err.println("TEST PASSED");
+ if (stub.toString().indexOf(hostlist[i]) >= 0) {
+ System.err.println("stub's ref contains hostname: " +
+ hostlist[i]);
+ } else {
+ throw new RuntimeException(
+ "TEST FAILED: stub's ref doesn't contain hostname: " +
+ hostlist[i]);
+ }
+ }
+ System.err.println("TEST PASSED");
}
}
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/changeHostName/ChangeHostName_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/changeHostName/ChangeHostName_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,37 +29,37 @@
implements Receiver, java.rmi.Remote
{
private static final long serialVersionUID = 2;
-
+
private static java.lang.reflect.Method $method_receive_0;
-
+
static {
- try {
- $method_receive_0 = Receiver.class.getMethod("receive", new java.lang.Class[] {java.rmi.Remote.class});
- } catch (java.lang.NoSuchMethodException e) {
- throw new java.lang.NoSuchMethodError(
- "stub class initialization failed");
- }
+ try {
+ $method_receive_0 = Receiver.class.getMethod("receive", new java.lang.Class[] {java.rmi.Remote.class});
+ } catch (java.lang.NoSuchMethodException e) {
+ throw new java.lang.NoSuchMethodError(
+ "stub class initialization failed");
+ }
}
-
+
// constructors
public ChangeHostName_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of receive(Remote)
public void receive(java.rmi.Remote $param_Remote_1)
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- ref.invoke(this, $method_receive_0, new java.lang.Object[] {$param_Remote_1}, 5876293363550629411L);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ ref.invoke(this, $method_receive_0, new java.lang.Object[] {$param_Remote_1}, 5876293363550629411L);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/keepAliveDuringCall/KeepAliveDuringCall.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/keepAliveDuringCall/KeepAliveDuringCall.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -59,83 +59,83 @@
private boolean stillAlive = false;
public void submitShutdown(Shutdown shutdown) {
- synchronized (lock) {
- this.shutdown = shutdown;
- lock.notifyAll();
- }
+ synchronized (lock) {
+ this.shutdown = shutdown;
+ lock.notifyAll();
+ }
}
public void declareStillAlive() {
- synchronized (lock) {
- stillAlive = true;
- lock.notifyAll();
- }
+ synchronized (lock) {
+ stillAlive = true;
+ lock.notifyAll();
+ }
}
public static void main(String[] args) {
- System.err.println("\nRegression test for bug 4308492\n");
+ System.err.println("\nRegression test for bug 4308492\n");
- KeepAliveDuringCall obj = new KeepAliveDuringCall();
+ KeepAliveDuringCall obj = new KeepAliveDuringCall();
- try {
- UnicastRemoteObject.exportObject(obj);
- System.err.println("exported shutdown monitor");
+ try {
+ UnicastRemoteObject.exportObject(obj);
+ System.err.println("exported shutdown monitor");
- Registry localRegistry =
- LocateRegistry.createRegistry(TestLibrary.REGISTRY_PORT);
- System.err.println("created local registry");
+ Registry localRegistry =
+ LocateRegistry.createRegistry(TestLibrary.REGISTRY_PORT);
+ System.err.println("created local registry");
- localRegistry.bind(BINDING, obj);
- System.err.println("bound shutdown monitor in local registry");
+ localRegistry.bind(BINDING, obj);
+ System.err.println("bound shutdown monitor in local registry");
- System.err.println("starting remote ShutdownImpl VM...");
- (new JavaVM("ShutdownImpl")).start();
+ System.err.println("starting remote ShutdownImpl VM...");
+ (new JavaVM("ShutdownImpl")).start();
- Shutdown s;
- synchronized (obj.lock) {
- System.err.println(
- "waiting for submission of object to shutdown...");
- while ((s = obj.shutdown) == null) {
- obj.lock.wait(TIMEOUT);
- }
- if (s == null) {
- throw new RuntimeException(
- "TEST FAILED: timeout waiting for shutdown object " +
- "to make initial contact");
- }
- System.err.println("shutdown object submitted: " + s);
- }
+ Shutdown s;
+ synchronized (obj.lock) {
+ System.err.println(
+ "waiting for submission of object to shutdown...");
+ while ((s = obj.shutdown) == null) {
+ obj.lock.wait(TIMEOUT);
+ }
+ if (s == null) {
+ throw new RuntimeException(
+ "TEST FAILED: timeout waiting for shutdown object " +
+ "to make initial contact");
+ }
+ System.err.println("shutdown object submitted: " + s);
+ }
- try {
- s.shutdown();
- } catch (RemoteException e) {
- throw new RuntimeException(
- "TEST FAILED: shutdown method threw remote exception", e);
- }
+ try {
+ s.shutdown();
+ } catch (RemoteException e) {
+ throw new RuntimeException(
+ "TEST FAILED: shutdown method threw remote exception", e);
+ }
- synchronized (obj.lock) {
- if (!obj.stillAlive) {
- throw new RuntimeException("TEST FAILED: " +
- "shutdown object not detected alive after unexport");
- }
- }
+ synchronized (obj.lock) {
+ if (!obj.stillAlive) {
+ throw new RuntimeException("TEST FAILED: " +
+ "shutdown object not detected alive after unexport");
+ }
+ }
- System.err.println("TEST PASSED: " +
- "shutdown object detected still alive after unexport");
+ System.err.println("TEST PASSED: " +
+ "shutdown object detected still alive after unexport");
- } catch (Exception e) {
- if (e instanceof RuntimeException) {
- throw (RuntimeException) e;
- } else {
- throw new RuntimeException(
- "TEST FAILED: unexpected exception", e);
- }
- } finally {
- try {
- UnicastRemoteObject.unexportObject(obj, true);
- } catch (RemoteException e) {
- }
- }
+ } catch (Exception e) {
+ if (e instanceof RuntimeException) {
+ throw (RuntimeException) e;
+ } else {
+ throw new RuntimeException(
+ "TEST FAILED: unexpected exception", e);
+ }
+ } finally {
+ try {
+ UnicastRemoteObject.unexportObject(obj, true);
+ } catch (RemoteException e) {
+ }
+ }
}
}
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/keepAliveDuringCall/KeepAliveDuringCall_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/keepAliveDuringCall/KeepAliveDuringCall_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,54 +29,54 @@
implements ShutdownMonitor
{
private static final long serialVersionUID = 2;
-
+
private static java.lang.reflect.Method $method_declareStillAlive_0;
private static java.lang.reflect.Method $method_submitShutdown_1;
-
+
static {
- try {
- $method_declareStillAlive_0 = ShutdownMonitor.class.getMethod("declareStillAlive", new java.lang.Class[] {});
- $method_submitShutdown_1 = ShutdownMonitor.class.getMethod("submitShutdown", new java.lang.Class[] {Shutdown.class});
- } catch (java.lang.NoSuchMethodException e) {
- throw new java.lang.NoSuchMethodError(
- "stub class initialization failed");
- }
+ try {
+ $method_declareStillAlive_0 = ShutdownMonitor.class.getMethod("declareStillAlive", new java.lang.Class[] {});
+ $method_submitShutdown_1 = ShutdownMonitor.class.getMethod("submitShutdown", new java.lang.Class[] {Shutdown.class});
+ } catch (java.lang.NoSuchMethodException e) {
+ throw new java.lang.NoSuchMethodError(
+ "stub class initialization failed");
+ }
}
-
+
// constructors
public KeepAliveDuringCall_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of declareStillAlive()
public void declareStillAlive()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- ref.invoke(this, $method_declareStillAlive_0, null, -1562228924246272634L);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ ref.invoke(this, $method_declareStillAlive_0, null, -1562228924246272634L);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of submitShutdown(Shutdown)
public void submitShutdown(Shutdown $param_Shutdown_1)
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- ref.invoke(this, $method_submitShutdown_1, new java.lang.Object[] {$param_Shutdown_1}, 7574258166120515108L);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ ref.invoke(this, $method_submitShutdown_1, new java.lang.Object[] {$param_Shutdown_1}, 7574258166120515108L);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/keepAliveDuringCall/Shutdown.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/keepAliveDuringCall/Shutdown.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/keepAliveDuringCall/ShutdownImpl.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/keepAliveDuringCall/ShutdownImpl.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -32,58 +32,58 @@
public class ShutdownImpl implements Shutdown {
- private static Remote impl; // rooted here to prevent GC
+ private static Remote impl; // rooted here to prevent GC
private final ShutdownMonitor monitor;
private ShutdownImpl(ShutdownMonitor monitor) {
- this.monitor = monitor;
+ this.monitor = monitor;
}
public void shutdown() {
- try {
- System.err.println(
- "(ShutdownImpl.shutdown) shutdown method invoked:");
+ try {
+ System.err.println(
+ "(ShutdownImpl.shutdown) shutdown method invoked:");
- UnicastRemoteObject.unexportObject(this, true);
- System.err.println(
- "(ShutdownImpl.shutdown) shutdown object unexported");
+ UnicastRemoteObject.unexportObject(this, true);
+ System.err.println(
+ "(ShutdownImpl.shutdown) shutdown object unexported");
- Thread.sleep(500);
- System.err.println("(ShutDownImpl.shutdown) FEE");
- Thread.sleep(500);
- System.err.println("(ShutDownImpl.shutdown) FIE");
- Thread.sleep(500);
- System.err.println("(ShutDownImpl.shutdown) FOE");
- Thread.sleep(500);
- System.err.println("(ShutDownImpl.shutdown) FOO");
+ Thread.sleep(500);
+ System.err.println("(ShutDownImpl.shutdown) FEE");
+ Thread.sleep(500);
+ System.err.println("(ShutDownImpl.shutdown) FIE");
+ Thread.sleep(500);
+ System.err.println("(ShutDownImpl.shutdown) FOE");
+ Thread.sleep(500);
+ System.err.println("(ShutDownImpl.shutdown) FOO");
- monitor.declareStillAlive();
- System.err.println("(ShutDownImpl.shutdown) still alive!");
- } catch (Exception e) {
- throw new RuntimeException(
- "unexpected exception occurred in shutdown method", e);
- }
+ monitor.declareStillAlive();
+ System.err.println("(ShutDownImpl.shutdown) still alive!");
+ } catch (Exception e) {
+ throw new RuntimeException(
+ "unexpected exception occurred in shutdown method", e);
+ }
}
public static void main(String[] args) {
- try {
- Registry registry =
- LocateRegistry.getRegistry("", TestLibrary.REGISTRY_PORT);
- ShutdownMonitor monitor = (ShutdownMonitor)
- registry.lookup(KeepAliveDuringCall.BINDING);
- System.err.println("(ShutdownImpl) retrieved shutdown monitor");
+ try {
+ Registry registry =
+ LocateRegistry.getRegistry("", TestLibrary.REGISTRY_PORT);
+ ShutdownMonitor monitor = (ShutdownMonitor)
+ registry.lookup(KeepAliveDuringCall.BINDING);
+ System.err.println("(ShutdownImpl) retrieved shutdown monitor");
- impl = new ShutdownImpl(monitor);
- Shutdown stub = (Shutdown) UnicastRemoteObject.exportObject(impl);
- System.err.println("(ShutdownImpl) exported shutdown object");
+ impl = new ShutdownImpl(monitor);
+ Shutdown stub = (Shutdown) UnicastRemoteObject.exportObject(impl);
+ System.err.println("(ShutdownImpl) exported shutdown object");
- monitor.submitShutdown(stub);
- System.err.println("(ShutdownImpl) submitted shutdown object");
+ monitor.submitShutdown(stub);
+ System.err.println("(ShutdownImpl) submitted shutdown object");
- } catch (Exception e) {
- System.err.println("(ShutdownImpl) TEST SUBPROCESS FAILURE:");
- e.printStackTrace();
- }
+ } catch (Exception e) {
+ System.err.println("(ShutdownImpl) TEST SUBPROCESS FAILURE:");
+ e.printStackTrace();
+ }
}
}
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/keepAliveDuringCall/ShutdownImpl_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/keepAliveDuringCall/ShutdownImpl_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,37 +29,37 @@
implements Shutdown
{
private static final long serialVersionUID = 2;
-
+
private static java.lang.reflect.Method $method_shutdown_0;
-
+
static {
- try {
- $method_shutdown_0 = Shutdown.class.getMethod("shutdown", new java.lang.Class[] {});
- } catch (java.lang.NoSuchMethodException e) {
- throw new java.lang.NoSuchMethodError(
- "stub class initialization failed");
- }
+ try {
+ $method_shutdown_0 = Shutdown.class.getMethod("shutdown", new java.lang.Class[] {});
+ } catch (java.lang.NoSuchMethodException e) {
+ throw new java.lang.NoSuchMethodError(
+ "stub class initialization failed");
+ }
}
-
+
// constructors
public ShutdownImpl_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of shutdown()
public void shutdown()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- ref.invoke(this, $method_shutdown_0, null, -7207851917985848402L);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ ref.invoke(this, $method_shutdown_0, null, -7207851917985848402L);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/keepAliveDuringCall/ShutdownMonitor.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/keepAliveDuringCall/ShutdownMonitor.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/marshalAfterUnexport/MarshalAfterUnexport.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/marshalAfterUnexport/MarshalAfterUnexport.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -53,35 +53,35 @@
}
public static void main(String[] args) throws Exception {
- Remote impl2 = null;
- try {
- Remote impl = new MarshalAfterUnexport();
- System.err.println("created impl extending URO: " + impl);
+ Remote impl2 = null;
+ try {
+ Remote impl = new MarshalAfterUnexport();
+ System.err.println("created impl extending URO: " + impl);
- Receiver stub = (Receiver) RemoteObject.toStub(impl);
- System.err.println("stub for impl: " + stub);
+ Receiver stub = (Receiver) RemoteObject.toStub(impl);
+ System.err.println("stub for impl: " + stub);
- UnicastRemoteObject.unexportObject(impl, true);
- System.err.println("unexported impl");
+ UnicastRemoteObject.unexportObject(impl, true);
+ System.err.println("unexported impl");
- impl2 = new MarshalAfterUnexport();
- Receiver stub2 = (Receiver) RemoteObject.toStub(impl2);
+ impl2 = new MarshalAfterUnexport();
+ Receiver stub2 = (Receiver) RemoteObject.toStub(impl2);
- System.err.println("marshalling unexported object:");
- MarshalledObject mobj = new MarshalledObject(impl);
+ System.err.println("marshalling unexported object:");
+ MarshalledObject mobj = new MarshalledObject(impl);
- System.err.println("passing unexported object via RMI-JRMP:");
- stub2.receive(stub);
+ System.err.println("passing unexported object via RMI-JRMP:");
+ stub2.receive(stub);
- System.err.println("TEST PASSED");
- } finally {
- if (impl2 != null) {
- try {
- UnicastRemoteObject.unexportObject(impl2, true);
- } catch (Throwable t) {
- }
- }
- }
+ System.err.println("TEST PASSED");
+ } finally {
+ if (impl2 != null) {
+ try {
+ UnicastRemoteObject.unexportObject(impl2, true);
+ } catch (Throwable t) {
+ }
+ }
+ }
}
}
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/marshalAfterUnexport/MarshalAfterUnexport2.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/marshalAfterUnexport/MarshalAfterUnexport2.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2002 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -49,47 +49,47 @@
implements Receiver
{
public MarshalAfterUnexport2() throws RemoteException {
- super(0, null, null);
+ super(0, null, null);
}
public void receive(Remote obj) {
}
public static void main(String[] args) throws Exception {
-
- System.err.println("\nRegression test for bug 4513223\n");
-
- Remote impl2 = null;
- try {
- Remote impl = new MarshalAfterUnexport2();
- System.err.println(
- "created impl extending URO (with a UnicastServerRef2): " +
- impl);
+
+ System.err.println("\nRegression test for bug 4513223\n");
- Receiver stub = (Receiver) RemoteObject.toStub(impl);
- System.err.println("stub for impl: " + stub);
+ Remote impl2 = null;
+ try {
+ Remote impl = new MarshalAfterUnexport2();
+ System.err.println(
+ "created impl extending URO (with a UnicastServerRef2): " +
+ impl);
- UnicastRemoteObject.unexportObject(impl, true);
- System.err.println("unexported impl");
+ Receiver stub = (Receiver) RemoteObject.toStub(impl);
+ System.err.println("stub for impl: " + stub);
+
+ UnicastRemoteObject.unexportObject(impl, true);
+ System.err.println("unexported impl");
- impl2 = new MarshalAfterUnexport2();
- Receiver stub2 = (Receiver) RemoteObject.toStub(impl2);
+ impl2 = new MarshalAfterUnexport2();
+ Receiver stub2 = (Receiver) RemoteObject.toStub(impl2);
- System.err.println("marshalling unexported object:");
- MarshalledObject mobj = new MarshalledObject(impl);
+ System.err.println("marshalling unexported object:");
+ MarshalledObject mobj = new MarshalledObject(impl);
- System.err.println("passing unexported object via RMI-JRMP:");
- stub2.receive(stub);
+ System.err.println("passing unexported object via RMI-JRMP:");
+ stub2.receive(stub);
- System.err.println("TEST PASSED");
- } finally {
- if (impl2 != null) {
- try {
- UnicastRemoteObject.unexportObject(impl2, true);
- } catch (Throwable t) {
- }
- }
- }
+ System.err.println("TEST PASSED");
+ } finally {
+ if (impl2 != null) {
+ try {
+ UnicastRemoteObject.unexportObject(impl2, true);
+ } catch (Throwable t) {
+ }
+ }
+ }
}
}
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/marshalAfterUnexport/MarshalAfterUnexport2_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/marshalAfterUnexport/MarshalAfterUnexport2_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2002 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,37 +29,37 @@
implements Receiver, java.rmi.Remote
{
private static final long serialVersionUID = 2;
-
+
private static java.lang.reflect.Method $method_receive_0;
-
+
static {
- try {
- $method_receive_0 = Receiver.class.getMethod("receive", new java.lang.Class[] {java.rmi.Remote.class});
- } catch (java.lang.NoSuchMethodException e) {
- throw new java.lang.NoSuchMethodError(
- "stub class initialization failed");
- }
+ try {
+ $method_receive_0 = Receiver.class.getMethod("receive", new java.lang.Class[] {java.rmi.Remote.class});
+ } catch (java.lang.NoSuchMethodException e) {
+ throw new java.lang.NoSuchMethodError(
+ "stub class initialization failed");
+ }
}
-
+
// constructors
public MarshalAfterUnexport2_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of receive(Remote)
public void receive(java.rmi.Remote $param_Remote_1)
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- ref.invoke(this, $method_receive_0, new java.lang.Object[] {$param_Remote_1}, 5876293363550629411L);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ ref.invoke(this, $method_receive_0, new java.lang.Object[] {$param_Remote_1}, 5876293363550629411L);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/marshalAfterUnexport/MarshalAfterUnexport_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/marshalAfterUnexport/MarshalAfterUnexport_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,37 +29,37 @@
implements Receiver, java.rmi.Remote
{
private static final long serialVersionUID = 2;
-
+
private static java.lang.reflect.Method $method_receive_0;
-
+
static {
- try {
- $method_receive_0 = Receiver.class.getMethod("receive", new java.lang.Class[] {java.rmi.Remote.class});
- } catch (java.lang.NoSuchMethodException e) {
- throw new java.lang.NoSuchMethodError(
- "stub class initialization failed");
- }
+ try {
+ $method_receive_0 = Receiver.class.getMethod("receive", new java.lang.Class[] {java.rmi.Remote.class});
+ } catch (java.lang.NoSuchMethodException e) {
+ throw new java.lang.NoSuchMethodError(
+ "stub class initialization failed");
+ }
}
-
+
// constructors
public MarshalAfterUnexport_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of receive(Remote)
public void receive(java.rmi.Remote $param_Remote_1)
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- ref.invoke(this, $method_receive_0, new java.lang.Object[] {$param_Remote_1}, 5876293363550629411L);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ ref.invoke(this, $method_receive_0, new java.lang.Object[] {$param_Remote_1}, 5876293363550629411L);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/unexportObject/Ping.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/unexportObject/Ping.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -26,4 +26,3 @@
public interface Ping extends Remote {
public void ping() throws RemoteException;
}
-
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/unexportObject/UnexportLeak.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/unexportObject/UnexportLeak.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -24,7 +24,7 @@
/* @test
* @bug 4331349
* @summary synopsis: unexporting doesn't guarantee that DGC will
- * let go of remote object
+ * let go of remote object
*
* @author Ann Wollrath
*
@@ -40,36 +40,36 @@
import java.rmi.registry.*;
public class UnexportLeak implements Ping {
-
+
private static int PORT = 2006;
public void ping() {
}
public static void main(String[] args) {
- try {
- System.err.println("\nRegression test for bug 4331349\n");
- LocateRegistry.createRegistry(PORT);
- Remote obj = new UnexportLeak();
- WeakReference wr = new WeakReference(obj);
- UnicastRemoteObject.exportObject(obj);
- LocateRegistry.getRegistry(PORT).rebind("UnexportLeak", obj);
- UnicastRemoteObject.unexportObject(obj, true);
- obj = null;
- flushRefs();
- if (wr.get() != null) {
- System.err.println("FAILED: unexported object not collected");
- throw new RuntimeException(
- "FAILED: unexported object not collected");
- } else {
- System.err.println("PASSED: unexported object collected");
- }
- } catch (RemoteException e) {
- System.err.println(
- "FAILED: RemoteException encountered: " + e.getMessage());
- e.printStackTrace();
- throw new RuntimeException("FAILED: RemoteException encountered");
- }
+ try {
+ System.err.println("\nRegression test for bug 4331349\n");
+ LocateRegistry.createRegistry(PORT);
+ Remote obj = new UnexportLeak();
+ WeakReference wr = new WeakReference(obj);
+ UnicastRemoteObject.exportObject(obj);
+ LocateRegistry.getRegistry(PORT).rebind("UnexportLeak", obj);
+ UnicastRemoteObject.unexportObject(obj, true);
+ obj = null;
+ flushRefs();
+ if (wr.get() != null) {
+ System.err.println("FAILED: unexported object not collected");
+ throw new RuntimeException(
+ "FAILED: unexported object not collected");
+ } else {
+ System.err.println("PASSED: unexported object collected");
+ }
+ } catch (RemoteException e) {
+ System.err.println(
+ "FAILED: RemoteException encountered: " + e.getMessage());
+ e.printStackTrace();
+ throw new RuntimeException("FAILED: RemoteException encountered");
+ }
}
/**
@@ -77,15 +77,13 @@
* will be cleared.
*/
private static void flushRefs() {
- java.util.Vector chain = new java.util.Vector();
- try {
- while (true) {
- int[] hungry = new int[65536];
- chain.addElement(hungry);
- }
- } catch (OutOfMemoryError e) {
- }
+ java.util.Vector chain = new java.util.Vector();
+ try {
+ while (true) {
+ int[] hungry = new int[65536];
+ chain.addElement(hungry);
+ }
+ } catch (OutOfMemoryError e) {
+ }
}
}
-
-
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/unexportObject/UnexportLeak_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/unexportObject/UnexportLeak_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,37 +29,37 @@
implements Ping
{
private static final long serialVersionUID = 2;
-
+
private static java.lang.reflect.Method $method_ping_0;
-
+
static {
- try {
- $method_ping_0 = Ping.class.getMethod("ping", new java.lang.Class[] {});
- } catch (java.lang.NoSuchMethodException e) {
- throw new java.lang.NoSuchMethodError(
- "stub class initialization failed");
- }
+ try {
+ $method_ping_0 = Ping.class.getMethod("ping", new java.lang.Class[] {});
+ } catch (java.lang.NoSuchMethodException e) {
+ throw new java.lang.NoSuchMethodError(
+ "stub class initialization failed");
+ }
}
-
+
// constructors
public UnexportLeak_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of ping()
public void ping()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- ref.invoke(this, $method_ping_0, null, 5866401369815527589L);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ ref.invoke(this, $method_ping_0, null, 5866401369815527589L);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/useDynamicProxies/UseDynamicProxies.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/useDynamicProxies/UseDynamicProxies.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -43,75 +43,75 @@
public Object passObject(Object obj) {
- return obj;
+ return obj;
}
public int passInt(int x) {
- return x;
+ return x;
}
public String passString(String string) {
- return string;
+ return string;
}
public static void main(String[] args) throws Exception {
-
- RemoteInterface server = null;
- RemoteInterface proxy = null;
-
- try {
- System.setProperty("java.rmi.server.ignoreStubClasses", args[0]);
- boolean ignoreStubClasses = Boolean.parseBoolean(args[0]);
+
+ RemoteInterface server = null;
+ RemoteInterface proxy = null;
+
+ try {
+ System.setProperty("java.rmi.server.ignoreStubClasses", args[0]);
+ boolean ignoreStubClasses = Boolean.parseBoolean(args[0]);
+
+ if (System.getSecurityManager() == null) {
+ System.setSecurityManager(new SecurityManager());
+ }
- if (System.getSecurityManager() == null) {
- System.setSecurityManager(new SecurityManager());
- }
+ System.err.println("export object");
+ server = new UseDynamicProxies();
+ proxy =
+ (RemoteInterface) UnicastRemoteObject.exportObject(server, 0);
- System.err.println("export object");
- server = new UseDynamicProxies();
- proxy =
- (RemoteInterface) UnicastRemoteObject.exportObject(server, 0);
+ System.err.println("proxy = " + proxy);
+ if (ignoreStubClasses) {
+ if (!Proxy.isProxyClass(proxy.getClass())) {
+ throw new RuntimeException(
+ "server proxy is not a dynamic proxy");
+ }
+ if (!(Proxy.getInvocationHandler(proxy) instanceof
+ RemoteObjectInvocationHandler))
+ {
+ throw new RuntimeException("invalid invocation handler");
+ }
- System.err.println("proxy = " + proxy);
- if (ignoreStubClasses) {
- if (!Proxy.isProxyClass(proxy.getClass())) {
- throw new RuntimeException(
- "server proxy is not a dynamic proxy");
- }
- if (!(Proxy.getInvocationHandler(proxy) instanceof
- RemoteObjectInvocationHandler))
- {
- throw new RuntimeException("invalid invocation handler");
- }
-
- } else if (!(proxy instanceof RemoteStub)) {
- throw new RuntimeException(
- "server proxy is not a RemoteStub");
- }
+ } else if (!(proxy instanceof RemoteStub)) {
+ throw new RuntimeException(
+ "server proxy is not a RemoteStub");
+ }
+
+ System.err.println("invoke methods");
+ Object obj = proxy.passObject(proxy);
+ if (!proxy.equals(obj)) {
+ throw new RuntimeException("returned proxy not equal");
+ }
- System.err.println("invoke methods");
- Object obj = proxy.passObject(proxy);
- if (!proxy.equals(obj)) {
- throw new RuntimeException("returned proxy not equal");
- }
-
- int x = proxy.passInt(53);
- if (x != 53) {
- throw new RuntimeException("returned int not equal");
- }
+ int x = proxy.passInt(53);
+ if (x != 53) {
+ throw new RuntimeException("returned int not equal");
+ }
- String string = proxy.passString("test");
- if (!string.equals("test")) {
- throw new RuntimeException("returned string not equal");
- }
-
- System.err.println("TEST PASSED");
-
- } finally {
- if (proxy != null) {
- UnicastRemoteObject.unexportObject(server, true);
- }
- }
+ String string = proxy.passString("test");
+ if (!string.equals("test")) {
+ throw new RuntimeException("returned string not equal");
+ }
+
+ System.err.println("TEST PASSED");
+
+ } finally {
+ if (proxy != null) {
+ UnicastRemoteObject.unexportObject(server, true);
+ }
+ }
}
}
--- a/jdk/test/java/rmi/server/UnicastRemoteObject/useDynamicProxies/UseDynamicProxies_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/UnicastRemoteObject/useDynamicProxies/UseDynamicProxies_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,74 +29,74 @@
implements RemoteInterface
{
private static final long serialVersionUID = 2;
-
+
private static java.lang.reflect.Method $method_passInt_0;
private static java.lang.reflect.Method $method_passObject_1;
private static java.lang.reflect.Method $method_passString_2;
-
+
static {
- try {
- $method_passInt_0 = RemoteInterface.class.getMethod("passInt", new java.lang.Class[] {int.class});
- $method_passObject_1 = RemoteInterface.class.getMethod("passObject", new java.lang.Class[] {java.lang.Object.class});
- $method_passString_2 = RemoteInterface.class.getMethod("passString", new java.lang.Class[] {java.lang.String.class});
- } catch (java.lang.NoSuchMethodException e) {
- throw new java.lang.NoSuchMethodError(
- "stub class initialization failed");
- }
+ try {
+ $method_passInt_0 = RemoteInterface.class.getMethod("passInt", new java.lang.Class[] {int.class});
+ $method_passObject_1 = RemoteInterface.class.getMethod("passObject", new java.lang.Class[] {java.lang.Object.class});
+ $method_passString_2 = RemoteInterface.class.getMethod("passString", new java.lang.Class[] {java.lang.String.class});
+ } catch (java.lang.NoSuchMethodException e) {
+ throw new java.lang.NoSuchMethodError(
+ "stub class initialization failed");
+ }
}
-
+
// constructors
public UseDynamicProxies_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of passInt(int)
public int passInt(int $param_int_1)
- throws java.io.IOException
+ throws java.io.IOException
{
- try {
- Object $result = ref.invoke(this, $method_passInt_0, new java.lang.Object[] {new java.lang.Integer($param_int_1)}, 8655249712495061761L);
- return ((java.lang.Integer) $result).intValue();
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.io.IOException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ Object $result = ref.invoke(this, $method_passInt_0, new java.lang.Object[] {new java.lang.Integer($param_int_1)}, 8655249712495061761L);
+ return ((java.lang.Integer) $result).intValue();
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.io.IOException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of passObject(Object)
public java.lang.Object passObject(java.lang.Object $param_Object_1)
- throws java.io.IOException
+ throws java.io.IOException
{
- try {
- Object $result = ref.invoke(this, $method_passObject_1, new java.lang.Object[] {$param_Object_1}, 3074202549763602823L);
- return ((java.lang.Object) $result);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.io.IOException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ Object $result = ref.invoke(this, $method_passObject_1, new java.lang.Object[] {$param_Object_1}, 3074202549763602823L);
+ return ((java.lang.Object) $result);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.io.IOException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of passString(String)
public java.lang.String passString(java.lang.String $param_String_1)
- throws java.io.IOException
+ throws java.io.IOException
{
- try {
- Object $result = ref.invoke(this, $method_passString_2, new java.lang.Object[] {$param_String_1}, 6627880292288702000L);
- return ((java.lang.String) $result);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.io.IOException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ Object $result = ref.invoke(this, $method_passString_2, new java.lang.Object[] {$param_String_1}, 6627880292288702000L);
+ return ((java.lang.String) $result);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.io.IOException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/server/Unmarshal/checkUnmarshalOnStopThread/CheckUnmarshalOnStopThread.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/Unmarshal/checkUnmarshalOnStopThread/CheckUnmarshalOnStopThread.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -22,7 +22,7 @@
*/
/* @test
- * @bug 4118600
+ * @bug 4118600
* @summary RMI UnmarshallException, interaction on stopping a thread.
*
* @bug 4177704
@@ -35,7 +35,7 @@
* @build CheckUnmarshall PoisonPill RuntimeExceptionParameter
* @build CheckUnmarshalOnStopThread
* @build CheckUnmarshalOnStopThread_Stub
- * @run main/othervm/timeout=480 CheckUnmarshalOnStopThread
+ * @run main/othervm/timeout=480 CheckUnmarshalOnStopThread
*/
import java.rmi.*;
@@ -44,7 +44,7 @@
import java.rmi.registry.*;
/**
- * Description for 4118600:
+ * Description for 4118600:
*
* If an rmi call thread is stopped while unmarshalling a return
* value), java.lang.ThreadDeath will be thrown during
@@ -77,8 +77,8 @@
* occur. This test is only written to track UnmarshalExceptions;
* success/failure does not depend on other types of problems.
*
- * Description for 4177704:
- *
+ * Description for 4177704:
+ *
* Similar situation as for 4177704 except that instead of just
* ensuring that RMI properly handles Errors, the second part of the
* test ensures that RMI deals with RuntimeExceptions correctly.
@@ -88,110 +88,110 @@
* parameters. An object that throws a RuntimeException in its
* writeObject method helps to carry out this part of the test.
*/
-public class CheckUnmarshalOnStopThread
- extends UnicastRemoteObject
- implements CheckUnmarshal
+public class CheckUnmarshalOnStopThread
+ extends UnicastRemoteObject
+ implements CheckUnmarshal
{
final static int RUNTIME_PILL = 1;
public static int typeToThrow = 0;
/*
- * remote object implementation
+ * remote object implementation
*/
CheckUnmarshalOnStopThread() throws RemoteException { }
public PoisonPill getPoisonPill() throws RemoteException {
- return new PoisonPill(new Integer(0));
+ return new PoisonPill(new Integer(0));
}
public Object ping() throws RemoteException {
- return (Object) new Integer(0);
+ return (Object) new Integer(0);
}
public void passRuntimeExceptionParameter(
- RuntimeExceptionParameter rep) throws RemoteException
+ RuntimeExceptionParameter rep) throws RemoteException
{
- // will never be called
+ // will never be called
}
public static void main(String [] args) {
- Object dummy = new Object();
- CheckUnmarshal cu = null;
- CheckUnmarshalOnStopThread cuonst = null;
+ Object dummy = new Object();
+ CheckUnmarshal cu = null;
+ CheckUnmarshalOnStopThread cuonst = null;
- System.err.println("\nregression test for bugs: " +
- "4118600 and 4177704\n");
+ System.err.println("\nregression test for bugs: " +
+ "4118600 and 4177704\n");
- try {
- cuonst = new CheckUnmarshalOnStopThread();
- cu = (CheckUnmarshal) UnicastRemoteObject.toStub(cuonst);
+ try {
+ cuonst = new CheckUnmarshalOnStopThread();
+ cu = (CheckUnmarshal) UnicastRemoteObject.toStub(cuonst);
- // make sure that RMI will free connections appropriately
- // under several situations:
+ // make sure that RMI will free connections appropriately
+ // under several situations:
- // when Errors are thrown during parameter unmarshalling
- System.err.println("testing to see if RMI will handle errors");
- ensureConnectionsAreFreed(cu, true);
+ // when Errors are thrown during parameter unmarshalling
+ System.err.println("testing to see if RMI will handle errors");
+ ensureConnectionsAreFreed(cu, true);
- // when RuntimeExceptions are thrown during parameter unmarshalling
- System.err.println("testing to see if RMI will handle " +
- "runtime exceptions");
- typeToThrow = RUNTIME_PILL;
- ensureConnectionsAreFreed(cu, true);
+ // when RuntimeExceptions are thrown during parameter unmarshalling
+ System.err.println("testing to see if RMI will handle " +
+ "runtime exceptions");
+ typeToThrow = RUNTIME_PILL;
+ ensureConnectionsAreFreed(cu, true);
- // when RuntimeExceptions are thrown during parameter marshalling
- System.err.println("testing to see if RMI will handle " +
- "runtime exceptions thrown during " +
- "parameter marshalling");
- ensureConnectionsAreFreed(cu, false);
+ // when RuntimeExceptions are thrown during parameter marshalling
+ System.err.println("testing to see if RMI will handle " +
+ "runtime exceptions thrown during " +
+ "parameter marshalling");
+ ensureConnectionsAreFreed(cu, false);
- System.err.println
- ("\nsuccess: CheckUnmarshalOnStopThread test passed ");
+ System.err.println
+ ("\nsuccess: CheckUnmarshalOnStopThread test passed ");
- } catch (Exception e) {
- TestLibrary.bomb(e);
- } finally {
- cu = null;
- deactivate(cuonst);
- }
+ } catch (Exception e) {
+ TestLibrary.bomb(e);
+ } finally {
+ cu = null;
+ deactivate(cuonst);
+ }
}
-
- static void ensureConnectionsAreFreed(CheckUnmarshal cu, boolean getPill)
- throws Exception
+
+ static void ensureConnectionsAreFreed(CheckUnmarshal cu, boolean getPill)
+ throws Exception
{
- // invoke a remote call that will corrupt a call connection
- // that will not be freed (if the bug is not fixed)
+ // invoke a remote call that will corrupt a call connection
+ // that will not be freed (if the bug is not fixed)
- for (int i = 0 ; i < 250 ; i++) {
- try {
- Object test = cu.ping();
- if (getPill) {
- cu.getPoisonPill();
- } else {
- cu.passRuntimeExceptionParameter(
- new RuntimeExceptionParameter());
- }
- } catch (Error e) {
- // expect an Error from call unmarshalling, ignore it
- } catch (RuntimeException e) {
- // " RuntimeException "
- }
- }
+ for (int i = 0 ; i < 250 ; i++) {
+ try {
+ Object test = cu.ping();
+ if (getPill) {
+ cu.getPoisonPill();
+ } else {
+ cu.passRuntimeExceptionParameter(
+ new RuntimeExceptionParameter());
+ }
+ } catch (Error e) {
+ // expect an Error from call unmarshalling, ignore it
+ } catch (RuntimeException e) {
+ // " RuntimeException "
+ }
+ }
- System.err.println("remote calls passed, received no " +
- "unmarshal exceptions\n\n");
+ System.err.println("remote calls passed, received no " +
+ "unmarshal exceptions\n\n");
}
static void deactivate(RemoteServer r) {
- // make sure that the object goes away
- try {
- System.err.println("deactivating object.");
- UnicastRemoteObject.unexportObject(r, true);
- } catch (Exception e) {
- e.getMessage();
- e.printStackTrace();
- }
+ // make sure that the object goes away
+ try {
+ System.err.println("deactivating object.");
+ UnicastRemoteObject.unexportObject(r, true);
+ } catch (Exception e) {
+ e.getMessage();
+ e.printStackTrace();
+ }
}
}
--- a/jdk/test/java/rmi/server/Unmarshal/checkUnmarshalOnStopThread/CheckUnmarshalOnStopThread_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/Unmarshal/checkUnmarshalOnStopThread/CheckUnmarshalOnStopThread_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,138 +29,138 @@
implements CheckUnmarshal, java.rmi.Remote
{
private static final java.rmi.server.Operation[] operations = {
- new java.rmi.server.Operation("PoisonPill getPoisonPill()"),
- new java.rmi.server.Operation("void passRuntimeExceptionParameter(RuntimeExceptionParameter)"),
- new java.rmi.server.Operation("java.lang.Object ping()")
+ new java.rmi.server.Operation("PoisonPill getPoisonPill()"),
+ new java.rmi.server.Operation("void passRuntimeExceptionParameter(RuntimeExceptionParameter)"),
+ new java.rmi.server.Operation("java.lang.Object ping()")
};
-
+
private static final long interfaceHash = -5923540687975666490L;
-
+
private static final long serialVersionUID = 2;
-
+
private static boolean useNewInvoke;
private static java.lang.reflect.Method $method_getPoisonPill_0;
private static java.lang.reflect.Method $method_passRuntimeExceptionParameter_1;
private static java.lang.reflect.Method $method_ping_2;
-
+
static {
- try {
- java.rmi.server.RemoteRef.class.getMethod("invoke",
- new java.lang.Class[] {
- java.rmi.Remote.class,
- java.lang.reflect.Method.class,
- java.lang.Object[].class,
- long.class
- });
- useNewInvoke = true;
- $method_getPoisonPill_0 = CheckUnmarshal.class.getMethod("getPoisonPill", new java.lang.Class[] {});
- $method_passRuntimeExceptionParameter_1 = CheckUnmarshal.class.getMethod("passRuntimeExceptionParameter", new java.lang.Class[] {RuntimeExceptionParameter.class});
- $method_ping_2 = CheckUnmarshal.class.getMethod("ping", new java.lang.Class[] {});
- } catch (java.lang.NoSuchMethodException e) {
- useNewInvoke = false;
- }
+ try {
+ java.rmi.server.RemoteRef.class.getMethod("invoke",
+ new java.lang.Class[] {
+ java.rmi.Remote.class,
+ java.lang.reflect.Method.class,
+ java.lang.Object[].class,
+ long.class
+ });
+ useNewInvoke = true;
+ $method_getPoisonPill_0 = CheckUnmarshal.class.getMethod("getPoisonPill", new java.lang.Class[] {});
+ $method_passRuntimeExceptionParameter_1 = CheckUnmarshal.class.getMethod("passRuntimeExceptionParameter", new java.lang.Class[] {RuntimeExceptionParameter.class});
+ $method_ping_2 = CheckUnmarshal.class.getMethod("ping", new java.lang.Class[] {});
+ } catch (java.lang.NoSuchMethodException e) {
+ useNewInvoke = false;
+ }
}
-
+
// constructors
public CheckUnmarshalOnStopThread_Stub() {
- super();
+ super();
}
public CheckUnmarshalOnStopThread_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of getPoisonPill()
public PoisonPill getPoisonPill()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- Object $result = ref.invoke(this, $method_getPoisonPill_0, null, 5776441251039617360L);
- return ((PoisonPill) $result);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
- ref.invoke(call);
- PoisonPill $result;
- try {
- java.io.ObjectInput in = call.getInputStream();
- $result = (PoisonPill) in.readObject();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } catch (java.lang.ClassNotFoundException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } finally {
- ref.done(call);
- }
- return $result;
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ Object $result = ref.invoke(this, $method_getPoisonPill_0, null, 5776441251039617360L);
+ return ((PoisonPill) $result);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
+ ref.invoke(call);
+ PoisonPill $result;
+ try {
+ java.io.ObjectInput in = call.getInputStream();
+ $result = (PoisonPill) in.readObject();
+ } catch (java.io.IOException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } catch (java.lang.ClassNotFoundException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } finally {
+ ref.done(call);
+ }
+ return $result;
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of passRuntimeExceptionParameter(RuntimeExceptionParameter)
public void passRuntimeExceptionParameter(RuntimeExceptionParameter $param_RuntimeExceptionParameter_1)
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- ref.invoke(this, $method_passRuntimeExceptionParameter_1, new java.lang.Object[] {$param_RuntimeExceptionParameter_1}, -4427599990679364365L);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
- try {
- java.io.ObjectOutput out = call.getOutputStream();
- out.writeObject($param_RuntimeExceptionParameter_1);
- } catch (java.io.IOException e) {
- throw new java.rmi.MarshalException("error marshalling arguments", e);
- }
- ref.invoke(call);
- ref.done(call);
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ ref.invoke(this, $method_passRuntimeExceptionParameter_1, new java.lang.Object[] {$param_RuntimeExceptionParameter_1}, -4427599990679364365L);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
+ try {
+ java.io.ObjectOutput out = call.getOutputStream();
+ out.writeObject($param_RuntimeExceptionParameter_1);
+ } catch (java.io.IOException e) {
+ throw new java.rmi.MarshalException("error marshalling arguments", e);
+ }
+ ref.invoke(call);
+ ref.done(call);
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of ping()
public java.lang.Object ping()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- Object $result = ref.invoke(this, $method_ping_2, null, 7635508643486276040L);
- return ((java.lang.Object) $result);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 2, interfaceHash);
- ref.invoke(call);
- java.lang.Object $result;
- try {
- java.io.ObjectInput in = call.getInputStream();
- $result = (java.lang.Object) in.readObject();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } catch (java.lang.ClassNotFoundException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } finally {
- ref.done(call);
- }
- return $result;
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ Object $result = ref.invoke(this, $method_ping_2, null, 7635508643486276040L);
+ return ((java.lang.Object) $result);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 2, interfaceHash);
+ ref.invoke(call);
+ java.lang.Object $result;
+ try {
+ java.io.ObjectInput in = call.getInputStream();
+ $result = (java.lang.Object) in.readObject();
+ } catch (java.io.IOException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } catch (java.lang.ClassNotFoundException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } finally {
+ ref.done(call);
+ }
+ return $result;
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/server/Unmarshal/checkUnmarshalOnStopThread/CheckUnmarshall.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/Unmarshal/checkUnmarshalOnStopThread/CheckUnmarshall.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -20,7 +20,7 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
-
+
/**
*
*/
@@ -37,4 +37,3 @@
RuntimeExceptionParameter rep)
throws RemoteException;
}
-
--- a/jdk/test/java/rmi/server/Unmarshal/checkUnmarshalOnStopThread/PoisonPill.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/Unmarshal/checkUnmarshalOnStopThread/PoisonPill.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -45,7 +45,7 @@
throws IOException
{
if (CheckUnmarshalOnStopThread.typeToThrow !=
- CheckUnmarshalOnStopThread.RUNTIME_PILL) {
+ CheckUnmarshalOnStopThread.RUNTIME_PILL) {
throw new Error("Wrote a test object whos readObject " +
"method always throws an Error");
--- a/jdk/test/java/rmi/server/Unmarshal/checkUnmarshalOnStopThread/RuntimeExceptionParameter.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/Unmarshal/checkUnmarshalOnStopThread/RuntimeExceptionParameter.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -38,7 +38,6 @@
{
throw new RuntimeException("wrote a parameter whos writeObject " +
"method always throws a RuntimeException"
- );
+ );
}
}
-
--- a/jdk/test/java/rmi/server/Unreferenced/finiteGCLatency/FiniteGCLatency.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/Unreferenced/finiteGCLatency/FiniteGCLatency.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -54,69 +54,69 @@
private boolean unreferencedInvoked = false;
public void unreferenced() {
- System.err.println("unreferenced() method invoked");
- synchronized (lock) {
- unreferencedInvoked = true;
- lock.notify();
- }
+ System.err.println("unreferenced() method invoked");
+ synchronized (lock) {
+ unreferencedInvoked = true;
+ lock.notify();
+ }
}
public static void main(String[] args) {
- System.err.println("\nRegression test for bug 4164696\n");
+ System.err.println("\nRegression test for bug 4164696\n");
- /*
- * Set the interval that RMI will request for GC latency (before RMI
- * gets initialized and this property is read) to an unrealistically
- * small value, so that this test shouldn't have to wait too long.
- */
- System.setProperty("sun.rmi.dgc.client.gcInterval",
- String.valueOf(GC_INTERVAL));
+ /*
+ * Set the interval that RMI will request for GC latency (before RMI
+ * gets initialized and this property is read) to an unrealistically
+ * small value, so that this test shouldn't have to wait too long.
+ */
+ System.setProperty("sun.rmi.dgc.client.gcInterval",
+ String.valueOf(GC_INTERVAL));
- FiniteGCLatency obj = new FiniteGCLatency();
+ FiniteGCLatency obj = new FiniteGCLatency();
- try {
- UnicastRemoteObject.exportObject(obj);
- System.err.println("exported remote object");
+ try {
+ UnicastRemoteObject.exportObject(obj);
+ System.err.println("exported remote object");
- LocateRegistry.createRegistry(TestLibrary.REGISTRY_PORT);
- System.err.println("created registry");
+ LocateRegistry.createRegistry(TestLibrary.REGISTRY_PORT);
+ System.err.println("created registry");
- Registry registry = LocateRegistry.getRegistry("", TestLibrary.REGISTRY_PORT);
- registry.bind(BINDING, obj);
- System.err.println("bound remote object in registry");
+ Registry registry = LocateRegistry.getRegistry("", TestLibrary.REGISTRY_PORT);
+ registry.bind(BINDING, obj);
+ System.err.println("bound remote object in registry");
- synchronized (obj.lock) {
- registry.unbind(BINDING);
- System.err.println("unbound remote object from registry; " +
- "waiting for unreferenced() callback...");
- obj.lock.wait(TIMEOUT);
+ synchronized (obj.lock) {
+ registry.unbind(BINDING);
+ System.err.println("unbound remote object from registry; " +
+ "waiting for unreferenced() callback...");
+ obj.lock.wait(TIMEOUT);
- if (obj.unreferencedInvoked) {
- System.err.println("TEST PASSED: unreferenced() invoked");
- } else {
- throw new RuntimeException(
- "TEST FAILED: unrefereced() not invoked after " +
- ((double) TIMEOUT / 1000.0) + " seconds");
- }
- }
+ if (obj.unreferencedInvoked) {
+ System.err.println("TEST PASSED: unreferenced() invoked");
+ } else {
+ throw new RuntimeException(
+ "TEST FAILED: unrefereced() not invoked after " +
+ ((double) TIMEOUT / 1000.0) + " seconds");
+ }
+ }
- } catch (Exception e) {
- if (e instanceof RuntimeException) {
- throw (RuntimeException) e;
- } else {
- throw new RuntimeException(
- "TEST FAILED: unexpected exception: " + e.toString());
- }
- } finally {
- /*
- * When all is said and done, try to unexport the remote object
- * so that the VM has a chance to exit.
- */
- try {
- UnicastRemoteObject.unexportObject(obj, true);
- } catch (RemoteException e) {
- }
- }
+ } catch (Exception e) {
+ if (e instanceof RuntimeException) {
+ throw (RuntimeException) e;
+ } else {
+ throw new RuntimeException(
+ "TEST FAILED: unexpected exception: " + e.toString());
+ }
+ } finally {
+ /*
+ * When all is said and done, try to unexport the remote object
+ * so that the VM has a chance to exit.
+ */
+ try {
+ UnicastRemoteObject.unexportObject(obj, true);
+ } catch (RemoteException e) {
+ }
+ }
}
}
--- a/jdk/test/java/rmi/server/Unreferenced/finiteGCLatency/FiniteGCLatency_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/Unreferenced/finiteGCLatency/FiniteGCLatency_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,10 +29,10 @@
implements java.rmi.Remote
{
private static final long serialVersionUID = 2;
-
+
// constructors
public FiniteGCLatency_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
}
--- a/jdk/test/java/rmi/server/Unreferenced/leaseCheckInterval/LeaseCheckInterval.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/Unreferenced/leaseCheckInterval/LeaseCheckInterval.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -62,71 +62,71 @@
private boolean unreferencedInvoked = false;
public void unreferenced() {
- System.err.println("unreferenced() method invoked");
- synchronized (lock) {
- unreferencedInvoked = true;
- lock.notify();
- }
+ System.err.println("unreferenced() method invoked");
+ synchronized (lock) {
+ unreferencedInvoked = true;
+ lock.notify();
+ }
}
public static void main(String[] args) throws Exception {
- System.err.println("\nRegression test for bug 4285878\n");
+ System.err.println("\nRegression test for bug 4285878\n");
- /*
- * Set the duration of leases granted to a very small value, so that
- * we can test if expirations are detected in a roughly comparable
- * time.
- */
- System.setProperty("java.rmi.dgc.leaseValue",
- String.valueOf(LEASE_VALUE));
+ /*
+ * Set the duration of leases granted to a very small value, so that
+ * we can test if expirations are detected in a roughly comparable
+ * time.
+ */
+ System.setProperty("java.rmi.dgc.leaseValue",
+ String.valueOf(LEASE_VALUE));
- LeaseCheckInterval obj = new LeaseCheckInterval();
+ LeaseCheckInterval obj = new LeaseCheckInterval();
- try {
- UnicastRemoteObject.exportObject(obj);
- System.err.println("exported remote object");
+ try {
+ UnicastRemoteObject.exportObject(obj);
+ System.err.println("exported remote object");
- Registry localRegistry =
- LocateRegistry.createRegistry(TestLibrary.REGISTRY_PORT);
- System.err.println("created local registry");
+ Registry localRegistry =
+ LocateRegistry.createRegistry(TestLibrary.REGISTRY_PORT);
+ System.err.println("created local registry");
- localRegistry.bind(BINDING, obj);
- System.err.println("bound remote object in local registry");
+ localRegistry.bind(BINDING, obj);
+ System.err.println("bound remote object in local registry");
- synchronized (obj.lock) {
- System.err.println("starting remote client VM...");
- (new JavaVM("SelfTerminator")).start();
+ synchronized (obj.lock) {
+ System.err.println("starting remote client VM...");
+ (new JavaVM("SelfTerminator")).start();
- System.err.println("waiting for unreferenced() callback...");
- obj.lock.wait(TIMEOUT);
+ System.err.println("waiting for unreferenced() callback...");
+ obj.lock.wait(TIMEOUT);
- if (obj.unreferencedInvoked) {
- System.err.println("TEST PASSED: " +
- "unreferenced() invoked in timely fashion");
- } else {
- throw new RuntimeException(
- "TEST FAILED: unreferenced() not invoked after " +
- ((double) TIMEOUT / 1000.0) + " seconds");
- }
- }
+ if (obj.unreferencedInvoked) {
+ System.err.println("TEST PASSED: " +
+ "unreferenced() invoked in timely fashion");
+ } else {
+ throw new RuntimeException(
+ "TEST FAILED: unreferenced() not invoked after " +
+ ((double) TIMEOUT / 1000.0) + " seconds");
+ }
+ }
- } catch (Exception e) {
- if (e instanceof RuntimeException) {
- throw (RuntimeException) e;
- } else {
- throw new RuntimeException(
- "TEST FAILED: unexpected exception: " + e.toString());
- }
- } finally {
- /*
- * When all is said and done, try to unexport the remote object
- * so that the VM has a chance to exit.
- */
- try {
- UnicastRemoteObject.unexportObject(obj, true);
- } catch (RemoteException e) {
- }
- }
+ } catch (Exception e) {
+ if (e instanceof RuntimeException) {
+ throw (RuntimeException) e;
+ } else {
+ throw new RuntimeException(
+ "TEST FAILED: unexpected exception: " + e.toString());
+ }
+ } finally {
+ /*
+ * When all is said and done, try to unexport the remote object
+ * so that the VM has a chance to exit.
+ */
+ try {
+ UnicastRemoteObject.unexportObject(obj, true);
+ } catch (RemoteException e) {
+ }
+ }
}
}
--- a/jdk/test/java/rmi/server/Unreferenced/leaseCheckInterval/LeaseCheckInterval_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/Unreferenced/leaseCheckInterval/LeaseCheckInterval_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,10 +29,10 @@
implements java.rmi.Remote
{
private static final long serialVersionUID = 2;
-
+
// constructors
public LeaseCheckInterval_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
}
--- a/jdk/test/java/rmi/server/Unreferenced/leaseCheckInterval/SelfTerminator.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/Unreferenced/leaseCheckInterval/SelfTerminator.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -32,13 +32,13 @@
public class SelfTerminator {
public static void main(String[] args) {
- try {
- Registry registry =
- LocateRegistry.getRegistry("", TestLibrary.REGISTRY_PORT);
- Remote stub = registry.lookup(LeaseCheckInterval.BINDING);
- Runtime.getRuntime().halt(0);
- } catch (Exception e) {
- e.printStackTrace();
- }
+ try {
+ Registry registry =
+ LocateRegistry.getRegistry("", TestLibrary.REGISTRY_PORT);
+ Remote stub = registry.lookup(LeaseCheckInterval.BINDING);
+ Runtime.getRuntime().halt(0);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
}
}
--- a/jdk/test/java/rmi/server/Unreferenced/marshalledObjectGet/MarshalledObjectGet.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/Unreferenced/marshalledObjectGet/MarshalledObjectGet.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2000-2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -51,72 +51,72 @@
private boolean unreferencedInvoked;
public void unreferenced() {
- System.err.println("unreferenced() method invoked");
- synchronized (lock) {
- unreferencedInvoked = true;
- lock.notify();
- }
+ System.err.println("unreferenced() method invoked");
+ synchronized (lock) {
+ unreferencedInvoked = true;
+ lock.notify();
+ }
}
public static void main(String[] args) {
- System.err.println(
- "\nTest to verify correction interaction of " +
- "MarshalledObject.get and DGC registration\n");
+ System.err.println(
+ "\nTest to verify correction interaction of " +
+ "MarshalledObject.get and DGC registration\n");
- /*
- * Set the interval that RMI will request for GC latency (before RMI
- * gets initialized and this property is read) to an unrealistically
- * small value, so that this test shouldn't have to wait too long.
- */
- System.setProperty("sun.rmi.dgc.client.gcInterval",
- String.valueOf(GC_INTERVAL));
+ /*
+ * Set the interval that RMI will request for GC latency (before RMI
+ * gets initialized and this property is read) to an unrealistically
+ * small value, so that this test shouldn't have to wait too long.
+ */
+ System.setProperty("sun.rmi.dgc.client.gcInterval",
+ String.valueOf(GC_INTERVAL));
- MarshalledObjectGet obj = new MarshalledObjectGet();
+ MarshalledObjectGet obj = new MarshalledObjectGet();
- try {
- Remote stub = UnicastRemoteObject.exportObject(obj);
- System.err.println("exported remote object");
+ try {
+ Remote stub = UnicastRemoteObject.exportObject(obj);
+ System.err.println("exported remote object");
- MarshalledObject mobj = new MarshalledObject(stub);
- Remote unmarshalledStub = (Remote) mobj.get();
- System.err.println("unmarshalled stub from marshalled object");
+ MarshalledObject mobj = new MarshalledObject(stub);
+ Remote unmarshalledStub = (Remote) mobj.get();
+ System.err.println("unmarshalled stub from marshalled object");
- synchronized (obj.lock) {
- obj.unreferencedInvoked = false;
+ synchronized (obj.lock) {
+ obj.unreferencedInvoked = false;
- unmarshalledStub = null;
- System.gc();
- System.err.println("cleared unmarshalled stub");
- System.err.println("waiting for unreferenced() callback " +
- "(SHOULD happen)...");
- obj.lock.wait(TIMEOUT);
+ unmarshalledStub = null;
+ System.gc();
+ System.err.println("cleared unmarshalled stub");
+ System.err.println("waiting for unreferenced() callback " +
+ "(SHOULD happen)...");
+ obj.lock.wait(TIMEOUT);
- if (obj.unreferencedInvoked) {
- // TEST PASSED
- } else {
- throw new RuntimeException(
- "TEST FAILED: unrefereced() not invoked after " +
- ((double) TIMEOUT / 1000.0) + " seconds");
- }
- }
+ if (obj.unreferencedInvoked) {
+ // TEST PASSED
+ } else {
+ throw new RuntimeException(
+ "TEST FAILED: unrefereced() not invoked after " +
+ ((double) TIMEOUT / 1000.0) + " seconds");
+ }
+ }
- System.err.println("TEST PASSED");
+ System.err.println("TEST PASSED");
- } catch (Exception e) {
- if (e instanceof RuntimeException) {
- throw (RuntimeException) e;
- } else {
- throw new RuntimeException(
- "TEST FAILED: unexpected exception: " + e.toString());
- }
- } finally {
- if (obj != null) {
- try {
- UnicastRemoteObject.unexportObject(obj, true);
- } catch (Exception e) {
- }
- }
- }
+ } catch (Exception e) {
+ if (e instanceof RuntimeException) {
+ throw (RuntimeException) e;
+ } else {
+ throw new RuntimeException(
+ "TEST FAILED: unexpected exception: " + e.toString());
+ }
+ } finally {
+ if (obj != null) {
+ try {
+ UnicastRemoteObject.unexportObject(obj, true);
+ } catch (Exception e) {
+ }
+ }
+ }
}
}
--- a/jdk/test/java/rmi/server/Unreferenced/marshalledObjectGet/MarshalledObjectGet_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/Unreferenced/marshalledObjectGet/MarshalledObjectGet_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,10 +29,10 @@
implements java.rmi.Remote
{
private static final long serialVersionUID = 2;
-
+
// constructors
public MarshalledObjectGet_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
}
--- a/jdk/test/java/rmi/server/Unreferenced/unreferencedContext/UnreferencedContext.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/Unreferenced/unreferencedContext/UnreferencedContext.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -32,12 +32,12 @@
*
* @bug 4214123
* @summary Unreferenced.unreferenced(...) threads should run in the nonSystem group.
- * To complete the fix for, 4182104, RMI unreferenced threads should also
+ * To complete the fix for, 4182104, RMI unreferenced threads should also
* run in the nonSystem so that they do not need permissions to modify the
* system thread group.
*
* @author Laird Dornin
- *
+ *
* @library ../../../testlibrary
* @build UnreferencedContext
* @build UnreferencedContext_Stub
@@ -60,127 +60,127 @@
private ClassLoader unreferencedContext;
public void run() {
- System.err.println("unreferenced method created thread succesfully");
+ System.err.println("unreferenced method created thread succesfully");
}
public void unreferenced() {
- // turn on security to ensure that the action below will not
- // require extra permissions
- System.setSecurityManager(new java.rmi.RMISecurityManager());
+ // turn on security to ensure that the action below will not
+ // require extra permissions
+ System.setSecurityManager(new java.rmi.RMISecurityManager());
- // exercise functionality prohibited by 4214123
- (new Thread(this)).start();
+ // exercise functionality prohibited by 4214123
+ (new Thread(this)).start();
- System.err.println("unreferenced() method invoked");
- synchronized (lock) {
- unreferencedInvoked = true;
- unreferencedContext =
- Thread.currentThread().getContextClassLoader();
- lock.notify();
- }
+ System.err.println("unreferenced() method invoked");
+ synchronized (lock) {
+ unreferencedInvoked = true;
+ unreferencedContext =
+ Thread.currentThread().getContextClassLoader();
+ lock.notify();
+ }
}
public static void main(String[] args) {
- System.err.println("\nRegression test for bug 4171278\n");
+ System.err.println("\nRegression test for bug 4171278\n");
- /*
- * Set the interval that RMI will request for GC latency (before RMI
- * gets initialized and this property is read) to an unrealistically
- * small value, so that this test shouldn't have to wait too long.
- */
- System.setProperty("sun.rmi.dgc.client.gcInterval",
- String.valueOf(GC_INTERVAL));
+ /*
+ * Set the interval that RMI will request for GC latency (before RMI
+ * gets initialized and this property is read) to an unrealistically
+ * small value, so that this test shouldn't have to wait too long.
+ */
+ System.setProperty("sun.rmi.dgc.client.gcInterval",
+ String.valueOf(GC_INTERVAL));
- UnreferencedContext obj = new UnreferencedContext();
+ UnreferencedContext obj = new UnreferencedContext();
- try {
- /*
- * This little trick is necessary to make sure that the RMI server
- * threads for objects created on the default port get created
- * before we set our special context class loader, so that they
- * don't *accidentally* inherit it when making the unreferenced()
- * callback.
- */
- UnicastRemoteObject.exportObject(obj);
- UnicastRemoteObject.unexportObject(obj, true);
+ try {
+ /*
+ * This little trick is necessary to make sure that the RMI server
+ * threads for objects created on the default port get created
+ * before we set our special context class loader, so that they
+ * don't *accidentally* inherit it when making the unreferenced()
+ * callback.
+ */
+ UnicastRemoteObject.exportObject(obj);
+ UnicastRemoteObject.unexportObject(obj, true);
- /*
- * Now create special context class loader before exporting the
- * remote object for real, so that it should be set when the
- * object's unreferenced() method is called.
- */
- ClassLoader intendedContext = new URLClassLoader(new URL[0]);
- Thread.currentThread().setContextClassLoader(intendedContext);
- System.err.println(
- "created and set intended context class loader: " +
- intendedContext);
+ /*
+ * Now create special context class loader before exporting the
+ * remote object for real, so that it should be set when the
+ * object's unreferenced() method is called.
+ */
+ ClassLoader intendedContext = new URLClassLoader(new URL[0]);
+ Thread.currentThread().setContextClassLoader(intendedContext);
+ System.err.println(
+ "created and set intended context class loader: " +
+ intendedContext);
- UnicastRemoteObject.exportObject(obj);
- System.err.println("exported remote object");
+ UnicastRemoteObject.exportObject(obj);
+ System.err.println("exported remote object");
- LocateRegistry.createRegistry(TestLibrary.REGISTRY_PORT);
- System.err.println("created registry");
+ LocateRegistry.createRegistry(TestLibrary.REGISTRY_PORT);
+ System.err.println("created registry");
- Registry registry = LocateRegistry.getRegistry("", TestLibrary.REGISTRY_PORT);
- registry.bind(BINDING, obj);
- System.err.println("bound remote object in registry");
+ Registry registry = LocateRegistry.getRegistry("", TestLibrary.REGISTRY_PORT);
+ registry.bind(BINDING, obj);
+ System.err.println("bound remote object in registry");
- synchronized (obj.lock) {
- registry.unbind(BINDING);
- System.err.println("unbound remote object from registry; " +
- "waiting for unreferenced() callback...");
- /*
- * This incantation seems sufficient to work around the
- * ramifications of 4164696, so that this test will actually
- * prove something useful about 1.2Beta4 or 1.2FCS before
- * 4171278 was fixed.
- */
- for (int i = 0; i < 10; i++) {
- System.gc();
- obj.lock.wait(TIMEOUT / 10);
- if (obj.unreferencedInvoked) {
- break;
- }
- }
+ synchronized (obj.lock) {
+ registry.unbind(BINDING);
+ System.err.println("unbound remote object from registry; " +
+ "waiting for unreferenced() callback...");
+ /*
+ * This incantation seems sufficient to work around the
+ * ramifications of 4164696, so that this test will actually
+ * prove something useful about 1.2Beta4 or 1.2FCS before
+ * 4171278 was fixed.
+ */
+ for (int i = 0; i < 10; i++) {
+ System.gc();
+ obj.lock.wait(TIMEOUT / 10);
+ if (obj.unreferencedInvoked) {
+ break;
+ }
+ }
- if (obj.unreferencedInvoked) {
- System.err.println(
- "invoked with context class loader: " +
- obj.unreferencedContext);
+ if (obj.unreferencedInvoked) {
+ System.err.println(
+ "invoked with context class loader: " +
+ obj.unreferencedContext);
- if (obj.unreferencedContext == intendedContext) {
- System.err.println(
- "TEST PASSED: unreferenced() invoked" +
- " with intended context class loader");
- } else {
- throw new RuntimeException(
- "TEST FAILED: unreferenced() invoked" +
- " with incorrect context class loader");
- }
- } else {
- throw new RuntimeException(
- "TEST FAILED: unreferenced() not invoked after " +
- ((double) TIMEOUT / 1000.0) + " seconds or unreferenced failed to create a thread");
- }
- }
+ if (obj.unreferencedContext == intendedContext) {
+ System.err.println(
+ "TEST PASSED: unreferenced() invoked" +
+ " with intended context class loader");
+ } else {
+ throw new RuntimeException(
+ "TEST FAILED: unreferenced() invoked" +
+ " with incorrect context class loader");
+ }
+ } else {
+ throw new RuntimeException(
+ "TEST FAILED: unreferenced() not invoked after " +
+ ((double) TIMEOUT / 1000.0) + " seconds or unreferenced failed to create a thread");
+ }
+ }
- } catch (Exception e) {
- if (e instanceof RuntimeException) {
- throw (RuntimeException) e;
- } else {
- throw new RuntimeException(
- "TEST FAILED: unexpected exception: " + e.toString());
- }
- } finally {
- /*
- * When all is said and done, try to unexport the remote object
- * so that the VM has a chance to exit.
- */
- try {
- UnicastRemoteObject.unexportObject(obj, true);
- } catch (RemoteException e) {
- }
- }
+ } catch (Exception e) {
+ if (e instanceof RuntimeException) {
+ throw (RuntimeException) e;
+ } else {
+ throw new RuntimeException(
+ "TEST FAILED: unexpected exception: " + e.toString());
+ }
+ } finally {
+ /*
+ * When all is said and done, try to unexport the remote object
+ * so that the VM has a chance to exit.
+ */
+ try {
+ UnicastRemoteObject.unexportObject(obj, true);
+ } catch (RemoteException e) {
+ }
+ }
}
}
--- a/jdk/test/java/rmi/server/Unreferenced/unreferencedContext/UnreferencedContext_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/server/Unreferenced/unreferencedContext/UnreferencedContext_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,10 +29,10 @@
implements java.rmi.Remote
{
private static final long serialVersionUID = 2;
-
+
// constructors
public UnreferencedContext_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
}
--- a/jdk/test/java/rmi/transport/acceptLoop/CloseServerSocketOnTermination.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/acceptLoop/CloseServerSocketOnTermination.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -51,75 +51,75 @@
private static long TIMEOUT = 5000;
public static void main(String[] args) throws Exception {
- System.err.println("\nRegression test for bug 4924577\n");
+ System.err.println("\nRegression test for bug 4924577\n");
- RMISocketFactory.setFailureHandler(new RMIFailureHandler() {
- public boolean failure(Exception e) { return false; }
- });
+ RMISocketFactory.setFailureHandler(new RMIFailureHandler() {
+ public boolean failure(Exception e) { return false; }
+ });
- tryWith(new IOException());
- tryWith(new NullPointerException());
- tryWith(new OutOfMemoryError());
- tryWith(new NoClassDefFoundError());
- tryWith(new InternalError());
- tryWith(new Throwable());
+ tryWith(new IOException());
+ tryWith(new NullPointerException());
+ tryWith(new OutOfMemoryError());
+ tryWith(new NoClassDefFoundError());
+ tryWith(new InternalError());
+ tryWith(new Throwable());
- System.err.println("TEST PASSED");
+ System.err.println("TEST PASSED");
}
private static void tryWith(Throwable t) throws Exception {
- Remote impl = new Remote() { };
- try {
- CountDownLatch latch = new CountDownLatch(1);
- UnicastRemoteObject.exportObject(impl, 0, null, new SSF(t, latch));
- if (!latch.await(TIMEOUT, TimeUnit.MILLISECONDS)) {
- throw new Error("server socket not closed");
- }
- } finally {
- UnicastRemoteObject.unexportObject(impl, true);
- }
+ Remote impl = new Remote() { };
+ try {
+ CountDownLatch latch = new CountDownLatch(1);
+ UnicastRemoteObject.exportObject(impl, 0, null, new SSF(t, latch));
+ if (!latch.await(TIMEOUT, TimeUnit.MILLISECONDS)) {
+ throw new Error("server socket not closed");
+ }
+ } finally {
+ UnicastRemoteObject.unexportObject(impl, true);
+ }
}
private static class SSF implements RMIServerSocketFactory {
- private final Throwable acceptFailure;
- private final CountDownLatch closedLatch;
- SSF(Throwable acceptFailure, CountDownLatch closedLatch) {
- this.acceptFailure = acceptFailure;
- this.closedLatch = closedLatch;
- }
- public ServerSocket createServerSocket(int port) throws IOException {
- return new ServerSocket(port) {
- private int acceptInvocations = 0;
- public synchronized Socket accept() throws IOException {
- if (acceptInvocations++ == 0) {
- throwException(acceptFailure);
- }
- return super.accept();
- }
- public void close() throws IOException {
- closedLatch.countDown();
- super.close();
- }
- };
- }
+ private final Throwable acceptFailure;
+ private final CountDownLatch closedLatch;
+ SSF(Throwable acceptFailure, CountDownLatch closedLatch) {
+ this.acceptFailure = acceptFailure;
+ this.closedLatch = closedLatch;
+ }
+ public ServerSocket createServerSocket(int port) throws IOException {
+ return new ServerSocket(port) {
+ private int acceptInvocations = 0;
+ public synchronized Socket accept() throws IOException {
+ if (acceptInvocations++ == 0) {
+ throwException(acceptFailure);
+ }
+ return super.accept();
+ }
+ public void close() throws IOException {
+ closedLatch.countDown();
+ super.close();
+ }
+ };
+ }
- // hack to throw an arbitrary (possibly checked) Throwable
- private static void throwException(Throwable t) {
- try {
- toThrow.set(t);
- Thrower.class.newInstance();
- } catch (IllegalAccessException e) {
- throw new AssertionError();
- } catch (InstantiationException e) {
- throw new AssertionError();
- } finally {
- toThrow.remove();
- }
- }
- private static ThreadLocal<Throwable> toThrow =
- new ThreadLocal<Throwable>();
- private static class Thrower {
- Thrower() throws Throwable { throw toThrow.get(); }
- }
+ // hack to throw an arbitrary (possibly checked) Throwable
+ private static void throwException(Throwable t) {
+ try {
+ toThrow.set(t);
+ Thrower.class.newInstance();
+ } catch (IllegalAccessException e) {
+ throw new AssertionError();
+ } catch (InstantiationException e) {
+ throw new AssertionError();
+ } finally {
+ toThrow.remove();
+ }
+ }
+ private static ThreadLocal<Throwable> toThrow =
+ new ThreadLocal<Throwable>();
+ private static class Thrower {
+ Thrower() throws Throwable { throw toThrow.get(); }
+ }
}
}
--- a/jdk/test/java/rmi/transport/checkFQDN/CheckFQDN.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/checkFQDN/CheckFQDN.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -34,15 +34,15 @@
*
* @library ../../testlibrary
* @build CheckFQDN CheckFQDNClient CheckFQDN_Stub TellServerName
- * @run main/othervm/timeout=120 CheckFQDN
+ * @run main/othervm/timeout=120 CheckFQDN
*/
-/**
+/**
* Get the hostname used by rmi using different rmi properities:
*
* if set java.rmi.server.hostname, hostname should equal this
* property.
- *
+ *
* if set java.rmi.server.useLocalHostname, hostname must contain a '.'
*
* if set no properties hostname should be an ipaddress.
@@ -58,118 +58,118 @@
import java.io.*;
/**
- * Export a remote object through which the exec'ed client vm can
+ * Export a remote object through which the exec'ed client vm can
* inform the main test what its host name is.
*/
-public class CheckFQDN extends UnicastRemoteObject
+public class CheckFQDN extends UnicastRemoteObject
implements TellServerName {
-
+
static String propertyBeingTested = null;
static String propertyBeingTestedValue = null;
public static void main(String args[]) {
- Object dummy = new Object();
- CheckFQDN checkFQDN = null;
- try {
- checkFQDN = new CheckFQDN();
+ Object dummy = new Object();
+ CheckFQDN checkFQDN = null;
+ try {
+ checkFQDN = new CheckFQDN();
+
+ System.err.println
+ ("\nRegression test for bug/rfe 4115683\n");
+
+ Registry registry = java.rmi.registry.LocateRegistry.
+ createRegistry(TestLibrary.REGISTRY_PORT);
+ registry.bind("CheckFQDN", checkFQDN);
- System.err.println
- ("\nRegression test for bug/rfe 4115683\n");
-
- Registry registry = java.rmi.registry.LocateRegistry.
- createRegistry(TestLibrary.REGISTRY_PORT);
- registry.bind("CheckFQDN", checkFQDN);
-
- /* test the host name scheme in different environments.*/
- testProperty("java.rmi.server.useLocalHostname", "true", "");
- testProperty("java.rmi.server.hostname", "thisIsJustAnRMITest", "");
- testProperty("java.rmi.server.hostname", "thisIsJustAnRMITest",
- " -Djava.rmi.server.useLocalHostname=true ");
- testProperty("", "", "");
+ /* test the host name scheme in different environments.*/
+ testProperty("java.rmi.server.useLocalHostname", "true", "");
+ testProperty("java.rmi.server.hostname", "thisIsJustAnRMITest", "");
+ testProperty("java.rmi.server.hostname", "thisIsJustAnRMITest",
+ " -Djava.rmi.server.useLocalHostname=true ");
+ testProperty("", "", "");
- } catch (Exception e) {
- TestLibrary.bomb(e);
- } finally {
- if (checkFQDN != null) {
- TestLibrary.unexport(checkFQDN);
- }
- }
- System.err.println("\nTest for bug/ref 4115683 passed.\n");
+ } catch (Exception e) {
+ TestLibrary.bomb(e);
+ } finally {
+ if (checkFQDN != null) {
+ TestLibrary.unexport(checkFQDN);
+ }
+ }
+ System.err.println("\nTest for bug/ref 4115683 passed.\n");
}
- /**
+ /**
* Spawn a vm and feed it a property which sets the client's rmi
* hostname.
*/
- public static void testProperty(String property,
- String propertyValue,
- String extraProp)
+ public static void testProperty(String property,
+ String propertyValue,
+ String extraProp)
{
- try {
- String propOption = "";
- String equal = "";
- if (!property.equals("")) {
- propOption = " -D";
- equal = "=";
- }
+ try {
+ String propOption = "";
+ String equal = "";
+ if (!property.equals("")) {
+ propOption = " -D";
+ equal = "=";
+ }
- JavaVM jvm = new JavaVM("CheckFQDNClient",
- propOption + property +
- equal +
- propertyValue + extraProp,
- "");
-
- propertyBeingTested=property;
- propertyBeingTestedValue=propertyValue;
+ JavaVM jvm = new JavaVM("CheckFQDNClient",
+ propOption + property +
+ equal +
+ propertyValue + extraProp,
+ "");
+
+ propertyBeingTested=property;
+ propertyBeingTestedValue=propertyValue;
- // create a client to tell checkFQDN what its rmi name is. */
- jvm.start();
+ // create a client to tell checkFQDN what its rmi name is. */
+ jvm.start();
- if (jvm.getVM().waitFor() != 0 ) {
- TestLibrary.bomb("Test failed, error in client.");
- }
-
- } catch (Exception e) {
- TestLibrary.bomb(e);
- }
+ if (jvm.getVM().waitFor() != 0 ) {
+ TestLibrary.bomb("Test failed, error in client.");
+ }
+
+ } catch (Exception e) {
+ TestLibrary.bomb(e);
+ }
}
CheckFQDN() throws RemoteException { }
- /**
- * Remote method to allow client vm to tell the main test what its
+ /**
+ * Remote method to allow client vm to tell the main test what its
* host name is .
*/
- public void tellServerName(String serverName)
- throws RemoteException {
+ public void tellServerName(String serverName)
+ throws RemoteException {
- if (propertyBeingTested.equals("java.rmi.server.hostname")) {
- if ( !propertyBeingTestedValue.equals(serverName)) {
- TestLibrary.bomb(propertyBeingTested +
- ":\n Client rmi server name does " +
- "not equal the one specified " +
- "by java.rmi.server.hostname: " +
- serverName +" != " +
- propertyBeingTestedValue);
- }
+ if (propertyBeingTested.equals("java.rmi.server.hostname")) {
+ if ( !propertyBeingTestedValue.equals(serverName)) {
+ TestLibrary.bomb(propertyBeingTested +
+ ":\n Client rmi server name does " +
+ "not equal the one specified " +
+ "by java.rmi.server.hostname: " +
+ serverName +" != " +
+ propertyBeingTestedValue);
+ }
- /** use local host name, must contain a '.' */
- } else if (propertyBeingTested.equals
- ("java.rmi.server.useLocalHostname")) {
- if (serverName.indexOf('.') < 0) {
- TestLibrary.bomb(propertyBeingTested +
- ":\nThe client servername contains no '.'");
- }
- } else {
- // no propety set, must be ip address
- if ((serverName.indexOf('.') < 0) ||
- (!Character.isDigit(serverName.charAt(0)))) {
- TestLibrary.bomb("Default name scheme:\n"+
- " The client servername contains no '.'"+
- "or is not an ip address");
- }
- }
- System.err.println("Servername used: " + serverName);
+ /** use local host name, must contain a '.' */
+ } else if (propertyBeingTested.equals
+ ("java.rmi.server.useLocalHostname")) {
+ if (serverName.indexOf('.') < 0) {
+ TestLibrary.bomb(propertyBeingTested +
+ ":\nThe client servername contains no '.'");
+ }
+ } else {
+ // no propety set, must be ip address
+ if ((serverName.indexOf('.') < 0) ||
+ (!Character.isDigit(serverName.charAt(0)))) {
+ TestLibrary.bomb("Default name scheme:\n"+
+ " The client servername contains no '.'"+
+ "or is not an ip address");
+ }
+ }
+ System.err.println("Servername used: " + serverName);
}
}
--- a/jdk/test/java/rmi/transport/checkFQDN/CheckFQDNClient.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/checkFQDN/CheckFQDNClient.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -25,7 +25,7 @@
*
*
* Client that will run in its own vm and tell the main CheckFQDN test
- * program what its rmi host name is, name obtained from TCPEndpoint.
+ * program what its rmi host name is, name obtained from TCPEndpoint.
*/
import java.rmi.*;
@@ -40,72 +40,72 @@
public class CheckFQDNClient implements Runnable {
final static int NAME_SERVICE_TIME_OUT = 12000;
-
+
static TCPEndpoint ep = null;
- /**
+ /**
* main, lookup remote object and tell it the rmi
* hostname of this client vm.
*/
public static void main (String args[]) {
-
- // start a registry and register a copy of this in it.
- TellServerName tell;
- String hostname = null;
-
- try {
- hostname = retrieveServerName();
- System.err.println("Client host name: " +
- hostname);
+
+ // start a registry and register a copy of this in it.
+ TellServerName tell;
+ String hostname = null;
+
+ try {
+ hostname = retrieveServerName();
+ System.err.println("Client host name: " +
+ hostname);
- tell = (TellServerName) Naming.lookup("rmi://:" +
- TestLibrary.REGISTRY_PORT
- + "/CheckFQDN");
- tell.tellServerName(hostname);
- System.err.println("client has exited");
+ tell = (TellServerName) Naming.lookup("rmi://:" +
+ TestLibrary.REGISTRY_PORT
+ + "/CheckFQDN");
+ tell.tellServerName(hostname);
+ System.err.println("client has exited");
- } catch (Exception e ) {
- throw new RuntimeException(e.getMessage());
- }
- System.exit(0);
+ } catch (Exception e ) {
+ throw new RuntimeException(e.getMessage());
+ }
+ System.exit(0);
}
-
+
/* what is the rmi hostname for this vm? */
public static String retrieveServerName () {
- try {
+ try {
+
+ CheckFQDNClient chk = new CheckFQDNClient();
+
+ synchronized(chk) {
+ (new Thread (chk)).start();
+ chk.wait(NAME_SERVICE_TIME_OUT);
+ }
- CheckFQDNClient chk = new CheckFQDNClient();
-
- synchronized(chk) {
- (new Thread (chk)).start();
- chk.wait(NAME_SERVICE_TIME_OUT);
- }
-
- if (ep == null) {
- throw new RuntimeException
- ("Timeout getting the local endpoint.");
- }
-
- // this is the name used by rmi for the client hostname
- return ep.getHost();
-
- }catch (Exception e){
- throw new RuntimeException (e.getMessage());
- }
+ if (ep == null) {
+ throw new RuntimeException
+ ("Timeout getting the local endpoint.");
+ }
+
+ // this is the name used by rmi for the client hostname
+ return ep.getHost();
+
+ }catch (Exception e){
+ throw new RuntimeException (e.getMessage());
+ }
}
/* thread to geth the rmi hostname of this vm */
public void run () {
- try {
- synchronized(this) {
- ep = TCPEndpoint.getLocalEndpoint(0);
- }
- } catch (Exception e) {
- throw new RuntimeException();
- } finally {
- synchronized(this) {
- this.notify();
- }
- }
+ try {
+ synchronized(this) {
+ ep = TCPEndpoint.getLocalEndpoint(0);
+ }
+ } catch (Exception e) {
+ throw new RuntimeException();
+ } finally {
+ synchronized(this) {
+ this.notify();
+ }
+ }
}
}
--- a/jdk/test/java/rmi/transport/checkFQDN/CheckFQDN_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/checkFQDN/CheckFQDN_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,66 +29,66 @@
implements TellServerName, java.rmi.Remote
{
private static java.rmi.server.Operation[] operations = {
- new java.rmi.server.Operation("void tellServerName(java.lang.String)")
+ new java.rmi.server.Operation("void tellServerName(java.lang.String)")
};
-
+
private static final long interfaceHash = 4509625981775855367L;
-
+
private static final long serialVersionUID = 2;
-
+
private static boolean useNewInvoke;
private static java.lang.reflect.Method $method_tellServerName_0;
-
+
static {
- try {
- java.rmi.server.RemoteRef.class.getMethod("invoke",
- new java.lang.Class[] {
- java.rmi.Remote.class,
- java.lang.reflect.Method.class,
- java.lang.Object[].class,
- long.class
- });
- useNewInvoke = true;
- $method_tellServerName_0 = TellServerName.class.getMethod("tellServerName", new java.lang.Class[] {java.lang.String.class});
- } catch (java.lang.NoSuchMethodException e) {
- useNewInvoke = false;
- }
+ try {
+ java.rmi.server.RemoteRef.class.getMethod("invoke",
+ new java.lang.Class[] {
+ java.rmi.Remote.class,
+ java.lang.reflect.Method.class,
+ java.lang.Object[].class,
+ long.class
+ });
+ useNewInvoke = true;
+ $method_tellServerName_0 = TellServerName.class.getMethod("tellServerName", new java.lang.Class[] {java.lang.String.class});
+ } catch (java.lang.NoSuchMethodException e) {
+ useNewInvoke = false;
+ }
}
-
+
// constructors
public CheckFQDN_Stub() {
- super();
+ super();
}
public CheckFQDN_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of tellServerName(String)
public void tellServerName(java.lang.String $param_String_1)
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- ref.invoke(this, $method_tellServerName_0, new java.lang.Object[] {$param_String_1}, -5180633734615762942L);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
- try {
- java.io.ObjectOutput out = call.getOutputStream();
- out.writeObject($param_String_1);
- } catch (java.io.IOException e) {
- throw new java.rmi.MarshalException("error marshalling arguments", e);
- }
- ref.invoke(call);
- ref.done(call);
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ ref.invoke(this, $method_tellServerName_0, new java.lang.Object[] {$param_String_1}, -5180633734615762942L);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
+ try {
+ java.io.ObjectOutput out = call.getOutputStream();
+ out.writeObject($param_String_1);
+ } catch (java.io.IOException e) {
+ throw new java.rmi.MarshalException("error marshalling arguments", e);
+ }
+ ref.invoke(call);
+ ref.done(call);
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/transport/checkFQDN/TellServerName.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/checkFQDN/TellServerName.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -24,7 +24,7 @@
import java.rmi.*;
import java.rmi.server.*;
-/**
+/**
* interface to get server name from an execed vm
* I am using an execed vm because I need to set
* rmi's hostname serveral times with different properties.
@@ -32,4 +32,3 @@
interface TellServerName extends Remote {
void tellServerName (String serverName) throws RemoteException;
}
-
--- a/jdk/test/java/rmi/transport/checkLeaseInfoLeak/CheckLeaseLeak.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/checkLeaseInfoLeak/CheckLeaseLeak.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -44,7 +44,7 @@
* the remote object. Each vmid needs a seperate LeaseInfo object in
* the object table target DGCImpl.leaseTable. If the leak is fixed,
* the leaseTable field will contain no objects. We use reflection to
- * find the number of objects contained in this table.
+ * find the number of objects contained in this table.
*/
import java.rmi.*;
@@ -57,13 +57,13 @@
import java.rmi.registry.*;
public class CheckLeaseLeak extends UnicastRemoteObject implements LeaseLeak {
-
+
public CheckLeaseLeak() throws RemoteException { }
public void ping () throws RemoteException { }
/**
* Id to fake the DGC_ID, so we can later get a reference to the
- * DGCImpl in the object table.
+ * DGCImpl in the object table.
*/
private final static int DGC_ID = 2;
@@ -71,148 +71,148 @@
private final static int numberPingCalls = 0;
private final static int CHECK_INTERVAL = 400;
private final static int LEASE_VALUE = 20;
-
+
public static void main (String[] args) {
- CheckLeaseLeak leakServer = null;
- int numLeft =0;
+ CheckLeaseLeak leakServer = null;
+ int numLeft =0;
- /*
- * we want DGC to collect leases *quickly*
- * decrease the lease check interval
- */
- TestLibrary.setInteger("sun.rmi.dgc.checkInterval",
- CHECK_INTERVAL);
- TestLibrary.setInteger("java.rmi.dgc.leaseValue",
- LEASE_VALUE);
+ /*
+ * we want DGC to collect leases *quickly*
+ * decrease the lease check interval
+ */
+ TestLibrary.setInteger("sun.rmi.dgc.checkInterval",
+ CHECK_INTERVAL);
+ TestLibrary.setInteger("java.rmi.dgc.leaseValue",
+ LEASE_VALUE);
- try {
- Registry registry =
- java.rmi.registry.LocateRegistry.
- createRegistry(TestLibrary.REGISTRY_PORT);
+ try {
+ Registry registry =
+ java.rmi.registry.LocateRegistry.
+ createRegistry(TestLibrary.REGISTRY_PORT);
- leakServer = new CheckLeaseLeak();
- registry.rebind("/LeaseLeak", leakServer);
+ leakServer = new CheckLeaseLeak();
+ registry.rebind("/LeaseLeak", leakServer);
+
+ /* create a bunch of clients in a *different* vm */
+ for (int i = 0 ; i < ITERATIONS ; i ++ ) {
+ System.err.println("Created client: " + i);
- /* create a bunch of clients in a *different* vm */
- for (int i = 0 ; i < ITERATIONS ; i ++ ) {
- System.err.println("Created client: " + i);
-
- JavaVM jvm = new JavaVM("LeaseLeakClient",
- " -Djava.security.policy=" +
- TestParams.defaultPolicy, "");
- jvm.start();
+ JavaVM jvm = new JavaVM("LeaseLeakClient",
+ " -Djava.security.policy=" +
+ TestParams.defaultPolicy, "");
+ jvm.start();
+
+ if (jvm.getVM().waitFor() == 1 ) {
+ TestLibrary.bomb("Client process failed");
+ }
+ }
+ numLeft = getDGCLeaseTableSize();
+ Thread.sleep(3000);
- if (jvm.getVM().waitFor() == 1 ) {
- TestLibrary.bomb("Client process failed");
- }
- }
- numLeft = getDGCLeaseTableSize();
- Thread.sleep(3000);
-
- } catch(Exception e) {
- TestLibrary.bomb("CheckLeaseLeak Error: ", e);
- } finally {
- if (leakServer != null) {
- TestLibrary.unexport(leakServer);
- leakServer = null;
- }
- }
+ } catch(Exception e) {
+ TestLibrary.bomb("CheckLeaseLeak Error: ", e);
+ } finally {
+ if (leakServer != null) {
+ TestLibrary.unexport(leakServer);
+ leakServer = null;
+ }
+ }
- /* numLeft should be 2 - if 11 there is a problem. */
- if (numLeft > 2) {
- TestLibrary.bomb("Too many objects in DGCImpl.leaseTable: "+
- numLeft);
- } else {
- System.err.println("Check leaseInfo leak passed with " +
- numLeft
- + " object(s) in the leaseTable");
- }
+ /* numLeft should be 2 - if 11 there is a problem. */
+ if (numLeft > 2) {
+ TestLibrary.bomb("Too many objects in DGCImpl.leaseTable: "+
+ numLeft);
+ } else {
+ System.err.println("Check leaseInfo leak passed with " +
+ numLeft
+ + " object(s) in the leaseTable");
+ }
}
/**
* Obtain a reference to the main DGCImpl via reflection. Extract
* the DGCImpl using the ObjectTable and the well known ID of the
- * DGCImpl.
+ * DGCImpl.
*/
private static int getDGCLeaseTableSize () {
- int numLeaseInfosLeft = 0;
+ int numLeaseInfosLeft = 0;
+
+ /**
+ * Will eventually be set to point at the leaseTable inside
+ * DGCImpl.
+ */
+ Map leaseTable = null;
+ final Remote[] dgcImpl = new Remote[1];
+ Field f;
+
+ try {
+ f = (Field) java.security.AccessController.doPrivileged
+ (new java.security.PrivilegedExceptionAction() {
+ public Object run() throws Exception {
- /**
- * Will eventually be set to point at the leaseTable inside
- * DGCImpl.
- */
- Map leaseTable = null;
- final Remote[] dgcImpl = new Remote[1];
- Field f;
+ ObjID dgcID = new ObjID(DGC_ID);
- try {
- f = (Field) java.security.AccessController.doPrivileged
- (new java.security.PrivilegedExceptionAction() {
- public Object run() throws Exception {
+ /*
+ * Construct an ObjectEndpoint containing DGC's
+ * ObjID.
+ */
+ Class oeClass =
+ Class.forName("sun.rmi.transport.ObjectEndpoint");
+ Class[] constrParams =
+ new Class[]{ ObjID.class, Transport.class };
+ Constructor oeConstructor =
+ oeClass.getDeclaredConstructor(constrParams);
+ oeConstructor.setAccessible(true);
+ Object oe =
+ oeConstructor.newInstance(
+ new Object[]{ dgcID, null });
- ObjID dgcID = new ObjID(DGC_ID);
-
- /*
- * Construct an ObjectEndpoint containing DGC's
- * ObjID.
- */
- Class oeClass =
- Class.forName("sun.rmi.transport.ObjectEndpoint");
- Class[] constrParams =
- new Class[]{ ObjID.class, Transport.class };
- Constructor oeConstructor =
- oeClass.getDeclaredConstructor(constrParams);
- oeConstructor.setAccessible(true);
- Object oe =
- oeConstructor.newInstance(
- new Object[]{ dgcID, null });
-
- /*
- * Get Target that contains DGCImpl in ObjectTable
- */
- Class objTableClass =
- Class.forName("sun.rmi.transport.ObjectTable");
- Class getTargetParams[] = new Class[] { oeClass };
- Method objTableGetTarget =
- objTableClass.getDeclaredMethod("getTarget",
- getTargetParams);
- objTableGetTarget.setAccessible(true);
- Target dgcTarget = (Target)
- objTableGetTarget.invoke(null, new Object[]{ oe });
-
- /* get the DGCImpl from its Target */
- Method targetGetImpl =
- dgcTarget.getClass().getDeclaredMethod
- ("getImpl", null);
- targetGetImpl.setAccessible(true);
- dgcImpl[0] =
- (Remote) targetGetImpl.invoke(dgcTarget, null);
+ /*
+ * Get Target that contains DGCImpl in ObjectTable
+ */
+ Class objTableClass =
+ Class.forName("sun.rmi.transport.ObjectTable");
+ Class getTargetParams[] = new Class[] { oeClass };
+ Method objTableGetTarget =
+ objTableClass.getDeclaredMethod("getTarget",
+ getTargetParams);
+ objTableGetTarget.setAccessible(true);
+ Target dgcTarget = (Target)
+ objTableGetTarget.invoke(null, new Object[]{ oe });
+
+ /* get the DGCImpl from its Target */
+ Method targetGetImpl =
+ dgcTarget.getClass().getDeclaredMethod
+ ("getImpl", null);
+ targetGetImpl.setAccessible(true);
+ dgcImpl[0] =
+ (Remote) targetGetImpl.invoke(dgcTarget, null);
- /* Get the lease table from the DGCImpl. */
- Field reflectedLeaseTable =
- dgcImpl[0].getClass().getDeclaredField
- ("leaseTable");
- reflectedLeaseTable.setAccessible(true);
+ /* Get the lease table from the DGCImpl. */
+ Field reflectedLeaseTable =
+ dgcImpl[0].getClass().getDeclaredField
+ ("leaseTable");
+ reflectedLeaseTable.setAccessible(true);
- return reflectedLeaseTable;
- }
- });
+ return reflectedLeaseTable;
+ }
+ });
- /**
- * This is the leaseTable that will fill up with LeaseInfo
- * objects if the LeaseInfo memory leak is not fixed.
- */
- leaseTable = (Map) f.get(dgcImpl[0]);
+ /**
+ * This is the leaseTable that will fill up with LeaseInfo
+ * objects if the LeaseInfo memory leak is not fixed.
+ */
+ leaseTable = (Map) f.get(dgcImpl[0]);
- numLeaseInfosLeft = leaseTable.size();
+ numLeaseInfosLeft = leaseTable.size();
- } catch(Exception e) {
- if (e instanceof java.security.PrivilegedActionException)
- e = ((java.security.PrivilegedActionException) e).
- getException();
- TestLibrary.bomb(e);
- }
+ } catch(Exception e) {
+ if (e instanceof java.security.PrivilegedActionException)
+ e = ((java.security.PrivilegedActionException) e).
+ getException();
+ TestLibrary.bomb(e);
+ }
- return numLeaseInfosLeft;
+ return numLeaseInfosLeft;
}
}
--- a/jdk/test/java/rmi/transport/checkLeaseInfoLeak/CheckLeaseLeak_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/checkLeaseInfoLeak/CheckLeaseLeak_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,60 +29,60 @@
implements LeaseLeak, java.rmi.Remote
{
private static java.rmi.server.Operation[] operations = {
- new java.rmi.server.Operation("void ping()")
+ new java.rmi.server.Operation("void ping()")
};
-
+
private static final long interfaceHash = -8409781791984809394L;
-
+
private static final long serialVersionUID = 2;
-
+
private static boolean useNewInvoke;
private static java.lang.reflect.Method $method_ping_0;
-
+
static {
- try {
- java.rmi.server.RemoteRef.class.getMethod("invoke",
- new java.lang.Class[] {
- java.rmi.Remote.class,
- java.lang.reflect.Method.class,
- java.lang.Object[].class,
- long.class
- });
- useNewInvoke = true;
- $method_ping_0 = LeaseLeak.class.getMethod("ping", new java.lang.Class[] {});
- } catch (java.lang.NoSuchMethodException e) {
- useNewInvoke = false;
- }
+ try {
+ java.rmi.server.RemoteRef.class.getMethod("invoke",
+ new java.lang.Class[] {
+ java.rmi.Remote.class,
+ java.lang.reflect.Method.class,
+ java.lang.Object[].class,
+ long.class
+ });
+ useNewInvoke = true;
+ $method_ping_0 = LeaseLeak.class.getMethod("ping", new java.lang.Class[] {});
+ } catch (java.lang.NoSuchMethodException e) {
+ useNewInvoke = false;
+ }
}
-
+
// constructors
public CheckLeaseLeak_Stub() {
- super();
+ super();
}
public CheckLeaseLeak_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of ping()
public void ping()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- ref.invoke(this, $method_ping_0, null, 5866401369815527589L);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
- ref.invoke(call);
- ref.done(call);
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ ref.invoke(this, $method_ping_0, null, 5866401369815527589L);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
+ ref.invoke(call);
+ ref.done(call);
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/transport/checkLeaseInfoLeak/LeaseLeak.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/checkLeaseInfoLeak/LeaseLeak.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
--- a/jdk/test/java/rmi/transport/checkLeaseInfoLeak/LeaseLeakClient.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/checkLeaseInfoLeak/LeaseLeakClient.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -25,24 +25,24 @@
import java.rmi.server.*;
import java.rmi.registry.*;
-public class LeaseLeakClient {
+public class LeaseLeakClient {
public static void main(String args[]) {
- TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
-
- try {
- LeaseLeak leaseLeak = null;
-
- // put a reference on a remote object.
- Registry registry =
- java.rmi.registry.LocateRegistry.getRegistry(
- TestLibrary.REGISTRY_PORT);
- leaseLeak = (LeaseLeak) registry.lookup("/LeaseLeak");
- leaseLeak.ping();
-
- } catch(Exception e) {
- System.err.println("LeaseLeakClient Error: "+e.getMessage());
- e.printStackTrace();
- throw new RuntimeException(e.getMessage());
- }
+ TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
+
+ try {
+ LeaseLeak leaseLeak = null;
+
+ // put a reference on a remote object.
+ Registry registry =
+ java.rmi.registry.LocateRegistry.getRegistry(
+ TestLibrary.REGISTRY_PORT);
+ leaseLeak = (LeaseLeak) registry.lookup("/LeaseLeak");
+ leaseLeak.ping();
+
+ } catch(Exception e) {
+ System.err.println("LeaseLeakClient Error: "+e.getMessage());
+ e.printStackTrace();
+ throw new RuntimeException(e.getMessage());
+ }
}
}
--- a/jdk/test/java/rmi/transport/closeServerSocket/CloseServerSocket.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/closeServerSocket/CloseServerSocket.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -50,80 +50,80 @@
private CloseServerSocket() { }
public static void main(String[] args) throws Exception {
- System.err.println("\nRegression test for bug 4457683\n");
+ System.err.println("\nRegression test for bug 4457683\n");
- verifyPortFree(PORT);
- Registry registry = LocateRegistry.createRegistry(PORT);
- System.err.println("- exported registry: " + registry);
- verifyPortInUse(PORT);
- UnicastRemoteObject.unexportObject(registry, true);
- System.err.println("- unexported registry");
- Thread.sleep(1); // work around BindException (bug?)
- verifyPortFree(PORT);
+ verifyPortFree(PORT);
+ Registry registry = LocateRegistry.createRegistry(PORT);
+ System.err.println("- exported registry: " + registry);
+ verifyPortInUse(PORT);
+ UnicastRemoteObject.unexportObject(registry, true);
+ System.err.println("- unexported registry");
+ Thread.sleep(1); // work around BindException (bug?)
+ verifyPortFree(PORT);
- /*
- * The follow portion of this test is disabled temporarily
- * because 4457683 was partially backed out because of
- * 6269166; for now, only server sockets originally opened for
- * exports on non-anonymous ports will be closed when all of
- * the corresponding remote objects have been exported. A
- * separate bug will be filed to represent the remainder of
- * 4457683 for anonymous-port exports.
- */
+ /*
+ * The follow portion of this test is disabled temporarily
+ * because 4457683 was partially backed out because of
+ * 6269166; for now, only server sockets originally opened for
+ * exports on non-anonymous ports will be closed when all of
+ * the corresponding remote objects have been exported. A
+ * separate bug will be filed to represent the remainder of
+ * 4457683 for anonymous-port exports.
+ */
-// SSF ssf = new SSF();
-// Remote impl = new CloseServerSocket();
-// Remote stub = UnicastRemoteObject.exportObject(impl, 0, null, ssf);
-// System.err.println("- exported object: " + stub);
-// UnicastRemoteObject.unexportObject(impl, true);
-// System.err.println("- unexported object");
-// synchronized (ssf) {
-// if (!ssf.serverSocketClosed) {
-// throw new RuntimeException("TEST FAILED: " +
-// "server socket not closed");
-// }
-// }
+// SSF ssf = new SSF();
+// Remote impl = new CloseServerSocket();
+// Remote stub = UnicastRemoteObject.exportObject(impl, 0, null, ssf);
+// System.err.println("- exported object: " + stub);
+// UnicastRemoteObject.unexportObject(impl, true);
+// System.err.println("- unexported object");
+// synchronized (ssf) {
+// if (!ssf.serverSocketClosed) {
+// throw new RuntimeException("TEST FAILED: " +
+// "server socket not closed");
+// }
+// }
- System.err.println("TEST PASSED");
+ System.err.println("TEST PASSED");
}
private static void verifyPortFree(int port) throws IOException {
- ServerSocket ss = new ServerSocket(PORT);
- ss.close();
- System.err.println("- port " + port + " is free");
+ ServerSocket ss = new ServerSocket(PORT);
+ ss.close();
+ System.err.println("- port " + port + " is free");
}
private static void verifyPortInUse(int port) throws IOException {
- try {
- verifyPortFree(port);
- } catch (BindException e) {
- System.err.println("- port " + port + " is in use");
- return;
- }
+ try {
+ verifyPortFree(port);
+ } catch (BindException e) {
+ System.err.println("- port " + port + " is in use");
+ return;
+ }
}
private static class SSF implements RMIServerSocketFactory {
- boolean serverSocketClosed = false;
- SSF() { };
+ boolean serverSocketClosed = false;
+ SSF() { };
- public ServerSocket createServerSocket(int port) throws IOException {
- return new SS(port);
- }
+ public ServerSocket createServerSocket(int port) throws IOException {
+ return new SS(port);
+ }
- private class SS extends ServerSocket {
- SS(int port) throws IOException {
- super(port);
- System.err.println("- created server socket: " + this);
- };
+ private class SS extends ServerSocket {
+ SS(int port) throws IOException {
+ super(port);
+ System.err.println("- created server socket: " + this);
+ };
- public void close() throws IOException {
- synchronized (SSF.this) {
- serverSocketClosed = true;
- SSF.this.notifyAll();
- }
- System.err.println("- closing server socket: " + this);
- super.close();
- }
- }
+ public void close() throws IOException {
+ synchronized (SSF.this) {
+ serverSocketClosed = true;
+ SSF.this.notifyAll();
+ }
+ System.err.println("- closing server socket: " + this);
+ super.close();
+ }
+ }
}
}
--- a/jdk/test/java/rmi/transport/dgcDeadLock/DGCDeadLock.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/dgcDeadLock/DGCDeadLock.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -46,7 +46,7 @@
* was attempting to lock.
*
* This test causes the above conditions to occur and waits to see if
- * a given set of remote calls finishes "quickly enough."
+ * a given set of remote calls finishes "quickly enough."
*/
import java.rmi.*;
@@ -60,98 +60,98 @@
static DGCDeadLock test = new DGCDeadLock();
static {
- System.setProperty("sun.rmi.transport.cleanInterval", "50");
+ System.setProperty("sun.rmi.transport.cleanInterval", "50");
}
static public void main(String[] args) {
- JavaVM testImplVM = null;
-
- System.err.println("\nregression test for 4118056\n");
- TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
+ JavaVM testImplVM = null;
+
+ System.err.println("\nregression test for 4118056\n");
+ TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
try {
- String options = " -Djava.security.policy=" +
- TestParams.defaultPolicy +
- " -Djava.rmi.dgc.leaseValue=500000" +
- " -Dsun.rmi.dgc.checkInterval=" +
- (HOLD_TARGET_TIME - 5000) + "";
+ String options = " -Djava.security.policy=" +
+ TestParams.defaultPolicy +
+ " -Djava.rmi.dgc.leaseValue=500000" +
+ " -Dsun.rmi.dgc.checkInterval=" +
+ (HOLD_TARGET_TIME - 5000) + "";
- testImplVM = new JavaVM("TestImpl", options, "");
- testImplVM.start();
+ testImplVM = new JavaVM("TestImpl", options, "");
+ testImplVM.start();
- synchronized (test) {
- Thread t = new Thread(test);
- t.setDaemon(true);
- t.start();
+ synchronized (test) {
+ Thread t = new Thread(test);
+ t.setDaemon(true);
+ t.start();
- // wait for the remote calls to take place
- test.wait(TEST_FAIL_TIME);
- }
+ // wait for the remote calls to take place
+ test.wait(TEST_FAIL_TIME);
+ }
- if (!finished) {
- TestLibrary.bomb("Test failed, had exception or exercise" +
- " routines took too long to " +
- "execute");
- }
- System.err.println("Test passed, exercises " +
- "finished in time.");
+ if (!finished) {
+ TestLibrary.bomb("Test failed, had exception or exercise" +
+ " routines took too long to " +
+ "execute");
+ }
+ System.err.println("Test passed, exercises " +
+ "finished in time.");
} catch (Exception e) {
- testImplVM = null;
- TestLibrary.bomb("test failed", e);
+ testImplVM = null;
+ TestLibrary.bomb("test failed", e);
}
}
public void run() {
- try {
- String echo = null;
+ try {
+ String echo = null;
- // give the test remote object time to initialize.
- Thread.currentThread().sleep(8000);
+ // give the test remote object time to initialize.
+ Thread.currentThread().sleep(8000);
- // create a test client
- Test foo = (Test) Naming.lookup("rmi://:" +
- TestLibrary.REGISTRY_PORT +
- "/Foo");
- echo = foo.echo("Hello world");
- System.err.println("Test object created.");
+ // create a test client
+ Test foo = (Test) Naming.lookup("rmi://:" +
+ TestLibrary.REGISTRY_PORT +
+ "/Foo");
+ echo = foo.echo("Hello world");
+ System.err.println("Test object created.");
- /* give TestImpl time to lock the target in the
- * object table and any dirtys finish.
- */
- Thread.currentThread().sleep(5000);
+ /* give TestImpl time to lock the target in the
+ * object table and any dirtys finish.
+ */
+ Thread.currentThread().sleep(5000);
- //unreference "Foo"
- foo = null;
+ //unreference "Foo"
+ foo = null;
+
+ //garbage collect and finalize foo
+ Runtime.getRuntime().gc();
+ Runtime.getRuntime().runFinalization();
- //garbage collect and finalize foo
- Runtime.getRuntime().gc();
- Runtime.getRuntime().runFinalization();
-
- //import "Bar"
- Test bar = (Test) Naming.lookup("rmi://:" +
- TestLibrary.REGISTRY_PORT +
- "/Bar");
-
- /* infinite loop to show the liveness of Client,
- * if we have deadlock remote call will not return
- */
- try {
- for (int i = 0; i < 500; i++) {
- echo = bar.echo("Remote call" + i);
- Thread.sleep(10);
- }
+ //import "Bar"
+ Test bar = (Test) Naming.lookup("rmi://:" +
+ TestLibrary.REGISTRY_PORT +
+ "/Bar");
- // flag exercises finished
- finished = true;
+ /* infinite loop to show the liveness of Client,
+ * if we have deadlock remote call will not return
+ */
+ try {
+ for (int i = 0; i < 500; i++) {
+ echo = bar.echo("Remote call" + i);
+ Thread.sleep(10);
+ }
- } catch (RemoteException e) {
- }
-
- } catch (Exception e) {
- TestLibrary.bomb("test failed", e);
- } finally {
- }
+ // flag exercises finished
+ finished = true;
+
+ } catch (RemoteException e) {
+ }
+
+ } catch (Exception e) {
+ TestLibrary.bomb("test failed", e);
+ } finally {
+ }
}
}
--- a/jdk/test/java/rmi/transport/dgcDeadLock/Test.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/dgcDeadLock/Test.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
--- a/jdk/test/java/rmi/transport/dgcDeadLock/TestImpl.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/dgcDeadLock/TestImpl.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -34,7 +34,7 @@
import java.rmi.registry.*;
import java.rmi.server.*;
-public class TestImpl extends UnicastRemoteObject
+public class TestImpl extends UnicastRemoteObject
implements Test {
static Thread locker = null;
@@ -46,197 +46,197 @@
public String echo(String msg) throws RemoteException {
- if (locker == null) {
- // hold the target if not already held
- locker = lockTargetExpireLeases(foo, DGCDeadLock.HOLD_TARGET_TIME);
- }
+ if (locker == null) {
+ // hold the target if not already held
+ locker = lockTargetExpireLeases(foo, DGCDeadLock.HOLD_TARGET_TIME);
+ }
return "Message received: " + msg;
}
static public void main(String[] args) {
- Registry registry = null;
+ Registry registry = null;
try {
- registry = java.rmi.registry.LocateRegistry.
- createRegistry(TestLibrary.REGISTRY_PORT);
+ registry = java.rmi.registry.LocateRegistry.
+ createRegistry(TestLibrary.REGISTRY_PORT);
- //export "Foo"
- foo = new TestImpl();
- Naming.rebind("rmi://:" +
- TestLibrary.REGISTRY_PORT
- + "/Foo", foo);
+ //export "Foo"
+ foo = new TestImpl();
+ Naming.rebind("rmi://:" +
+ TestLibrary.REGISTRY_PORT
+ + "/Foo", foo);
- try {
- //export "Bar" after leases have been expired.
- bar = new TestImpl();
- Naming.rebind("rmi://localhost:" +
- TestLibrary.REGISTRY_PORT
- + "/Bar", bar);
- } catch (Exception e) {
- throw new RemoteException(e.getMessage());
- }
- Thread.sleep(DGCDeadLock.TEST_FAIL_TIME);
- System.err.println("object vm exiting...");
- System.exit(0);
+ try {
+ //export "Bar" after leases have been expired.
+ bar = new TestImpl();
+ Naming.rebind("rmi://localhost:" +
+ TestLibrary.REGISTRY_PORT
+ + "/Bar", bar);
+ } catch (Exception e) {
+ throw new RemoteException(e.getMessage());
+ }
+ Thread.sleep(DGCDeadLock.TEST_FAIL_TIME);
+ System.err.println("object vm exiting...");
+ System.exit(0);
} catch (Exception e) {
- System.err.println(e.getMessage());
- e.printStackTrace();
+ System.err.println(e.getMessage());
+ e.printStackTrace();
} finally {
- TestLibrary.unexport(registry);
- registry = null;
- }
+ TestLibrary.unexport(registry);
+ registry = null;
+ }
}
static Thread lockTargetExpireLeases(Remote toLock, int timeOut) {
- Thread t = new Thread((Runnable) new TargetLocker(toLock, timeOut));
- t.start();
- return t;
+ Thread t = new Thread((Runnable) new TargetLocker(toLock, timeOut));
+ t.start();
+ return t;
}
static class TargetLocker implements Runnable {
- Remote toLock = null;
- int timeOut = 0;
+ Remote toLock = null;
+ int timeOut = 0;
- TargetLocker(Remote toLock, int timeOut) {
- this.toLock = toLock;
- this.timeOut = timeOut;
- }
+ TargetLocker(Remote toLock, int timeOut) {
+ this.toLock = toLock;
+ this.timeOut = timeOut;
+ }
- public void run() {
- try {
- // give dgc dirty calls time to finish.
- Thread.currentThread().sleep(4000);
+ public void run() {
+ try {
+ // give dgc dirty calls time to finish.
+ Thread.currentThread().sleep(4000);
- java.security.AccessController.
- doPrivileged(new LockTargetCheckLeases(toLock,
- timeOut));
+ java.security.AccessController.
+ doPrivileged(new LockTargetCheckLeases(toLock,
+ timeOut));
- } catch (Exception e) {
- System.err.println(e.getMessage());
- e.printStackTrace();
- System.exit(1);
- }
- }
+ } catch (Exception e) {
+ System.err.println(e.getMessage());
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
}
- static class LockTargetCheckLeases
- implements java.security.PrivilegedAction {
+ static class LockTargetCheckLeases
+ implements java.security.PrivilegedAction {
+
+ Remote toLock = null;
+ int timeOut = 0;
- Remote toLock = null;
- int timeOut = 0;
+ LockTargetCheckLeases(Remote toLock, int timeOut) {
+ this.toLock = toLock;
+ this.timeOut = timeOut;
+ }
- LockTargetCheckLeases(Remote toLock, int timeOut) {
- this.toLock = toLock;
- this.timeOut = timeOut;
- }
+ public Object run() {
+ try {
+
+ Class args[] = new Class[1];
+
+ Class objTableClass = Class.forName
+ ("sun.rmi.transport.ObjectTable");
- public Object run() {
- try {
-
- Class args[] = new Class[1];
-
- Class objTableClass = Class.forName
- ("sun.rmi.transport.ObjectTable");
-
- /* get the Target that corresponds to toLock from the
- * ObjectTable
- */
- args[0] = Class.forName("java.rmi.Remote");
- Method objTableGetTarget =
- objTableClass.getDeclaredMethod("getTarget", args );
- objTableGetTarget.setAccessible(true);
-
- Target lockTarget =
- ((Target) objTableGetTarget.invoke
- (null , new Object [] {toLock} ));
-
- // make sure the lease on this object has expired.
- expireLeases(lockTarget);
-
- // stop other threads from using the target for toLock.
- synchronized (lockTarget) {
- System.err.println("Locked the relevant target, sleeping " +
- timeOut/1000 + " seconds");
- Thread.currentThread().sleep(timeOut);
- System.err.println("Target unlocked");
- }
+ /* get the Target that corresponds to toLock from the
+ * ObjectTable
+ */
+ args[0] = Class.forName("java.rmi.Remote");
+ Method objTableGetTarget =
+ objTableClass.getDeclaredMethod("getTarget", args );
+ objTableGetTarget.setAccessible(true);
+
+ Target lockTarget =
+ ((Target) objTableGetTarget.invoke
+ (null , new Object [] {toLock} ));
+
+ // make sure the lease on this object has expired.
+ expireLeases(lockTarget);
- } catch (Exception e) {
- System.err.println(e.getMessage());
- e.printStackTrace();
- System.exit(1);
- }
- return null;
- }
+ // stop other threads from using the target for toLock.
+ synchronized (lockTarget) {
+ System.err.println("Locked the relevant target, sleeping " +
+ timeOut/1000 + " seconds");
+ Thread.currentThread().sleep(timeOut);
+ System.err.println("Target unlocked");
+ }
+
+ } catch (Exception e) {
+ System.err.println(e.getMessage());
+ e.printStackTrace();
+ System.exit(1);
+ }
+ return null;
+ }
}
/* leases have long values, so no dirty calls which would lock out
* a clean call, but the leases need to expire anyway, so we do it
- * explicitly.
+ * explicitly.
*/
static void expireLeases(Target t) throws Exception {
- final Target target = t;
+ final Target target = t;
+
+ java.security.AccessController.doPrivileged(
- java.security.AccessController.doPrivileged(
+ // put this into another class?
+ new java.security.PrivilegedAction() {
+ public Object run() {
+ try {
+
+ Class DGCClass = Class.forName("sun.rmi.transport.DGCImpl");
+ Method getDGCImpl =
+ DGCClass.getDeclaredMethod("getDGCImpl", null );
+ getDGCImpl.setAccessible(true);
- // put this into another class?
- new java.security.PrivilegedAction() {
- public Object run() {
- try {
+ // make sure the lease on this object has expired.
+ DGC dgcImpl = ((DGC) getDGCImpl.invoke(null, null));
+
+ /* Get the lease table from the DGCImpl. */
+ Field reflectedLeaseTable =
+ dgcImpl.getClass().getDeclaredField("leaseTable");
+ reflectedLeaseTable.setAccessible(true);
+
+ Map leaseTable = (Map) reflectedLeaseTable.get(dgcImpl);
+
+ // dont really need this synchronization...
+ synchronized (leaseTable) {
+ Iterator en = leaseTable.values().iterator();
+ while (en.hasNext()) {
+ Object info = en.next();
- Class DGCClass = Class.forName("sun.rmi.transport.DGCImpl");
- Method getDGCImpl =
- DGCClass.getDeclaredMethod("getDGCImpl", null );
- getDGCImpl.setAccessible(true);
-
- // make sure the lease on this object has expired.
- DGC dgcImpl = ((DGC) getDGCImpl.invoke(null, null));
-
- /* Get the lease table from the DGCImpl. */
- Field reflectedLeaseTable =
- dgcImpl.getClass().getDeclaredField("leaseTable");
- reflectedLeaseTable.setAccessible(true);
-
- Map leaseTable = (Map) reflectedLeaseTable.get(dgcImpl);
-
- // dont really need this synchronization...
- synchronized (leaseTable) {
- Iterator en = leaseTable.values().iterator();
- while (en.hasNext()) {
- Object info = en.next();
-
- /* Get the notifySet in the leaseInfo object. */
- Field notifySetField =
- info.getClass().getDeclaredField("notifySet");
- notifySetField.setAccessible(true);
- HashSet notifySet = (HashSet) notifySetField.get(info);
-
- Iterator iter = notifySet.iterator();
- while (iter.hasNext()) {
- Target notified = (Target) iter.next();
-
- if (notified == target) {
-
- /* Get and set the expiration field from the info object. */
- Field expirationField = info.getClass().
- getDeclaredField("expiration");
- expirationField.setAccessible(true);
- expirationField.setLong(info, 0);
- }
- }
- }
- }
- } catch (Exception e) {
- System.err.println(e.getMessage());
- e.printStackTrace();
- System.exit(1);
- }
- // no interesting return value for this privileged action
- return null;
- }
- });
+ /* Get the notifySet in the leaseInfo object. */
+ Field notifySetField =
+ info.getClass().getDeclaredField("notifySet");
+ notifySetField.setAccessible(true);
+ HashSet notifySet = (HashSet) notifySetField.get(info);
+
+ Iterator iter = notifySet.iterator();
+ while (iter.hasNext()) {
+ Target notified = (Target) iter.next();
+
+ if (notified == target) {
+
+ /* Get and set the expiration field from the info object. */
+ Field expirationField = info.getClass().
+ getDeclaredField("expiration");
+ expirationField.setAccessible(true);
+ expirationField.setLong(info, 0);
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ System.err.println(e.getMessage());
+ e.printStackTrace();
+ System.exit(1);
+ }
+ // no interesting return value for this privileged action
+ return null;
+ }
+ });
}
}
--- a/jdk/test/java/rmi/transport/dgcDeadLock/TestImpl_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/dgcDeadLock/TestImpl_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1998 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,78 +29,78 @@
implements Test, java.rmi.Remote
{
private static final java.rmi.server.Operation[] operations = {
- new java.rmi.server.Operation("java.lang.String echo(java.lang.String)")
+ new java.rmi.server.Operation("java.lang.String echo(java.lang.String)")
};
-
+
private static final long interfaceHash = 8975711176019764637L;
-
+
private static final long serialVersionUID = 2;
-
+
private static boolean useNewInvoke;
private static java.lang.reflect.Method $method_echo_0;
-
+
static {
- try {
- java.rmi.server.RemoteRef.class.getMethod("invoke",
- new java.lang.Class[] {
- java.rmi.Remote.class,
- java.lang.reflect.Method.class,
- java.lang.Object[].class,
- long.class
- });
- useNewInvoke = true;
- $method_echo_0 = Test.class.getMethod("echo", new java.lang.Class[] {java.lang.String.class});
- } catch (java.lang.NoSuchMethodException e) {
- useNewInvoke = false;
- }
+ try {
+ java.rmi.server.RemoteRef.class.getMethod("invoke",
+ new java.lang.Class[] {
+ java.rmi.Remote.class,
+ java.lang.reflect.Method.class,
+ java.lang.Object[].class,
+ long.class
+ });
+ useNewInvoke = true;
+ $method_echo_0 = Test.class.getMethod("echo", new java.lang.Class[] {java.lang.String.class});
+ } catch (java.lang.NoSuchMethodException e) {
+ useNewInvoke = false;
+ }
}
-
+
// constructors
public TestImpl_Stub() {
- super();
+ super();
}
public TestImpl_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of echo(String)
public java.lang.String echo(java.lang.String $param_String_1)
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- Object $result = ref.invoke(this, $method_echo_0, new java.lang.Object[] {$param_String_1}, 5525131960618330777L);
- return ((java.lang.String) $result);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
- try {
- java.io.ObjectOutput out = call.getOutputStream();
- out.writeObject($param_String_1);
- } catch (java.io.IOException e) {
- throw new java.rmi.MarshalException("error marshalling arguments", e);
- }
- ref.invoke(call);
- java.lang.String $result;
- try {
- java.io.ObjectInput in = call.getInputStream();
- $result = (java.lang.String) in.readObject();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } catch (java.lang.ClassNotFoundException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } finally {
- ref.done(call);
- }
- return $result;
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ Object $result = ref.invoke(this, $method_echo_0, new java.lang.Object[] {$param_String_1}, 5525131960618330777L);
+ return ((java.lang.String) $result);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
+ try {
+ java.io.ObjectOutput out = call.getOutputStream();
+ out.writeObject($param_String_1);
+ } catch (java.io.IOException e) {
+ throw new java.rmi.MarshalException("error marshalling arguments", e);
+ }
+ ref.invoke(call);
+ java.lang.String $result;
+ try {
+ java.io.ObjectInput in = call.getInputStream();
+ $result = (java.lang.String) in.readObject();
+ } catch (java.io.IOException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } catch (java.lang.ClassNotFoundException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } finally {
+ ref.done(call);
+ }
+ return $result;
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/transport/handshakeFailure/HandshakeFailure.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/handshakeFailure/HandshakeFailure.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -49,85 +49,85 @@
public static void main(String[] args) throws Exception {
- /*
- * Listen on port...
- */
- ServerSocket serverSocket = new ServerSocket(PORT);
+ /*
+ * Listen on port...
+ */
+ ServerSocket serverSocket = new ServerSocket(PORT);
- /*
- * (Attempt RMI call to port in separate thread.)
- */
- Registry registry = LocateRegistry.getRegistry(PORT);
- Connector connector = new Connector(registry);
- Thread t = new Thread(connector);
- t.setDaemon(true);
- t.start();
+ /*
+ * (Attempt RMI call to port in separate thread.)
+ */
+ Registry registry = LocateRegistry.getRegistry(PORT);
+ Connector connector = new Connector(registry);
+ Thread t = new Thread(connector);
+ t.setDaemon(true);
+ t.start();
- /*
- * ...accept one connection from port and send non-JRMP data.
- */
- Socket socket = serverSocket.accept();
- socket.getOutputStream().write("Wrong way".getBytes());
- socket.close();
+ /*
+ * ...accept one connection from port and send non-JRMP data.
+ */
+ Socket socket = serverSocket.accept();
+ socket.getOutputStream().write("Wrong way".getBytes());
+ socket.close();
- /*
- * Wait for call attempt to finish, and analyze result.
- */
- t.join(TIMEOUT);
- synchronized (connector) {
- if (connector.success) {
- throw new RuntimeException(
- "TEST FAILED: remote call succeeded??");
- }
- if (connector.exception == null) {
- throw new RuntimeException(
- "TEST FAILED: remote call did not time out");
- } else {
- System.err.println("remote call failed with exception:");
- connector.exception.printStackTrace();
- System.err.println();
+ /*
+ * Wait for call attempt to finish, and analyze result.
+ */
+ t.join(TIMEOUT);
+ synchronized (connector) {
+ if (connector.success) {
+ throw new RuntimeException(
+ "TEST FAILED: remote call succeeded??");
+ }
+ if (connector.exception == null) {
+ throw new RuntimeException(
+ "TEST FAILED: remote call did not time out");
+ } else {
+ System.err.println("remote call failed with exception:");
+ connector.exception.printStackTrace();
+ System.err.println();
- if (connector.exception instanceof MarshalException) {
- System.err.println(
- "TEST FAILED: MarshalException thrown, expecting " +
- "java.rmi.ConnectException or ConnectIOException");
- } else if (connector.exception instanceof ConnectException ||
- connector.exception instanceof ConnectIOException)
- {
- System.err.println(
- "TEST PASSED: java.rmi.ConnectException or " +
- "ConnectIOException thrown");
- } else {
- throw new RuntimeException(
- "TEST FAILED: unexpected Exception thrown",
- connector.exception);
- }
- }
- }
+ if (connector.exception instanceof MarshalException) {
+ System.err.println(
+ "TEST FAILED: MarshalException thrown, expecting " +
+ "java.rmi.ConnectException or ConnectIOException");
+ } else if (connector.exception instanceof ConnectException ||
+ connector.exception instanceof ConnectIOException)
+ {
+ System.err.println(
+ "TEST PASSED: java.rmi.ConnectException or " +
+ "ConnectIOException thrown");
+ } else {
+ throw new RuntimeException(
+ "TEST FAILED: unexpected Exception thrown",
+ connector.exception);
+ }
+ }
+ }
}
private static class Connector implements Runnable {
- private final Registry registry;
+ private final Registry registry;
- boolean success = false;
+ boolean success = false;
Exception exception = null;
- Connector(Registry registry) {
- this.registry = registry;
- }
+ Connector(Registry registry) {
+ this.registry = registry;
+ }
- public void run() {
- try {
- registry.lookup("Dale Cooper");
- synchronized (this) {
- success = true;
- }
- } catch (Exception e) {
- synchronized (this) {
- exception = e;
- }
- }
- }
+ public void run() {
+ try {
+ registry.lookup("Dale Cooper");
+ synchronized (this) {
+ success = true;
+ }
+ } catch (Exception e) {
+ synchronized (this) {
+ exception = e;
+ }
+ }
+ }
}
}
--- a/jdk/test/java/rmi/transport/handshakeTimeout/HandshakeTimeout.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/handshakeTimeout/HandshakeTimeout.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -51,81 +51,81 @@
public static void main(String[] args) throws Exception {
- System.setProperty("sun.rmi.transport.tcp.handshakeTimeout",
- String.valueOf(TIMEOUT / 2));
+ System.setProperty("sun.rmi.transport.tcp.handshakeTimeout",
+ String.valueOf(TIMEOUT / 2));
- /*
- * Listen on port, but never process connections made to it.
- */
- ServerSocket serverSocket = new ServerSocket(PORT);
+ /*
+ * Listen on port, but never process connections made to it.
+ */
+ ServerSocket serverSocket = new ServerSocket(PORT);
- /*
- * Attempt RMI call to port in separate thread.
- */
- Registry registry = LocateRegistry.getRegistry(PORT);
- Connector connector = new Connector(registry);
- Thread t = new Thread(connector);
- t.setDaemon(true);
- t.start();
+ /*
+ * Attempt RMI call to port in separate thread.
+ */
+ Registry registry = LocateRegistry.getRegistry(PORT);
+ Connector connector = new Connector(registry);
+ Thread t = new Thread(connector);
+ t.setDaemon(true);
+ t.start();
- /*
- * Wait for call attempt to finished, and analyze result.
- */
- t.join(TIMEOUT);
- synchronized (connector) {
- if (connector.success) {
- throw new RuntimeException(
- "TEST FAILED: remote call succeeded??");
- }
- if (connector.exception == null) {
- throw new RuntimeException(
- "TEST FAILED: remote call did not time out");
- } else {
- System.err.println("remote call failed with exception:");
- connector.exception.printStackTrace();
- System.err.println();
+ /*
+ * Wait for call attempt to finished, and analyze result.
+ */
+ t.join(TIMEOUT);
+ synchronized (connector) {
+ if (connector.success) {
+ throw new RuntimeException(
+ "TEST FAILED: remote call succeeded??");
+ }
+ if (connector.exception == null) {
+ throw new RuntimeException(
+ "TEST FAILED: remote call did not time out");
+ } else {
+ System.err.println("remote call failed with exception:");
+ connector.exception.printStackTrace();
+ System.err.println();
- if (connector.exception instanceof MarshalException) {
- System.err.println(
- "TEST FAILED: MarshalException thrown, expecting " +
- "java.rmi.ConnectException or ConnectIOException");
- } else if (connector.exception instanceof ConnectException ||
- connector.exception instanceof ConnectIOException)
- {
- System.err.println(
- "TEST PASSED: java.rmi.ConnectException or " +
- "ConnectIOException thrown");
- } else {
- throw new RuntimeException(
- "TEST FAILED: unexpected Exception thrown",
- connector.exception);
- }
- }
- }
+ if (connector.exception instanceof MarshalException) {
+ System.err.println(
+ "TEST FAILED: MarshalException thrown, expecting " +
+ "java.rmi.ConnectException or ConnectIOException");
+ } else if (connector.exception instanceof ConnectException ||
+ connector.exception instanceof ConnectIOException)
+ {
+ System.err.println(
+ "TEST PASSED: java.rmi.ConnectException or " +
+ "ConnectIOException thrown");
+ } else {
+ throw new RuntimeException(
+ "TEST FAILED: unexpected Exception thrown",
+ connector.exception);
+ }
+ }
+ }
}
private static class Connector implements Runnable {
- private final Registry registry;
+ private final Registry registry;
- boolean success = false;
+ boolean success = false;
Exception exception = null;
- Connector(Registry registry) {
- this.registry = registry;
- }
+ Connector(Registry registry) {
+ this.registry = registry;
+ }
- public void run() {
- try {
- registry.lookup("Dale Cooper");
- synchronized (this) {
- success = true;
- }
- } catch (Exception e) {
- synchronized (this) {
- exception = e;
- }
- }
- }
+ public void run() {
+ try {
+ registry.lookup("Dale Cooper");
+ synchronized (this) {
+ success = true;
+ }
+ } catch (Exception e) {
+ synchronized (this) {
+ exception = e;
+ }
+ }
+ }
}
}
--- a/jdk/test/java/rmi/transport/httpSocket/HttpSocketTest.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/httpSocket/HttpSocketTest.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -53,65 +53,60 @@
Remote getRemoteObject() throws RemoteException;
}
-public class HttpSocketTest extends UnicastRemoteObject
+public class HttpSocketTest extends UnicastRemoteObject
implements MyRemoteInterface
{
private static final String NAME = "HttpSocketTest";
private static final String REGNAME =
- "//:" + TestLibrary.REGISTRY_PORT + "/" + NAME;
+ "//:" + TestLibrary.REGISTRY_PORT + "/" + NAME;
public HttpSocketTest() throws RemoteException{}
private Remote ro;
public static void main(String[] args)
- throws Exception
+ throws Exception
{
-
- Registry registry = null;
+
+ Registry registry = null;
- TestLibrary.suggestSecurityManager(null);
-
- // Set the socket factory.
- System.err.println("installing socket factory");
- RMISocketFactory.setSocketFactory(new RMIHttpToPortSocketFactory());
+ TestLibrary.suggestSecurityManager(null);
- try {
+ // Set the socket factory.
+ System.err.println("installing socket factory");
+ RMISocketFactory.setSocketFactory(new RMIHttpToPortSocketFactory());
+
+ try {
System.err.println("Starting registry");
registry = LocateRegistry.createRegistry(TestLibrary.REGISTRY_PORT);
} catch (Exception e) {
- TestLibrary.bomb(e);
- }
+ TestLibrary.bomb(e);
+ }
- try {
+ try {
- registry.rebind( NAME, new HttpSocketTest() );
- MyRemoteInterface httpTest =
- (MyRemoteInterface)Naming.lookup( REGNAME );
- httpTest.setRemoteObject( new HttpSocketTest() );
- Remote r = httpTest.getRemoteObject();
+ registry.rebind( NAME, new HttpSocketTest() );
+ MyRemoteInterface httpTest =
+ (MyRemoteInterface)Naming.lookup( REGNAME );
+ httpTest.setRemoteObject( new HttpSocketTest() );
+ Remote r = httpTest.getRemoteObject();
- } catch (Exception e) {
- TestLibrary.bomb(e);
- }
+ } catch (Exception e) {
+ TestLibrary.bomb(e);
+ }
}
public void setRemoteObject( Remote ro ) throws RemoteException {
- this.ro = ro;
+ this.ro = ro;
}
public Remote getRemoteObject() throws RemoteException {
- return( this.ro );
+ return( this.ro );
}
}
-
-
-
-
-
--- a/jdk/test/java/rmi/transport/httpSocket/HttpSocketTest_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/httpSocket/HttpSocketTest_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,102 +29,102 @@
implements MyRemoteInterface, java.rmi.Remote
{
private static final java.rmi.server.Operation[] operations = {
- new java.rmi.server.Operation("java.rmi.Remote getRemoteObject()"),
- new java.rmi.server.Operation("void setRemoteObject(java.rmi.Remote)")
+ new java.rmi.server.Operation("java.rmi.Remote getRemoteObject()"),
+ new java.rmi.server.Operation("void setRemoteObject(java.rmi.Remote)")
};
-
+
private static final long interfaceHash = 3775375480010579665L;
-
+
private static final long serialVersionUID = 2;
-
+
private static boolean useNewInvoke;
private static java.lang.reflect.Method $method_getRemoteObject_0;
private static java.lang.reflect.Method $method_setRemoteObject_1;
-
+
static {
- try {
- java.rmi.server.RemoteRef.class.getMethod("invoke",
- new java.lang.Class[] {
- java.rmi.Remote.class,
- java.lang.reflect.Method.class,
- java.lang.Object[].class,
- long.class
- });
- useNewInvoke = true;
- $method_getRemoteObject_0 = MyRemoteInterface.class.getMethod("getRemoteObject", new java.lang.Class[] {});
- $method_setRemoteObject_1 = MyRemoteInterface.class.getMethod("setRemoteObject", new java.lang.Class[] {java.rmi.Remote.class});
- } catch (java.lang.NoSuchMethodException e) {
- useNewInvoke = false;
- }
+ try {
+ java.rmi.server.RemoteRef.class.getMethod("invoke",
+ new java.lang.Class[] {
+ java.rmi.Remote.class,
+ java.lang.reflect.Method.class,
+ java.lang.Object[].class,
+ long.class
+ });
+ useNewInvoke = true;
+ $method_getRemoteObject_0 = MyRemoteInterface.class.getMethod("getRemoteObject", new java.lang.Class[] {});
+ $method_setRemoteObject_1 = MyRemoteInterface.class.getMethod("setRemoteObject", new java.lang.Class[] {java.rmi.Remote.class});
+ } catch (java.lang.NoSuchMethodException e) {
+ useNewInvoke = false;
+ }
}
-
+
// constructors
public HttpSocketTest_Stub() {
- super();
+ super();
}
public HttpSocketTest_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of getRemoteObject()
public java.rmi.Remote getRemoteObject()
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- Object $result = ref.invoke(this, $method_getRemoteObject_0, null, -2578437860804964265L);
- return ((java.rmi.Remote) $result);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
- ref.invoke(call);
- java.rmi.Remote $result;
- try {
- java.io.ObjectInput in = call.getInputStream();
- $result = (java.rmi.Remote) in.readObject();
- } catch (java.io.IOException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } catch (java.lang.ClassNotFoundException e) {
- throw new java.rmi.UnmarshalException("error unmarshalling return", e);
- } finally {
- ref.done(call);
- }
- return $result;
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ Object $result = ref.invoke(this, $method_getRemoteObject_0, null, -2578437860804964265L);
+ return ((java.rmi.Remote) $result);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 0, interfaceHash);
+ ref.invoke(call);
+ java.rmi.Remote $result;
+ try {
+ java.io.ObjectInput in = call.getInputStream();
+ $result = (java.rmi.Remote) in.readObject();
+ } catch (java.io.IOException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } catch (java.lang.ClassNotFoundException e) {
+ throw new java.rmi.UnmarshalException("error unmarshalling return", e);
+ } finally {
+ ref.done(call);
+ }
+ return $result;
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
-
+
// implementation of setRemoteObject(Remote)
public void setRemoteObject(java.rmi.Remote $param_Remote_1)
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- if (useNewInvoke) {
- ref.invoke(this, $method_setRemoteObject_1, new java.lang.Object[] {$param_Remote_1}, -7518632118115022871L);
- } else {
- java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
- try {
- java.io.ObjectOutput out = call.getOutputStream();
- out.writeObject($param_Remote_1);
- } catch (java.io.IOException e) {
- throw new java.rmi.MarshalException("error marshalling arguments", e);
- }
- ref.invoke(call);
- ref.done(call);
- }
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ if (useNewInvoke) {
+ ref.invoke(this, $method_setRemoteObject_1, new java.lang.Object[] {$param_Remote_1}, -7518632118115022871L);
+ } else {
+ java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject) this, operations, 1, interfaceHash);
+ try {
+ java.io.ObjectOutput out = call.getOutputStream();
+ out.writeObject($param_Remote_1);
+ } catch (java.io.IOException e) {
+ throw new java.rmi.MarshalException("error marshalling arguments", e);
+ }
+ ref.invoke(call);
+ ref.done(call);
+ }
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/transport/pinClientSocketFactory/PinClientSocketFactory.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/pinClientSocketFactory/PinClientSocketFactory.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -60,109 +60,109 @@
private static final int SESSIONS = 50;
public interface Factory extends Remote {
- Session getSession() throws RemoteException;
+ Session getSession() throws RemoteException;
}
public interface Session extends Remote {
- void ping() throws RemoteException;
+ void ping() throws RemoteException;
}
private static class FactoryImpl implements Factory {
- FactoryImpl() { }
- public Session getSession() throws RemoteException {
- Session impl = new SessionImpl();
- UnicastRemoteObject.exportObject(impl, 0, new CSF(), new SSF());
- // return impl instead of stub to work around 4114579
- return impl;
- }
+ FactoryImpl() { }
+ public Session getSession() throws RemoteException {
+ Session impl = new SessionImpl();
+ UnicastRemoteObject.exportObject(impl, 0, new CSF(), new SSF());
+ // return impl instead of stub to work around 4114579
+ return impl;
+ }
}
private static class SessionImpl implements Session {
- SessionImpl() { }
- public void ping() { }
+ SessionImpl() { }
+ public void ping() { }
}
public static void main(String[] args) throws Exception {
- System.err.println("\nRegression test for bug 4486732\n");
+ System.err.println("\nRegression test for bug 4486732\n");
- Factory factoryImpl = new FactoryImpl();
- Factory factoryStub =
- (Factory) UnicastRemoteObject.exportObject(factoryImpl, 0);
- for (int i = 0; i < SESSIONS; i++) {
- Session session = factoryStub.getSession();
- session.ping();
- }
- UnicastRemoteObject.unexportObject(factoryImpl, true);
+ Factory factoryImpl = new FactoryImpl();
+ Factory factoryStub =
+ (Factory) UnicastRemoteObject.exportObject(factoryImpl, 0);
+ for (int i = 0; i < SESSIONS; i++) {
+ Session session = factoryStub.getSession();
+ session.ping();
+ }
+ UnicastRemoteObject.unexportObject(factoryImpl, true);
- Registry registryImpl = LocateRegistry.createRegistry(PORT);
- CSF csf = new CSF();
- Reference<CSF> registryRef = new WeakReference<CSF>(csf);
- Registry registryStub = LocateRegistry.getRegistry("", PORT, csf);
- csf = null;
- registryStub.list();
- registryStub = null;
- UnicastRemoteObject.unexportObject(registryImpl, true);
+ Registry registryImpl = LocateRegistry.createRegistry(PORT);
+ CSF csf = new CSF();
+ Reference<CSF> registryRef = new WeakReference<CSF>(csf);
+ Registry registryStub = LocateRegistry.getRegistry("", PORT, csf);
+ csf = null;
+ registryStub.list();
+ registryStub = null;
+ UnicastRemoteObject.unexportObject(registryImpl, true);
- System.gc();
- // allow connections to time out
- Thread.sleep(3 * Long.getLong("sun.rmi.transport.connectionTimeout",
- 15000));
- System.gc();
+ System.gc();
+ // allow connections to time out
+ Thread.sleep(3 * Long.getLong("sun.rmi.transport.connectionTimeout",
+ 15000));
+ System.gc();
- if (CSF.deserializedInstances.size() != SESSIONS) {
- throw new Error("unexpected number of deserialized instances: " +
- CSF.deserializedInstances.size());
- }
+ if (CSF.deserializedInstances.size() != SESSIONS) {
+ throw new Error("unexpected number of deserialized instances: " +
+ CSF.deserializedInstances.size());
+ }
- int nonNullCount = 0;
- for (Reference<CSF> ref : CSF.deserializedInstances) {
- csf = ref.get();
- if (csf != null) {
- System.err.println("non-null deserialized instance: " + csf);
- nonNullCount++;
- }
- }
- if (nonNullCount > 0) {
- throw new Error("TEST FAILED: " +
- nonNullCount + " non-null deserialized instances");
- }
+ int nonNullCount = 0;
+ for (Reference<CSF> ref : CSF.deserializedInstances) {
+ csf = ref.get();
+ if (csf != null) {
+ System.err.println("non-null deserialized instance: " + csf);
+ nonNullCount++;
+ }
+ }
+ if (nonNullCount > 0) {
+ throw new Error("TEST FAILED: " +
+ nonNullCount + " non-null deserialized instances");
+ }
- csf = registryRef.get();
- if (csf != null) {
- System.err.println("non-null registry instance: " + csf);
- throw new Error("TEST FAILED: non-null registry instance");
- }
+ csf = registryRef.get();
+ if (csf != null) {
+ System.err.println("non-null registry instance: " + csf);
+ throw new Error("TEST FAILED: non-null registry instance");
+ }
- System.err.println("TEST PASSED");
+ System.err.println("TEST PASSED");
}
private static class CSF implements RMIClientSocketFactory, Serializable {
- static final List<Reference<CSF>> deserializedInstances =
- Collections.synchronizedList(new ArrayList<Reference<CSF>>());
- private static final AtomicInteger count = new AtomicInteger(0);
- private int num = count.incrementAndGet();
- CSF() { }
- public Socket createSocket(String host, int port) throws IOException {
- return new Socket(host, port);
- }
- public int hashCode() {
- return num;
- }
- public boolean equals(Object obj) {
- return obj instanceof CSF && ((CSF) obj).num == num;
- }
- private void readObject(ObjectInputStream in)
- throws IOException, ClassNotFoundException
- {
- in.defaultReadObject();
- deserializedInstances.add(new WeakReference<CSF>(this));
- }
+ static final List<Reference<CSF>> deserializedInstances =
+ Collections.synchronizedList(new ArrayList<Reference<CSF>>());
+ private static final AtomicInteger count = new AtomicInteger(0);
+ private int num = count.incrementAndGet();
+ CSF() { }
+ public Socket createSocket(String host, int port) throws IOException {
+ return new Socket(host, port);
+ }
+ public int hashCode() {
+ return num;
+ }
+ public boolean equals(Object obj) {
+ return obj instanceof CSF && ((CSF) obj).num == num;
+ }
+ private void readObject(ObjectInputStream in)
+ throws IOException, ClassNotFoundException
+ {
+ in.defaultReadObject();
+ deserializedInstances.add(new WeakReference<CSF>(this));
+ }
}
private static class SSF implements RMIServerSocketFactory {
- SSF() { }
- public ServerSocket createServerSocket(int port) throws IOException {
- return new ServerSocket(port);
- }
+ SSF() { }
+ public ServerSocket createServerSocket(int port) throws IOException {
+ return new ServerSocket(port);
+ }
}
}
--- a/jdk/test/java/rmi/transport/pinLastArguments/PinLastArguments.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/pinLastArguments/PinLastArguments.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -45,45 +45,45 @@
public class PinLastArguments {
public interface Ping extends Remote {
- void ping(Object first, Object second) throws RemoteException;
+ void ping(Object first, Object second) throws RemoteException;
}
private static class PingImpl implements Ping {
- PingImpl() { }
- public void ping(Object first, Object second) {
- System.err.println("ping invoked: " + first + ", " + second);
- }
+ PingImpl() { }
+ public void ping(Object first, Object second) {
+ System.err.println("ping invoked: " + first + ", " + second);
+ }
}
public static void main(String[] args) throws Exception {
- System.err.println("\nRegression test for bug 6332349\n");
+ System.err.println("\nRegression test for bug 6332349\n");
- Ping impl = new PingImpl();
- Reference<?> ref = new WeakReference<Ping>(impl);
- try {
- Ping stub = (Ping) UnicastRemoteObject.exportObject(impl, 0);
- Object notSerializable = new Object();
- stub.ping(impl, null);
- try {
- stub.ping(impl, notSerializable);
- } catch (MarshalException e) {
- if (e.getCause() instanceof NotSerializableException) {
- System.err.println("ping invocation failed as expected");
- } else {
- throw e;
- }
- }
- } finally {
- UnicastRemoteObject.unexportObject(impl, true);
- }
- impl = null;
+ Ping impl = new PingImpl();
+ Reference<?> ref = new WeakReference<Ping>(impl);
+ try {
+ Ping stub = (Ping) UnicastRemoteObject.exportObject(impl, 0);
+ Object notSerializable = new Object();
+ stub.ping(impl, null);
+ try {
+ stub.ping(impl, notSerializable);
+ } catch (MarshalException e) {
+ if (e.getCause() instanceof NotSerializableException) {
+ System.err.println("ping invocation failed as expected");
+ } else {
+ throw e;
+ }
+ }
+ } finally {
+ UnicastRemoteObject.unexportObject(impl, true);
+ }
+ impl = null;
- System.gc();
+ System.gc();
- if (ref.get() != null) {
- throw new Error("TEST FAILED: impl not garbage collected");
- }
+ if (ref.get() != null) {
+ throw new Error("TEST FAILED: impl not garbage collected");
+ }
- System.err.println("TEST PASSED");
+ System.err.println("TEST PASSED");
}
}
--- a/jdk/test/java/rmi/transport/rapidExportUnexport/RapidExportUnexport.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/rapidExportUnexport/RapidExportUnexport.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -46,22 +46,22 @@
private static final long TIMEOUT = 60000;
public static void main(String[] args) throws Exception {
- System.err.println("\nRegression test for bug 6275081\n");
+ System.err.println("\nRegression test for bug 6275081\n");
- Remote impl = new Remote() { };
- long start = System.currentTimeMillis();
- for (int i = 0; i < REPS; i++) {
- System.err.println(i);
- UnicastRemoteObject.exportObject(impl, PORT);
- UnicastRemoteObject.unexportObject(impl, true);
- Thread.sleep(1); // work around BindException (bug?)
- }
- long delta = System.currentTimeMillis() - start;
- System.err.println(REPS + " export/unexport operations took " +
- delta + "ms");
- if (delta > TIMEOUT) {
- throw new Error("TEST FAILED: took over " + TIMEOUT + "ms");
- }
- System.err.println("TEST PASSED");
+ Remote impl = new Remote() { };
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < REPS; i++) {
+ System.err.println(i);
+ UnicastRemoteObject.exportObject(impl, PORT);
+ UnicastRemoteObject.unexportObject(impl, true);
+ Thread.sleep(1); // work around BindException (bug?)
+ }
+ long delta = System.currentTimeMillis() - start;
+ System.err.println(REPS + " export/unexport operations took " +
+ delta + "ms");
+ if (delta > TIMEOUT) {
+ throw new Error("TEST FAILED: took over " + TIMEOUT + "ms");
+ }
+ System.err.println("TEST PASSED");
}
}
--- a/jdk/test/java/rmi/transport/readTimeout/ReadTimeoutTest.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/readTimeout/ReadTimeoutTest.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -50,134 +50,134 @@
public class ReadTimeoutTest
{
- private static final int DELAY = 5000; // milliseconds
+ private static final int DELAY = 5000; // milliseconds
public static void main(String[] args)
- throws Exception
+ throws Exception
{
- // Make trouble for ourselves
- if (System.getSecurityManager() == null)
- System.setSecurityManager(new RMISecurityManager());
-
- // Flaky code alert - hope this is executed before TCPTransport.<clinit>
- System.setProperty("sun.rmi.transport.tcp.readTimeout", Integer.toString(DELAY));
+ // Make trouble for ourselves
+ if (System.getSecurityManager() == null)
+ System.setSecurityManager(new RMISecurityManager());
+
+ // Flaky code alert - hope this is executed before TCPTransport.<clinit>
+ System.setProperty("sun.rmi.transport.tcp.readTimeout", Integer.toString(DELAY));
+
+ // Set the socket factory.
+ System.err.println("(installing socket factory)");
+ SomeFactory fac = new SomeFactory();
+ RMISocketFactory.setSocketFactory(fac);
- // Set the socket factory.
- System.err.println("(installing socket factory)");
- SomeFactory fac = new SomeFactory();
- RMISocketFactory.setSocketFactory(fac);
+ // Create remote object
+ TestImpl impl = new TestImpl();
- // Create remote object
- TestImpl impl = new TestImpl();
+ // Export and get which port.
+ System.err.println("(exporting remote object)");
+ TestIface stub = impl.export();
+ Socket DoS = null;
+ try {
+ int port = fac.whichPort();
- // Export and get which port.
- System.err.println("(exporting remote object)");
- TestIface stub = impl.export();
- Socket DoS = null;
- try {
- int port = fac.whichPort();
+ // Sanity
+ if (port == 0)
+ throw new Error("TEST FAILED: export didn't reserve a port(?)");
- // Sanity
- if (port == 0)
- throw new Error("TEST FAILED: export didn't reserve a port(?)");
-
- // Now, connect to that port
- //Thread.sleep(2000);
- System.err.println("(connecting to listening port on 127.0.0.1:" +
- port + ")");
- DoS = new Socket("127.0.0.1", port);
- InputStream stream = DoS.getInputStream();
+ // Now, connect to that port
+ //Thread.sleep(2000);
+ System.err.println("(connecting to listening port on 127.0.0.1:" +
+ port + ")");
+ DoS = new Socket("127.0.0.1", port);
+ InputStream stream = DoS.getInputStream();
- // Read on the socket in the background
- boolean[] successful = new boolean[] { false };
- (new SomeReader(stream, successful)).start();
+ // Read on the socket in the background
+ boolean[] successful = new boolean[] { false };
+ (new SomeReader(stream, successful)).start();
- // Wait for completion
- int nretries = 4;
- while (nretries-- > 0) {
- if (successful[0])
- break;
- Thread.sleep(DELAY);
- }
+ // Wait for completion
+ int nretries = 4;
+ while (nretries-- > 0) {
+ if (successful[0])
+ break;
+ Thread.sleep(DELAY);
+ }
- if (successful[0]) {
- System.err.println("TEST PASSED.");
- } else {
- throw new Error("TEST FAILED.");
- }
+ if (successful[0]) {
+ System.err.println("TEST PASSED.");
+ } else {
+ throw new Error("TEST FAILED.");
+ }
- } finally {
- try {
- if (DoS != null)
- DoS.close(); // aborts the reader if still blocked
- impl.unexport();
- } catch (Throwable unmatter) {
- }
- }
+ } finally {
+ try {
+ if (DoS != null)
+ DoS.close(); // aborts the reader if still blocked
+ impl.unexport();
+ } catch (Throwable unmatter) {
+ }
+ }
- // Should exit here
+ // Should exit here
}
private static class SomeFactory
- extends RMISocketFactory
+ extends RMISocketFactory
{
- private int servport = 0;
+ private int servport = 0;
- public Socket createSocket(String h, int p)
- throws IOException
- {
- return (new Socket(h, p));
- }
+ public Socket createSocket(String h, int p)
+ throws IOException
+ {
+ return (new Socket(h, p));
+ }
- /** Create a server socket and remember which port it's on.
- * Aborts if createServerSocket(0) is called twice, because then
- * it doesn't know whether to remember the first or second port.
- */
- public ServerSocket createServerSocket(int p)
- throws IOException
- {
- ServerSocket ss;
- ss = new ServerSocket(p);
- if (p == 0) {
- if (servport != 0) {
- System.err.println("TEST FAILED: " +
- "Duplicate createServerSocket(0)");
- throw new Error("Test aborted (createServerSocket)");
- }
- servport = ss.getLocalPort();
- }
- return (ss);
- }
+ /** Create a server socket and remember which port it's on.
+ * Aborts if createServerSocket(0) is called twice, because then
+ * it doesn't know whether to remember the first or second port.
+ */
+ public ServerSocket createServerSocket(int p)
+ throws IOException
+ {
+ ServerSocket ss;
+ ss = new ServerSocket(p);
+ if (p == 0) {
+ if (servport != 0) {
+ System.err.println("TEST FAILED: " +
+ "Duplicate createServerSocket(0)");
+ throw new Error("Test aborted (createServerSocket)");
+ }
+ servport = ss.getLocalPort();
+ }
+ return (ss);
+ }
- /** Return which port was reserved by createServerSocket(0).
- * If the return value was 0, createServerSocket(0) wasn't called.
- */
- public int whichPort() {
- return (servport);
- }
+ /** Return which port was reserved by createServerSocket(0).
+ * If the return value was 0, createServerSocket(0) wasn't called.
+ */
+ public int whichPort() {
+ return (servport);
+ }
} // end class SomeFactory
protected static class SomeReader extends Thread {
- private InputStream readon;
- private boolean[] vec;
+ private InputStream readon;
+ private boolean[] vec;
- public SomeReader(InputStream s, boolean[] successvec) {
- super();
- this.setDaemon(true);
- this.readon = s;
- this.vec = successvec;
- }
+ public SomeReader(InputStream s, boolean[] successvec) {
+ super();
+ this.setDaemon(true);
+ this.readon = s;
+ this.vec = successvec;
+ }
- public void run() {
- try {
- int c = this.readon.read();
- if (c != -1)
- throw new Error ("Server returned " + c);
- this.vec[0] = true;
+ public void run() {
+ try {
+ int c = this.readon.read();
+ if (c != -1)
+ throw new Error ("Server returned " + c);
+ this.vec[0] = true;
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
} // end class SomeReader
}
--- a/jdk/test/java/rmi/transport/readTimeout/TestIface.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/readTimeout/TestIface.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -27,5 +27,5 @@
extends Remote
{
public String testCall(String ign)
- throws RemoteException;
+ throws RemoteException;
}
--- a/jdk/test/java/rmi/transport/readTimeout/TestImpl.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/readTimeout/TestImpl.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -32,19 +32,18 @@
}
public TestIface export()
- throws RemoteException
+ throws RemoteException
{
- return (TestIface)UnicastRemoteObject.exportObject(this);
+ return (TestIface)UnicastRemoteObject.exportObject(this);
}
public void unexport()
- throws NoSuchObjectException
+ throws NoSuchObjectException
{
- UnicastRemoteObject.unexportObject(this, true);
+ UnicastRemoteObject.unexportObject(this, true);
}
public String testCall(String ign) {
- return ("OK");
+ return ("OK");
}
}
-
--- a/jdk/test/java/rmi/transport/readTimeout/TestImpl_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/readTimeout/TestImpl_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,38 +29,38 @@
implements TestIface
{
private static final long serialVersionUID = 2;
-
+
private static java.lang.reflect.Method $method_testCall_0;
-
+
static {
- try {
- $method_testCall_0 = TestIface.class.getMethod("testCall", new java.lang.Class[] {java.lang.String.class});
- } catch (java.lang.NoSuchMethodException e) {
- throw new java.lang.NoSuchMethodError(
- "stub class initialization failed");
- }
+ try {
+ $method_testCall_0 = TestIface.class.getMethod("testCall", new java.lang.Class[] {java.lang.String.class});
+ } catch (java.lang.NoSuchMethodException e) {
+ throw new java.lang.NoSuchMethodError(
+ "stub class initialization failed");
+ }
}
-
+
// constructors
public TestImpl_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
// methods from remote interfaces
-
+
// implementation of testCall(String)
public java.lang.String testCall(java.lang.String $param_String_1)
- throws java.rmi.RemoteException
+ throws java.rmi.RemoteException
{
- try {
- Object $result = ref.invoke(this, $method_testCall_0, new java.lang.Object[] {$param_String_1}, -4495720265115653109L);
- return ((java.lang.String) $result);
- } catch (java.lang.RuntimeException e) {
- throw e;
- } catch (java.rmi.RemoteException e) {
- throw e;
- } catch (java.lang.Exception e) {
- throw new java.rmi.UnexpectedException("undeclared checked exception", e);
- }
+ try {
+ Object $result = ref.invoke(this, $method_testCall_0, new java.lang.Object[] {$param_String_1}, -4495720265115653109L);
+ return ((java.lang.String) $result);
+ } catch (java.lang.RuntimeException e) {
+ throw e;
+ } catch (java.rmi.RemoteException e) {
+ throw e;
+ } catch (java.lang.Exception e) {
+ throw new java.rmi.UnexpectedException("undeclared checked exception", e);
+ }
}
}
--- a/jdk/test/java/rmi/transport/reuseDefaultPort/ReuseDefaultPort.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/reuseDefaultPort/ReuseDefaultPort.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -53,32 +53,32 @@
private ReuseDefaultPort() { }
public static void main(String[] args) throws Exception {
- System.err.println("\nRegression test for bug 6269166\n");
- RMISocketFactory.setSocketFactory(new SF());
- Remote impl = new ReuseDefaultPort();
- Remote stub = UnicastRemoteObject.exportObject(impl, 0);
- System.err.println("- exported object: " + stub);
- try {
- Registry registry = LocateRegistry.createRegistry(PORT);
- System.err.println("- exported registry: " + registry);
- System.err.println("TEST PASSED");
- } finally {
- UnicastRemoteObject.unexportObject(impl, true);
- }
+ System.err.println("\nRegression test for bug 6269166\n");
+ RMISocketFactory.setSocketFactory(new SF());
+ Remote impl = new ReuseDefaultPort();
+ Remote stub = UnicastRemoteObject.exportObject(impl, 0);
+ System.err.println("- exported object: " + stub);
+ try {
+ Registry registry = LocateRegistry.createRegistry(PORT);
+ System.err.println("- exported registry: " + registry);
+ System.err.println("TEST PASSED");
+ } finally {
+ UnicastRemoteObject.unexportObject(impl, true);
+ }
}
private static class SF extends RMISocketFactory {
- private static RMISocketFactory defaultFactory =
- RMISocketFactory.getDefaultSocketFactory();
- SF() { }
- public Socket createSocket(String host, int port) throws IOException {
- return defaultFactory.createSocket(host, port);
- }
- public ServerSocket createServerSocket(int port) throws IOException {
- if (port == 0) {
- port = PORT;
- }
- return defaultFactory.createServerSocket(port);
- }
+ private static RMISocketFactory defaultFactory =
+ RMISocketFactory.getDefaultSocketFactory();
+ SF() { }
+ public Socket createSocket(String host, int port) throws IOException {
+ return defaultFactory.createSocket(host, port);
+ }
+ public ServerSocket createServerSocket(int port) throws IOException {
+ if (port == 0) {
+ port = PORT;
+ }
+ return defaultFactory.createServerSocket(port);
+ }
}
}
--- a/jdk/test/java/rmi/transport/runtimeThreadInheritanceLeak/RuntimeThreadInheritanceLeak.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/runtimeThreadInheritanceLeak/RuntimeThreadInheritanceLeak.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001-2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -60,80 +60,80 @@
public static void main(String[] args) {
- System.err.println("\nRegression test for bug 4404702\n");
+ System.err.println("\nRegression test for bug 4404702\n");
- /*
- * HACK: Work around the fact that java.util.logging.LogManager's
- * (singleton) construction also has this bug-- it will register a
- * "shutdown hook", i.e. a thread, which will inherit and pin the
- * current thread's context class loader for the lifetime of the VM--
- * by causing the LogManager to be initialized now, instead of by
- * RMI when our special context class loader is set.
- */
- java.util.logging.LogManager.getLogManager();
+ /*
+ * HACK: Work around the fact that java.util.logging.LogManager's
+ * (singleton) construction also has this bug-- it will register a
+ * "shutdown hook", i.e. a thread, which will inherit and pin the
+ * current thread's context class loader for the lifetime of the VM--
+ * by causing the LogManager to be initialized now, instead of by
+ * RMI when our special context class loader is set.
+ */
+ java.util.logging.LogManager.getLogManager();
- /*
- * HACK: Work around the fact that the non-native, thread-based
- * SecureRandom seed generator (ThreadedSeedGenerator) seems to
- * have this bug too (which had been causing this test to fail
- * when run with jtreg on Windows XP-- see 4910382).
- */
- (new java.security.SecureRandom()).nextInt();
+ /*
+ * HACK: Work around the fact that the non-native, thread-based
+ * SecureRandom seed generator (ThreadedSeedGenerator) seems to
+ * have this bug too (which had been causing this test to fail
+ * when run with jtreg on Windows XP-- see 4910382).
+ */
+ (new java.security.SecureRandom()).nextInt();
- RuntimeThreadInheritanceLeak obj = new RuntimeThreadInheritanceLeak();
+ RuntimeThreadInheritanceLeak obj = new RuntimeThreadInheritanceLeak();
- try {
- ClassLoader loader = URLClassLoader.newInstance(new URL[0]);
- ReferenceQueue refQueue = new ReferenceQueue();
- Reference loaderRef = new WeakReference(loader, refQueue);
- System.err.println("created loader: " + loader);
+ try {
+ ClassLoader loader = URLClassLoader.newInstance(new URL[0]);
+ ReferenceQueue refQueue = new ReferenceQueue();
+ Reference loaderRef = new WeakReference(loader, refQueue);
+ System.err.println("created loader: " + loader);
- Thread.currentThread().setContextClassLoader(loader);
- UnicastRemoteObject.exportObject(obj);
- Thread.currentThread().setContextClassLoader(
- ClassLoader.getSystemClassLoader());
- System.err.println(
- "exported remote object with loader as context class loader");
+ Thread.currentThread().setContextClassLoader(loader);
+ UnicastRemoteObject.exportObject(obj);
+ Thread.currentThread().setContextClassLoader(
+ ClassLoader.getSystemClassLoader());
+ System.err.println(
+ "exported remote object with loader as context class loader");
- loader = null;
- System.err.println("nulled strong reference to loader");
+ loader = null;
+ System.err.println("nulled strong reference to loader");
- UnicastRemoteObject.unexportObject(obj, true);
- System.err.println("unexported remote object");
+ UnicastRemoteObject.unexportObject(obj, true);
+ System.err.println("unexported remote object");
- /*
- * HACK: Work around the fact that the sun.misc.GC daemon thread
- * also has this bug-- it will have inherited our loader as its
- * context class loader-- by giving it a chance to pass away.
- */
- Thread.sleep(2000);
- System.gc();
+ /*
+ * HACK: Work around the fact that the sun.misc.GC daemon thread
+ * also has this bug-- it will have inherited our loader as its
+ * context class loader-- by giving it a chance to pass away.
+ */
+ Thread.sleep(2000);
+ System.gc();
- System.err.println(
- "waiting to be notified of loader being weakly reachable...");
- Reference dequeued = refQueue.remove(TIMEOUT);
- if (dequeued == null) {
- System.err.println(
- "TEST FAILED: loader not deteced weakly reachable");
- dumpThreads();
- throw new RuntimeException(
- "TEST FAILED: loader not detected weakly reachable");
- }
+ System.err.println(
+ "waiting to be notified of loader being weakly reachable...");
+ Reference dequeued = refQueue.remove(TIMEOUT);
+ if (dequeued == null) {
+ System.err.println(
+ "TEST FAILED: loader not deteced weakly reachable");
+ dumpThreads();
+ throw new RuntimeException(
+ "TEST FAILED: loader not detected weakly reachable");
+ }
- System.err.println(
- "TEST PASSED: loader detected weakly reachable");
- dumpThreads();
+ System.err.println(
+ "TEST PASSED: loader detected weakly reachable");
+ dumpThreads();
- } catch (RuntimeException e) {
- throw e;
- } catch (Exception e) {
- throw new RuntimeException("TEST FAILED: unexpected exception", e);
- } finally {
- try {
- UnicastRemoteObject.unexportObject(obj, true);
- } catch (RemoteException e) {
- }
- }
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new RuntimeException("TEST FAILED: unexpected exception", e);
+ } finally {
+ try {
+ UnicastRemoteObject.unexportObject(obj, true);
+ } catch (RemoteException e) {
+ }
+ }
}
/**
@@ -141,19 +141,19 @@
* including their context class loaders.
**/
private static void dumpThreads() {
- System.err.println(
- "current live threads and their context class loaders:");
- Map threads = Thread.getAllStackTraces();
- for (Iterator iter = threads.entrySet().iterator(); iter.hasNext();) {
- Map.Entry e = (Map.Entry) iter.next();
- Thread t = (Thread) e.getKey();
- System.err.println(" thread: " + t);
- System.err.println(" context class loader: " +
- t.getContextClassLoader());
- StackTraceElement[] trace = (StackTraceElement[]) e.getValue();
- for (int i = 0; i < trace.length; i++) {
- System.err.println(" " + trace[i]);
- }
- }
+ System.err.println(
+ "current live threads and their context class loaders:");
+ Map threads = Thread.getAllStackTraces();
+ for (Iterator iter = threads.entrySet().iterator(); iter.hasNext();) {
+ Map.Entry e = (Map.Entry) iter.next();
+ Thread t = (Thread) e.getKey();
+ System.err.println(" thread: " + t);
+ System.err.println(" context class loader: " +
+ t.getContextClassLoader());
+ StackTraceElement[] trace = (StackTraceElement[]) e.getValue();
+ for (int i = 0; i < trace.length; i++) {
+ System.err.println(" " + trace[i]);
+ }
+ }
}
}
--- a/jdk/test/java/rmi/transport/runtimeThreadInheritanceLeak/RuntimeThreadInheritanceLeak_Stub.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/java/rmi/transport/runtimeThreadInheritanceLeak/RuntimeThreadInheritanceLeak_Stub.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,10 +29,10 @@
implements java.rmi.Remote
{
private static final long serialVersionUID = 2;
-
+
// constructors
public RuntimeThreadInheritanceLeak_Stub(java.rmi.server.RemoteRef ref) {
- super(ref);
+ super(ref);
}
-
+
}
--- a/jdk/test/javax/crypto/Cipher/TestGetInstance.java Wed Apr 09 15:30:44 2008 +0100
+++ b/jdk/test/javax/crypto/Cipher/TestGetInstance.java Tue Apr 15 17:48:22 2008 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -46,9 +46,7 @@
Cipher c;
- c = Cipher.getInstance("des");
- same(p, c.getProvider());
- c = Cipher.getInstance("des/cbc/pkcs5padding");
+ c = Cipher.getInstance("PBEWithMD5AndTripleDES");
same(p, c.getProvider());
c = Cipher.getInstance("des", "SunJCE");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/management/modelmbean/LoggingExceptionTest.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,81 @@
+/*
+ * @test
+ * @bug 6471865 6675768
+ * @summary DescriptorSupport constructors throw IAE when traces are enabled;
+ * RequiredModelMBean.addAttributeChangeNotificationListener throws exception
+ * when traces enabled and no attributes.
+ * @author Luis-Miguel Alventosa
+ * @author Paul Cheeseman
+ */
+
+import java.util.logging.ConsoleHandler;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.management.Notification;
+import javax.management.NotificationListener;
+import javax.management.modelmbean.DescriptorSupport;
+import javax.management.modelmbean.RequiredModelMBean;
+
+public class LoggingExceptionTest {
+ private static final String tests[] = new String[] {
+ "DescriptorSupport()",
+ "DescriptorSupport(int)",
+ "DescriptorSupport(String)",
+ "DescriptorSupport(String...)",
+ "DescriptorSupport(String[], Object[])",
+ "DescriptorSupport(DescriptorSupport)",
+ "RequiredModelMBean.addAttributeChangeNotificationListener",
+ };
+ public static void main(String[] args) {
+ Handler handler = new ConsoleHandler();
+ Logger logger = Logger.getLogger("javax.management.modelmbean");
+ logger.addHandler(handler);
+ logger.setLevel(Level.FINEST);
+ try {
+ for (int i = 0; i < tests.length; i++) {
+ System.out.println(">>> DescriptorSupportLoggingTest: Test Case " + i);
+ DescriptorSupport ds;
+ String msg = "Instantiate " + tests[i];
+ System.out.println(msg);
+ switch (i) {
+ case 0:
+ ds = new DescriptorSupport();
+ break;
+ case 1:
+ ds = new DescriptorSupport(10);
+ break;
+ case 2:
+ ds = new DescriptorSupport(new DescriptorSupport().toXMLString());
+ break;
+ case 3:
+ ds = new DescriptorSupport("name1=value1", "name2=value2");
+ break;
+ case 4:
+ ds = new DescriptorSupport(new String[] {"name"}, new Object[] {"value"});
+ break;
+ case 5:
+ ds = new DescriptorSupport(new DescriptorSupport());
+ break;
+ case 6:
+ RequiredModelMBean mbean = new RequiredModelMBean();
+ NotificationListener nl = new NotificationListener() {
+ public void handleNotification(Notification notification,
+ Object handback) {}
+ };
+ mbean.addAttributeChangeNotificationListener(nl, null, null);
+ break;
+ default:
+ throw new AssertionError();
+ }
+ System.out.println(msg + " OK");
+ }
+ } catch (Exception e) {
+ System.out.println("Got unexpected exception = " + e);
+ String msg = "Test FAILED!";
+ System.out.println(msg);
+ throw new IllegalArgumentException(msg);
+ }
+ System.out.println("Test PASSED!");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/management/query/QueryNotifFilterTest.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,347 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test QueryNotifFilterTest
+ * @bug 6610917
+ * @summary Test the QueryNotificationFilter class
+ * @author Eamonn McManus
+ */
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import javax.management.Attribute;
+import javax.management.AttributeChangeNotification;
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanInfo;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.Notification;
+import javax.management.NotificationFilter;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+import javax.management.Query;
+import javax.management.QueryEval;
+import javax.management.QueryExp;
+import javax.management.QueryNotificationFilter;
+
+public class QueryNotifFilterTest {
+ private static class Case {
+ final Notification notif;
+ final QueryExp query;
+ final boolean expect;
+ final Class<? extends Notification> notifClass;
+ Case(Notification notif, String query, boolean expect) {
+ this(notif, query, notif.getClass(), expect);
+ }
+ Case(Notification notif, String query,
+ Class<? extends Notification> notifClass, boolean expect) {
+ this(notif, Query.fromString(query), notifClass, expect);
+ }
+ Case(Notification notif, QueryExp query, boolean expect) {
+ this(notif, query, notif.getClass(), expect);
+ }
+ Case(Notification notif, QueryExp query,
+ Class<? extends Notification> notifClass, boolean expect) {
+ this.notif = notif;
+ this.query = query;
+ this.expect = expect;
+ this.notifClass = notifClass;
+ }
+ }
+
+ /* In principle users can create their own implementations of QueryExp
+ * and use them with QueryNotificationFilter. If they do so, then
+ * they can call any MBeanServer method. Not all of those methods
+ * will work with the special MBeanServer we concoct to analyze a
+ * Notification, but some will, including some that are not called
+ * by the standard queries. So we check each of those cases too.
+ */
+ private static class ExoticCase {
+ final Notification trueNotif;
+ final Notification falseNotif;
+ final QueryExp query;
+ ExoticCase(Notification trueNotif, Notification falseNotif, QueryExp query) {
+ this.trueNotif = trueNotif;
+ this.falseNotif = falseNotif;
+ this.query = query;
+ }
+ }
+
+ private static abstract class ExoticQuery
+ extends QueryEval implements QueryExp {
+ private final String queryString;
+ ExoticQuery(String queryString) {
+ this.queryString = queryString;
+ }
+ abstract boolean apply(MBeanServer mbs, ObjectName name) throws Exception;
+ @Override
+ public boolean apply(ObjectName name) {
+ try {
+ return apply(getMBeanServer(), name);
+ } catch (Exception e) {
+ e.printStackTrace(System.out);
+ return false;
+ }
+ }
+ @Override
+ public String toString() {
+ return queryString;
+ }
+ }
+
+ private static ObjectName makeObjectName(String s) {
+ try {
+ return new ObjectName(s);
+ } catch (MalformedObjectNameException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static class CustomNotification extends Notification {
+ public CustomNotification(String type, Object source, long seqNo) {
+ super(type, source, seqNo);
+ }
+
+ public String getName() {
+ return "claude";
+ }
+
+ public boolean isInteresting() {
+ return true;
+ }
+ }
+
+ private static final Notification simpleNotif =
+ new Notification("mytype", "source", 0L);
+ private static final Notification attrChangeNotif =
+ new AttributeChangeNotification(
+ "x", 0L, 0L, "msg", "AttrName", "int", 2, 3);
+ private static final ObjectName testObjectName = makeObjectName("a:b=c");
+ private static final Notification sourcedNotif =
+ new Notification("mytype", testObjectName, 0L);
+ private static final Notification customNotif =
+ new CustomNotification("mytype", testObjectName, 0L);
+
+ private static final Case[] testCases = {
+ new Case(simpleNotif, "Type = 'mytype'", true),
+ new Case(simpleNotif, "Type = 'mytype'",
+ Notification.class, true),
+ new Case(simpleNotif, "Type = 'mytype'",
+ AttributeChangeNotification.class, false),
+ new Case(simpleNotif, "Type != 'mytype'", false),
+ new Case(simpleNotif, "Type = 'somethingelse'", false),
+ new Case(attrChangeNotif, "AttributeName = 'AttrName'", true),
+ new Case(attrChangeNotif,
+ "instanceof 'javax.management.AttributeChangeNotification'",
+ true),
+ new Case(attrChangeNotif,
+ "instanceof 'javax.management.Notification'",
+ true),
+ new Case(attrChangeNotif,
+ "instanceof 'javax.management.relation.MBeanServerNotification'",
+ false),
+ new Case(attrChangeNotif,
+ "class = 'javax.management.AttributeChangeNotification'",
+ true),
+ new Case(attrChangeNotif,
+ "javax.management.AttributeChangeNotification#AttributeName = 'AttrName'",
+ true),
+ new Case(sourcedNotif,
+ testObjectName,
+ true),
+ new Case(sourcedNotif,
+ makeObjectName("a*:b=*"),
+ true),
+ new Case(sourcedNotif,
+ makeObjectName("a*:c=*"),
+ false),
+ new Case(customNotif, "Name = 'claude'", true),
+ new Case(customNotif, "Name = 'tiddly'", false),
+ new Case(customNotif, "Interesting = true", true),
+ new Case(customNotif, "Interesting = false", false),
+ };
+
+ private static final ExoticCase[] exoticTestCases = {
+ new ExoticCase(
+ simpleNotif, new Notification("notmytype", "source", 0L),
+ new ExoticQuery("getAttributes") {
+ boolean apply(MBeanServer mbs, ObjectName name)
+ throws Exception {
+ List<Attribute> attrs = mbs.getAttributes(
+ name, new String[] {"Type", "Source"}).asList();
+ return (attrs.get(0).equals(new Attribute("Type", "mytype")) &&
+ attrs.get(1).equals(new Attribute("Source", "source")));
+ }
+ }),
+ new ExoticCase(
+ new Notification("mytype", "source", 0L) {},
+ simpleNotif,
+ new ExoticQuery("getClassLoaderFor") {
+ boolean apply(MBeanServer mbs, ObjectName name)
+ throws Exception {
+ return (mbs.getClassLoaderFor(name) ==
+ this.getClass().getClassLoader());
+ }
+ }),
+ new ExoticCase(
+ sourcedNotif, simpleNotif,
+ new ExoticQuery("getDomains") {
+ boolean apply(MBeanServer mbs, ObjectName name)
+ throws Exception {
+ return Arrays.equals(mbs.getDomains(),
+ new String[] {testObjectName.getDomain()});
+ }
+ }),
+ new ExoticCase(
+ simpleNotif, attrChangeNotif,
+ new ExoticQuery("getMBeanInfo") {
+ boolean apply(MBeanServer mbs, ObjectName name)
+ throws Exception {
+ MBeanInfo mbi = mbs.getMBeanInfo(name);
+ // If we ever add a constructor to Notification then
+ // we will have to change the 4 below.
+ if (mbi.getOperations().length > 0 ||
+ mbi.getConstructors().length != 4 ||
+ mbi.getNotifications().length > 0)
+ return false;
+ Set<String> expect = new HashSet<String>(
+ Arrays.asList(
+ "Class", "Message", "SequenceNumber", "Source",
+ "TimeStamp", "Type", "UserData"));
+ Set<String> actual = new HashSet<String>();
+ for (MBeanAttributeInfo mbai : mbi.getAttributes())
+ actual.add(mbai.getName());
+ return actual.equals(expect);
+ }
+ }),
+ new ExoticCase(
+ simpleNotif, attrChangeNotif,
+ new ExoticQuery("getObjectInstance") {
+ boolean apply(MBeanServer mbs, ObjectName name)
+ throws Exception {
+ ObjectInstance oi = mbs.getObjectInstance(name);
+ return oi.getClassName().equals(Notification.class.getName());
+ }
+ }),
+ new ExoticCase(
+ sourcedNotif, simpleNotif,
+ new ExoticQuery("queryNames") {
+ boolean apply(MBeanServer mbs, ObjectName name)
+ throws Exception {
+ Set<ObjectName> names = mbs.queryNames(null,
+ Query.eq(Query.attr("Type"), Query.value("mytype")));
+ return names.equals(Collections.singleton(testObjectName));
+ }
+ }),
+ new ExoticCase(
+ sourcedNotif, simpleNotif,
+ new ExoticQuery("queryMBeans") {
+ boolean apply(MBeanServer mbs, ObjectName name)
+ throws Exception {
+ Set<ObjectInstance> insts = mbs.queryMBeans(null,
+ Query.eq(Query.attr("Type"), Query.value("mytype")));
+ if (insts.size() != 1)
+ return false;
+ ObjectInstance inst = insts.iterator().next();
+ return (inst.getObjectName().equals(testObjectName) &&
+ inst.getClassName().equals(Notification.class.getName()));
+ }
+ }),
+ };
+
+ private static enum Test {
+ QUERY_EXP("query"), STRING("string"), STRING_PLUS_CLASS("string with class");
+ private final String name;
+ Test(String name) {
+ this.name = name;
+ }
+ @Override
+ public String toString() {
+ return name;
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ boolean allok = true;
+ for (Case testCase : testCases) {
+ for (Test test : Test.values()) {
+ QueryNotificationFilter nf;
+ String queryString;
+ switch (test) {
+ case QUERY_EXP: {
+ QueryExp inst = Query.isInstanceOf(
+ Query.value(testCase.notifClass.getName()));
+ QueryExp and = Query.and(inst, testCase.query);
+ queryString = Query.toString(and);
+ nf = new QueryNotificationFilter(and);
+ break;
+ }
+ case STRING: {
+ String s = "instanceof '" + testCase.notifClass.getName() + "'";
+ queryString = s + " and " + Query.toString(testCase.query);
+ nf = new QueryNotificationFilter(queryString);
+ break;
+ }
+ case STRING_PLUS_CLASS:
+ queryString = null;
+ nf = new QueryNotificationFilter(
+ testCase.notifClass, Query.toString(testCase.query));
+ break;
+ default:
+ throw new AssertionError();
+ }
+ boolean accept = nf.isNotificationEnabled(testCase.notif);
+ if (queryString != null) {
+ queryString = Query.toString(Query.fromString(queryString));
+ if (!queryString.equals(Query.toString(nf.getQuery()))) {
+ System.out.println("FAIL: query string mismatch: expected " +
+ "\"" + queryString + "\", got \"" +
+ Query.toString(nf.getQuery()));
+ allok = false;
+ }
+ }
+ boolean ok = (accept == testCase.expect);
+ System.out.println((ok ? "pass" : "FAIL") + ": " +
+ testCase.query + " (" + test + ")");
+ allok &= ok;
+ }
+ }
+ for (ExoticCase testCase : exoticTestCases) {
+ NotificationFilter nf = new QueryNotificationFilter(testCase.query);
+ for (boolean expect : new boolean[] {true, false}) {
+ Notification n = expect ? testCase.trueNotif : testCase.falseNotif;
+ boolean accept = nf.isNotificationEnabled(n);
+ boolean ok = (accept == expect);
+ System.out.println((ok ? "pass" : "FAIL") + ": " +
+ testCase.query + ": " + n);
+ allok &= ok;
+ }
+ }
+ if (!allok)
+ throw new Exception("TEST FAILED");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/pkcs11/Cipher/TestRSACipherWrap.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6572331
+ * @summary basic test for RSA cipher key wrapping functionality
+ * @author Valerie Peng
+ * @library ..
+ */
+import java.io.*;
+import java.util.*;
+
+import java.security.*;
+
+import javax.crypto.*;
+import javax.crypto.spec.SecretKeySpec;
+
+public class TestRSACipherWrap extends PKCS11Test {
+
+ private static final String RSA_ALGO = "RSA/ECB/PKCS1Padding";
+
+ public void main(Provider p) throws Exception {
+ try {
+ Cipher.getInstance(RSA_ALGO, p);
+ } catch (GeneralSecurityException e) {
+ System.out.println("Not supported by provider, skipping");
+ return;
+ }
+ KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", p);
+ kpg.initialize(1024);
+ KeyPair kp = kpg.generateKeyPair();
+ PublicKey publicKey = kp.getPublic();
+ PrivateKey privateKey = kp.getPrivate();
+
+ Cipher cipherPKCS11 = Cipher.getInstance(RSA_ALGO, p);
+ Cipher cipherJce = Cipher.getInstance(RSA_ALGO, "SunJCE");
+
+ String algos[] = {"AES", "RC2", "Blowfish"};
+ int keySizes[] = {128, 256};
+
+ for (int j = 0; j < algos.length; j++) {
+ String algorithm = algos[j];
+ KeyGenerator keygen =
+ KeyGenerator.getInstance(algorithm);
+
+ for (int i = 0; i < keySizes.length; i++) {
+ SecretKey secretKey = null;
+ System.out.print("Generate " + keySizes[i] + "-bit " +
+ algorithm + " key using ");
+ try {
+ keygen.init(keySizes[i]);
+ secretKey = keygen.generateKey();
+ System.out.println(keygen.getProvider().getName());
+ } catch (InvalidParameterException ipe) {
+ secretKey = new SecretKeySpec(new byte[32], algorithm);
+ System.out.println("SecretKeySpec class");
+ }
+ test(kp, secretKey, cipherPKCS11, cipherJce);
+ test(kp, secretKey, cipherPKCS11, cipherPKCS11);
+ test(kp, secretKey, cipherJce, cipherPKCS11);
+ }
+ }
+ }
+
+ private static void test(KeyPair kp, SecretKey secretKey,
+ Cipher wrapCipher, Cipher unwrapCipher)
+ throws Exception {
+ String algo = secretKey.getAlgorithm();
+ wrapCipher.init(Cipher.WRAP_MODE, kp.getPublic());
+ byte[] wrappedKey = wrapCipher.wrap(secretKey);
+ unwrapCipher.init(Cipher.UNWRAP_MODE, kp.getPrivate());
+ Key unwrappedKey =
+ unwrapCipher.unwrap(wrappedKey, algo, Cipher.SECRET_KEY);
+
+ System.out.println("Test " + wrapCipher.getProvider().getName() +
+ "/" + unwrapCipher.getProvider().getName() + ": ");
+ if (!Arrays.equals(secretKey.getEncoded(),
+ unwrappedKey.getEncoded())) {
+ throw new Exception("Test Failed!");
+ }
+ System.out.println("Passed");
+ }
+
+ public static void main(String[] args) throws Exception {
+ main(new TestRSACipherWrap());
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/pkcs11/Cipher/TestSymmCiphers.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,282 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modi
+fy it
+ * under the terms of the GNU General Public License version 2 onl
+y, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, bu
+t WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABIL
+ITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public L
+icense
+ * version 2 for more details (a copy is included in the LICENSE f
+ile that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public Licen
+se version
+ * 2 along with this work; if not, write to the Free Software Foun
+dation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, San
+ta Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional inform
+ation or
+ * have any questions.
+ */
+
+/**
+ * @test %I% %E%
+ * @bug 4898461
+ * @summary basic test for symmetric ciphers with padding
+ * @author Valerie Peng
+ * @library ..
+ */
+import java.io.*;
+import java.nio.*;
+import java.util.*;
+
+import java.security.*;
+import java.security.spec.AlgorithmParameterSpec;
+
+import javax.crypto.*;
+import javax.crypto.spec.IvParameterSpec;
+
+public class TestSymmCiphers extends PKCS11Test {
+
+ private static class CI { // class for holding Cipher Information
+
+ String transformation;
+ String keyAlgo;
+ int dataSize;
+
+ CI(String transformation, String keyAlgo, int dataSize) {
+ this.transformation = transformation;
+ this.keyAlgo = keyAlgo;
+ this.dataSize = dataSize;
+ }
+ }
+ private static final CI[] TEST_LIST = {
+ new CI("ARCFOUR", "ARCFOUR", 400),
+ new CI("RC4", "RC4", 401),
+ new CI("DES/CBC/NoPadding", "DES", 400),
+ new CI("DESede/CBC/NoPadding", "DESede", 160),
+ new CI("AES/CBC/NoPadding", "AES", 4800),
+ new CI("Blowfish/CBC/NoPadding", "Blowfish", 24),
+ new CI("DES/cbc/PKCS5Padding", "DES", 6401),
+ new CI("DESede/CBC/PKCS5Padding", "DESede", 402),
+ new CI("AES/CBC/PKCS5Padding", "AES", 30),
+ new CI("Blowfish/CBC/PKCS5Padding", "Blowfish", 19),
+ new CI("DES/ECB/NoPadding", "DES", 400),
+ new CI("DESede/ECB/NoPadding", "DESede", 160),
+ new CI("AES/ECB/NoPadding", "AES", 4800),
+ new CI("DES/ECB/PKCS5Padding", "DES", 32),
+ new CI("DES/ECB/PKCS5Padding", "DES", 6400),
+ new CI("DESede/ECB/PKCS5Padding", "DESede", 400),
+ new CI("AES/ECB/PKCS5Padding", "AES", 64),
+ new CI("DES", "DES", 6400),
+ new CI("DESede", "DESede", 408),
+ new CI("AES", "AES", 128)
+ };
+ private static StringBuffer debugBuf = new StringBuffer();
+
+ public void main(Provider p) throws Exception {
+ // NSS reports CKR_DEVICE_ERROR when the data passed to
+ // its EncryptUpdate/DecryptUpdate is not multiple of blocks
+ int firstBlkSize = 16;
+ boolean status = true;
+ Random random = new Random();
+ try {
+ for (int i = 0; i < TEST_LIST.length; i++) {
+ CI currTest = TEST_LIST[i];
+ System.out.println("===" + currTest.transformation + "===");
+ try {
+ KeyGenerator kg =
+ KeyGenerator.getInstance(currTest.keyAlgo, p);
+ SecretKey key = kg.generateKey();
+ Cipher c1 = Cipher.getInstance(currTest.transformation, p);
+ Cipher c2 = Cipher.getInstance(currTest.transformation,
+ "SunJCE");
+
+ byte[] plainTxt = new byte[currTest.dataSize];
+ random.nextBytes(plainTxt);
+ System.out.println("Testing inLen = " + plainTxt.length);
+
+ c2.init(Cipher.ENCRYPT_MODE, key);
+ AlgorithmParameters params = c2.getParameters();
+ byte[] answer = c2.doFinal(plainTxt);
+ System.out.println("Encryption tests: START");
+ test(c1, Cipher.ENCRYPT_MODE, key, params, firstBlkSize,
+ plainTxt, answer);
+ System.out.println("Encryption tests: DONE");
+ c2.init(Cipher.DECRYPT_MODE, key, params);
+ byte[] answer2 = c2.doFinal(answer);
+ System.out.println("Decryption tests: START");
+ test(c1, Cipher.DECRYPT_MODE, key, params, firstBlkSize,
+ answer, answer2);
+ System.out.println("Decryption tests: DONE");
+ } catch (NoSuchAlgorithmException nsae) {
+ System.out.println("Skipping unsupported algorithm: " +
+ nsae);
+ }
+ }
+ } catch (Exception ex) {
+ // print out debug info when exception is encountered
+ if (debugBuf != null) {
+ System.out.println(debugBuf.toString());
+ debugBuf = new StringBuffer();
+ }
+ throw ex;
+ }
+ }
+
+ private static void test(Cipher cipher, int mode, SecretKey key,
+ AlgorithmParameters params, int firstBlkSize,
+ byte[] in, byte[] answer) throws Exception {
+ // test setup
+ long startTime, endTime;
+ cipher.init(mode, key, params);
+ int outLen = cipher.getOutputSize(in.length);
+ //debugOut("Estimated output size = " + outLen + "\n");
+
+ // test data preparation
+ ByteBuffer inBuf = ByteBuffer.allocate(in.length);
+ inBuf.put(in);
+ inBuf.position(0);
+ ByteBuffer inDirectBuf = ByteBuffer.allocateDirect(in.length);
+ inDirectBuf.put(in);
+ inDirectBuf.position(0);
+ ByteBuffer outBuf = ByteBuffer.allocate(outLen);
+ ByteBuffer outDirectBuf = ByteBuffer.allocateDirect(outLen);
+
+ // test#1: byte[] in + byte[] out
+ //debugOut("Test#1:\n");
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ startTime = System.nanoTime();
+ byte[] temp = cipher.update(in, 0, firstBlkSize);
+ if (temp != null && temp.length > 0) {
+ baos.write(temp, 0, temp.length);
+ }
+ temp = cipher.doFinal(in, firstBlkSize, in.length - firstBlkSize);
+ if (temp != null && temp.length > 0) {
+ baos.write(temp, 0, temp.length);
+ }
+ byte[] testOut1 = baos.toByteArray();
+ endTime = System.nanoTime();
+ perfOut("stream InBuf + stream OutBuf: " +
+ (endTime - startTime));
+ match(testOut1, answer);
+
+ // test#2: Non-direct Buffer in + non-direct Buffer out
+ //debugOut("Test#2:\n");
+ //debugOut("inputBuf: " + inBuf + "\n");
+ //debugOut("outputBuf: " + outBuf + "\n");
+
+ startTime = System.nanoTime();
+ cipher.update(inBuf, outBuf);
+ cipher.doFinal(inBuf, outBuf);
+ endTime = System.nanoTime();
+ perfOut("non-direct InBuf + non-direct OutBuf: " +
+ (endTime - startTime));
+ match(outBuf, answer);
+
+ // test#3: Direct Buffer in + direc Buffer out
+ //debugOut("Test#3:\n");
+ //debugOut("(pre) inputBuf: " + inDirectBuf + "\n");
+ //debugOut("(pre) outputBuf: " + outDirectBuf + "\n");
+
+ startTime = System.nanoTime();
+ cipher.update(inDirectBuf, outDirectBuf);
+ cipher.doFinal(inDirectBuf, outDirectBuf);
+ endTime = System.nanoTime();
+ perfOut("direct InBuf + direct OutBuf: " +
+ (endTime - startTime));
+
+ //debugOut("(post) inputBuf: " + inDirectBuf + "\n");
+ //debugOut("(post) outputBuf: " + outDirectBuf + "\n");
+ match(outDirectBuf, answer);
+
+ // test#4: Direct Buffer in + non-direct Buffer out
+ //debugOut("Test#4:\n");
+ inDirectBuf.position(0);
+ outBuf.position(0);
+ //debugOut("inputBuf: " + inDirectBuf + "\n");
+ //debugOut("outputBuf: " + outBuf + "\n");
+
+ startTime = System.nanoTime();
+ cipher.update(inDirectBuf, outBuf);
+ cipher.doFinal(inDirectBuf, outBuf);
+ endTime = System.nanoTime();
+ perfOut("direct InBuf + non-direct OutBuf: " +
+ (endTime - startTime));
+ match(outBuf, answer);
+
+ // test#5: Non-direct Buffer in + direct Buffer out
+ //debugOut("Test#5:\n");
+ inBuf.position(0);
+ outDirectBuf.position(0);
+
+ //debugOut("(pre) inputBuf: " + inBuf + "\n");
+ //debugOut("(pre) outputBuf: " + outDirectBuf + "\n");
+
+ startTime = System.nanoTime();
+ cipher.update(inBuf, outDirectBuf);
+ cipher.doFinal(inBuf, outDirectBuf);
+ endTime = System.nanoTime();
+ perfOut("non-direct InBuf + direct OutBuf: " +
+ (endTime - startTime));
+
+ //debugOut("(post) inputBuf: " + inBuf + "\n");
+ //debugOut("(post) outputBuf: " + outDirectBuf + "\n");
+ match(outDirectBuf, answer);
+
+ debugBuf = null;
+ }
+
+ private static void perfOut(String msg) {
+ if (debugBuf != null) {
+ debugBuf.append("PERF>" + msg);
+ }
+ }
+
+ private static void debugOut(String msg) {
+ if (debugBuf != null) {
+ debugBuf.append(msg);
+ }
+ }
+
+ private static void match(byte[] b1, byte[] b2) throws Exception {
+ if (b1.length != b2.length) {
+ debugOut("got len : " + b1.length + "\n");
+ debugOut("expect len: " + b2.length + "\n");
+ throw new Exception("mismatch - different length! got: " + b1.length + ", expect: " + b2.length + "\n");
+ } else {
+ for (int i = 0; i < b1.length; i++) {
+ if (b1[i] != b2[i]) {
+ debugOut("got : " + toString(b1) + "\n");
+ debugOut("expect: " + toString(b2) + "\n");
+ throw new Exception("mismatch");
+ }
+ }
+ }
+ }
+
+ private static void match(ByteBuffer bb, byte[] answer) throws Exception {
+ byte[] bbTemp = new byte[bb.position()];
+ bb.position(0);
+ bb.get(bbTemp, 0, bbTemp.length);
+ match(bbTemp, answer);
+ }
+
+ public static void main(String[] args) throws Exception {
+ main(new TestSymmCiphers());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/pkcs11/KeyStore/SecretKeysBasic.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.io.*;
+import java.util.*;
+import java.lang.reflect.*;
+
+import java.security.*;
+import java.security.cert.*;
+import java.security.spec.*;
+import java.security.interfaces.*;
+import java.math.BigInteger;
+
+import javax.crypto.*;
+import javax.crypto.spec.*;
+
+public class SecretKeysBasic extends PKCS11Test {
+
+ private static final char SEP = File.separatorChar;
+ private static char[] tokenPwd;
+ private static final char[] nssPwd =
+ new char[]{'t', 'e', 's', 't', '1', '2'};
+ private static final char[] solarisPwd =
+ new char[]{'p', 'i', 'n'};
+ private static SecretKey sk1;
+ private static SecretKey sk2;
+ private static SecretKey softkey;
+ private static KeyStore ks;
+ private static final String KS_TYPE = "PKCS11";
+ private static Provider provider;
+
+ public static void main(String[] args) throws Exception {
+ main(new SecretKeysBasic());
+ }
+
+ public void main(Provider p) throws Exception {
+ this.provider = p;
+
+ // create secret key
+ byte[] keyVal = new byte[16];
+ (new SecureRandom()).nextBytes(keyVal);
+ // NSS will throw CKR_HOST_MEMORY if calling C_DecryptInit w/
+ // (keyVal[0] == 0)
+ if (keyVal[0] == 0) {
+ keyVal[0] = 1;
+ }
+ softkey = new SecretKeySpec(keyVal, "AES");
+ dumpKey("softkey", softkey);
+
+ KeyGenerator kg = KeyGenerator.getInstance("DESede", provider);
+ sk1 = kg.generateKey();
+ dumpKey("skey1", sk1);
+ sk2 = kg.generateKey();
+ dumpKey("skey2", sk2);
+
+ String token = System.getProperty("TOKEN");
+
+ if (token == null || token.length() == 0) {
+ System.out.println("Error: missing TOKEN system property");
+ throw new Exception("token arg required");
+ }
+
+ if ("nss".equals(token)) {
+ tokenPwd = nssPwd;
+ } else if ("solaris".equals(token)) {
+ tokenPwd = solarisPwd;
+ }
+
+ int testnum = 1;
+ doTest();
+ }
+
+ private static boolean checkSecretKeyEntry(String alias,
+ SecretKey expected,
+ boolean saveBeforeCheck)
+ throws Exception {
+ if (saveBeforeCheck) {
+ ks.setKeyEntry(alias, expected, null, null);
+ }
+ SecretKey result = (SecretKey) (ks.getKey(alias, null));
+ String keyEncFormat = result.getFormat();
+ if (keyEncFormat == null) {
+ // sensitive or un-extractable keys - verify by encrypt/decrypt
+ byte[] data = new byte[64];
+ Cipher c =
+ Cipher.getInstance(result.getAlgorithm() + "/CBC/NoPadding",
+ provider);
+ c.init(Cipher.ENCRYPT_MODE, expected);
+ byte[] encOut = c.doFinal(data);
+ c.init(Cipher.DECRYPT_MODE, result, c.getParameters());
+ byte[] decOut = c.doFinal(encOut);
+ if (!Arrays.equals(data, decOut)) {
+ return false;
+ }
+ } else if (keyEncFormat.toUpperCase().equals("RAW")) {
+ if (!Arrays.equals(result.getEncoded(), expected.getEncoded())) {
+ dumpKey("\texpected:", expected);
+ dumpKey("\treturns:", result);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private static void dumpKey(String info, SecretKey key) {
+ System.out.println(info + "> " + key);
+ System.out.println("\tALGO=" + key.getAlgorithm());
+ if (key.getFormat() != null) {
+ System.out.println("\t[" + key.getFormat() + "] VALUE=" +
+ new BigInteger(key.getEncoded()));
+ } else {
+ System.out.println("\tVALUE=n/a");
+ }
+ }
+
+ private static void doTest() throws Exception {
+ if (ks == null) {
+ ks = KeyStore.getInstance(KS_TYPE, provider);
+ ks.load(null, tokenPwd);
+ }
+
+ System.out.println("Number of entries: " + ks.size());
+ if (ks.size() != 0) {
+ System.out.println("Deleting entries under aliases: ");
+ for (Enumeration<String> aliases = ks.aliases();
+ aliases.hasMoreElements();) {
+ String alias = aliases.nextElement();
+ System.out.println("\t" + alias);
+ ks.deleteEntry(alias);
+ }
+ }
+
+ String alias = "testSKey";
+
+ boolean testResult = checkSecretKeyEntry(alias, softkey, true);
+ if (!testResult) {
+ System.out.println("FAILURE: setKey() w/ softSecretKey failed");
+ }
+
+ if (!checkSecretKeyEntry(alias, sk1, true)) {
+ testResult = false;
+ System.out.println("FAILURE: setKey() w/ skey1 failed");
+ }
+ if (!checkSecretKeyEntry(alias, sk2, true)) {
+ testResult = false;
+ System.out.println("FAILURE: setKey() w/ skey2 failed");
+ }
+
+ ks.store(null);
+ System.out.println("Reloading keystore...");
+
+ ks.load(null, "whatever".toCharArray());
+ if (ks.size() != 1) {
+ System.out.println("FAILURE: reload#1 ks.size() != 1");
+ }
+ if (!checkSecretKeyEntry(alias, sk2, false)) {
+ testResult = false;
+ System.out.println("FAILURE: reload#1 ks entry check failed");
+ }
+
+ ks.deleteEntry(alias);
+ ks.store(null);
+
+ System.out.println("Reloading keystore...");
+ ks.load(null, "whatever".toCharArray());
+ if (ks.size() != 0) {
+ testResult = false;
+ System.out.println("FAILURE: reload#2 ks.size() != 0");
+ }
+ if (!testResult) {
+ throw new Exception("One or more test failed!");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/pkcs11/KeyStore/SecretKeysBasic.sh Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,164 @@
+#
+# Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 6599979
+# @summary Ensure that re-assigning the alias works
+#
+# @run shell SecretKeysBasic.sh
+#
+# To run by hand:
+# %sh SecretKeysBasic.sh
+#
+# Note:
+# . test only runs on solaris at the moment
+
+# set a few environment variables so that the shell-script can run stand-alone
+# in the source directory
+
+# if running by hand on windows, change TESTSRC and TESTCLASSES to "."
+if [ "${TESTSRC}" = "" ] ; then
+ TESTSRC=`pwd`
+fi
+if [ "${TESTCLASSES}" = "" ] ; then
+ TESTCLASSES=`pwd`
+fi
+
+# if running by hand on windows, change this to appropriate value
+if [ "${TESTJAVA}" = "" ] ; then
+ TESTJAVA="/net/shimmer/export/valeriep/jdk7/build/solaris-sparc"
+fi
+echo TESTSRC=${TESTSRC}
+echo TESTCLASSES=${TESTCLASSES}
+echo TESTJAVA=${TESTJAVA}
+echo ""
+
+#DEBUG=sunpkcs11,pkcs11keystore
+
+echo DEBUG=${DEBUG}
+echo ""
+
+OS=`uname -s`
+case "$OS" in
+ SunOS )
+ FS="/"
+ PS=":"
+ SCCS="${FS}usr${FS}ccs${FS}bin${FS}sccs"
+ CP="${FS}bin${FS}cp -f"
+ RM="${FS}bin${FS}rm -rf"
+ MKDIR="${FS}bin${FS}mkdir -p"
+ CHMOD="${FS}bin${FS}chmod"
+ ;;
+ * )
+ echo "Unsupported System ${OS} - Test only runs on Solaris"
+ exit 0;
+ ;;
+esac
+
+TOKENS="nss solaris"
+STATUS=0
+for token in ${TOKENS}
+do
+
+if [ ${token} = "nss" ]
+then
+ # make cert/key DBs writable if token is NSS
+ ${CP} ${TESTSRC}${FS}..${FS}nss${FS}db${FS}cert8.db ${TESTCLASSES}
+ ${CHMOD} +w ${TESTCLASSES}${FS}cert8.db
+
+ ${CP} ${TESTSRC}${FS}..${FS}nss${FS}db${FS}key3.db ${TESTCLASSES}
+ ${CHMOD} +w ${TESTCLASSES}${FS}key3.db
+ USED_FILE_LIST="${TESTCLASSES}${FS}cert8.db ${TESTCLASSES}${FS}key3.db"
+elif [ ${token} = "solaris" ]
+then
+ OS_VERSION=`uname -r`
+ case "${OS_VERSION}" in
+ 5.1* )
+ SOFTTOKEN_DIR=${TESTCLASSES}
+ export SOFTTOKEN_DIR
+ ;;
+ * )
+ echo "Unsupported Version ${OS_VERSION} - Test only runs on Solaris"
+ exit 0;
+ ;;
+ esac
+
+ # copy keystore into write-able location
+ if [ -d ${TESTCLASSES}${FS}pkcs11_softtoken ]
+ then
+ echo "Removing old pkcs11_keystore, creating new pkcs11_keystore"
+
+ echo ${RM} ${TESTCLASSES}${FS}pkcs11_softtoken
+ ${RM} ${TESTCLASSES}${FS}pkcs11_softtoken
+ fi
+ echo ${MKDIR} ${TESTCLASSES}${FS}pkcs11_softtoken${FS}private
+ ${MKDIR} ${TESTCLASSES}${FS}pkcs11_softtoken${FS}private
+
+ echo ${MKDIR} ${TESTCLASSES}${FS}pkcs11_softtoken${FS}public
+ ${MKDIR} ${TESTCLASSES}${FS}pkcs11_softtoken${FS}public
+
+ echo ${CP} ${TESTSRC}${FS}BasicData${FS}pkcs11_softtoken${FS}objstore_info \
+ ${TESTCLASSES}${FS}pkcs11_softtoken
+ ${CP} ${TESTSRC}${FS}BasicData${FS}pkcs11_softtoken${FS}objstore_info \
+ ${TESTCLASSES}${FS}pkcs11_softtoken
+
+ echo ${CHMOD} +w ${TESTCLASSES}${FS}pkcs11_softtoken${FS}objstore_info
+ ${CHMOD} 600 ${TESTCLASSES}${FS}pkcs11_softtoken${FS}objstore_info
+ USED_FILE_LIST="${TESTCLASSES}${FS}pkcs11_softtoken"
+fi
+
+cd ${TESTCLASSES}
+${TESTJAVA}${FS}bin${FS}javac \
+ -classpath ${TESTCLASSES} \
+ -d ${TESTCLASSES} \
+ ${TESTSRC}${FS}SecretKeysBasic.java
+
+# run test
+cd ${TESTSRC}
+${TESTJAVA}${FS}bin${FS}java \
+ -DDIR=${TESTSRC}${FS}BasicData${FS} \
+ -classpath ${TESTCLASSES}${PS}${TESTSRC}${FS}loader.jar \
+ -DCUSTOM_DB_DIR=${TESTCLASSES} \
+ -DCUSTOM_P11_CONFIG=${TESTSRC}${FS}BasicData${FS}p11-${token}.txt \
+ -DNO_DEFAULT=true \
+ -DNO_DEIMOS=true \
+ -DTOKEN=${token} \
+ -Djava.security.debug=${DEBUG} \
+ SecretKeysBasic
+
+# -DCUSTOM_P11_CONFIG=${TESTSRC}${FS}BasicData${FS}p11-${token}.txt \
+
+# save error status
+if [ $? != 0 ]
+then
+ echo "Test against " ${token} " Failed!"
+ STATUS=1
+fi
+
+# clean up
+${RM} ${USED_FILE_LIST}
+
+done
+
+# return
+exit ${STATUS}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/www/protocol/https/HttpsURLConnection/CriticalSubjectAltName.java Tue Apr 15 17:48:22 2008 -0700
@@ -0,0 +1,262 @@
+/*
+ * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6668231
+ * @summary Presence of a critical subjectAltName causes JSSE's SunX509 to
+ * fail trusted checks
+ * @author Xuelei Fan
+ *
+ * This test depends on binary keystore, crisubn.jks and trusted.jks. Because
+ * JAVA keytool cannot generate X509 certificate with SubjectAltName extension,
+ * the certificates are generated with openssl toolkits and then imported into
+ * JAVA keystore.
+ *
+ * The crisubn.jks holds a private key entry and the corresponding X509
+ * certificate issued with an empty Subject field, and a critical
+ * SubjectAltName extension.
+ *
+ * The trusted.jks holds the trusted certificate.
+ */
+import java.io.*;
+import java.net.*;
+import javax.net.ssl.*;
+import java.security.cert.Certificate;
+
+public class CriticalSubjectAltName implements HostnameVerifier {
+ /*
+ * =============================================================
+ * Set the various variables needed for the tests, then
+ * specify what tests to run on each side.
+ */
+
+ /*
+ * Should we run the client or server in a separate thread?
+ * Both sides can throw exceptions, but do you have a preference
+ * as to which side should be the main thread.
+ */
+ static boolean separateServerThread = true;
+
+ /*
+ * Where do we find the keystores?
+ */
+ static String pathToStores = "./";
+ static String keyStoreFile = "crisubn.jks";
+ static String trustStoreFile = "trusted.jks";
+ static String passwd = "passphrase";
+
+ /*
+ * Is the server ready to serve?
+ */
+ volatile static boolean serverReady = false;
+
+ /*
+ * Turn on SSL debugging?
+ */
+ static boolean debug = false;
+
+ /*
+ * If the client or server is doing some kind of object creation
+ * that the other side depends on, and that thread prematurely
+ * exits, you may experience a hang. The test harness will
+ * terminate all hung threads after its timeout has expired,
+ * currently 3 minutes by default, but you might try to be
+ * smart about it....
+ */
+
+ /*
+ * Define the server side of the test.
+ *
+ * If the server prematurely exits, serverReady will be set to true
+ * to avoid infinite hangs.
+ */
+ void doServerSide() throws Exception {
+ SSLServerSocketFactory sslssf =
+ (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
+ SSLServerSocket sslServerSocket =
+ (SSLServerSocket) sslssf.createServerSocket(serverPort);
+ serverPort = sslServerSocket.getLocalPort();
+
+ /*
+ * Signal Client, we're ready for his connect.
+ */
+ serverReady = true;
+
+ SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();
+ OutputStream sslOS = sslSocket.getOutputStream();
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sslOS));
+ bw.write("HTTP/1.1 200 OK\r\n\r\n\r\n");
+ bw.flush();
+ Thread.sleep(5000);
+ sslSocket.close();
+ }
+
+ /*
+ * Define the client side of the test.
+ *
+ * If the server prematurely exits, serverReady will be set to true
+ * to avoid infinite hangs.
+ */
+ void doClientSide() throws Exception {
+
+ /*
+ * Wait for server to get started.
+ */
+ while (!serverReady) {
+ Thread.sleep(50);
+ }
+
+ URL url = new URL("https://localhost:"+serverPort+"/index.html");
+ HttpsURLConnection urlc = (HttpsURLConnection)url.openConnection();
+ urlc.setHostnameVerifier(this);
+ urlc.getInputStream();
+
+ if (urlc.getResponseCode() == -1) {
+ throw new RuntimeException("getResponseCode() returns -1");
+ }
+ }
+
+ /*
+ * =============================================================
+ * The remainder is just support stuff
+ */
+
+ // use any free port by default
+ volatile int serverPort = 0;
+
+ volatile Exception serverException = null;
+ volatile Exception clientException = null;
+
+ public static void main(String[] args) throws Exception {
+ String keyFilename =
+ System.getProperty("test.src", "./") + "/" + pathToStores +
+ "/" + keyStoreFile;
+ String trustFilename =
+ System.getProperty("test.src", "./") + "/" + pathToStores +
+ "/" + trustStoreFile;
+
+ System.setProperty("javax.net.ssl.keyStore", keyFilename);
+ System.setProperty("javax.net.ssl.keyStorePassword", passwd);
+ System.setProperty("javax.net.ssl.trustStore", trustFilename);
+ System.setProperty("javax.net.ssl.trustStorePassword", passwd);
+
+ if (debug)
+ System.setProperty("javax.net.debug", "all");
+
+ /*
+ * Start the tests.
+ */
+ new CriticalSubjectAltName();
+ }
+
+ Thread clientThread = null;
+ Thread serverThread = null;
+
+ /*
+ * Primary constructor, used to drive remainder of the test.
+ *
+ * Fork off the other side, then do your work.
+ */
+ CriticalSubjectAltName() throws Exception {
+ if (separateServerThread) {
+ startServer(true);
+ startClient(false);
+ } else {
+ startClient(true);
+ startServer(false);
+ }
+
+ /*
+ * Wait for other side to close down.
+ */
+ if (separateServerThread) {
+ serverThread.join();
+ } else {
+ clientThread.join();
+ }
+
+ /*
+ * When we get here, the test is pretty much over.
+ *
+ * If the main thread excepted, that propagates back
+ * immediately. If the other thread threw an exception, we
+ * should report back.
+ */
+ if (serverException != null)
+ throw serverException;
+ if (clientException != null)
+ throw clientException;
+ }
+
+ void startServer(boolean newThread) throws Exception {
+ if (newThread) {
+ serverThread = new Thread() {
+ public void run() {
+ try {
+ doServerSide();
+ } catch (Exception e) {
+ /*
+ * Our server thread just died.
+ *
+ * Release the client, if not active already...
+ */
+ System.err.println("Server died...");
+ serverReady = true;
+ serverException = e;
+ }
+ }
+ };
+ serverThread.start();
+ } else {
+ doServerSide();
+ }
+ }
+
+ void startClient(boolean newThread) throws Exception {
+ if (newThread) {
+ clientThread = new Thread() {
+ public void run() {
+ try {
+ doClientSide();
+ } catch (Exception e) {
+ /*
+ * Our client thread just died.
+ */
+ System.err.println("Client died...");
+ clientException = e;
+ }
+ }
+ };
+ clientThread.start();
+ } else {
+ doClientSide();
+ }
+ }
+
+ // Simple test method to blindly agree that hostname and certname match
+ public boolean verify(String hostname, SSLSession session) {
+ return true;
+ }
+
+}
Binary file jdk/test/sun/security/ssl/com/sun/net/ssl/internal/www/protocol/https/HttpsURLConnection/crisubn.jks has changed
Binary file jdk/test/sun/security/ssl/com/sun/net/ssl/internal/www/protocol/https/HttpsURLConnection/trusted.jks has changed
--- a/langtools/.hgtags Wed Apr 09 15:30:44 2008 +0100
+++ b/langtools/.hgtags Tue Apr 15 17:48:22 2008 -0700
@@ -1,1 +1,2 @@
9a66ca7c79fab293c1bb0534e0d208c7e4f58b01 jdk7-b24
+58039502942e52f4144a33f36290a2bd2f3581e6 jdk7-b25