This commit is contained in:
J. Duke 2017-07-05 18:04:27 +02:00
commit 2a504c4c16
89 changed files with 3307 additions and 464 deletions

View File

@ -149,3 +149,4 @@ cc771d92284f71765eca14d6d08703c4af254c04 jdk8-b21
221a378e06a326f45e5d89e2123cd6323e0181d1 jdk8-b25
2accafff224ae39caf5f532c305251ba624bf2c0 jdk8-b26
1533dfab9903e4edcfead3b0192643f38c418b9b jdk8-b27
6e2541d60f4e342b5b67140271d7611643929dc3 jdk8-b28

View File

@ -149,3 +149,4 @@ b98f0e6dddf987df565029a1f58417fc1844c3f3 jdk8-b24
e45d6b406d5f91ff5256a5c82456ab1e7eb8becd jdk8-b25
79f709a099f40c08f76567fa6d813f9009a69826 jdk8-b26
4fffe75e4edd39a2517f10b743941bf94edb143d jdk8-b27
2082eb35d49a9c2aab90b8d4fd31cefb7a23b82e jdk8-b28

View File

@ -226,3 +226,5 @@ f92a171cf0071ca6c3fa8231d7d570377f8b2f4d hs23-b16
931e5f39e365a0d550d79148ff87a7f9e864d2e1 hs23-b16
3b24e7e01d20ca590d0f86b1222bb7c3f1a2aa2d jdk8-b27
975c4105f1e2ef1190a75b77124033f1fd4290b5 hs24-b01
b183b0863611b85dbac16f3b08b40ba978756d19 jdk8-b28
030b5306d60f140e822e4a6d301744cb110ff0c8 hs24-b02

View File

@ -58,6 +58,7 @@
# needs to be set here since this Makefile doesn't include defs.make
OS_VENDOR:=$(shell uname -s)
-include $(SPEC)
include $(GAMMADIR)/make/scm.make
include $(GAMMADIR)/make/altsrc.make
@ -247,6 +248,8 @@ flags.make: $(BUILDTREE_MAKE) ../shared_dirs.lst
echo "HOTSPOT_EXTRA_SYSDEFS\$$(HOTSPOT_EXTRA_SYSDEFS) = $(HOTSPOT_EXTRA_SYSDEFS)" && \
echo "SYSDEFS += \$$(HOTSPOT_EXTRA_SYSDEFS)"; \
echo; \
[ -n "$(SPEC)" ] && \
echo "include $(SPEC)"; \
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(VARIANT).make"; \
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(COMPILER).make"; \
) > $@

View File

@ -27,53 +27,57 @@ OS_VENDOR = $(shell uname -s)
#------------------------------------------------------------------------
# CC, CXX & AS
# When cross-compiling the ALT_COMPILER_PATH points
# to the cross-compilation toolset
ifdef CROSS_COMPILE_ARCH
CXX = $(ALT_COMPILER_PATH)/g++
CC = $(ALT_COMPILER_PATH)/gcc
HOSTCXX = g++
HOSTCC = gcc
else ifneq ($(OS_VENDOR), Darwin)
CXX = g++
CC = gcc
HOSTCXX = $(CXX)
HOSTCC = $(CC)
# If a SPEC is not set already, then use these defaults.
ifeq ($(SPEC),)
# When cross-compiling the ALT_COMPILER_PATH points
# to the cross-compilation toolset
ifdef CROSS_COMPILE_ARCH
CXX = $(ALT_COMPILER_PATH)/g++
CC = $(ALT_COMPILER_PATH)/gcc
HOSTCXX = g++
HOSTCC = gcc
else ifneq ($(OS_VENDOR), Darwin)
CXX = g++
CC = gcc
HOSTCXX = $(CXX)
HOSTCC = $(CC)
endif
# i486 hotspot requires -mstackrealign on Darwin.
# llvm-gcc supports this in Xcode 3.2.6 and 4.0.
# gcc-4.0 supports this on earlier versions.
# Prefer llvm-gcc where available.
ifeq ($(OS_VENDOR), Darwin)
ifeq ($(origin CXX), default)
CXX = llvm-g++
endif
ifeq ($(origin CC), default)
CC = llvm-gcc
endif
ifeq ($(ARCH), i486)
LLVM_SUPPORTS_STACKREALIGN := $(shell \
[ "0"`llvm-gcc -v 2>&1 | grep LLVM | sed -E "s/.*LLVM build ([0-9]+).*/\1/"` -gt "2333" ] \
&& echo true || echo false)
ifeq ($(LLVM_SUPPORTS_STACKREALIGN), true)
CXX32 ?= llvm-g++
CC32 ?= llvm-gcc
else
CXX32 ?= g++-4.0
CC32 ?= gcc-4.0
endif
CXX = $(CXX32)
CC = $(CC32)
endif
HOSTCXX = $(CXX)
HOSTCC = $(CC)
endif
AS = $(CC) -c -x assembler-with-cpp
endif
# i486 hotspot requires -mstackrealign on Darwin.
# llvm-gcc supports this in Xcode 3.2.6 and 4.0.
# gcc-4.0 supports this on earlier versions.
# Prefer llvm-gcc where available.
ifeq ($(OS_VENDOR), Darwin)
ifeq ($(origin CXX), default)
CXX = llvm-g++
endif
ifeq ($(origin CC), default)
CC = llvm-gcc
endif
ifeq ($(ARCH), i486)
LLVM_SUPPORTS_STACKREALIGN := $(shell \
[ "0"`llvm-gcc -v 2>&1 | grep LLVM | sed -E "s/.*LLVM build ([0-9]+).*/\1/"` -gt "2333" ] \
&& echo true || echo false)
ifeq ($(LLVM_SUPPORTS_STACKREALIGN), true)
CXX32 ?= llvm-g++
CC32 ?= llvm-gcc
else
CXX32 ?= g++-4.0
CC32 ?= gcc-4.0
endif
CXX = $(CXX32)
CC = $(CC32)
endif
HOSTCXX = $(CXX)
HOSTCC = $(CC)
endif
AS = $(CC) -c -x assembler-with-cpp
# -dumpversion in gcc-2.91 shows "egcs-2.91.66". In later version, it only
# prints the numbers (e.g. "2.95", "3.2.1")

View File

@ -25,12 +25,15 @@
#------------------------------------------------------------------------
# CC, CXX & AS
CXX = CC
CC = cc
AS = $(CC) -c
# If a SPEC is not set already, then use these defaults.
ifeq ($(SPEC),)
CXX = CC
CC = cc
AS = $(CC) -c
HOSTCXX = $(CXX)
HOSTCC = $(CC)
HOSTCXX = $(CXX)
HOSTCC = $(CC)
endif
ARCHFLAG = $(ARCHFLAG/$(BUILDARCH))
ARCHFLAG/i486 = -m32

View File

@ -24,6 +24,11 @@
# The common definitions for hotspot builds.
# Optionally include SPEC file generated by configure.
ifneq ($(SPEC),)
include $(SPEC)
endif
# Default to verbose build logs (show all compile lines):
MAKE_VERBOSE=y

View File

@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2011
HS_MAJOR_VER=24
HS_MINOR_VER=0
HS_BUILD_NUMBER=01
HS_BUILD_NUMBER=02
JDK_MAJOR_VER=1
JDK_MINOR_VER=8

View File

@ -55,6 +55,7 @@
# The makefiles are split this way so that "make foo" will run faster by not
# having to read the dependency files for the vm.
-include $(SPEC)
include $(GAMMADIR)/make/scm.make
include $(GAMMADIR)/make/altsrc.make
@ -244,6 +245,8 @@ flags.make: $(BUILDTREE_MAKE) ../shared_dirs.lst
echo "HOTSPOT_EXTRA_SYSDEFS\$$(HOTSPOT_EXTRA_SYSDEFS) = $(HOTSPOT_EXTRA_SYSDEFS)" && \
echo "SYSDEFS += \$$(HOTSPOT_EXTRA_SYSDEFS)"; \
echo; \
[ -n "$(SPEC)" ] && \
echo "include $(SPEC)"; \
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(VARIANT).make"; \
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(COMPILER).make"; \
) > $@

View File

@ -25,21 +25,26 @@
#------------------------------------------------------------------------
# CC, CXX & AS
# When cross-compiling the ALT_COMPILER_PATH points
# to the cross-compilation toolset
ifdef CROSS_COMPILE_ARCH
CXX = $(ALT_COMPILER_PATH)/g++
CC = $(ALT_COMPILER_PATH)/gcc
HOSTCXX = g++
HOSTCC = gcc
else
CXX = g++
CC = gcc
HOSTCXX = $(CXX)
HOSTCC = $(CC)
# If a SPEC is not set already, then use these defaults.
ifeq ($(SPEC),)
# When cross-compiling the ALT_COMPILER_PATH points
# to the cross-compilation toolset
ifdef CROSS_COMPILE_ARCH
CXX = $(ALT_COMPILER_PATH)/g++
CC = $(ALT_COMPILER_PATH)/gcc
HOSTCXX = g++
HOSTCC = gcc
STRIP = $(ALT_COMPILER_PATH)/strip
else
CXX = g++
CC = gcc
HOSTCXX = $(CXX)
HOSTCC = $(CC)
STRIP = strip
endif
AS = $(CC) -c
endif
AS = $(CC) -c
# -dumpversion in gcc-2.91 shows "egcs-2.91.66". In later version, it only
# prints the numbers (e.g. "2.95", "3.2.1")
@ -261,9 +266,3 @@ endif
ifdef MINIMIZE_RAM_USAGE
CFLAGS += -DMINIMIZE_RAM_USAGE
endif
ifdef CROSS_COMPILE_ARCH
STRIP = $(ALT_COMPILER_PATH)/strip
else
STRIP = strip
endif

View File

@ -25,12 +25,15 @@
#------------------------------------------------------------------------
# CC, CXX & AS
CXX = CC
CC = cc
AS = $(CC) -c
# If a SPEC is not set already, then use these defaults.
ifeq ($(SPEC),)
CXX = CC
CC = cc
AS = $(CC) -c
HOSTCXX = $(CXX)
HOSTCC = $(CC)
HOSTCXX = $(CXX)
HOSTCC = $(CC)
endif
ARCHFLAG = $(ARCHFLAG/$(BUILDARCH))
ARCHFLAG/i486 = -m32

View File

@ -55,6 +55,7 @@
# The makefiles are split this way so that "make foo" will run faster by not
# having to read the dependency files for the vm.
-include $(SPEC)
include $(GAMMADIR)/make/scm.make
include $(GAMMADIR)/make/altsrc.make
@ -237,6 +238,8 @@ flags.make: $(BUILDTREE_MAKE) ../shared_dirs.lst
echo "HOTSPOT_EXTRA_SYSDEFS\$$(HOTSPOT_EXTRA_SYSDEFS) = $(HOTSPOT_EXTRA_SYSDEFS)" && \
echo "SYSDEFS += \$$(HOTSPOT_EXTRA_SYSDEFS)"; \
echo; \
[ -n "$(SPEC)" ] && \
echo "include $(SPEC)"; \
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(VARIANT).make"; \
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(COMPILER).make"; \
) > $@

View File

@ -25,9 +25,13 @@
#------------------------------------------------------------------------
# CC, CXX & AS
CXX = g++
CC = gcc
AS = $(CC) -c
# If a SPEC is not set already, then use these defaults.
ifeq ($(SPEC),)
CXX = g++
CC = gcc
AS = $(CC) -c
MCS = /usr/ccs/bin/mcs
endif
Compiler = gcc
@ -193,5 +197,3 @@ DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH))
ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),)
DEBUG_CFLAGS += -gstabs
endif
MCS = /usr/ccs/bin/mcs

View File

@ -22,18 +22,22 @@
#
#
# Compiler-specific flags for sparcworks.
# If a SPEC is not set already, then use these defaults.
ifeq ($(SPEC),)
# Compiler-specific flags for sparcworks.
CC = cc
CXX = CC
# tell make which C and C++ compilers to use
CC = cc
CXX = CC
# Note that this 'as' is an older version of the Sun Studio 'fbe', and will
# use the older style options. The 'fbe' options will match 'cc' and 'CC'.
AS = /usr/ccs/bin/as
# Note that this 'as' is an older version of the Sun Studio 'fbe', and will
# use the older style options. The 'fbe' options will match 'cc' and 'CC'.
AS = /usr/ccs/bin/as
NM = /usr/ccs/bin/nm
NAWK = /bin/nawk
NM = /usr/ccs/bin/nm
NAWK = /bin/nawk
MCS = /usr/ccs/bin/mcs
STRIP = /usr/ccs/bin/strip
endif
REORDER_FLAG = -xF
@ -557,9 +561,6 @@ else
#LINK_INTO = LIBJVM
endif
MCS = /usr/ccs/bin/mcs
STRIP = /usr/ccs/bin/strip
# Solaris platforms collect lots of redundant file-ident lines,
# to the point of wasting a significant percentage of file space.
# (The text is stored in ELF .comment sections, contributed by

View File

@ -297,6 +297,10 @@ $(variantDir)\local.make: checks
@ echo BUILDARCH=$(BUILDARCH) >> $@
@ echo Platform_arch=$(Platform_arch) >> $@
@ echo Platform_arch_model=$(Platform_arch_model) >> $@
@ echo CXX=$(CXX) >> $@
@ echo LD=$(LD) >> $@
@ echo MT=$(MT) >> $@
@ echo RC=$(RC) >> $@
@ sh $(WorkSpace)/make/windows/get_msc_ver.sh >> $@
checks: checkVariant checkWorkSpace checkSA

View File

@ -23,7 +23,9 @@
#
# Generic compiler settings
!if "x$(CXX)" == "x"
CXX=cl.exe
!endif
# CXX Flags: (these vary slightly from VC6->VS2003->VS2005 compilers)
# /nologo Supress copyright message at every cl.exe startup
@ -183,8 +185,10 @@ BUFFEROVERFLOWLIB = bufferoverflowU.lib
LD_FLAGS = /manifest $(LD_FLAGS) $(BUFFEROVERFLOWLIB)
# Manifest Tool - used in VS2005 and later to adjust manifests stored
# as resources inside build artifacts.
!if "x$(MT)" == "x"
MT=mt.exe
!endif
!endif
!if "$(COMPILER_NAME)" == "VS2008"
PRODUCT_OPT_OPTION = /O2 /Oy-
@ -194,8 +198,10 @@ GX_OPTION = /EHsc
LD_FLAGS = /manifest $(LD_FLAGS)
# Manifest Tool - used in VS2005 and later to adjust manifests stored
# as resources inside build artifacts.
!if "x$(MT)" == "x"
MT=mt.exe
!endif
!endif
!if "$(COMPILER_NAME)" == "VS2010"
PRODUCT_OPT_OPTION = /O2 /Oy-
@ -205,7 +211,9 @@ GX_OPTION = /EHsc
LD_FLAGS = /manifest $(LD_FLAGS)
# Manifest Tool - used in VS2005 and later to adjust manifests stored
# as resources inside build artifacts.
!if "x$(MT)" == "x"
MT=mt.exe
!endif
!if "$(BUILDARCH)" == "i486"
LD_FLAGS = /SAFESEH $(LD_FLAGS)
!endif
@ -225,7 +233,9 @@ FASTDEBUG_OPT_OPTION = $(DEBUG_OPT_OPTION)
!endif
# Generic linker settings
!if "x$(LD)" == "x"
LD=link.exe
!endif
LD_FLAGS= $(LD_FLAGS) kernel32.lib user32.lib gdi32.lib winspool.lib \
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib \
uuid.lib Wsock32.lib winmm.lib /nologo /machine:$(MACHINE) /opt:REF \
@ -237,7 +247,9 @@ LD_FLAGS= $(LD_FLAGS) psapi.lib
!endif
# Resource compiler settings
!if "x$(RC)" == "x"
RC=rc.exe
!endif
RC_FLAGS=/D "HS_VER=$(HS_VER)" \
/D "HS_DOTVER=$(HS_DOTVER)" \
/D "HS_BUILD_ID=$(HS_BUILD_ID)" \

View File

@ -202,3 +202,19 @@ ifeq ($(BUILD_WIN_SA), 1)
# Must pass this down to nmake.
MAKE_ARGS += BUILD_WIN_SA=1
endif
# Propagate compiler and tools paths from configure to nmake.
# Need to make sure they contain \\ and not /.
ifneq ($(SPEC),)
ifeq ($(USING_CYGWIN), true)
MAKE_ARGS += CXX="$(subst /,\\,$(shell /bin/cygpath -s -m -a $(CXX)))"
MAKE_ARGS += LD="$(subst /,\\,$(shell /bin/cygpath -s -m -a $(LD)))"
MAKE_ARGS += RC="$(subst /,\\,$(shell /bin/cygpath -s -m -a $(RC)))"
MAKE_ARGS += MT="$(subst /,\\,$(shell /bin/cygpath -s -m -a $(MT)))"
else
MAKE_ARGS += CXX="$(subst /,\\,$(CXX))"
MAKE_ARGS += LD="$(subst /,\\,$(LD))"
MAKE_ARGS += RC="$(subst /,\\,$(RC))"
MAKE_ARGS += MT="$(subst /,\\,$(MT))"
endif
endif

View File

@ -47,6 +47,12 @@ int StubAssembler::call_RT(Register oop_result1, Register oop_result2, address e
assert(!(oop_result1->is_valid() || oop_result2->is_valid()) || oop_result1 != oop_result2, "registers must be different");
assert(oop_result1 != thread && oop_result2 != thread, "registers must be different");
assert(args_size >= 0, "illegal args_size");
bool align_stack = false;
#ifdef _LP64
// At a method handle call, the stack may not be properly aligned
// when returning with an exception.
align_stack = (stub_id() == Runtime1::handle_exception_from_callee_id);
#endif
#ifdef _LP64
mov(c_rarg0, thread);
@ -59,11 +65,21 @@ int StubAssembler::call_RT(Register oop_result1, Register oop_result2, address e
push(thread);
#endif // _LP64
set_last_Java_frame(thread, noreg, rbp, NULL);
int call_offset;
if (!align_stack) {
set_last_Java_frame(thread, noreg, rbp, NULL);
} else {
address the_pc = pc();
call_offset = offset();
set_last_Java_frame(thread, noreg, rbp, the_pc);
andptr(rsp, -(StackAlignmentInBytes)); // Align stack
}
// do the call
call(RuntimeAddress(entry));
int call_offset = offset();
if (!align_stack) {
call_offset = offset();
}
// verify callee-saved register
#ifdef ASSERT
guarantee(thread != rax, "change this code");
@ -78,7 +94,7 @@ int StubAssembler::call_RT(Register oop_result1, Register oop_result2, address e
}
pop(rax);
#endif
reset_last_Java_frame(thread, true, false);
reset_last_Java_frame(thread, true, align_stack);
// discard thread and arguments
NOT_LP64(addptr(rsp, num_rt_args()*BytesPerWord));

View File

@ -1181,14 +1181,13 @@ static void save_or_restore_arguments(MacroAssembler* masm,
BasicType* in_sig_bt) {
// if map is non-NULL then the code should store the values,
// otherwise it should load them.
int handle_index = 0;
int slot = arg_save_area;
// Save down double word first
for ( int i = 0; i < total_in_args; i++) {
if (in_regs[i].first()->is_XMMRegister() && in_sig_bt[i] == T_DOUBLE) {
int slot = handle_index * VMRegImpl::slots_per_word + arg_save_area;
int offset = slot * VMRegImpl::stack_slot_size;
handle_index += 2;
assert(handle_index <= stack_slots, "overflow");
slot += VMRegImpl::slots_per_word;
assert(slot <= stack_slots, "overflow");
if (map != NULL) {
__ movdbl(Address(rsp, offset), in_regs[i].first()->as_XMMRegister());
} else {
@ -1197,10 +1196,7 @@ static void save_or_restore_arguments(MacroAssembler* masm,
}
if (in_regs[i].first()->is_Register() &&
(in_sig_bt[i] == T_LONG || in_sig_bt[i] == T_ARRAY)) {
int slot = handle_index * VMRegImpl::slots_per_word + arg_save_area;
int offset = slot * VMRegImpl::stack_slot_size;
handle_index += 2;
assert(handle_index <= stack_slots, "overflow");
if (map != NULL) {
__ movq(Address(rsp, offset), in_regs[i].first()->as_Register());
if (in_sig_bt[i] == T_ARRAY) {
@ -1209,14 +1205,15 @@ static void save_or_restore_arguments(MacroAssembler* masm,
} else {
__ movq(in_regs[i].first()->as_Register(), Address(rsp, offset));
}
slot += VMRegImpl::slots_per_word;
}
}
// Save or restore single word registers
for ( int i = 0; i < total_in_args; i++) {
if (in_regs[i].first()->is_Register()) {
int slot = handle_index++ * VMRegImpl::slots_per_word + arg_save_area;
int offset = slot * VMRegImpl::stack_slot_size;
assert(handle_index <= stack_slots, "overflow");
slot++;
assert(slot <= stack_slots, "overflow");
// Value is in an input register pass we must flush it to the stack
const Register reg = in_regs[i].first()->as_Register();
@ -1241,9 +1238,9 @@ static void save_or_restore_arguments(MacroAssembler* masm,
}
} else if (in_regs[i].first()->is_XMMRegister()) {
if (in_sig_bt[i] == T_FLOAT) {
int slot = handle_index++ * VMRegImpl::slots_per_word + arg_save_area;
int offset = slot * VMRegImpl::stack_slot_size;
assert(handle_index <= stack_slots, "overflow");
slot++;
assert(slot <= stack_slots, "overflow");
if (map != NULL) {
__ movflt(Address(rsp, offset), in_regs[i].first()->as_XMMRegister());
} else {
@ -1368,6 +1365,174 @@ static void unpack_array_argument(MacroAssembler* masm, VMRegPair reg, BasicType
__ bind(done);
}
class ComputeMoveOrder: public StackObj {
class MoveOperation: public ResourceObj {
friend class ComputeMoveOrder;
private:
VMRegPair _src;
VMRegPair _dst;
int _src_index;
int _dst_index;
bool _processed;
MoveOperation* _next;
MoveOperation* _prev;
static int get_id(VMRegPair r) {
return r.first()->value();
}
public:
MoveOperation(int src_index, VMRegPair src, int dst_index, VMRegPair dst):
_src(src)
, _src_index(src_index)
, _dst(dst)
, _dst_index(dst_index)
, _next(NULL)
, _prev(NULL)
, _processed(false) {
}
VMRegPair src() const { return _src; }
int src_id() const { return get_id(src()); }
int src_index() const { return _src_index; }
VMRegPair dst() const { return _dst; }
void set_dst(int i, VMRegPair dst) { _dst_index = i, _dst = dst; }
int dst_index() const { return _dst_index; }
int dst_id() const { return get_id(dst()); }
MoveOperation* next() const { return _next; }
MoveOperation* prev() const { return _prev; }
void set_processed() { _processed = true; }
bool is_processed() const { return _processed; }
// insert
void break_cycle(VMRegPair temp_register) {
// create a new store following the last store
// to move from the temp_register to the original
MoveOperation* new_store = new MoveOperation(-1, temp_register, dst_index(), dst());
// break the cycle of links and insert new_store at the end
// break the reverse link.
MoveOperation* p = prev();
assert(p->next() == this, "must be");
_prev = NULL;
p->_next = new_store;
new_store->_prev = p;
// change the original store to save it's value in the temp.
set_dst(-1, temp_register);
}
void link(GrowableArray<MoveOperation*>& killer) {
// link this store in front the store that it depends on
MoveOperation* n = killer.at_grow(src_id(), NULL);
if (n != NULL) {
assert(_next == NULL && n->_prev == NULL, "shouldn't have been set yet");
_next = n;
n->_prev = this;
}
}
};
private:
GrowableArray<MoveOperation*> edges;
public:
ComputeMoveOrder(int total_in_args, VMRegPair* in_regs, int total_c_args, VMRegPair* out_regs,
BasicType* in_sig_bt, GrowableArray<int>& arg_order, VMRegPair tmp_vmreg) {
// Move operations where the dest is the stack can all be
// scheduled first since they can't interfere with the other moves.
for (int i = total_in_args - 1, c_arg = total_c_args - 1; i >= 0; i--, c_arg--) {
if (in_sig_bt[i] == T_ARRAY) {
c_arg--;
if (out_regs[c_arg].first()->is_stack() &&
out_regs[c_arg + 1].first()->is_stack()) {
arg_order.push(i);
arg_order.push(c_arg);
} else {
if (out_regs[c_arg].first()->is_stack() ||
in_regs[i].first() == out_regs[c_arg].first()) {
add_edge(i, in_regs[i].first(), c_arg, out_regs[c_arg + 1]);
} else {
add_edge(i, in_regs[i].first(), c_arg, out_regs[c_arg]);
}
}
} else if (in_sig_bt[i] == T_VOID) {
arg_order.push(i);
arg_order.push(c_arg);
} else {
if (out_regs[c_arg].first()->is_stack() ||
in_regs[i].first() == out_regs[c_arg].first()) {
arg_order.push(i);
arg_order.push(c_arg);
} else {
add_edge(i, in_regs[i].first(), c_arg, out_regs[c_arg]);
}
}
}
// Break any cycles in the register moves and emit the in the
// proper order.
GrowableArray<MoveOperation*>* stores = get_store_order(tmp_vmreg);
for (int i = 0; i < stores->length(); i++) {
arg_order.push(stores->at(i)->src_index());
arg_order.push(stores->at(i)->dst_index());
}
}
// Collected all the move operations
void add_edge(int src_index, VMRegPair src, int dst_index, VMRegPair dst) {
if (src.first() == dst.first()) return;
edges.append(new MoveOperation(src_index, src, dst_index, dst));
}
// Walk the edges breaking cycles between moves. The result list
// can be walked in order to produce the proper set of loads
GrowableArray<MoveOperation*>* get_store_order(VMRegPair temp_register) {
// Record which moves kill which values
GrowableArray<MoveOperation*> killer;
for (int i = 0; i < edges.length(); i++) {
MoveOperation* s = edges.at(i);
assert(killer.at_grow(s->dst_id(), NULL) == NULL, "only one killer");
killer.at_put_grow(s->dst_id(), s, NULL);
}
assert(killer.at_grow(MoveOperation::get_id(temp_register), NULL) == NULL,
"make sure temp isn't in the registers that are killed");
// create links between loads and stores
for (int i = 0; i < edges.length(); i++) {
edges.at(i)->link(killer);
}
// at this point, all the move operations are chained together
// in a doubly linked list. Processing it backwards finds
// the beginning of the chain, forwards finds the end. If there's
// a cycle it can be broken at any point, so pick an edge and walk
// backward until the list ends or we end where we started.
GrowableArray<MoveOperation*>* stores = new GrowableArray<MoveOperation*>();
for (int e = 0; e < edges.length(); e++) {
MoveOperation* s = edges.at(e);
if (!s->is_processed()) {
MoveOperation* start = s;
// search for the beginning of the chain or cycle
while (start->prev() != NULL && start->prev() != s) {
start = start->prev();
}
if (start->prev() == s) {
start->break_cycle(temp_register);
}
// walk the chain forward inserting to store list
while (start != NULL) {
stores->append(start);
start->set_processed();
start = start->next();
}
}
}
return stores;
}
};
// ---------------------------------------------------------------------------
// Generate a native wrapper for a given method. The method takes arguments
// in the Java compiled code convention, marshals them to the native
@ -1488,12 +1653,12 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
if (in_regs[i].first()->is_Register()) {
const Register reg = in_regs[i].first()->as_Register();
switch (in_sig_bt[i]) {
case T_ARRAY:
case T_BOOLEAN:
case T_BYTE:
case T_SHORT:
case T_CHAR:
case T_INT: single_slots++; break;
case T_ARRAY:
case T_LONG: double_slots++; break;
default: ShouldNotReachHere();
}
@ -1690,36 +1855,43 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
#endif /* ASSERT */
if (is_critical_native) {
// The mapping of Java and C arguments passed in registers are
// rotated by one, which helps when passing arguments to regular
// Java method but for critical natives that creates a cycle which
// can cause arguments to be killed before they are used. Break
// the cycle by moving the first argument into a temporary
// register.
for (int i = 0; i < total_c_args; i++) {
if (in_regs[i].first()->is_Register() &&
in_regs[i].first()->as_Register() == rdi) {
__ mov(rbx, rdi);
in_regs[i].set1(rbx->as_VMReg());
}
}
}
// This may iterate in two different directions depending on the
// kind of native it is. The reason is that for regular JNI natives
// the incoming and outgoing registers are offset upwards and for
// critical natives they are offset down.
int c_arg = total_c_args - 1;
int stride = -1;
int init = total_in_args - 1;
if (is_critical_native) {
// stride forwards
c_arg = 0;
stride = 1;
init = 0;
GrowableArray<int> arg_order(2 * total_in_args);
VMRegPair tmp_vmreg;
tmp_vmreg.set1(rbx->as_VMReg());
if (!is_critical_native) {
for (int i = total_in_args - 1, c_arg = total_c_args - 1; i >= 0; i--, c_arg--) {
arg_order.push(i);
arg_order.push(c_arg);
}
} else {
// Compute a valid move order, using tmp_vmreg to break any cycles
ComputeMoveOrder cmo(total_in_args, in_regs, total_c_args, out_regs, in_sig_bt, arg_order, tmp_vmreg);
}
for (int i = init, count = 0; count < total_in_args; i += stride, c_arg += stride, count++ ) {
int temploc = -1;
for (int ai = 0; ai < arg_order.length(); ai += 2) {
int i = arg_order.at(ai);
int c_arg = arg_order.at(ai + 1);
__ block_comment(err_msg("move %d -> %d", i, c_arg));
if (c_arg == -1) {
assert(is_critical_native, "should only be required for critical natives");
// This arg needs to be moved to a temporary
__ mov(tmp_vmreg.first()->as_Register(), in_regs[i].first()->as_Register());
in_regs[i] = tmp_vmreg;
temploc = i;
continue;
} else if (i == -1) {
assert(is_critical_native, "should only be required for critical natives");
// Read from the temporary location
assert(temploc != -1, "must be valid");
i = temploc;
temploc = -1;
}
#ifdef ASSERT
if (in_regs[i].first()->is_Register()) {
assert(!reg_destroyed[in_regs[i].first()->as_Register()->encoding()], "destroyed reg!");
@ -1779,7 +1951,7 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
// point c_arg at the first arg that is already loaded in case we
// need to spill before we call out
c_arg++;
int c_arg = total_c_args - total_in_args;
// Pre-load a static method's oop into r14. Used both by locking code and
// the normal JNI call code.
@ -3620,8 +3792,12 @@ void OptoRuntime::generate_exception_blob() {
//
// address OptoRuntime::handle_exception_C(JavaThread* thread)
__ set_last_Java_frame(noreg, noreg, NULL);
// At a method handle call, the stack may not be properly aligned
// when returning with an exception.
address the_pc = __ pc();
__ set_last_Java_frame(noreg, noreg, the_pc);
__ mov(c_rarg0, r15_thread);
__ andptr(rsp, -(StackAlignmentInBytes)); // Align stack
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, OptoRuntime::handle_exception_C)));
// Set an oopmap for the call site. This oopmap will only be used if we
@ -3632,9 +3808,9 @@ void OptoRuntime::generate_exception_blob() {
OopMapSet* oop_maps = new OopMapSet();
oop_maps->add_gc_map( __ pc()-start, new OopMap(SimpleRuntimeFrame::framesize, 0));
oop_maps->add_gc_map(the_pc - start, new OopMap(SimpleRuntimeFrame::framesize, 0));
__ reset_last_Java_frame(false, false);
__ reset_last_Java_frame(false, true);
// Restore callee-saved registers

View File

@ -710,6 +710,21 @@ class StubGenerator: public StubCodeGenerator {
return start;
}
// Support for intptr_t get_previous_sp()
//
// This routine is used to find the previous stack pointer for the
// caller.
address generate_get_previous_sp() {
StubCodeMark mark(this, "StubRoutines", "get_previous_sp");
address start = __ pc();
__ movptr(rax, rsp);
__ addptr(rax, 8); // return address is at the top of the stack.
__ ret(0);
return start;
}
//----------------------------------------------------------------------------------------------------
// Support for void verify_mxcsr()
//
@ -3060,6 +3075,7 @@ class StubGenerator: public StubCodeGenerator {
// platform dependent
StubRoutines::x86::_get_previous_fp_entry = generate_get_previous_fp();
StubRoutines::x86::_get_previous_sp_entry = generate_get_previous_sp();
StubRoutines::x86::_verify_mxcsr_entry = generate_verify_mxcsr();

View File

@ -43,6 +43,7 @@
// a description of how to extend it, see the stubRoutines.hpp file.
address StubRoutines::x86::_get_previous_fp_entry = NULL;
address StubRoutines::x86::_get_previous_sp_entry = NULL;
address StubRoutines::x86::_verify_mxcsr_entry = NULL;

View File

@ -41,6 +41,7 @@ class x86 {
private:
static address _get_previous_fp_entry;
static address _get_previous_sp_entry;
static address _verify_mxcsr_entry;
static address _f2i_fixup;
@ -61,6 +62,11 @@ class x86 {
return _get_previous_fp_entry;
}
static address get_previous_sp_entry()
{
return _get_previous_sp_entry;
}
static address verify_mxcsr_entry()
{
return _verify_mxcsr_entry;

View File

@ -4690,14 +4690,12 @@ char* os::map_memory(int fd, const char* file_name, size_t file_offset,
char *addr, size_t bytes, bool read_only,
bool allow_exec) {
int prot;
int flags;
int flags = MAP_PRIVATE;
if (read_only) {
prot = PROT_READ;
flags = MAP_SHARED;
} else {
prot = PROT_READ | PROT_WRITE;
flags = MAP_PRIVATE;
}
if (allow_exec) {

View File

@ -1013,15 +1013,6 @@ extern "C" void breakpoint() {
// use debugger to set breakpoint here
}
// Returns an estimate of the current stack pointer. Result must be guaranteed to
// point into the calling threads stack, and be no lower than the current stack
// pointer.
address os::current_stack_pointer() {
volatile int dummy;
address sp = (address)&dummy + 8; // %%%% need to confirm if this is right
return sp;
}
static thread_t main_thread;
// Thread start routine for all new Java threads

View File

@ -324,16 +324,6 @@ extern "C" void breakpoint() {
os::breakpoint();
}
// Returns an estimate of the current stack pointer. Result must be guaranteed
// to point into the calling threads stack, and be no lower than the current
// stack pointer.
address os::current_stack_pointer() {
int dummy;
address sp = (address)&dummy;
return sp;
}
// os::current_stack_base()
//
// Returns the base of the stack, which is the stack's

View File

@ -1126,3 +1126,8 @@ void os::setup_fpu() {
: "r" (fpu_cntrl) : "memory");
#endif // !AMD64
}
#ifndef PRODUCT
void os::verify_stack_alignment() {
}
#endif

View File

@ -562,3 +562,8 @@ extern "C" {
}
};
#endif // !_LP64
#ifndef PRODUCT
void os::verify_stack_alignment() {
}
#endif

View File

@ -756,3 +756,8 @@ size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
// guard page, only enable glibc guard page for non-Java threads.
return (thr_type == java_thread ? 0 : page_size());
}
#ifndef PRODUCT
void os::verify_stack_alignment() {
}
#endif

View File

@ -862,3 +862,11 @@ void os::setup_fpu() {
: "r" (fpu_cntrl) : "memory");
#endif // !AMD64
}
#ifndef PRODUCT
void os::verify_stack_alignment() {
#ifdef AMD64
assert(((intptr_t)os::current_stack_pointer() & (StackAlignmentInBytes-1)) == 0, "incorrect stack alignment");
#endif
}
#endif

View File

@ -506,3 +506,8 @@ extern "C" {
}
};
#endif // !_LP64
#ifndef PRODUCT
void os::verify_stack_alignment() {
}
#endif

View File

@ -251,6 +251,15 @@ frame os::get_sender_for_C_frame(frame* fr) {
return frame(fr->sender_sp(), frame::unpatchable, fr->sender_pc());
}
// Returns an estimate of the current stack pointer. Result must be guaranteed to
// point into the calling threads stack, and be no lower than the current stack
// pointer.
address os::current_stack_pointer() {
volatile int dummy;
address sp = (address)&dummy + 8; // %%%% need to confirm if this is right
return sp;
}
frame os::current_frame() {
intptr_t* sp = StubRoutines::Sparc::flush_callers_register_windows_func()();
frame myframe(sp, frame::unpatchable,
@ -815,3 +824,8 @@ add_func_t* os::atomic_add_func = os::atomic_add_bootstrap;
__asm__ __volatile__ ("wr %%g0, 0, %%fprs \n\t" : : :);
}
#endif //defined(__sparc) && defined(COMPILER2)
#ifndef PRODUCT
void os::verify_stack_alignment() {
}
#endif

View File

@ -237,6 +237,12 @@ frame os::get_sender_for_C_frame(frame* fr) {
return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
}
extern "C" intptr_t *_get_current_sp(); // in .il file
address os::current_stack_pointer() {
return (address)_get_current_sp();
}
extern "C" intptr_t *_get_current_fp(); // in .il file
frame os::current_frame() {
@ -954,3 +960,11 @@ void os::setup_fpu() {
_solaris_raw_setup_fpu(fpu_cntrl);
}
#endif // AMD64
#ifndef PRODUCT
void os::verify_stack_alignment() {
#ifdef AMD64
assert(((intptr_t)os::current_stack_pointer() & (StackAlignmentInBytes-1)) == 0, "incorrect stack alignment");
#endif
}
#endif

View File

@ -37,6 +37,12 @@
movl %gs:0, %eax
.end
// Get current sp
.inline _get_current_sp,0
.volatile
movl %esp, %eax
.end
// Get current fp
.inline _get_current_fp,0
.volatile

View File

@ -30,6 +30,12 @@
movq %fs:0, %rax
.end
// Get current sp
.inline _get_current_sp,0
.volatile
movq %rsp, %rax
.end
// Get current fp
.inline _get_current_fp,0
.volatile

View File

@ -370,6 +370,26 @@ frame os::get_sender_for_C_frame(frame* fr) {
return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
}
#ifndef AMD64
// Returns an estimate of the current stack pointer. Result must be guaranteed
// to point into the calling threads stack, and be no lower than the current
// stack pointer.
address os::current_stack_pointer() {
int dummy;
address sp = (address)&dummy;
return sp;
}
#else
// Returns the current stack pointer. Accurate value needed for
// os::verify_stack_alignment().
address os::current_stack_pointer() {
typedef address get_sp_func();
get_sp_func* func = CAST_TO_FN_PTR(get_sp_func*,
StubRoutines::x86::get_previous_sp_entry());
return (*func)();
}
#endif
#ifndef AMD64
intptr_t* _get_previous_fp() {
@ -546,3 +566,11 @@ void os::setup_fpu() {
__asm fldcw fpu_cntrl_word;
#endif // !AMD64
}
#ifndef PRODUCT
void os::verify_stack_alignment() {
#ifdef AMD64
assert(((intptr_t)os::current_stack_pointer() & (StackAlignmentInBytes-1)) == 0, "incorrect stack alignment");
#endif
}
#endif

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -33,6 +33,7 @@ public class Compilation implements LogEvent {
private boolean osr;
private Method method;
private CallSite call = new CallSite();
private CallSite lateInlineCall = new CallSite();
private int osrBci;
private String icount;
private String bcount;
@ -80,6 +81,13 @@ public class Compilation implements LogEvent {
sb.append(site);
sb.append("\n");
}
if (getLateInlineCall().getCalls() != null) {
sb.append("late inline:\n");
for (CallSite site : getLateInlineCall().getCalls()) {
sb.append(site);
sb.append("\n");
}
}
return sb.toString();
}
@ -115,6 +123,12 @@ public class Compilation implements LogEvent {
site.print(stream, indent + 2);
}
}
if (printInlining && lateInlineCall.getCalls() != null) {
stream.println("late inline:");
for (CallSite site : lateInlineCall.getCalls()) {
site.print(stream, indent + 2);
}
}
}
}
@ -215,7 +229,11 @@ public class Compilation implements LogEvent {
}
public void setMethod(Method method) {
this.method = method;
// Don't change method if it is already set to avoid changing
// it by post parse inlining info.
if (getMethod() == null) {
this.method = method;
}
}
public CallSite getCall() {
@ -226,6 +244,10 @@ public class Compilation implements LogEvent {
this.call = call;
}
public CallSite getLateInlineCall() {
return lateInlineCall;
}
public double getElapsedTime() {
return end - start;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -146,6 +146,7 @@ public class LogParser extends DefaultHandler implements ErrorHandler, Constants
private CallSite site;
private Stack<Phase> phaseStack = new Stack<Phase>();
private UncommonTrapEvent currentTrap;
private Stack<CallSite> late_inline_scope;
long parseLong(String l) {
try {
@ -302,6 +303,7 @@ public class LogParser extends DefaultHandler implements ErrorHandler, Constants
}
events.add(compile);
compiles.put(makeId(atts), compile);
site = compile.getCall();
} else if (qname.equals("type")) {
type(search(atts, "id"), search(atts, "name"));
} else if (qname.equals("bc")) {
@ -360,12 +362,22 @@ public class LogParser extends DefaultHandler implements ErrorHandler, Constants
// uncommon trap inserted during parsing.
// ignore for now
}
} else if (qname.equals("late_inline")) {
late_inline_scope = new Stack<CallSite>();
site = new CallSite(-999, method(search(atts, "method")));
late_inline_scope.push(site);
} else if (qname.equals("jvms")) {
// <jvms bci='4' method='java/io/DataInputStream readChar ()C' bytes='40' count='5815' iicount='20815'/>
if (currentTrap != null) {
currentTrap.addJVMS(atts.getValue("method"), Integer.parseInt(atts.getValue("bci")));
} else if (late_inline_scope != null) {
bci = Integer.parseInt(search(atts, "bci"));
site = new CallSite(bci, method(search(atts, "method")));
late_inline_scope.push(site);
} else {
// Ignore <eliminate_allocation type='667'> and <eliminate_lock lock='1'>
// Ignore <eliminate_allocation type='667'>,
// <eliminate_lock lock='1'>,
// <replace_string_concat arguments='2' string_alloc='0' multiple='0'>
}
} else if (qname.equals("nmethod")) {
String id = makeId(atts);
@ -379,7 +391,7 @@ public class LogParser extends DefaultHandler implements ErrorHandler, Constants
Method m = method(search(atts, "method"));
if (scopes.size() == 0) {
compile.setMethod(m);
scopes.push(compile.getCall());
scopes.push(site);
} else {
if (site.getMethod() == m) {
scopes.push(site);
@ -393,7 +405,7 @@ public class LogParser extends DefaultHandler implements ErrorHandler, Constants
}
} else if (qname.equals("parse_done")) {
CallSite call = scopes.pop();
call.setEndNodes(Integer.parseInt(search(atts, "nodes")));
call.setEndNodes(Integer.parseInt(search(atts, "nodes", "1")));
call.setTimeStamp(Double.parseDouble(search(atts, "stamp")));
scopes.push(call);
}
@ -408,6 +420,43 @@ public class LogParser extends DefaultHandler implements ErrorHandler, Constants
scopes.pop();
} else if (qname.equals("uncommon_trap")) {
currentTrap = null;
} else if (qname.equals("late_inline")) {
// Populate late inlining info.
// late_inline scopes are specified in reverse order:
// compiled method should be on top of stack.
CallSite caller = late_inline_scope.pop();
Method m = compile.getMethod();
if (m != caller.getMethod()) {
System.out.println(m);
System.out.println(caller.getMethod() + " bci: " + bci);
throw new InternalError("call site and late_inline info don't match");
}
// late_inline contains caller+bci info, convert it
// to bci+callee info used by LogCompilation.
site = compile.getLateInlineCall();
do {
bci = caller.getBci();
// Next inlined call.
caller = late_inline_scope.pop();
CallSite callee = new CallSite(bci, caller.getMethod());
site.add(callee);
site = callee;
} while (!late_inline_scope.empty());
if (caller.getBci() != -999) {
System.out.println(caller.getMethod());
throw new InternalError("broken late_inline info");
}
if (site.getMethod() != caller.getMethod()) {
System.out.println(site.getMethod());
System.out.println(caller.getMethod());
throw new InternalError("call site and late_inline info don't match");
}
// late_inline is followed by parse with scopes.size() == 0,
// 'site' will be pushed to scopes.
late_inline_scope = null;
} else if (qname.equals("task")) {
types.clear();
methods.clear();

View File

@ -1884,7 +1884,7 @@ void LinearScan::resolve_exception_entry(BlockBegin* block, MoveResolver &move_r
if (move_resolver.has_mappings()) {
// insert moves after first instruction
move_resolver.set_insert_position(block->lir(), 1);
move_resolver.set_insert_position(block->lir(), 0);
move_resolver.resolve_and_append_moves();
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -509,6 +509,9 @@
template(clear_name, "clear") \
template(trigger_method_signature, "(ILjava/lang/management/MemoryUsage;)V") \
template(startAgent_name, "startAgent") \
template(startRemoteAgent_name, "startRemoteManagementAgent") \
template(startLocalAgent_name, "startLocalManagementAgent") \
template(stopRemoteAgent_name, "stopRemoteManagementAgent") \
template(java_lang_management_ThreadInfo_constructor_signature, "(Ljava/lang/Thread;ILjava/lang/Object;Ljava/lang/Thread;JJJJ[Ljava/lang/StackTraceElement;)V") \
template(java_lang_management_ThreadInfo_with_locks_constructor_signature, "(Ljava/lang/Thread;ILjava/lang/Object;Ljava/lang/Thread;JJJJ[Ljava/lang/StackTraceElement;[Ljava/lang/Object;[I[Ljava/lang/Object;)V") \
template(long_long_long_long_void_signature, "(JJJJ)V") \

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -504,17 +504,17 @@ bool ConstantPoolCacheEntry::is_interesting_method_entry(klassOop k) {
void ConstantPoolCacheEntry::print(outputStream* st, int index) const {
// print separator
if (index == 0) tty->print_cr(" -------------");
if (index == 0) st->print_cr(" -------------");
// print entry
tty->print("%3d ("PTR_FORMAT") ", index, (intptr_t)this);
st->print("%3d ("PTR_FORMAT") ", index, (intptr_t)this);
if (is_secondary_entry())
tty->print_cr("[%5d|secondary]", main_entry_index());
st->print_cr("[%5d|secondary]", main_entry_index());
else
tty->print_cr("[%02x|%02x|%5d]", bytecode_2(), bytecode_1(), constant_pool_index());
tty->print_cr(" [ "PTR_FORMAT"]", (intptr_t)(oop)_f1);
tty->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_f2);
tty->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_flags);
tty->print_cr(" -------------");
st->print_cr("[%02x|%02x|%5d]", bytecode_2(), bytecode_1(), constant_pool_index());
st->print_cr(" [ "PTR_FORMAT"]", (intptr_t)(oop)_f1);
st->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_f2);
st->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_flags);
st->print_cr(" -------------");
}
void ConstantPoolCacheEntry::verify(outputStream* st) const {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -1051,6 +1051,7 @@ Node *ConvL2INode::Ideal(PhaseGVN *phase, bool can_reshape) {
//------------------------------Value------------------------------------------
const Type *CastX2PNode::Value( PhaseTransform *phase ) const {
const Type* t = phase->type(in(1));
if (t == Type::TOP) return Type::TOP;
if (t->base() == Type_X && t->singleton()) {
uintptr_t bits = (uintptr_t) t->is_intptr_t()->get_con();
if (bits == 0) return TypePtr::NULL_PTR;
@ -1121,6 +1122,7 @@ Node *CastX2PNode::Identity( PhaseTransform *phase ) {
//------------------------------Value------------------------------------------
const Type *CastP2XNode::Value( PhaseTransform *phase ) const {
const Type* t = phase->type(in(1));
if (t == Type::TOP) return Type::TOP;
if (t->base() == Type::RawPtr && t->singleton()) {
uintptr_t bits = (uintptr_t) t->is_rawptr()->get_con();
return TypeX::make(bits);

View File

@ -2035,40 +2035,14 @@ void ConnectionGraph::find_init_values(Node* alloc, VectorSet* visited, PhaseTra
Node* store = ini->find_captured_store(offset, type2aelembytes(ft), phase);
if (store != NULL && store->is_Store()) {
value = store->in(MemNode::ValueIn);
} else if (ptn->edge_count() > 0) { // Are there oop stores?
// Check for a store which follows allocation without branches.
} else {
// There could be initializing stores which follow allocation.
// For example, a volatile field store is not collected
// by Initialize node. TODO: it would be nice to use idom() here.
// by Initialize node.
//
// Search all references to the same field which use different
// AddP nodes, for example, in the next case:
//
// Point p[] = new Point[1];
// if ( x ) { p[0] = new Point(); p[0].x = x; }
// if ( p[0] != null ) { y = p[0].x; } // has CastPP
//
for (uint next = ei; (next < ae_cnt) && (value == NULL); next++) {
uint fpi = pta->edge_target(next); // Field (AddP)
PointsToNode *ptf = ptnode_adr(fpi);
if (ptf->offset() == offset) {
Node* nf = ptf->_node;
for (DUIterator_Fast imax, i = nf->fast_outs(imax); i < imax; i++) {
store = nf->fast_out(i);
if (store->is_Store() && store->in(0) != NULL) {
Node* ctrl = store->in(0);
while(!(ctrl == ini || ctrl == alloc || ctrl == NULL ||
ctrl == C->root() || ctrl == C->top() || ctrl->is_Region() ||
ctrl->is_IfTrue() || ctrl->is_IfFalse())) {
ctrl = ctrl->in(0);
}
if (ctrl == ini || ctrl == alloc) {
value = store->in(MemNode::ValueIn);
break;
}
}
}
}
}
// Need to check for dependent loads to separate such stores from
// stores which follow loads. For now, add initial value NULL so
// that compare pointers optimization works correctly.
}
}
if (value == NULL || value != ptnode_adr(value->_idx)->_node) {

View File

@ -436,6 +436,7 @@ class RuntimeHistogramElement : public HistogramElement {
#define VM_LEAF_BASE(result_type, header) \
TRACE_CALL(result_type, header) \
debug_only(NoHandleMark __hm;) \
os::verify_stack_alignment(); \
/* begin of body */
@ -445,6 +446,7 @@ class RuntimeHistogramElement : public HistogramElement {
TRACE_CALL(result_type, header) \
HandleMarkCleaner __hm(thread); \
Thread* THREAD = thread; \
os::verify_stack_alignment(); \
/* begin of body */
@ -454,6 +456,7 @@ class RuntimeHistogramElement : public HistogramElement {
TRACE_CALL(result_type, header) \
debug_only(NoHandleMark __hm;) \
Thread* THREAD = thread; \
os::verify_stack_alignment(); \
/* begin of body */

View File

@ -404,6 +404,8 @@ class os: AllStatic {
static address current_stack_base();
static size_t current_stack_size();
static void verify_stack_alignment() PRODUCT_RETURN;
static int message_box(const char* title, const char* message);
static char* do_you_want_to_debug(const char* message);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -49,6 +49,11 @@ void DCmdRegistrant::register_dcmds(){
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<ClassHistogramDCmd>(true, false));
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<ThreadDumpDCmd>(true, false));
//Enhanced JMX Agent Support
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<JMXStartRemoteDCmd>(true,false));
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<JMXStartLocalDCmd>(true,false));
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<JMXStopRemoteDCmd>(true,false));
}
#ifndef HAVE_EXTRA_DCMD
@ -344,3 +349,185 @@ int ThreadDumpDCmd::num_arguments() {
return 0;
}
}
// Enhanced JMX Agent support
JMXStartRemoteDCmd::JMXStartRemoteDCmd(outputStream *output, bool heap_allocated) :
DCmdWithParser(output, heap_allocated),
_config_file
("config.file",
"set com.sun.management.config.file", "STRING", false),
_jmxremote_port
("jmxremote.port",
"set com.sun.management.jmxremote.port", "STRING", false),
_jmxremote_rmi_port
("jmxremote.rmi.port",
"set com.sun.management.jmxremote.rmi.port", "STRING", false),
_jmxremote_ssl
("jmxremote.ssl",
"set com.sun.management.jmxremote.ssl", "STRING", false),
_jmxremote_registry_ssl
("jmxremote.registry.ssl",
"set com.sun.management.jmxremote.registry.ssl", "STRING", false),
_jmxremote_authenticate
("jmxremote.authenticate",
"set com.sun.management.jmxremote.authenticate", "STRING", false),
_jmxremote_password_file
("jmxremote.password.file",
"set com.sun.management.jmxremote.password.file", "STRING", false),
_jmxremote_access_file
("jmxremote.access.file",
"set com.sun.management.jmxremote.access.file", "STRING", false),
_jmxremote_login_config
("jmxremote.login.config",
"set com.sun.management.jmxremote.login.config", "STRING", false),
_jmxremote_ssl_enabled_cipher_suites
("jmxremote.ssl.enabled.cipher.suites",
"set com.sun.management.jmxremote.ssl.enabled.cipher.suite", "STRING", false),
_jmxremote_ssl_enabled_protocols
("jmxremote.ssl.enabled.protocols",
"set com.sun.management.jmxremote.ssl.enabled.protocols", "STRING", false),
_jmxremote_ssl_need_client_auth
("jmxremote.ssl.need.client.auth",
"set com.sun.management.jmxremote.need.client.auth", "STRING", false),
_jmxremote_ssl_config_file
("jmxremote.ssl.config.file",
"set com.sun.management.jmxremote.ssl_config_file", "STRING", false)
{
_dcmdparser.add_dcmd_option(&_config_file);
_dcmdparser.add_dcmd_option(&_jmxremote_port);
_dcmdparser.add_dcmd_option(&_jmxremote_rmi_port);
_dcmdparser.add_dcmd_option(&_jmxremote_ssl);
_dcmdparser.add_dcmd_option(&_jmxremote_registry_ssl);
_dcmdparser.add_dcmd_option(&_jmxremote_authenticate);
_dcmdparser.add_dcmd_option(&_jmxremote_password_file);
_dcmdparser.add_dcmd_option(&_jmxremote_access_file);
_dcmdparser.add_dcmd_option(&_jmxremote_login_config);
_dcmdparser.add_dcmd_option(&_jmxremote_ssl_enabled_cipher_suites);
_dcmdparser.add_dcmd_option(&_jmxremote_ssl_enabled_protocols);
_dcmdparser.add_dcmd_option(&_jmxremote_ssl_need_client_auth);
_dcmdparser.add_dcmd_option(&_jmxremote_ssl_config_file);
}
int JMXStartRemoteDCmd::num_arguments() {
ResourceMark rm;
JMXStartRemoteDCmd* dcmd = new JMXStartRemoteDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}
void JMXStartRemoteDCmd::execute(TRAPS) {
ResourceMark rm(THREAD);
HandleMark hm(THREAD);
// Load and initialize the sun.management.Agent class
// invoke startRemoteManagementAgent(string) method to start
// the remote management server.
// throw java.lang.NoSuchMethodError if the method doesn't exist
Handle loader = Handle(THREAD, SystemDictionary::java_system_loader());
klassOop k = SystemDictionary::resolve_or_fail(vmSymbols::sun_management_Agent(), loader, Handle(), true, CHECK);
instanceKlassHandle ik (THREAD, k);
JavaValue result(T_VOID);
// Pass all command line arguments to java as key=value,...
// All checks are done on java side
int len = 0;
stringStream options;
char comma[2] = {0,0};
// Leave default values on Agent.class side and pass only
// agruments explicitly set by user. All arguments passed
// to jcmd override properties with the same name set by
// command line with -D or by managmenent.properties
// file.
#define PUT_OPTION(a) \
if ( (a).is_set() ){ \
options.print("%scom.sun.management.%s=%s", comma, (a).name(), (a).value()); \
comma[0] = ','; \
}
PUT_OPTION(_config_file);
PUT_OPTION(_jmxremote_port);
PUT_OPTION(_jmxremote_rmi_port);
PUT_OPTION(_jmxremote_ssl);
PUT_OPTION(_jmxremote_registry_ssl);
PUT_OPTION(_jmxremote_authenticate);
PUT_OPTION(_jmxremote_password_file);
PUT_OPTION(_jmxremote_access_file);
PUT_OPTION(_jmxremote_login_config);
PUT_OPTION(_jmxremote_ssl_enabled_cipher_suites);
PUT_OPTION(_jmxremote_ssl_enabled_protocols);
PUT_OPTION(_jmxremote_ssl_need_client_auth);
PUT_OPTION(_jmxremote_ssl_config_file);
#undef PUT_OPTION
Handle str = java_lang_String::create_from_str(options.as_string(), CHECK);
JavaCalls::call_static(&result, ik, vmSymbols::startRemoteAgent_name(), vmSymbols::string_void_signature(), str, CHECK);
}
JMXStartLocalDCmd::JMXStartLocalDCmd(outputStream *output, bool heap_allocated) :
DCmd(output, heap_allocated)
{
// do nothing
}
void JMXStartLocalDCmd::execute(TRAPS) {
ResourceMark rm(THREAD);
HandleMark hm(THREAD);
// Load and initialize the sun.management.Agent class
// invoke startLocalManagementAgent(void) method to start
// the local management server
// throw java.lang.NoSuchMethodError if method doesn't exist
Handle loader = Handle(THREAD, SystemDictionary::java_system_loader());
klassOop k = SystemDictionary::resolve_or_fail(vmSymbols::sun_management_Agent(), loader, Handle(), true, CHECK);
instanceKlassHandle ik (THREAD, k);
JavaValue result(T_VOID);
JavaCalls::call_static(&result, ik, vmSymbols::startLocalAgent_name(), vmSymbols::void_method_signature(), CHECK);
}
void JMXStopRemoteDCmd::execute(TRAPS) {
ResourceMark rm(THREAD);
HandleMark hm(THREAD);
// Load and initialize the sun.management.Agent class
// invoke stopRemoteManagementAgent method to stop the
// management server
// throw java.lang.NoSuchMethodError if method doesn't exist
Handle loader = Handle(THREAD, SystemDictionary::java_system_loader());
klassOop k = SystemDictionary::resolve_or_fail(vmSymbols::sun_management_Agent(), loader, Handle(), true, CHECK);
instanceKlassHandle ik (THREAD, k);
JavaValue result(T_VOID);
JavaCalls::call_static(&result, ik, vmSymbols::stopRemoteAgent_name(), vmSymbols::void_method_signature(), CHECK);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -214,4 +214,82 @@ public:
virtual void execute(TRAPS);
};
// Enhanced JMX Agent support
class JMXStartRemoteDCmd : public DCmdWithParser {
// Explicitly list all properties that could be
// passed to Agent.startRemoteManagementAgent()
// com.sun.management is omitted
DCmdArgument<char *> _config_file;
DCmdArgument<char *> _jmxremote_port;
DCmdArgument<char *> _jmxremote_rmi_port;
DCmdArgument<char *> _jmxremote_ssl;
DCmdArgument<char *> _jmxremote_registry_ssl;
DCmdArgument<char *> _jmxremote_authenticate;
DCmdArgument<char *> _jmxremote_password_file;
DCmdArgument<char *> _jmxremote_access_file;
DCmdArgument<char *> _jmxremote_login_config;
DCmdArgument<char *> _jmxremote_ssl_enabled_cipher_suites;
DCmdArgument<char *> _jmxremote_ssl_enabled_protocols;
DCmdArgument<char *> _jmxremote_ssl_need_client_auth;
DCmdArgument<char *> _jmxremote_ssl_config_file;
public:
JMXStartRemoteDCmd(outputStream *output, bool heap_allocated);
static const char *name() {
return "ManagementAgent.start";
}
static const char *description() {
return "Start remote management agent.";
}
static int num_arguments();
virtual void execute(TRAPS);
};
class JMXStartLocalDCmd : public DCmd {
// Explicitly request start of local agent,
// it will not be started by start dcmd
public:
JMXStartLocalDCmd(outputStream *output, bool heap_allocated);
static const char *name() {
return "ManagementAgent.start_local";
}
static const char *description() {
return "Start local management agent.";
}
virtual void execute(TRAPS);
};
class JMXStopRemoteDCmd : public DCmd {
public:
JMXStopRemoteDCmd(outputStream *output, bool heap_allocated) :
DCmd(output, heap_allocated) {
// Do Nothing
}
static const char *name() {
return "ManagementAgent.stop";
}
static const char *description() {
return "Stop remote management agent.";
}
virtual void execute(TRAPS);
};
#endif // SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP

View File

@ -149,3 +149,4 @@ dda27c73d8db4a9c7a23872b6f0c5106edcb2021 jdk8-b22
ec17fbe5b8fbc52da070eec43b4711d9354b2ab8 jdk8-b25
5aca406e87cb9144a9405be312dadd728a9c6fe2 jdk8-b26
c68342532e2e7deb3a25fc04ed3e4c142278f747 jdk8-b27
1e1d41daaded291ab3a370ca6a27f7325701978e jdk8-b28

View File

@ -197,7 +197,7 @@ examples_help:
#
# 'all' target intro
#
all::
all::
@$(ECHO) $(PLATFORM) $(ARCH) $(RELEASE) build started: $(shell $(DATE) '+%y-%m-%d %H:%M')
# Just in case anyone uses this old name, same as 'build'
@ -234,7 +234,17 @@ all build:: sanity-all post-sanity-all
SUBDIRS = tools java javax sun com
SUBDIRS_tools = launchers
SUBDIRS_misc = org sunw jpda mkdemo mksample
SUBDIRS_misc = org sunw jpda
# demos
ifndef NO_DEMOS
SUBDIRS_misc += mkdemo
endif
# samples
ifndef NO_SAMPLES
SUBDIRS_misc += mksample
endif
# Alternate classes implementation
ifndef OPENJDK
@ -383,4 +393,3 @@ include jprt.gmk
.PHONY: all build clean clobber optimized debug fastdebug create_links \
import import_product import_fastdebug import_debug \
test test_run test_start test_clean test_summary

View File

@ -234,7 +234,7 @@ images:: sanity-images post-sanity-images \
$(INITIAL_IMAGE_JRE) $(INITIAL_IMAGE_JDK) \
trim-image-jre trim-image-jdk \
identify-image-jre identify-image-jdk \
process-image-jre process-image-jdk sec-files sec-files-win jgss-files
process-image-jre process-image-jdk sec-files sec-files-win jgss-files
# Don't use these
image-jre:: initial-image-jre trim-image-jre identify-image-jre process-image-jre
@ -496,7 +496,7 @@ $(JDK_IMAGE_DIR)/demo/DEMOS_LICENSE: $(SHARE_JDK_DOC_SRC)/DEMOS_LICENSE
$(JDK_IMAGE_DIR)/sample/SAMPLES_LICENSE: $(SHARE_JDK_DOC_SRC)/SAMPLES_LICENSE
$(process-doc-file)
# JRE files
# JRE files
$(JRE_IMAGE_DIR)/%: $(SHARE_JRE_DOC_SRC)/%
$(process-doc-file)
ifeq ($(PLATFORM), windows)
@ -1095,8 +1095,12 @@ initial-image-jdk:: initial-image-jdk-setup \
@#
@# demo, include
@#
ifndef NO_DEMOS
$(CP) -r -f $(DEMODIR) $(JDK_IMAGE_DIR)
endif
ifndef NO_SAMPLES
$(CP) -r -f $(SAMPLEDIR) $(JDK_IMAGE_DIR)
endif
$(CP) -r $(INCLUDEDIR) $(JDK_IMAGE_DIR)
@#
@# Swing BeanInfo generation
@ -1359,4 +1363,3 @@ images images-clobber::
# Force rule
FRC:

View File

@ -134,6 +134,8 @@ ALL_SETTINGS+=$(call addOptionalSetting,USE_HOTSPOT_INTERPRETER_MODE)
ALL_SETTINGS+=$(call addOptionalSetting,PEDANTIC)
ALL_SETTINGS+=$(call addOptionalSetting,DEV_ONLY)
ALL_SETTINGS+=$(call addOptionalSetting,NO_DOCS)
ALL_SETTINGS+=$(call addOptionalSetting,NO_DEMOS)
ALL_SETTINGS+=$(call addOptionalSetting,NO_SAMPLES)
ALL_SETTINGS+=$(call addOptionalSetting,NO_IMAGES)
ALL_SETTINGS+=$(call addOptionalSetting,TOOLS_ONLY)
ALL_SETTINGS+=$(call addOptionalSetting,INSANE)
@ -263,4 +265,3 @@ ifdef OPENJDK
ALL_SETTINGS+=$(call addAltSetting,PREVIOUS_JRE_FILE)
ALL_SETTINGS+=$(call addAltSetting,PREVIOUS_RELEASE_IMAGE)
endif

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -26,6 +26,7 @@
package build.tools.javazic;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@ -162,6 +163,20 @@ class Mappings {
for (String key : toBeRemoved) {
aliases.remove(key);
}
// Eliminate any alias-to-alias mappings. For example, if
// there are A->B and B->C, A->B is changed to A->C.
Map<String, String> newMap = new HashMap<String, String>();
for (String key : aliases.keySet()) {
String realid = aliases.get(key);
String leaf = realid;
while (aliases.get(leaf) != null) {
leaf = aliases.get(leaf);
}
if (!realid.equals(leaf)) {
newMap.put(key, leaf);
}
}
aliases.putAll(newMap);
}
Map<String,String> getAliases() {

View File

@ -55,7 +55,6 @@ import javax.swing.text.DefaultEditorKit;
import java.awt.Font;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.ActionEvent;
import java.security.AccessController;
@ -523,6 +522,7 @@ public class WindowsLookAndFeel extends BasicLookAndFeel
Object ScrollbarBackgroundColor = new DesktopProperty(
"win.scrollbar.backgroundColor",
table.get("scrollbar"));
Object buttonFocusColor = new FocusColorProperty();
Object TextBackground = new XPColorValue(Part.EP_EDIT, null, Prop.FILLCOLOR,
WindowBackgroundColor);
@ -629,7 +629,7 @@ public class WindowsLookAndFeel extends BasicLookAndFeel
"Button.highlight", ControlHighlightColor,
"Button.disabledForeground", InactiveTextColor,
"Button.disabledShadow", ControlHighlightColor,
"Button.focus", black,
"Button.focus", buttonFocusColor,
"Button.dashedRectGapX", new XPValue(Integer.valueOf(3), Integer.valueOf(5)),
"Button.dashedRectGapY", new XPValue(Integer.valueOf(3), Integer.valueOf(4)),
"Button.dashedRectGapWidth", new XPValue(Integer.valueOf(6), Integer.valueOf(10)),
@ -652,7 +652,7 @@ public class WindowsLookAndFeel extends BasicLookAndFeel
"CheckBox.darkShadow", ControlDarkShadowColor,
"CheckBox.light", ControlLightColor,
"CheckBox.highlight", ControlHighlightColor,
"CheckBox.focus", black,
"CheckBox.focus", buttonFocusColor,
"CheckBox.focusInputMap",
new UIDefaults.LazyInputMap(new Object[] {
"SPACE", "pressed",
@ -1007,7 +1007,7 @@ public class WindowsLookAndFeel extends BasicLookAndFeel
"RadioButton.darkShadow", ControlDarkShadowColor,
"RadioButton.light", ControlLightColor,
"RadioButton.highlight", ControlHighlightColor,
"RadioButton.focus", black,
"RadioButton.focus", buttonFocusColor,
"RadioButton.focusInputMap",
new UIDefaults.LazyInputMap(new Object[] {
"SPACE", "pressed",
@ -2614,4 +2614,19 @@ public class WindowsLookAndFeel extends BasicLookAndFeel
}
}
private static class FocusColorProperty extends DesktopProperty {
public FocusColorProperty () {
// Fallback value is never used bacause of the configureValue method doesn't return null
super("win.3d.backgroundColor", Color.BLACK);
}
@Override
protected Object configureValue(Object value) {
if (! ((Boolean)Toolkit.getDefaultToolkit().getDesktopProperty("win.highContrast.on")).booleanValue()){
return Color.BLACK;
}
return Color.BLACK.equals(value) ? Color.WHITE : Color.BLACK;
}
}
}

View File

@ -89,6 +89,11 @@ public class WindowsRadioButtonUI extends BasicRadioButtonUI
}
}
protected void uninstallDefaults(AbstractButton b) {
super.uninstallDefaults(b);
initialized = false;
}
protected Color getFocusColor() {
return focusColor;
}

View File

@ -10070,11 +10070,12 @@ public abstract class Component implements ImageObserver, MenuContainer,
}
Window window = getContainingWindow();
if (window != null) {
if (!window.hasHeavyweightDescendants() || !window.hasLightweightDescendants()) {
if (!window.hasHeavyweightDescendants() || !window.hasLightweightDescendants() || window.isDisposing()) {
if (mixingLog.isLoggable(PlatformLogger.FINE)) {
mixingLog.fine("containing window = " + window +
"; has h/w descendants = " + window.hasHeavyweightDescendants() +
"; has l/w descendants = " + window.hasLightweightDescendants());
"; has l/w descendants = " + window.hasLightweightDescendants() +
"; disposing = " + window.isDisposing());
}
return false;
}

View File

@ -226,6 +226,7 @@ public class Window extends Container implements Accessible {
static boolean systemSyncLWRequests = false;
boolean syncLWRequests = false;
transient boolean beforeFirstShow = true;
private transient boolean disposing = false;
static final int OPENED = 0x01;
@ -1162,36 +1163,41 @@ public class Window extends Container implements Accessible {
void doDispose() {
class DisposeAction implements Runnable {
public void run() {
// Check if this window is the fullscreen window for the
// device. Exit the fullscreen mode prior to disposing
// of the window if that's the case.
GraphicsDevice gd = getGraphicsConfiguration().getDevice();
if (gd.getFullScreenWindow() == Window.this) {
gd.setFullScreenWindow(null);
}
disposing = true;
try {
// Check if this window is the fullscreen window for the
// device. Exit the fullscreen mode prior to disposing
// of the window if that's the case.
GraphicsDevice gd = getGraphicsConfiguration().getDevice();
if (gd.getFullScreenWindow() == Window.this) {
gd.setFullScreenWindow(null);
}
Object[] ownedWindowArray;
synchronized(ownedWindowList) {
ownedWindowArray = new Object[ownedWindowList.size()];
ownedWindowList.copyInto(ownedWindowArray);
}
for (int i = 0; i < ownedWindowArray.length; i++) {
Window child = (Window) (((WeakReference)
(ownedWindowArray[i])).get());
if (child != null) {
child.disposeImpl();
Object[] ownedWindowArray;
synchronized(ownedWindowList) {
ownedWindowArray = new Object[ownedWindowList.size()];
ownedWindowList.copyInto(ownedWindowArray);
}
}
hide();
beforeFirstShow = true;
removeNotify();
synchronized (inputContextLock) {
if (inputContext != null) {
inputContext.dispose();
inputContext = null;
for (int i = 0; i < ownedWindowArray.length; i++) {
Window child = (Window) (((WeakReference)
(ownedWindowArray[i])).get());
if (child != null) {
child.disposeImpl();
}
}
hide();
beforeFirstShow = true;
removeNotify();
synchronized (inputContextLock) {
if (inputContext != null) {
inputContext.dispose();
inputContext = null;
}
}
clearCurrentFocusCycleRootOnHide();
} finally {
disposing = false;
}
clearCurrentFocusCycleRootOnHide();
}
}
DisposeAction action = new DisposeAction();
@ -2734,6 +2740,10 @@ public class Window extends Container implements Accessible {
return visible;
}
boolean isDisposing() {
return disposing;
}
/**
* @deprecated As of J2SE 1.4, replaced by
* {@link Component#applyComponentOrientation Component.applyComponentOrientation}.

View File

@ -180,7 +180,7 @@ public abstract class Executable extends AccessibleObject
/**
* Returns the {@code Class} object representing the class or interface
* that declares the method represented by this executable object.
* that declares the executable represented by this object.
*/
public abstract Class<?> getDeclaringClass();
@ -215,18 +215,18 @@ public abstract class Executable extends AccessibleObject
* Returns an array of {@code Class} objects that represent the formal
* parameter types, in declaration order, of the executable
* represented by this object. Returns an array of length
* 0 if the underlying method takes no parameters.
* 0 if the underlying executable takes no parameters.
*
* @return the parameter types for the method this object
* @return the parameter types for the executable this object
* represents
*/
public abstract Class<?>[] getParameterTypes();
/**
* Returns an array of {@code Type} objects that represent the formal
* parameter types, in declaration order, of the method represented by
* this executable object. Returns an array of length 0 if the
* underlying method takes no parameters.
* parameter types, in declaration order, of the executable represented by
* this object. Returns an array of length 0 if the
* underlying executable takes no parameters.
*
* <p>If a formal parameter type is a parameterized type,
* the {@code Type} object returned for it must accurately reflect
@ -236,16 +236,16 @@ public abstract class Executable extends AccessibleObject
* type, it is created. Otherwise, it is resolved.
*
* @return an array of {@code Type}s that represent the formal
* parameter types of the underlying method, in declaration order
* parameter types of the underlying executable, in declaration order
* @throws GenericSignatureFormatError
* if the generic method signature does not conform to the format
* specified in
* <cite>The Java&trade; Virtual Machine Specification</cite>
* @throws TypeNotPresentException if any of the parameter
* types of the underlying method refers to a non-existent type
* types of the underlying executable refers to a non-existent type
* declaration
* @throws MalformedParameterizedTypeException if any of
* the underlying method's parameter types refer to a parameterized
* the underlying executable's parameter types refer to a parameterized
* type that cannot be instantiated for any reason
*/
public Type[] getGenericParameterTypes() {
@ -277,15 +277,15 @@ public abstract class Executable extends AccessibleObject
* type, it is created. Otherwise, it is resolved.
*
* @return an array of Types that represent the exception types
* thrown by the underlying method
* thrown by the underlying executable
* @throws GenericSignatureFormatError
* if the generic method signature does not conform to the format
* specified in
* <cite>The Java&trade; Virtual Machine Specification</cite>
* @throws TypeNotPresentException if the underlying method's
* @throws TypeNotPresentException if the underlying executable's
* {@code throws} clause refers to a non-existent type declaration
* @throws MalformedParameterizedTypeException if
* the underlying method's {@code throws} clause refers to a
* the underlying executable's {@code throws} clause refers to a
* parameterized type that cannot be instantiated for any reason
*/
public Type[] getGenericExceptionTypes() {
@ -330,7 +330,7 @@ public abstract class Executable extends AccessibleObject
* Returns an array of arrays that represent the annotations on
* the formal parameters, in declaration order, of the executable
* represented by this object. (Returns an array of length zero if
* the underlying method is parameterless. If the executable has
* the underlying executable is parameterless. If the executable has
* one or more parameters, a nested array of length zero is
* returned for each parameter with no annotations.) The
* annotation objects contained in the returned arrays are
@ -339,7 +339,7 @@ public abstract class Executable extends AccessibleObject
* to other callers.
*
* @return an array of arrays that represent the annotations on the formal
* parameters, in declaration order, of the exectuable represented by this
* parameters, in declaration order, of the executable represented by this
* object
*/
public abstract Annotation[][] getParameterAnnotations();

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -1489,6 +1489,8 @@ public class Collections {
}
public int hashCode() {return e.hashCode();}
public boolean equals(Object o) {
if (this == o)
return true;
if (!(o instanceof Map.Entry))
return false;
Map.Entry t = (Map.Entry)o;
@ -1709,6 +1711,8 @@ public class Collections {
}
public boolean equals(Object o) {
if (this == o)
return true;
synchronized (mutex) {return c.equals(o);}
}
public int hashCode() {
@ -1863,6 +1867,8 @@ public class Collections {
}
public boolean equals(Object o) {
if (this == o)
return true;
synchronized (mutex) {return list.equals(o);}
}
public int hashCode() {
@ -2073,6 +2079,8 @@ public class Collections {
}
public boolean equals(Object o) {
if (this == o)
return true;
synchronized (mutex) {return m.equals(o);}
}
public int hashCode() {

View File

@ -27,9 +27,7 @@ package javax.swing;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.VolatileImage;
import java.awt.peer.ComponentPeer;
import java.applet.Applet;
import java.beans.Transient;
import javax.swing.plaf.ViewportUI;
@ -265,6 +263,14 @@ public class JViewport extends JComponent implements Accessible
*/
private boolean hasHadValidView;
/**
* When view is changed we have to synchronize scrollbar values
* with viewport (see the BasicScrollPaneUI#syncScrollPaneWithViewport method).
* This flag allows to invoke that method while ScrollPaneLayout#layoutContainer
* is running.
*/
private boolean viewChanged;
/** Creates a <code>JViewport</code>. */
public JViewport() {
super();
@ -830,7 +836,9 @@ public class JViewport extends JComponent implements Accessible
backingStoreImage = null;
}
super.reshape(x, y, w, h);
if (sizeChanged) {
if (sizeChanged || viewChanged) {
viewChanged = false;
fireStateChanged();
}
}
@ -967,6 +975,8 @@ public class JViewport extends JComponent implements Accessible
hasHadValidView = true;
}
viewChanged = true;
revalidate();
repaint();
}

View File

@ -2619,10 +2619,6 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE {
physicalFonts.remove(oldFont.fullName);
fullNameToFont.remove(oldFont.fullName.toLowerCase(Locale.ENGLISH));
FontFamily.remove(oldFont);
if (oldFont instanceof FileFont) {
((FileFont)oldFont).deregisterFontAndClearStrikeCache();
}
if (localeFullNamesToFont != null) {
Map.Entry[] mapEntries =
(Map.Entry[])localeFullNamesToFont.entrySet().

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -25,30 +25,34 @@
package sun.management;
import java.io.File;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.management.ManagementFactory;
import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.Properties;
import java.util.ResourceBundle;
import java.util.MissingResourceException;
import java.lang.management.ManagementFactory;
import java.lang.reflect.Method;
import javax.management.remote.JMXConnectorServer;
import sun.management.jmxremote.ConnectorBootstrap;
import static sun.management.AgentConfigurationError.*;
import sun.management.jmxremote.ConnectorBootstrap;
import sun.misc.VMSupport;
/**
* This Agent is started by the VM when -Dcom.sun.management.snmp
* or -Dcom.sun.management.jmxremote is set. This class will be
* loaded by the system class loader.
* loaded by the system class loader. Also jmx framework could
* be started by jcmd
*/
public class Agent {
// management properties
@ -69,7 +73,33 @@ public class Agent {
"com.sun.management.jmxremote.localConnectorAddress";
private static final String SNMP_ADAPTOR_BOOTSTRAP_CLASS_NAME =
"sun.management.snmp.AdaptorBootstrap";
"sun.management.snmp.AdaptorBootstrap";
// The only active agent allowed
private static JMXConnectorServer jmxServer = null;
// Parse string com.sun.management.prop=xxx,com.sun.management.prop=yyyy
// and return property set if args is null or empty
// return empty property set
private static Properties parseString(String args){
Properties argProps = new Properties();
if (args != null) {
for (String option : args.split(",")) {
String s[] = option.split("=", 2);
String name = s[0].trim();
String value = (s.length > 1) ? s[1].trim() : "";
if (!name.startsWith("com.sun.management.")) {
error(INVALID_OPTION, name);
}
argProps.setProperty(name, value);
}
}
return argProps;
}
// invoked by -javaagent or -Dcom.sun.management.agent.class
public static void premain(String args) throws Exception {
@ -82,37 +112,104 @@ public class Agent {
args = JMXREMOTE; // default to local management
}
// Parse agent options into properties
Properties arg_props = new Properties();
if (args != null) {
String[] options = args.split(",");
for (int i=0; i<options.length; i++) {
String[] option = options[i].split("=");
if (option.length >= 1 && option.length <= 2) {
String name = option[0];
String value = (option.length == 1) ? "" : option[1];
if (name != null && name.length() > 0) {
// Assume that any com.sun.management.* options are okay
if (name.startsWith("com.sun.management.")) {
arg_props.setProperty(name, value);
} else {
error(INVALID_OPTION, name);
}
}
}
}
}
Properties arg_props = parseString(args);
// Read properties from the config file
Properties config_props = new Properties();
String fname = arg_props.getProperty(CONFIG_FILE);
readConfiguration(fname, config_props);
Properties config_props = new Properties();
String fname = arg_props.getProperty(CONFIG_FILE);
readConfiguration(fname, config_props);
// Arguments override config file
config_props.putAll(arg_props);
startAgent(config_props);
// Arguments override config file
config_props.putAll(arg_props);
startAgent(config_props);
}
// jcmd ManagementAgent.start_local entry point
// Also called due to command-line via startAgent()
private static synchronized void startLocalManagementAgent(){
Properties agentProps = VMSupport.getAgentProperties();
// start local connector if not started
if (agentProps.get(LOCAL_CONNECTOR_ADDRESS_PROP) == null) {
JMXConnectorServer cs = ConnectorBootstrap.startLocalConnectorServer();
String address = cs.getAddress().toString();
// Add the local connector address to the agent properties
agentProps.put(LOCAL_CONNECTOR_ADDRESS_PROP, address);
try {
// export the address to the instrumentation buffer
ConnectorAddressLink.export(address);
} catch (Exception x) {
// Connector server started but unable to export address
// to instrumentation buffer - non-fatal error.
warning(EXPORT_ADDRESS_FAILED, x.getMessage());
}
}
}
// jcmd ManagementAgent.start entry point
// This method starts the remote JMX agent and starts neither
// the local JMX agent nor the SNMP agent
// @see #startLocalManagementAgent and also @see #startAgent.
private static synchronized void startRemoteManagementAgent(String args) throws Exception {
if (jmxServer != null) {
throw new RuntimeException(getText(INVALID_STATE, "Agent already started"));
}
Properties argProps = parseString(args);
Properties configProps = new Properties();
// Load the management properties from the config file
// if config file is not specified readConfiguration implicitly
// reads <java.home>/lib/management/management.properties
String fname = System.getProperty(CONFIG_FILE);
readConfiguration(fname, configProps);
// management properties can be overridden by system properties
// which take precedence
configProps.putAll(System.getProperties());
// if user specifies config file into command line for either
// jcmd utilities or attach command it overrides properties set in
// command line at the time of VM start
String fnameUser = argProps.getProperty(CONFIG_FILE);
if (fnameUser != null) {
readConfiguration(fnameUser, configProps);
}
// arguments specified in command line of jcmd utilities
// override both system properties and one set by config file
// specified in jcmd command line
configProps.putAll(argProps);
// jcmd doesn't allow to change ThreadContentionMonitoring, but user
// can specify this property inside config file, so enable optional
// monitoring functionality if this property is set
final String enableThreadContentionMonitoring =
configProps.getProperty(ENABLE_THREAD_CONTENTION_MONITORING);
if (enableThreadContentionMonitoring != null) {
ManagementFactory.getThreadMXBean().
setThreadContentionMonitoringEnabled(true);
}
String jmxremotePort = configProps.getProperty(JMXREMOTE_PORT);
if (jmxremotePort != null) {
jmxServer = ConnectorBootstrap.
startRemoteConnectorServer(jmxremotePort, configProps);
}
}
private static synchronized void stopRemoteManagementAgent() throws Exception {
if (jmxServer != null) {
ConnectorBootstrap.unexportRegistry();
// Attempt to stop already stopped agent
// Don't cause any errors.
jmxServer.stop();
jmxServer = null;
}
}
private static void startAgent(Properties props) throws Exception {
@ -130,7 +227,7 @@ public class Agent {
try {
if (snmpPort != null) {
loadSnmpAgent(snmpPort, props);
loadSnmpAgent(snmpPort, props);
}
/*
@ -142,31 +239,14 @@ public class Agent {
* of this "local" server is exported as a counter to the jstat
* instrumentation buffer.
*/
if (jmxremote != null || jmxremotePort != null) {
if (jmxremote != null || jmxremotePort != null) {
if (jmxremotePort != null) {
ConnectorBootstrap.initialize(jmxremotePort, props);
jmxServer = ConnectorBootstrap.
startRemoteConnectorServer(jmxremotePort, props);
}
startLocalManagementAgent();
}
Properties agentProps = VMSupport.getAgentProperties();
// start local connector if not started
// System.out.println("local address : " +
// agentProps.get(LOCAL_CONNECTOR_ADDRESS_PROP));
if (agentProps.get(LOCAL_CONNECTOR_ADDRESS_PROP) == null) {
JMXConnectorServer cs = ConnectorBootstrap.startLocalConnectorServer();
String address = cs.getAddress().toString();
// Add the local connector address to the agent properties
agentProps.put(LOCAL_CONNECTOR_ADDRESS_PROP, address);
try {
// export the address to the instrumentation buffer
ConnectorAddressLink.export(address);
} catch (Exception x) {
// Connector server started but unable to export address
// to instrumentation buffer - non-fatal error.
warning(EXPORT_ADDRESS_FAILED, x.getMessage());
}
}
}
} catch (AgentConfigurationError e) {
error(e.getError(), e.getParams());
} catch (Exception e) {
@ -187,9 +267,9 @@ public class Agent {
props.putAll(System.getProperties());
return props;
}
}
public static synchronized Properties getManagementProperties() {
public static synchronized Properties getManagementProperties() {
if (mgmtProps == null) {
String configFile = System.getProperty(CONFIG_FILE);
String snmpPort = System.getProperty(SNMP_PORT);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -53,6 +53,8 @@ public class AgentConfigurationError extends Error {
"agent.err.invalid.agentclass";
public static final String INVALID_JMXREMOTE_PORT =
"agent.err.invalid.jmxremote.port";
public static final String INVALID_JMXREMOTE_RMI_PORT =
"agent.err.invalid.jmxremote.rmi.port";
public static final String PASSWORD_FILE_NOT_SET =
"agent.err.password.file.notset";
public static final String PASSWORD_FILE_NOT_READABLE =
@ -105,6 +107,8 @@ public class AgentConfigurationError extends Error {
"agent.err.snmp.adaptor.start.failed";
public static final String SNMP_MIB_INIT_FAILED =
"agent.err.snmp.mib.init.failed";
public static final String INVALID_STATE =
"agent.err.invalid.state";
private final String error;
private final String[] params;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -28,25 +28,22 @@ package sun.management.jmxremote;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.rmi.NoSuchObjectException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.Registry;
import java.rmi.server.RemoteObject;
import java.rmi.server.RMIClientSocketFactory;
import java.rmi.server.RMIServerSocketFactory;
import java.rmi.server.RemoteObject;
import java.rmi.server.UnicastRemoteObject;
import java.security.KeyStore;
import java.security.Principal;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@ -55,35 +52,31 @@ import java.util.Properties;
import java.util.Set;
import java.util.StringTokenizer;
import java.lang.management.ManagementFactory;
import javax.net.ssl.*;
import javax.management.MBeanServer;
import javax.management.remote.JMXAuthenticator;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import javax.management.remote.rmi.RMIConnectorServer;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import javax.rmi.ssl.SslRMIClientSocketFactory;
import javax.rmi.ssl.SslRMIServerSocketFactory;
import javax.security.auth.Subject;
import sun.rmi.server.UnicastRef;
import sun.rmi.server.UnicastServerRef;
import sun.rmi.server.UnicastServerRef2;
import com.sun.jmx.remote.internal.RMIExporter;
import com.sun.jmx.remote.security.JMXPluggableAuthenticator;
import com.sun.jmx.remote.util.ClassLogger;
import sun.management.Agent;
import sun.management.AgentConfigurationError;
import static sun.management.AgentConfigurationError.*;
import sun.management.ConnectorAddressLink;
import sun.management.FileSystem;
import com.sun.jmx.remote.util.ClassLogger;
import com.sun.jmx.remote.internal.RMIExporter;
import com.sun.jmx.remote.security.JMXPluggableAuthenticator;
import sun.rmi.server.UnicastRef;
import sun.rmi.server.UnicastServerRef;
import sun.rmi.server.UnicastServerRef2;
/**
* This class initializes and starts the RMIConnectorServer for JSR 163
@ -114,6 +107,8 @@ public final class ConnectorBootstrap {
public static final String PORT =
"com.sun.management.jmxremote.port";
public static final String RMI_PORT =
"com.sun.management.jmxremote.rmi.port";
public static final String CONFIG_FILE_NAME =
"com.sun.management.config.file";
public static final String USE_LOCAL_ONLY =
@ -266,34 +261,61 @@ public final class ConnectorBootstrap {
private final String accessFile;
}
/**
* Initializes and starts the JMX Connector Server.
* If the com.sun.management.jmxremote.port property is not defined,
* simply return. Otherwise, attempts to load the config file, and
* then calls {@link #initialize(java.lang.String, java.util.Properties)}.
*
**/
public static synchronized JMXConnectorServer initialize() {
// The variable below is here to support stop functionality
// It would be overriten if you call startRemoteCommectionServer second
// time. It's OK for now as logic in Agent.java forbids mutiple agents
private static Registry registry = null;
// Load a new management properties
final Properties props = Agent.loadManagementProperties();
if (props == null) {
return null;
public static void unexportRegistry() {
// Remove the entry from registry
try {
if (registry != null) {
UnicastRemoteObject.unexportObject(registry, true);
registry = null;
}
} catch(NoSuchObjectException ex) {
// This exception can appears only if we attempt
// to unexportRegistry second time. So it's safe
// to ignore it without additional messages.
}
}
final String portStr = props.getProperty(PropertyNames.PORT);
/**
* Initializes and starts the JMX Connector Server.
* If the com.sun.management.jmxremote.port property is not defined,
* simply return. Otherwise, attempts to load the config file, and
* then calls {@link #startRemoteConnectorServer
* (java.lang.String, java.util.Properties)}.
*
* This method is used by some jtreg tests.
**/
public static synchronized JMXConnectorServer initialize() {
// Load a new management properties
final Properties props = Agent.loadManagementProperties();
if (props == null) {
return null;
}
// System.out.println("initializing: {port=" + portStr + ",
// properties="+props+"}");
return initialize(portStr, props);
final String portStr = props.getProperty(PropertyNames.PORT);
return startRemoteConnectorServer(portStr, props);
}
/**
* This method is used by some jtreg tests.
*
* @see #startRemoteConnectorServer
* (String portStr, Properties props)
*/
public static synchronized JMXConnectorServer initialize(String portStr, Properties props) {
return startRemoteConnectorServer(portStr, props);
}
/**
* Initializes and starts a JMX Connector Server for remote
* monitoring and management.
**/
public static synchronized JMXConnectorServer initialize(String portStr, Properties props) {
public static synchronized JMXConnectorServer startRemoteConnectorServer(String portStr, Properties props) {
// Get port number
final int port;
@ -306,6 +328,22 @@ public final class ConnectorBootstrap {
throw new AgentConfigurationError(INVALID_JMXREMOTE_PORT, portStr);
}
// User can specify a port to be used to export rmi object,
// in order to simplify firewall rules
// if port is not specified random one will be allocated.
int rmiPort = 0;
String rmiPortStr = props.getProperty(PropertyNames.RMI_PORT);
try {
if (rmiPortStr != null) {
rmiPort = Integer.parseInt(rmiPortStr);
}
} catch (NumberFormatException x) {
throw new AgentConfigurationError(INVALID_JMXREMOTE_RMI_PORT, x, rmiPortStr);
}
if (rmiPort < 0) {
throw new AgentConfigurationError(INVALID_JMXREMOTE_RMI_PORT, rmiPortStr);
}
// Do we use authentication?
final String useAuthenticationStr =
props.getProperty(PropertyNames.USE_AUTHENTICATION,
@ -387,9 +425,10 @@ public final class ConnectorBootstrap {
}
if (log.debugOn()) {
log.debug("initialize",
Agent.getText("jmxremote.ConnectorBootstrap.initialize") +
log.debug("startRemoteConnectorServer",
Agent.getText("jmxremote.ConnectorBootstrap.starting") +
"\n\t" + PropertyNames.PORT + "=" + port +
"\n\t" + PropertyNames.RMI_PORT + "=" + rmiPort +
"\n\t" + PropertyNames.USE_SSL + "=" + useSsl +
"\n\t" + PropertyNames.USE_REGISTRY_SSL + "=" + useRegistrySsl +
"\n\t" + PropertyNames.SSL_CONFIG_FILE_NAME + "=" + sslConfigFileName +
@ -404,7 +443,7 @@ public final class ConnectorBootstrap {
(useAuthentication ? (loginConfigName == null ? ("\n\t" + PropertyNames.PASSWORD_FILE_NAME + "=" +
passwordFileName) : ("\n\t" + PropertyNames.LOGIN_CONFIG_NAME + "=" +
loginConfigName)) : "\n\t" +
Agent.getText("jmxremote.ConnectorBootstrap.initialize.noAuthentication")) +
Agent.getText("jmxremote.ConnectorBootstrap.noAuthentication")) +
(useAuthentication ? ("\n\t" + PropertyNames.ACCESS_FILE_NAME + "=" +
accessFileName) : "") +
"");
@ -415,15 +454,15 @@ public final class ConnectorBootstrap {
JMXServiceURL url = null;
try {
final JMXConnectorServerData data = exportMBeanServer(
mbs, port, useSsl, useRegistrySsl,
mbs, port, rmiPort, useSsl, useRegistrySsl,
sslConfigFileName, enabledCipherSuitesList,
enabledProtocolsList, sslNeedClientAuth,
useAuthentication, loginConfigName,
passwordFileName, accessFileName);
cs = data.jmxConnectorServer;
url = data.jmxRemoteURL;
log.config("initialize",
Agent.getText("jmxremote.ConnectorBootstrap.initialize.ready",
log.config("startRemoteConnectorServer",
Agent.getText("jmxremote.ConnectorBootstrap.ready",
url.toString()));
} catch (Exception e) {
throw new AgentConfigurationError(AGENT_EXCEPTION, e, e.toString());
@ -442,7 +481,7 @@ public final class ConnectorBootstrap {
// Remote connector server started but unable to export remote
// connector address and associated configuration properties to
// the instrumentation buffer - non-fatal error.
log.debug("initialize", e);
log.debug("startRemoteConnectorServer", e);
}
return cs;
}
@ -517,9 +556,9 @@ public final class ConnectorBootstrap {
try {
if (fs.supportsFileSecurity(file)) {
if (!fs.isAccessUserOnly(file)) {
final String msg = Agent.getText("jmxremote.ConnectorBootstrap.initialize.password.readonly",
final String msg = Agent.getText("jmxremote.ConnectorBootstrap.password.readonly",
passwordFileName);
log.config("initialize", msg);
log.config("startRemoteConnectorServer", msg);
throw new AgentConfigurationError(PASSWORD_FILE_ACCESS_NOT_RESTRICTED,
passwordFileName);
}
@ -560,9 +599,9 @@ public final class ConnectorBootstrap {
if (fs.supportsFileSecurity(file)) {
if (!fs.isAccessUserOnly(file)) {
final String msg = Agent.getText(
"jmxremote.ConnectorBootstrap.initialize.file.readonly",
"jmxremote.ConnectorBootstrap.file.readonly",
restrictedFileName);
log.config("initialize", msg);
log.config("startRemoteConnectorServer", msg);
throw new AgentConfigurationError(
FILE_ACCESS_NOT_RESTRICTED, restrictedFileName);
}
@ -662,6 +701,7 @@ public final class ConnectorBootstrap {
private static JMXConnectorServerData exportMBeanServer(
MBeanServer mbs,
int port,
int rmiPort,
boolean useSsl,
boolean useRegistrySsl,
String sslConfigFileName,
@ -679,7 +719,7 @@ public final class ConnectorBootstrap {
* IDs. */
System.setProperty("java.rmi.server.randomIDs", "true");
JMXServiceURL url = new JMXServiceURL("rmi", null, 0);
JMXServiceURL url = new JMXServiceURL("rmi", null, rmiPort);
Map<String, Object> env = new HashMap<>();
@ -736,7 +776,6 @@ public final class ConnectorBootstrap {
}
}
final Registry registry;
if (useRegistrySsl) {
registry =
new SingleEntryRegistry(port, csf, ssf,
@ -747,10 +786,12 @@ public final class ConnectorBootstrap {
"jmxrmi", exporter.firstExported);
}
JMXServiceURL remoteURL = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi://" + url.getHost() + ":" +
((UnicastRef) ((RemoteObject) registry).getRef()).getLiveRef().getPort() +
"/jmxrmi");
int registryPort =
((UnicastRef) ((RemoteObject) registry).getRef()).getLiveRef().getPort();
String jmxUrlStr = String.format("service:jmx:rmi:///jndi/rmi://%s:%d/jmxrmi",
url.getHost(), registryPort);
JMXServiceURL remoteURL = new JMXServiceURL(jmxUrlStr);
/* Our exporter remembers the first object it was asked to
export, which will be an RMIServerImpl appropriate for

View File

@ -1,6 +1,6 @@
#
#
# Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -43,8 +43,9 @@ agent.err.agentclass.failed = Management agent class failed
agent.err.premain.notfound = premain(String) does not exist in agent class
agent.err.agentclass.access.denied = Access to premain(String) is denied
agent.err.invalid.agentclass = Invalid com.sun.management.agent.class property value
agent.err.invalid.state = Invalid agent state
agent.err.invalid.jmxremote.port = Invalid com.sun.management.jmxremote.port number
agent.err.invalid.jmxremote.rmi.port = Invalid com.sun.management.jmxremote.rmi.port number
agent.err.file.not.set = File not specified
agent.err.file.not.readable = File not readable
@ -78,11 +79,11 @@ agent.err.acl.file.access.notrestricted = Password file read access must be rest
agent.err.snmp.adaptor.start.failed = Failed to start SNMP adaptor with address
agent.err.snmp.mib.init.failed = Failed to initialize SNMP MIB with error
jmxremote.ConnectorBootstrap.initialize = Starting JMX Connector Server:
jmxremote.ConnectorBootstrap.initialize.noAuthentication = No Authentication
jmxremote.ConnectorBootstrap.initialize.ready = JMX Connector ready at: {0}
jmxremote.ConnectorBootstrap.initialize.password.readonly = Password file read access must be restricted: {0}
jmxremote.ConnectorBootstrap.initialize.file.readonly = File read access must be restricted: {0}
jmxremote.ConnectorBootstrap.starting = Starting JMX Connector Server:
jmxremote.ConnectorBootstrap.noAuthentication = No Authentication
jmxremote.ConnectorBootstrap.ready = JMX Connector ready at: {0}
jmxremote.ConnectorBootstrap.password.readonly = Password file read access must be restricted: {0}
jmxremote.ConnectorBootstrap.file.readonly = File read access must be restricted: {0}
jmxremote.AdaptorBootstrap.getTargetList.processing = Processing ACL
jmxremote.AdaptorBootstrap.getTargetList.adding = Adding target: {0}

View File

@ -1246,7 +1246,10 @@ public class PolicyFile extends java.security.Policy {
* @return the set of permissions according to the policy.
*/
private PermissionCollection getPermissions(Permissions perms,
final CodeSource cs) {
final CodeSource cs) {
if (cs == null)
return perms;
CodeSource canonCodeSource = AccessController.doPrivileged(
new java.security.PrivilegedAction<CodeSource>(){

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -79,13 +79,18 @@ public class ZoneInfo extends TimeZone {
private static final int TRANSITION_NSHIFT = 12;
// Flag for supporting JDK backward compatible IDs, such as "EST".
private static final boolean USE_OLDMAPPING;
static final boolean USE_OLDMAPPING;
static {
String oldmapping = AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("sun.timezone.ids.oldmapping", "false")).toLowerCase(Locale.ROOT);
USE_OLDMAPPING = (oldmapping.equals("yes") || oldmapping.equals("true"));
}
// IDs having conflicting data between Olson and JDK 1.1
static final String[] conflictingIDs = {
"EST", "MST", "HST"
};
private static final CalendarSystem gcal = CalendarSystem.getGregorianCalendar();
/**
@ -808,6 +813,16 @@ public class ZoneInfo extends TimeZone {
private static SoftReference<Map<String, String>> aliasTable;
static Map<String, String> getCachedAliasTable() {
Map<String, String> aliases = null;
SoftReference<Map<String, String>> cache = aliasTable;
if (cache != null) {
aliases = cache.get();
}
return aliases;
}
/**
* Returns a Map from alias time zone IDs to their standard
* time zone IDs.
@ -816,23 +831,22 @@ public class ZoneInfo extends TimeZone {
* to their standard time zone IDs, or null if
* <code>ZoneInfoMappings</code> file is not available.
*/
public synchronized static Map<String, String> getAliasTable() {
Map<String, String> aliases = null;
SoftReference<Map<String, String>> cache = aliasTable;
if (cache != null) {
aliases = cache.get();
if (aliases != null) {
return aliases;
}
}
aliases = ZoneInfoFile.getZoneAliases();
if (aliases != null) {
aliasTable = new SoftReference<>(aliases);
}
return aliases;
}
public synchronized static Map<String, String> getAliasTable() {
Map<String, String> aliases = getCachedAliasTable();
if (aliases == null) {
aliases = ZoneInfoFile.getZoneAliases();
if (aliases != null) {
if (!USE_OLDMAPPING) {
// Remove the conflicting IDs from the alias table.
for (String key : conflictingIDs) {
aliases.remove(key);
}
}
aliasTable = new SoftReference<Map<String, String>>(aliases);
}
}
return aliases;
}
private void readObject(ObjectInputStream stream)
throws IOException, ClassNotFoundException {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -473,6 +473,8 @@ public class ZoneInfoFile {
private static Map<String, ZoneInfo> zoneInfoObjects = null;
private static final ZoneInfo GMT = new ZoneInfo("GMT", 0);
private static final String ziDir = AccessController.doPrivileged(
new PrivilegedAction<String>() {
public String run() {
@ -553,8 +555,15 @@ public class ZoneInfoFile {
* id.
*/
public static ZoneInfo getZoneInfo(String id) {
//treat GMT zone as special
if ("GMT".equals(id))
return (ZoneInfo) GMT.clone();
ZoneInfo zi = getFromCache(id);
if (zi == null) {
Map<String, String> aliases = ZoneInfo.getCachedAliasTable();
if (aliases != null && aliases.get(id) != null) {
return null;
}
zi = createZoneInfo(id);
if (zi == null) {
return null;
@ -1031,30 +1040,26 @@ public class ZoneInfoFile {
* @return the buffer, or null if any I/O error occurred.
*/
private static byte[] readZoneInfoFile(final String fileName) {
if (fileName.indexOf("..") >= 0) {
return null;
}
byte[] buffer = null;
try {
buffer = AccessController.doPrivileged(new PrivilegedExceptionAction<byte[]>() {
public byte[] run() throws IOException {
File file = new File(ziDir, fileName);
if (!file.exists() || !file.isFile()) {
return null;
}
file = file.getCanonicalFile();
String path = file.getCanonicalPath();
byte[] buf = null;
if (path != null && path.startsWith(ziDir)) {
int filesize = (int)file.length();
if (filesize > 0) {
FileInputStream fis = new FileInputStream(file);
buf = new byte[filesize];
try {
if (fis.read(buf) != filesize) {
throw new IOException("read error on " + fileName);
}
} finally {
fis.close();
int filesize = (int)file.length();
if (filesize > 0) {
FileInputStream fis = new FileInputStream(file);
buf = new byte[filesize];
try {
if (fis.read(buf) != filesize) {
throw new IOException("read error on " + fileName);
}
} finally {
fis.close();
}
}
return buf;

View File

@ -105,7 +105,6 @@ class XTextAreaPeer extends XComponentPeer implements TextAreaPeer {
this.target = target;
//ComponentAccessor.enableEvents(target,AWTEvent.MOUSE_WHEEL_EVENT_MASK);
target.enableInputMethods(true);
firstChangeSkipped = false;
String text = ((TextArea)target).getText();
@ -113,7 +112,6 @@ class XTextAreaPeer extends XComponentPeer implements TextAreaPeer {
jtext.setWrapStyleWord(true);
jtext.getDocument().addDocumentListener(jtext);
XToolkit.specialPeerMap.put(jtext,this);
jtext.enableInputMethods(true);
textPane = new AWTTextPane(jtext,this, target.getParent());
setBounds(x, y, width, height, SET_BOUNDS);

View File

@ -73,8 +73,6 @@ public class XTextFieldPeer extends XComponentPeer implements TextFieldPeer {
xtext = new XAWTTextField(text,this, target.getParent());
xtext.getDocument().addDocumentListener(xtext);
xtext.setCursor(target.getCursor());
target.enableInputMethods(true);
xtext.enableInputMethods(true);
XToolkit.specialPeerMap.put(xtext,this);
TextField txt = (TextField) target;

View File

@ -1,6 +1,6 @@
###########################################################################
#
# Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -125,15 +125,15 @@
# 7123972
java/lang/annotation/loaderLeak/Main.java generic-all
# 7079093
java/lang/instrument/ManifestTest.sh windows-all
# 6944188
java/lang/management/ThreadMXBean/ThreadStateTest.java generic-all
# 7067973
java/lang/management/MemoryMXBean/CollectionUsageThreshold.java generic-all
# 7148492
java/lang/management/MemoryMXBean/ResetPeakMemoryUsage.java generic-all
############################################################################
# jdk_management
@ -144,9 +144,8 @@ javax/management/loading/LibraryLoader/LibraryLoaderTest.java windows-all
# 7144846
javax/management/remote/mandatory/connection/ReconnectTest.java generic-all
# 7073626
sun/management/jmxremote/bootstrap/RmiBootstrapTest.sh windows-all
sun/management/jmxremote/bootstrap/RmiSslBootstrapTest.sh windows-all
# 7149181
sun/management/jmxremote/startstop/JMXStartStopTest.sh generic-all
############################################################################
@ -185,6 +184,10 @@ java/net/InetAddress/CheckJNI.java linux-all
# 7102702
java/net/PortUnreachableException/OneExceptionOnly.java windows-all
# 7148829
sun/net/InetAddress/nameservice/simple/CacheTest.java generic-all
sun/net/InetAddress/nameservice/simple/DefaultCaching.java generic-all
############################################################################
# jdk_io
@ -215,6 +218,9 @@ java/rmi/server/Unreferenced/finiteGCLatency/FiniteGCLatency.java generic-all
# 6948101
java/rmi/transport/pinLastArguments/PinLastArguments.java generic-all
# 7146541
java/rmi/transport/rapidExportUnexport/RapidExportUnexport.java linux-all
# 7132247
java/rmi/registry/readTest/readTest.sh windows-all
@ -339,4 +345,3 @@ java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java generic-all
java/util/TimeZone/TimeZoneDatePermissionCheck.sh solaris-all
############################################################################

View File

@ -0,0 +1,77 @@
/*
* Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* Portions Copyright (c) 2012 IBM Corporation
*/
/* @test
* @bug 7089914
* @summary Focus on image icons are not visible in javaws cache with high contrast mode
* @author Sean Chou
*/
import javax.swing.*;
import java.lang.reflect.Field;
public class bug7089914 {
public static void main(String[] args) throws Exception {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception e) {
System.out.println("Not WindowsLookAndFeel, test skipped");
return;
}
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
JRadioButton rb = new JRadioButton();
if (!"com.sun.java.swing.plaf.windows.WindowsRadioButtonUI".equals(rb.getUI().getClass().getName())) {
throw new RuntimeException("Unexpected UI class of JRadioButton");
}
try {
Field initializedField = rb.getUI().getClass().getDeclaredField("initialized");
initializedField.setAccessible(true);
if (!initializedField.getBoolean(rb.getUI())) {
throw new RuntimeException("initialized is false");
}
rb.getUI().uninstallUI(rb);
if (initializedField.getBoolean(rb.getUI())) {
throw new RuntimeException("initialized is true");
}
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
});
}
}

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -396,7 +396,7 @@ while read token; do
touch $FAIL_MARKER
fi
MESG=`cat expect_boot_cp_line`
MESG=`cat expect_boot_cp_line | tr -d '\n\r'`
grep -s "$MESG" output.log > /dev/null
result=$?
if [ "$result" = 0 ]; then
@ -406,7 +406,7 @@ while read token; do
touch $FAIL_MARKER
fi
MESG=`cat expect_redef_line`
MESG=`cat expect_redef_line | tr -d '\n\r'`
grep -s "$MESG" output.log > /dev/null
result=$?
if [ "$result" = 0 ]; then
@ -416,7 +416,7 @@ while read token; do
touch $FAIL_MARKER
fi
MESG=`cat expect_retrans_line`
MESG=`cat expect_retrans_line | tr -d '\n\r'`
grep -s "$MESG" output.log > /dev/null
result=$?
if [ "$result" = 0 ]; then
@ -426,7 +426,7 @@ while read token; do
touch $FAIL_MARKER
fi
MESG=`cat expect_set_nmp_line`
MESG=`cat expect_set_nmp_line | tr -d '\n\r'`
grep -s "$MESG" output.log > /dev/null
result=$?
if [ "$result" = 0 ]; then

View File

@ -0,0 +1,67 @@
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 7144488
* @summary Infinite recursion for some equals tests in Collections
*/
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class EqualsTest {
public static void main(String[] args) {
boolean test;
/* synchronizedList test */
List list = Collections.synchronizedList(new ArrayList());
list.add(list);
test = list.equals(list);
assertTrue(test);
list.remove(list);
/* synchronizedSet test */
Set s = Collections.synchronizedSet(new HashSet());
s.add(s);
test = s.equals(s);
assertTrue(test);
/* synchronizedMap test */
Map m = Collections.synchronizedMap(new HashMap());
test = m.equals(m);
assertTrue(test);
}
private static void assertTrue(boolean b) {
if (!b)
throw new RuntimeException("assertion failed");
}
}

View File

@ -0,0 +1,131 @@
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 4220171
* @author Konstantin Eremin
* @summary Tests
* @library ../../regtesthelpers
* @build Util
* @run main bug4220171
*/
import java.awt.Color;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
import javax.swing.border.LineBorder;
import sun.awt.SunToolkit;
public class bug4220171 {
private static JTable table;
public static void main(String args[]) throws Exception {
SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
Robot robot = new Robot();
robot.setAutoDelay(50);
javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
createAndShowGUI();
}
});
toolkit.realSync();
clickMouse(robot, 0, 0);
Util.hitKeys(robot, KeyEvent.VK_A, KeyEvent.VK_B, KeyEvent.VK_ENTER);
toolkit.realSync();
checkCell(0, 0);
clickMouse(robot, 0, 1);
Util.hitKeys(robot, KeyEvent.VK_D, KeyEvent.VK_E, KeyEvent.VK_ENTER);
toolkit.realSync();
checkCell(0, 1);
clickMouse(robot, 1, 0);
Util.hitKeys(robot, KeyEvent.VK_1, KeyEvent.VK_2, KeyEvent.VK_ENTER);
toolkit.realSync();
checkCell(1, 0);
clickMouse(robot, 1, 1);
Util.hitKeys(robot, KeyEvent.VK_4, KeyEvent.VK_5, KeyEvent.VK_ENTER);
toolkit.realSync();
checkCell(1, 1);
}
static void checkCell(final int row, final int column) throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
if (table.getValueAt(row, column) != null) {
throw new RuntimeException(
String.format("Cell (%d, %d) is editable", row, column));
}
}
});
}
static void clickMouse(Robot robot, int row, int column) throws Exception {
Point point = getCellClickPoint(row, column);
robot.mouseMove(point.x, point.y);
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
}
private static Point getCellClickPoint(final int row, final int column) throws Exception {
final Point[] result = new Point[1];
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
Rectangle rect = table.getCellRect(row, column, false);
Point point = new Point(rect.x + rect.width / 2,
rect.y + rect.height / 2);
SwingUtilities.convertPointToScreen(point, table);
result[0] = point;
}
});
return result[0];
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 200);
table = new JTable(2, 2);
table.setEnabled(false);
frame.getContentPane().add(table);
frame.setVisible(true);
}
}

View File

@ -0,0 +1,115 @@
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* @test
* @bug 4247996 4260485
* @summary Test that rollover toolbar doesn't corrupt buttons
* @author Peter Zhelezniakov
* @run main bug4247996
*/
import java.awt.*;
import javax.swing.*;
import sun.awt.SunToolkit;
public class bug4247996 {
private static JButton button;
private static JToggleButton toogleButton;
public static void main(String[] args) throws Exception {
SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
Robot robot = new Robot();
robot.setAutoDelay(50);
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
createAndShowGUI();
}
});
toolkit.realSync();
Point point = getButtonCenter();
robot.mouseMove(point.x, point.y);
toolkit.realSync();
checkButtonsSize();
}
private static void checkButtonsSize() throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
if (!button.getSize().equals(toogleButton.getSize())) {
throw new RuntimeException("Button sizes are different!");
}
}
});
}
private static Point getButtonCenter() throws Exception {
final Point[] result = new Point[1];
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
Point p = button.getLocationOnScreen();
Dimension size = button.getSize();
result[0] = new Point(p.x + size.width / 2, p.y + size.height / 2);
}
});
return result[0];
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 200);
JButton rButton = new JButton("Rollover");
rButton.setRolloverEnabled(true);
JToolBar nrToolbar = new JToolBar();
nrToolbar.add(rButton);
nrToolbar.remove(rButton);
if (!rButton.isRolloverEnabled()) {
throw new Error("Failed (bug 4260485): "
+ "toolbar overrode button's rollover property");
}
JToolBar rToolbar = new JToolBar();
rToolbar.putClientProperty("JToolBar.isRollover", Boolean.TRUE);
rToolbar.add(button = new JButton("Test"));
rToolbar.add(toogleButton = new JToggleButton("Test"));
frame.getContentPane().add(rToolbar, BorderLayout.NORTH);
frame.setVisible(true);
}
}

View File

@ -0,0 +1,138 @@
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 4846413
* @summary Checks if No tooltip modification when no KeyStroke modifier
* @library ../../regtesthelpers
* @build Util
* @author Konstantin Eremin
* @run main bug4846413
*/
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Robot;
import java.awt.Toolkit;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.plaf.metal.MetalToolTipUI;
import sun.awt.SunToolkit;
public class bug4846413 {
private static volatile boolean isTooltipAdded;
private static JButton button;
public static void main(String[] args) throws Exception {
SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
Robot robot = new Robot();
robot.setAutoDelay(50);
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
createAndShowGUI();
}
});
toolkit.realSync();
Point movePoint = getButtonPoint();
robot.mouseMove(movePoint.x, movePoint.y);
toolkit.realSync();
long timeout = System.currentTimeMillis() + 9000;
while (!isTooltipAdded && (System.currentTimeMillis() < timeout)) {
try {Thread.sleep(500);} catch (Exception e) {}
}
checkToolTip();
}
private static void checkToolTip() throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
JToolTip tooltip = (JToolTip) Util.findSubComponent(
JFrame.getFrames()[0], "JToolTip");
if (tooltip == null) {
throw new RuntimeException("Tooltip has not been found!");
}
MetalToolTipUI tooltipUI = (MetalToolTipUI) MetalToolTipUI.createUI(tooltip);
tooltipUI.installUI(tooltip);
if (!"-Insert".equals(tooltipUI.getAcceleratorString())) {
throw new RuntimeException("Tooltip acceleration is not properly set!");
}
}
});
}
private static Point getButtonPoint() throws Exception {
final Point[] result = new Point[1];
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
Point p = button.getLocationOnScreen();
Dimension size = button.getSize();
result[0] = new Point(p.x + size.width / 2, p.y + size.height / 2);
}
});
return result[0];
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 200);
button = new JButton("Press me");
button.setToolTipText("test");
button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, 0, true), "someCommand");
button.getActionMap().put("someCommand", null);
frame.getContentPane().add(button);
JLayeredPane layeredPane = (JLayeredPane) Util.findSubComponent(
frame, "JLayeredPane");
layeredPane.addContainerListener(new ContainerAdapter() {
@Override
public void componentAdded(ContainerEvent e) {
isTooltipAdded = true;
}
});
frame.setVisible(true);
}
}

View File

@ -0,0 +1,197 @@
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 4330357
* @summary Tests that real editor in JTree cleans up after editing was stopped
* @library ../../regtesthelpers
* @build Util
* @author Peter Zhelezniakov
* @run main bug4330357
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import sun.awt.SunToolkit;
public class bug4330357 {
private static JTree tree;
private static JButton button;
private static Robot robot;
public static void main(String[] args) throws Exception {
SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
robot = new Robot();
robot.setAutoDelay(50);
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
createAndShowGUI();
}
});
toolkit.realSync();
clickMouse(getTreeRowClickPoint(1));
Util.hitKeys(robot, KeyEvent.VK_F2);
Util.hitKeys(robot, KeyEvent.VK_A, KeyEvent.VK_B, KeyEvent.VK_C);
toolkit.realSync();
if (!hasComponent(JTextField.class)) {
throw new RuntimeException("Cell editor is missed for path: color");
}
clickMouse(getButtonClickPoint());
toolkit.realSync();
clickMouse(getTreeRowClickPoint(2));
Util.hitKeys(robot, KeyEvent.VK_F2);
toolkit.realSync();
if (!hasComponent(JComboBox.class)) {
throw new RuntimeException("Cell editor is missed for path: sports");
}
if (hasComponent(JTextField.class)) {
throw new RuntimeException("Cell editor is wrongly shown for path: color");
}
}
static void clickMouse(Point point) {
robot.mouseMove(point.x, point.y);
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
}
private static Point getTreeRowClickPoint(final int row) throws Exception {
final Point[] result = new Point[1];
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
Rectangle rect = tree.getRowBounds(row);
Point p = new Point(rect.x + rect.width / 2, rect.y + 2);
SwingUtilities.convertPointToScreen(p, tree);
result[0] = p;
}
});
return result[0];
}
private static Point getButtonClickPoint() throws Exception {
final Point[] result = new Point[1];
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
Point p = button.getLocationOnScreen();
Dimension size = button.getSize();
result[0] = new Point(p.x + size.width / 2, p.y + size.height / 2);
}
});
return result[0];
}
static boolean hasComponent(final Class cls) throws Exception {
final boolean[] result = new boolean[1];
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
result[0] = Util.findSubComponent(tree, cls.getName()) != null;
}
});
return result[0];
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("Test");
frame.setSize(200, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tree = new JTree();
tree.setEditable(true);
final TestEditor testEditor = new TestEditor();
tree.setCellEditor(new DefaultTreeCellEditor(tree,
(DefaultTreeCellRenderer) tree.getCellRenderer(),
testEditor));
button = new JButton("stop");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
testEditor.stopCellEditing();
}
});
frame.getContentPane().add(new JScrollPane(tree), BorderLayout.CENTER);
frame.getContentPane().add(button, BorderLayout.SOUTH);
frame.setVisible(true);
}
static class TestEditor extends AbstractCellEditor implements TreeCellEditor {
private JComboBox comboBox;
private JTextField textField;
private boolean comboBoxActive;
TestEditor() {
comboBox = new JComboBox(new String[]{"one", "two"});
textField = new JTextField();
}
public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean isSelected,
boolean expanded,
boolean leaf, int row) {
if (row % 2 == 0) {
comboBoxActive = true;
return comboBox;
}
comboBoxActive = false;
return textField;
}
public Object getCellEditorValue() {
if (comboBoxActive) {
return comboBox.getSelectedItem();
}
return textField.getText();
}
}
}

View File

@ -0,0 +1,104 @@
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* @test
@bug 7107099
@summary JScrollBar does not show up even if there are enough lebgth of textstring in textField
@author Pavel Porvatov
*/
import sun.awt.SunToolkit;
import javax.swing.*;
import java.awt.*;
public class bug7107099 {
private static JFrame frame;
private static JTextArea textarea;
private static JScrollPane scrollPane;
private static int value;
private static int min;
private static int max;
private static int extent;
public static void main(String[] args) throws Exception {
SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
textarea = new JTextArea("before###1###\nbefore###2###\nbefore###3###\nbefore###4###\nbefore###5###\n");
scrollPane = new JScrollPane(textarea);
scrollPane.setPreferredSize(new Dimension(100, 50));
frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.setSize(200, 200);
frame.add(scrollPane, BorderLayout.SOUTH);
frame.setVisible(true);
}
});
toolkit.realSync();
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
BoundedRangeModel model = scrollPane.getVerticalScrollBar().getModel();
value = model.getValue();
min = model.getMinimum();
max = model.getMaximum();
extent = model.getExtent();
// Do tricky manipulation for testing purpose
textarea.setText(null);
scrollPane.setViewportView(textarea);
textarea.setText("after###1###\nafter###1###\nafter###1###\nafter###1###\nafter###1###\n");
textarea.setCaretPosition(0);
}
});
toolkit.realSync();
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
BoundedRangeModel model = scrollPane.getVerticalScrollBar().getModel();
if (value != model.getValue() ||
min != model.getMinimum() ||
max != model.getMaximum() ||
extent != model.getExtent()) {
throw new RuntimeException("Test bug7107099 failed");
}
System.out.println("Test bug7107099 passed");
frame.dispose();
}
});
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -35,10 +35,10 @@ public class AgentCheckTest {
public static void main(String[] args){
String [][] testStrings = {
{"agent.err.error", "", ""},
{"jmxremote.ConnectorBootstrap.initialize", "", ""},
{"jmxremote.ConnectorBootstrap.initialize.noAuthentication", "", ""},
{"jmxremote.ConnectorBootstrap.initialize.ready", "Phony JMXServiceURL", ""},
{"jmxremote.ConnectorBootstrap.initialize.password.readonly", "Phony passwordFileName", ""},
{"jmxremote.ConnectorBootstrap.starting", "", ""},
{"jmxremote.ConnectorBootstrap.noAuthentication", "", ""},
{"jmxremote.ConnectorBootstrap.ready", "Phony JMXServiceURL", ""},
{"jmxremote.ConnectorBootstrap.password.readonly", "Phony passwordFileName", ""},
{"jmxremote.AdaptorBootstrap.getTargetList.processing", "", ""},
{"jmxremote.AdaptorBootstrap.getTargetList.adding", "Phony target", ""},
{"jmxremote.AdaptorBootstrap.getTargetList.starting", "", ""},

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -34,6 +34,13 @@
OS=`uname -s`
UMASK=`umask`
if [[ $OS == CYGWIN_NT* ]] ; then
OS="Windows_NT"
if [ -z "$SystemRoot" ] ; then
SystemRoot=$SYSTEMROOT
fi
fi
case $OS in
SunOS | Linux)
PATHSEP=":"

View File

@ -0,0 +1,52 @@
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.io.RandomAccessFile;
public class JMXStartStopDoSomething {
public void doSomething(){
try {
for (int i=0; i < 10; ++i) {
RandomAccessFile f = new RandomAccessFile("/dev/null","r");
int n = f.read();
f.close();
}
} catch (Throwable e) {
System.err.println("Something bad happens:" +e);
}
}
public static void main(String args[]) throws Exception {
System.err.println("main enter");
int count = 1;
while(count > 0) {
JMXStartStopDoSomething p = new JMXStartStopDoSomething();
p.doSomething();
Thread.sleep(1);
}
// System.err.println("main exit");
}
}

View File

@ -0,0 +1,181 @@
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.management.*;
import javax.management.remote.*;
import sun.management.AgentConfigurationError;
import sun.management.jmxremote.ConnectorBootstrap;
public class JMXStartStopTest {
static boolean verbose = false;
static void dbg_print(String msg){
if (verbose) {
System.err.println("DBG: " +msg);
}
}
static void dbg_print(String msg, Throwable ex){
if (verbose) {
System.err.println("DBG: " + msg + " " + ex.getMessage() );
ex.printStackTrace(System.err);
}
}
public static int listMBeans(MBeanServerConnection server, ObjectName pattern, QueryExp query)
throws Exception {
Set names = server.queryNames(pattern,query);
for (Iterator i=names.iterator(); i.hasNext(); ) {
ObjectName name = (ObjectName)i.next();
MBeanInfo info = server.getMBeanInfo(name);
dbg_print("Got MBean: " + name);
MBeanAttributeInfo[] attrs = info.getAttributes();
if (attrs == null)
continue;
for (int j=0; j<attrs.length; j++) {
if (attrs[j].isReadable()) {
Object o = server.getAttribute(name,attrs[j].getName());
}
}
}
return names.size();
}
public void run_local(String strPid)
throws Exception {
String jmxUrlStr = null;
int pid = Integer.parseInt(strPid);
try {
jmxUrlStr = sun.management.ConnectorAddressLink.importFrom(pid);
dbg_print("Local Service URL: " +jmxUrlStr);
if ( jmxUrlStr == null ) {
throw new Exception("No Service URL. Local agent not started?");
}
JMXServiceURL url = new JMXServiceURL(jmxUrlStr);
Map m = new HashMap();
JMXConnector c = JMXConnectorFactory.connect(url,m);
MBeanServerConnection conn = c.getMBeanServerConnection();
ObjectName pattern = new ObjectName("java.lang:type=Memory,*");
int count = listMBeans(conn,pattern,null);
if (count == 0)
throw new Exception("Expected at least one matching "+ "MBean for "+pattern);
} catch (IOException e) {
dbg_print("Cannot find process : " + pid);
throw e;
}
}
public void run(String args[]) throws Exception {
dbg_print("RmiRegistry lookup...");
int port = 4567;
if (args != null && args.length > 0) {
port = Integer.parseInt(args[0]);
}
dbg_print("Using port: " + port);
int rmiPort = 0;
if (args != null && args.length > 1) {
rmiPort = Integer.parseInt(args[1]);
}
dbg_print("Using rmi port: " + rmiPort);
Registry registry = LocateRegistry.getRegistry(port);
// "jmxrmi"
String[] relist = registry.list();
for (int i = 0; i < relist.length; ++i) {
dbg_print("Got registry: " + relist[i]);
}
String jmxUrlStr = (rmiPort != 0) ?
String.format("service:jmx:rmi://localhost:%d/jndi/rmi://localhost:%d/jmxrmi", rmiPort, port) :
String.format("service:jmx:rmi:///jndi/rmi://localhost:%d/jmxrmi",port);
JMXServiceURL url = new JMXServiceURL(jmxUrlStr);
Map m = new HashMap();
JMXConnector c = JMXConnectorFactory.connect(url,m);
MBeanServerConnection conn = c.getMBeanServerConnection();
ObjectName pattern = new ObjectName("java.lang:type=Memory,*");
int count = listMBeans(conn,pattern,null);
if (count == 0)
throw new Exception("Expected at least one matching "+ "MBean for "+pattern);
}
public static void main(String args[]) {
JMXStartStopTest manager = new JMXStartStopTest();
try {
if (args!=null && args[0].equals("local")) {
manager.run_local(args[1]);
} else {
manager.run(args);
}
} catch (RuntimeException r) {
dbg_print("No connection: ", r);
System.out.println("NO_CONN");
System.exit(1);
} catch (Throwable t) {
dbg_print("No connection: ", t);
System.out.println("NO_CONN");
System.exit(2);
}
System.out.println("OK_CONN");
System.exit(0);
}
}

View File

@ -0,0 +1,603 @@
#!/bin/sh
# Copyright (c) 2011, 2012 Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
# @test
# @bug 7110104
# @build JMXStartStopTest JMXStartStopDoSomething
# @run shell JMXStartStopTest.sh --jtreg --no-compile
# @summary No word Failed expected in the test output
_verbose=no
_server=no
_jtreg=no
_compile=yes
_testsuite="01,02,03,04,05,06,07,08,09,10,11,12,13"
_port_one=50234
_port_two=50235
_testclasses=".classes"
_testsrc=`pwd`
_logname=".classes/JMXStartStopTest_output.txt"
_compile(){
if [ ! -e ${_testclasses} ]
then
mkdir -p ${_testclasses}
fi
rm -f ${_testclasses}/JMXStartStopTest.class
# Compile testcase
${TESTJAVA}/bin/javac -d ${_testclasses} JMXStartStopDoSomething.java JMXStartStopTest.java
if [ ! -e ${_testclasses}/JMXStartStopTest.class ]
then
echo "ERROR: Can't compile"
exit -1
fi
}
_app_start(){
if [ "${_verbose}" = "yes" ]
then
echo "RUN: ${TESTJAVA}/bin/java -server $* -cp ${_testclasses} JMXStartStopDoSomething "
fi
${TESTJAVA}/bin/java -server $* -cp ${_testclasses} JMXStartStopDoSomething >> ${_logname} 2>&1 &
sleep 1
pid=`_get_pid`
if [ "x${pid}" = "x" ]
then
echo "ERROR: Test app not started"
exit -1
fi
}
_get_pid(){
${TESTJAVA}/bin/jps | sed -n "/JMXStartStopDoSomething/s/ .*//p"
}
_app_stop(){
pid=`_get_pid`
if [ "x${pid}" != "x" ]
then
kill $pid
fi
# Stop on first failed test under jtreg
if [ "x$1" = "xFailed" -a "${_jtreg}" = "yes" ]
then
exit -1
fi
}
testme(){
${TESTJAVA}/bin/java -cp ${_testclasses} JMXStartStopTest $*
}
_jcmd(){
if [ "${_verbose}" = "yes" ]
then
echo "RUN: ${TESTJAVA}/bin/jcmd JMXStartStopDoSomething $*"
${TESTJAVA}/bin/jcmd JMXStartStopDoSomething $*
else
${TESTJAVA}/bin/jcmd JMXStartStopDoSomething $* > /dev/null 2>/dev/null
fi
}
_echo(){
echo "$*"
echo "$*" >> ${_logname}
}
# ============= TESTS ======================================
test_01(){
# Run an app with JMX enabled stop it and
# restart on other port
_echo "**** Test one ****"
_app_start -Dcom.sun.management.jmxremote.port=$1 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false
res1=`testme $1`
_jcmd ManagementAgent.stop
res2=`testme $1`
_jcmd ManagementAgent.start jmxremote.port=$2
res3=`testme $2`
if [ "${res1}" = "OK_CONN" -a "${res2}" = "NO_CONN" -a "${res3}" = "OK_CONN" ]
then
_echo "Passed"
else
_echo "Failed r1(OK):${res1} r2(NO):${res2} r3(OK):${res3}"
_app_stop "Failed"
fi
_app_stop
}
test_02(){
# Run an app without JMX enabled
# start JMX by jcmd
_echo "**** Test two ****"
_app_start
_jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.authenticate=false jmxremote.ssl=false
res1=`testme $1`
if [ "${res1}" = "OK_CONN" ]
then
_echo "Passed"
else
_echo "Failed r1(OK):${res1}"
_app_stop "Failed"
fi
_app_stop
}
test_03(){
# Run an app without JMX enabled
# start JMX by jcmd on one port than on other one
_echo "**** Test three ****"
_app_start
_jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.authenticate=false jmxremote.ssl=false
# Second agent shouldn't start
_jcmd ManagementAgent.start jmxremote.port=$2 jmxremote.authenticate=false jmxremote.ssl=false
# First agent should connect
res1=`testme $1`
if [ "${res1}" = "OK_CONN" ]
then
_echo "Passed $1"
else
_echo "Failed r1(NO):${res1}"
_app_stop "Failed"
fi
#Second agent shouldn't connect
res1=`testme $2`
if [ "${res1}" = "NO_CONN" ]
then
_echo "Passed $2"
else
_echo "Failed r1(OK):${res1}"
fi
_app_stop
}
test_04(){
# Run an app without JMX enabled
# start JMX by jcmd on one port, specify rmi port explicitly
_echo "**** Test four ****"
_app_start
_jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.rmi.port=$2 jmxremote.authenticate=false jmxremote.ssl=false
# First agent should connect
res1=`testme $1 $2`
if [ "${res1}" = "OK_CONN" ]
then
_echo "Passed $1 $2"
else
_echo "Failed r1(NO):${res1}"
_app_stop "Failed"
fi
_app_stop
}
test_05(){
# Run an app without JMX enabled, it will enable local server
# but should leave remote server disabled
_echo "**** Test five ****"
_app_start
_jcmd ManagementAgent.start jmxremote=1
# First agent should connect
res1=`testme $1`
if [ "${res1}" = "NO_CONN" ]
then
_echo "Passed $1 $2"
else
_echo "Failed r1(OK):${res1}"
_app_stop "Failed"
fi
_app_stop
}
test_06(){
# Run an app without JMX enabled
# start JMX by jcmd on one port, specify rmi port explicitly
# attempt to start it again
# 1) with the same port
# 2) with other port
# 3) attempt to stop it twice
# Check for valid messages in the output
_echo "**** Test six ****"
_app_start
_jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.authenticate=false jmxremote.ssl=false
# First agent should connect
res1=`testme $1 $2`
if [ "${res1}" = "OK_CONN" ]
then
_echo "Passed $1 $2"
else
_echo "Failed r1(NO):${res1}"
_app_stop "Failed"
fi
_jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.authenticate=false jmxremote.ssl=false
_jcmd ManagementAgent.start jmxremote.port=$2 jmxremote.authenticate=false jmxremote.ssl=false
_jcmd ManagementAgent.stop
_jcmd ManagementAgent.stop
_jcmd ManagementAgent.start jmxremote.port=22 jmxremote.rmi.port=$2 jmxremote.authenticate=false jmxremote.ssl=false
_app_stop
}
test_07(){
# Run an app without JMX enabled, but with some properties set
# in command line.
# make sure these properties overriden corectly
_echo "**** Test seven ****"
_app_start -Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=true
res1=`testme $1`
_jcmd ManagementAgent.start jmxremote.port=$2 jmxremote.authenticate=false jmxremote.ssl=false
res2=`testme $2`
if [ "${res1}" = "NO_CONN" -a "${res2}" = "OK_CONN" ]
then
echo "Passed"
else
_echo "Failed r1(NO):${res1} r2(OK):${res2}"
_app_stop "Failed"
fi
_app_stop
}
test_08(){
# Run an app with JMX enabled and with some properties set
# in command line.
# stop JMX agent and then start it again with different property values
# make sure these properties overriden corectly
_echo "**** Test eight ****"
_app_start -Dcom.sun.management.jmxremote.port=$1 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=true
res1=`testme $1`
_jcmd ManagementAgent.stop
res2=`testme $1`
_jcmd ManagementAgent.start jmxremote.port=$2 jmxremote.authenticate=false jmxremote.ssl=false
res3=`testme $2`
if [ "${res1}" = "NO_CONN" -a "${res2}" = "NO_CONN" -a "${res3}" = "OK_CONN" ]
then
_echo "Passed"
else
_echo "Failed r1(NO):${res1} r2(NO):${res2} r3(OK):${res3}"
_app_stop "Failed"
fi
_app_stop
}
test_09(){
# Run an app with JMX enabled and with some properties set
# in command line.
# stop JMX agent and then start it again with different property values
# specifing some property in management config file and some of them
# in command line
# make sure these properties overriden corectly
_echo "**** Test nine ****"
_app_start -Dcom.sun.management.config.file=${_testsrc}/management_cl.properties \
-Dcom.sun.management.jmxremote.authenticate=false
res1=`testme $1`
_jcmd ManagementAgent.stop
res2=`testme $1`
_jcmd ManagementAgent.start config.file=${_testsrc}/management_jcmd.properties \
jmxremote.authenticate=false jmxremote.port=$2
res3=`testme $2`
if [ "${res1}" = "NO_CONN" -a "${res2}" = "NO_CONN" -a "${res3}" = "OK_CONN" ]
then
_echo "Passed"
else
_echo "Failed r1(NO):${res1} r2(NO):${res2} r3(OK):${res3}"
_app_stop "Failed"
fi
_app_stop
}
test_10(){
# Run an app with JMX enabled and with some properties set
# in command line.
# stop JMX agent and then start it again with different property values
# stop JMX agent again and then start it without property value
# make sure these properties overriden corectly
_echo "**** Test ten ****"
_app_start -Dcom.sun.management.jmxremote.port=$1 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=true
res1=`testme $1`
_jcmd ManagementAgent.stop
_jcmd ManagementAgent.start jmxremote.ssl=false jmxremote.port=$1
res2=`testme $1`
_jcmd ManagementAgent.stop
_jcmd ManagementAgent.start jmxremote.port=$1
res3=`testme $1`
if [ "${res1}" = "NO_CONN" -a "${res2}" = "OK_CONN" -a "${res3}" = "NO_CONN" ]
then
_echo "Passed"
else
_echo "Failed r1(NO):${res1} r2(OK):${res2} r3(NO):${res3}"
_app_stop "Failed"
fi
_app_stop
}
test_11(){
# Run an app with JMX enabled
# stop remote agent
# make sure local agent is not affected
_echo "**** Test eleven ****"
_app_start -Dcom.sun.management.jmxremote.port=$2 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false
res1=`testme $2`
_jcmd ManagementAgent.stop
pid=`${TESTJAVA}/bin/jps | sed -n "/JMXStartStopDoSomething/s/ .*//p"`
res2=`testme local ${pid}`
if [ "${res1}" = "OK_CONN" -a "${res2}" = "OK_CONN" ]
then
_echo "Passed"
else
_echo "Failed r1(OK):${res1} r2(OK):${res2}"
_app_stop "Failed"
fi
_app_stop
}
test_12(){
# Run an app with JMX disabled
# start local agent only
_echo "**** Test twelve ****"
_app_start
res1=`testme $1`
_jcmd ManagementAgent.start_local
pid=`_get_pid`
if [ "x${pid}" = "x" ]
then
res2="NO_CONN"
else
res2=`testme local ${pid}`
fi
if [ "${res1}" = "NO_CONN" -a "${res2}" = "OK_CONN" ]
then
_echo "Passed"
else
_echo "Failed r1(NO):${res1} r2(OK):${res2}"
_app_stop "Failed"
fi
_app_stop
}
test_13(){
# Run an app with -javaagent make sure it works as expected - system properties are ignored
_echo "**** Test 13 ****"
AGENT="${TESTJAVA}/jre/lib/management-agent.jar"
if [ ! -f ${AGENT} ]
then
AGENT="${TESTJAVA}/lib/management-agent.jar"
fi
_app_start -javaagent:${AGENT}=com.sun.management.jmxremote.port=$1,com.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
res1=`testme $1`
if [ "${res1}" = "NO_CONN" ]
then
_echo "Passed"
else
_echo "Failed r1(NO):${res1}"
_app_stop "Failed"
fi
_app_stop
}
#============== Server tests =======================
server_test_01(){
_echo "**** Server test one ****"
_app_start -Dcom.sun.management.jmxremote.port=$1 \
-Dcom.sun.management.jmxremote.rmi.port=$2 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false
}
# ============= MAIN =======================================
if [ "x${TESTJAVA}" = "x" ]
then
echo "TESTJAVA env have to be set"
exit
fi
if [ ! -x "${TESTJAVA}/bin/jcmd" ]
then
echo "${TESTJAVA}/bin/jcmd"
echo "Doesn't exist or not an executable"
if [ "${_verbose}" != "yes" ]
then
exit
fi
fi
#------------------------------------------------------------------------------
# reading parameters
for parm in "$@"
do
case $parm in
--verbose) _verbose=yes ;;
--server) _server=yes ;;
--jtreg) _jtreg=yes ;;
--no-compile) _compile=no ;;
--testsuite=*) _testsuite=`_echo $parm | sed "s,^--.*=\(.*\),\1,"` ;;
--port-one=*) _port_one=`_echo $parm | sed "s,^--.*=\(.*\),\1,"` ;;
--port-two=*) _port_two=`_echo $parm | sed "s,^--.*=\(.*\),\1,"` ;;
*)
echo "Undefined parameter $parm. Try --help for help"
exit
;;
esac
done
if [ ${_compile} = "yes" ]
then
_compile
fi
if [ ${_jtreg} = "yes" ]
then
_testclasses=${TESTCLASSES}
_testsrc=${TESTSRC}
_logname="JMXStartStopTest_output.txt"
fi
rm -f ${_logname}
# Start server mode tests
# All of them require manual cleanup
if [ "x${_server}" = "xyes" ]
then
server_test_01 ${_port_one} ${_port_two}
else
# Local mode tests
for i in `echo ${_testsuite} | sed -e "s/,/ /g"`
do
test_${i} ${_port_one} ${_port_two}
done
fi

View File

@ -0,0 +1,11 @@
1. Setup two hosts
2. Make sure tcp connection between them works
3. run tcpdump -i <interface> host <host2_name> and 'tcp[13] & 2!=0'
on host 1
4. run JMXStartStopTest.sh --server on host2
5. run jconsole on host1
6. connect jconsole to host2:50234
Make sure jconsole works
Make sure only host2.50234 and host2.50235 appears in tcpdump output.

View File

@ -0,0 +1,2 @@
com.sun.management.jmxremote.ssl=true
com.sun.management.internal.read_from_config_file_cl=true

View File

@ -0,0 +1,3 @@
com.sun.management.jmxremote.ssl=false
jmxremote.authenticate=true
com.sun.management.internal.read_from_config_file_jcmd=true

View File

@ -0,0 +1,44 @@
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 7147830
* @summary PolicyFile.getPermissions(CodeSource) should return
* empty permissions when passed in null code source
*/
import java.security.CodeSource;
import java.security.PermissionCollection;
import java.security.Policy;
public class NullCodeSource {
public static void main(String[] args) throws Exception {
Policy policy = Policy.getPolicy();
PermissionCollection perms = policy.getPermissions((CodeSource)null);
if (perms.elements().hasMoreElements()) {
System.err.println(perms);
throw new Exception("PermissionCollection is not empty");
}
}
}

View File

@ -75,14 +75,14 @@ public class Settings extends TestHelper {
static void runTestOptionDefault() throws IOException {
TestResult tr = null;
tr = doExec(javaCmd, "-Xms64m", "-Xmx512m",
"-Xss128k", "-XshowSettings", "-jar", testJar.getAbsolutePath());
"-Xss256k", "-XshowSettings", "-jar", testJar.getAbsolutePath());
containsAllOptions(tr);
if (!tr.isOK()) {
System.out.println(tr.status);
throw new RuntimeException("test fails");
}
tr = doExec(javaCmd, "-Xms65536k", "-Xmx712m",
"-Xss122880", "-XshowSettings", "-jar", testJar.getAbsolutePath());
"-Xss256000", "-XshowSettings", "-jar", testJar.getAbsolutePath());
containsAllOptions(tr);
if (!tr.isOK()) {
System.out.println(tr.status);

View File

@ -38,7 +38,7 @@ ifeq ($(BUILD_DEPLOY), true)
endif
ifeq ($(BUILD_JDK), true)
sanity:: jdk-sanity
sanity:: jdk-sanity
endif
# Only need these sanity rules when not doing a debug build
@ -64,7 +64,7 @@ $(ERROR_FILE) $(WARNING_FILE) $(MESSAGE_FILE):
purge-sanity: $(ERROR_FILE) $(WARNING_FILE) $(MESSAGE_FILE)
-@$(RM) $(ERROR_FILE) $(WARNING_FILE) $(MESSAGE_FILE)
pre-sanity: purge-sanity
pre-sanity: purge-sanity
# this should be the last rule in any target's sanity rule.
post-sanity post-sanity-hotspot post-sanity-jdk post-sanity-install post-sanity-deploy:
@ -132,7 +132,7 @@ endif
" $* defined. Please unset it and restart your build. \n" \
"" >> $(ERROR_FILE)
# Check the environment variables
# Check the environment variables
environment: $(DO_NOT_SET_LIST:%=%.do_not_set)
ifeq ($(LANGTOOLS_SRC_AVAILABLE), true)
ifneq ($(BUILD_LANGTOOLS), true)
@ -205,7 +205,15 @@ ifeq ($(SPONSORS_SRC_AVAILABLE), true)
endif
endif
ifeq ($(GENERATE_DOCS),false)
@$(ECHO) "WARNING: This build does not include running javadoc.\n" \
@$(ECHO) "WARNING: This build does not include generating javadoc.\n" \
"" >> $(WARNING_FILE)
endif
ifdef NO_DEMOS
@$(ECHO) "WARNING: This build and any install images will not include demos.\n" \
"" >> $(WARNING_FILE)
endif
ifdef NO_SAMPLES
@$(ECHO) "WARNING: This build and any install images will not include samples.\n" \
"" >> $(WARNING_FILE)
endif
ifdef NO_IMAGES
@ -231,7 +239,7 @@ ifneq ($(PLATFORM), windows)
HOSTNAME := $(shell hostname)
endif
endif
settings::
settings::
@$(ECHO) "Build Machine Information:" >> $(MESSAGE_FILE)
ifeq ($(PLATFORM), windows)
@$(ECHO) " build machine = $(COMPUTERNAME)" >> $(MESSAGE_FILE)

208
make/scripts/normalizer.pl Normal file
View File

@ -0,0 +1,208 @@
#!/usr/bin/perl
#
# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
#
# Parses java files:
# 1. Removes from the end of lines spaces and TABs
# 2. Replaces TABs by spaces
# 3. Replaces all NewLine separators by Unix NewLine separators
# 4. Makes one and only one empty line at the end of each file
if ($#ARGV < 0) {
&usage;
die;
}
use Cwd 'abs_path';
my @extensions = ("java");
# Read options
my $dirpos = 0;
while ($dirpos < $#ARGV) {
if ($ARGV[$dirpos] eq "-e") {
@extensions = split(/,/, $ARGV[$dirpos + 1]);
} else {
last;
}
$dirpos += 2;
}
if ($dirpos > $#ARGV) {
&usage;
die;
}
use Cwd;
my $currdir = getcwd;
my $allfiles = 0;
my $filecount = 0;
my @tabvalues;
# Init tabvalues
push (@tabvalues, " ");
for (my $i = 1; $i < 8; $i++) {
push(@tabvalues, $tabvalues[$i - 1] . " ");
}
open(FILELIST, ">$currdir/filelist") or die "Failed while open $currdir/filelist: $!\n";
while ($dirpos <= $#ARGV) {
use File::Find;
find(\&parse_file, abs_path($ARGV[$dirpos]));
$dirpos += 1;
}
close(FILELIST);
use Cwd 'chdir';
chdir $currdir;
print "Checked $allfiles file(s)\n";
print "Modified $filecount file(s)\n";
print "See results in the file $currdir/filelist\n";
sub parse_file {
my $filename = $File::Find::name;
# Skip directories
return if -d;
# Skip SCCS files
return if ($filename =~ /\/SCCS\//);
# Skip files with invalid extensions
my $accepted = 0;
foreach my $ext (@extensions) {
if ($_ =~ /\.$ext$/i) {
$accepted = 1;
last;
}
}
return if ($accepted == 0);
use File::Basename;
my $dirname = dirname($filename);
use Cwd 'chdir';
chdir $dirname;
open(FILE, $filename) or die "Failed while open $filename: $!\n";
# Read file
my @content;
my $line;
my $emptylinescount = 0;
my $modified = 0;
while ($line = <FILE>) {
my $originalline = $line;
# Process line
# Remove from the end of the line spaces and return character
while ($line =~ /\s$/) {
chop($line);
}
# Replace TABs
for (my $i = 0; $i < length($line); $i++) {
if (substr($line, $i, 1) =~ /\t/) {
$line = substr($line, 0, $i) . $tabvalues[7 - ($i % 8)] . substr($line, $i + 1);
}
}
if (length($line) == 0) {
$emptylinescount++;
} else {
while ($emptylinescount > 0) {
push(@content, "");
$emptylinescount--;
}
push(@content, $line);
}
if ($originalline ne ($line . "\n")) {
$modified = 1;
}
}
$allfiles++;
if ($emptylinescount > 0) {
$modified = 1;
}
close(FILE);
if ($modified != 0) {
# Write file
open(FILE, ">$filename") or die "Failed while open $filename: $!\n";
for (my $i = 0; $i <= $#content; $i++) {
print FILE "$content[$i]\n";
}
close(FILE);
# Print name from current dir
if (index($filename, $currdir) == 0) {
print FILELIST substr($filename, length($currdir) + 1);
} else {
print FILELIST $filename;
}
print FILELIST "\n";
$filecount++;
print "$filename: modified\n";
}
}
sub usage {
print "Usage:\n";
print " normalizer.pl [-options] <dir> [dir2 dir3 ...]\n";
print " Available options:\n";
print " -e comma separated files extensions. By default accepts only java files\n";
print "\n";
print "Examples:\n";
print " normalizer.pl -e c,cpp,h,hpp .\n";
}