Merge
This commit is contained in:
commit
4909043745
@ -38,7 +38,7 @@ _JUNK_ := $(shell echo -e >&2 ""\
|
||||
"Please use 'make jvmg' to build debug JVM. \n" \
|
||||
"----------------------------------------------------------------------\n")
|
||||
|
||||
G_SUFFIX =
|
||||
G_SUFFIX = _g
|
||||
VERSION = debug
|
||||
SYSDEFS += -DASSERT -DDEBUG
|
||||
PICFLAGS = DEFAULT
|
||||
|
@ -58,7 +58,7 @@ CFLAGS$(HOTSPARC_GENERIC) += $(OPT_CFLAGS/BYFILE)
|
||||
# Linker mapfile
|
||||
MAPFILE = $(GAMMADIR)/make/linux/makefiles/mapfile-vers-debug
|
||||
|
||||
G_SUFFIX =
|
||||
G_SUFFIX = _g
|
||||
VERSION = optimized
|
||||
SYSDEFS += -DASSERT -DFASTDEBUG
|
||||
PICFLAGS = DEFAULT
|
||||
|
@ -25,9 +25,12 @@
|
||||
# Rules to build signal interposition library, used by vm.make
|
||||
|
||||
# libjsig[_g].so: signal interposition library
|
||||
JSIG = jsig$(G_SUFFIX)
|
||||
JSIG = jsig
|
||||
LIBJSIG = lib$(JSIG).so
|
||||
|
||||
JSIG_G = $(JSIG)$(G_SUFFIX)
|
||||
LIBJSIG_G = lib$(JSIG_G).so
|
||||
|
||||
JSIGSRCDIR = $(GAMMADIR)/src/os/$(Platform_os_family)/vm
|
||||
|
||||
DEST_JSIG = $(JDK_LIBDIR)/$(LIBJSIG)
|
||||
@ -50,6 +53,7 @@ $(LIBJSIG): $(JSIGSRCDIR)/jsig.c $(LIBJSIG_MAPFILE)
|
||||
@echo Making signal interposition lib...
|
||||
$(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) $(SHARED_FLAG) $(PICFLAG) \
|
||||
$(LFLAGS_JSIG) $(JSIG_DEBUG_CFLAGS) -o $@ $< -ldl
|
||||
$(QUIETLY) [ -f $(LIBJSIG_G) ] || { ln -s $@ $(LIBJSIG_G); }
|
||||
|
||||
install_jsig: $(LIBJSIG)
|
||||
@echo "Copying $(LIBJSIG) to $(DEST_JSIG)"
|
||||
|
@ -35,7 +35,7 @@ CFLAGS += $(DEBUG_CFLAGS/BYFILE)
|
||||
# Linker mapfile
|
||||
MAPFILE = $(GAMMADIR)/make/linux/makefiles/mapfile-vers-debug
|
||||
|
||||
G_SUFFIX =
|
||||
G_SUFFIX = _g
|
||||
VERSION = debug
|
||||
SYSDEFS += -DASSERT -DDEBUG
|
||||
PICFLAGS = DEFAULT
|
||||
|
@ -25,7 +25,9 @@
|
||||
# Rules to build gamma launcher, used by vm.make
|
||||
|
||||
# gamma[_g]: launcher
|
||||
LAUNCHER = gamma$(G_SUFFIX)
|
||||
|
||||
LAUNCHER = gamma
|
||||
LAUNCHER_G = $(LAUNCHER)$(G_SUFFIX)
|
||||
|
||||
LAUNCHERDIR = $(GAMMADIR)/src/os/$(Platform_os_family)/launcher
|
||||
LAUNCHERFLAGS = $(ARCHFLAG) \
|
||||
@ -70,4 +72,5 @@ $(LAUNCHER): $(LAUNCHER.o) $(LIBJVM) $(LAUNCHER_MAPFILE)
|
||||
$(LINK_LAUNCHER/PRE_HOOK) \
|
||||
$(LINK_LAUNCHER) $(LFLAGS_LAUNCHER) -o $@ $(LAUNCHER.o) $(LIBS_LAUNCHER); \
|
||||
$(LINK_LAUNCHER/POST_HOOK) \
|
||||
[ -f $(LAUNCHER_G) ] || { ln -s $@ $(LAUNCHER_G); }; \
|
||||
}
|
||||
|
@ -25,9 +25,13 @@
|
||||
# Rules to build serviceability agent library, used by vm.make
|
||||
|
||||
# libsaproc[_g].so: serviceability agent
|
||||
SAPROC = saproc$(G_SUFFIX)
|
||||
|
||||
SAPROC = saproc
|
||||
LIBSAPROC = lib$(SAPROC).so
|
||||
|
||||
SAPROC_G = $(SAPROC)$(G_SUFFIX)
|
||||
LIBSAPROC_G = lib$(SAPROC_G).so
|
||||
|
||||
AGENT_DIR = $(GAMMADIR)/agent
|
||||
|
||||
SASRCDIR = $(AGENT_DIR)/src/os/$(Platform_os_family)
|
||||
@ -75,6 +79,7 @@ $(LIBSAPROC): $(SASRCFILES) $(SAMAPFILE)
|
||||
$(SA_DEBUG_CFLAGS) \
|
||||
-o $@ \
|
||||
-lthread_db
|
||||
$(QUIETLY) [ -f $(LIBSAPROC_G) ] || { ln -s $@ $(LIBSAPROC_G); }
|
||||
|
||||
install_saproc: checkAndBuildSA
|
||||
$(QUIETLY) if [ -e $(LIBSAPROC) ] ; then \
|
||||
|
@ -113,8 +113,9 @@ include $(MAKEFILES_DIR)/dtrace.make
|
||||
#----------------------------------------------------------------------
|
||||
# JVM
|
||||
|
||||
JVM = jvm$(G_SUFFIX)
|
||||
LIBJVM = lib$(JVM).so
|
||||
JVM = jvm
|
||||
LIBJVM = lib$(JVM).so
|
||||
LIBJVM_G = lib$(JVM)$(G_SUFFIX).so
|
||||
|
||||
JVM_OBJ_FILES = $(Obj_Files)
|
||||
|
||||
@ -201,6 +202,7 @@ $(LIBJVM): $(LIBJVM.o) $(LIBJVM_MAPFILE) $(LD_SCRIPT)
|
||||
$(LFLAGS_VM) -o $@ $(LIBJVM.o) $(LIBS_VM); \
|
||||
$(LINK_LIB.CC/POST_HOOK) \
|
||||
rm -f $@.1; ln -s $@ $@.1; \
|
||||
[ -f $(LIBJVM_G) ] || { ln -s $@ $(LIBJVM_G); ln -s $@.1 $(LIBJVM_G).1; }; \
|
||||
if [ -x /usr/sbin/selinuxenabled ] ; then \
|
||||
/usr/sbin/selinuxenabled; \
|
||||
if [ $$? = 0 ] ; then \
|
||||
|
@ -54,7 +54,7 @@ _JUNK_ := $(shell echo >&2 ""\
|
||||
"Please use 'gnumake jvmg' to build debug JVM. \n" \
|
||||
"-------------------------------------------------------------------------\n")
|
||||
|
||||
G_SUFFIX =
|
||||
G_SUFFIX = _g
|
||||
VERSION = debug
|
||||
SYSDEFS += -DASSERT -DDEBUG
|
||||
PICFLAGS = DEFAULT
|
||||
|
@ -24,8 +24,8 @@
|
||||
|
||||
# Rules to build jvm_db/dtrace, used by vm.make
|
||||
|
||||
# we build libjvm_dtrace/libjvm_db/dtrace for COMPILER1 and COMPILER2
|
||||
# but not for CORE configuration
|
||||
# We build libjvm_dtrace/libjvm_db/dtrace for COMPILER1 and COMPILER2
|
||||
# but not for CORE or KERNEL configurations.
|
||||
|
||||
ifneq ("${TYPE}", "CORE")
|
||||
ifneq ("${TYPE}", "KERNEL")
|
||||
@ -37,12 +37,13 @@ dtraceCheck:
|
||||
|
||||
else
|
||||
|
||||
|
||||
JVM_DB = libjvm_db
|
||||
LIBJVM_DB = libjvm$(G_SUFFIX)_db.so
|
||||
LIBJVM_DB = libjvm_db.so
|
||||
LIBJVM_DB_G = libjvm$(G_SUFFIX)_db.so
|
||||
|
||||
JVM_DTRACE = jvm_dtrace
|
||||
LIBJVM_DTRACE = libjvm$(G_SUFFIX)_dtrace.so
|
||||
LIBJVM_DTRACE = libjvm_dtrace.so
|
||||
LIBJVM_DTRACE_G = libjvm$(G_SUFFIX)_dtrace.so
|
||||
|
||||
JVMOFFS = JvmOffsets
|
||||
JVMOFFS.o = $(JVMOFFS).o
|
||||
@ -77,7 +78,7 @@ LFLAGS_JVM_DB += -D_REENTRANT $(PICFLAG)
|
||||
LFLAGS_JVM_DTRACE += -D_REENTRANT $(PICFLAG)
|
||||
else
|
||||
LFLAGS_JVM_DB += -mt $(PICFLAG) -xnolib
|
||||
LFLAGS_JVM_DTRACE += -mt $(PICFLAG) -xnolib
|
||||
LFLAGS_JVM_DTRACE += -mt $(PICFLAG) -xnolib -ldl
|
||||
endif
|
||||
|
||||
ISA = $(subst i386,i486,$(shell isainfo -n))
|
||||
@ -86,18 +87,24 @@ ISA = $(subst i386,i486,$(shell isainfo -n))
|
||||
ifneq ("${ISA}","${BUILDARCH}")
|
||||
|
||||
XLIBJVM_DB = 64/$(LIBJVM_DB)
|
||||
XLIBJVM_DB_G = 64/$(LIBJVM_DB_G)
|
||||
XLIBJVM_DTRACE = 64/$(LIBJVM_DTRACE)
|
||||
XLIBJVM_DTRACE_G = 64/$(LIBJVM_DTRACE_G)
|
||||
|
||||
$(XLIBJVM_DB): $(DTRACE_SRCDIR)/$(JVM_DB).c $(JVMOFFS).h $(LIBJVM_DB_MAPFILE)
|
||||
@echo Making $@
|
||||
$(QUIETLY) mkdir -p 64/ ; \
|
||||
$(CC) $(SYMFLAG) $(ARCHFLAG/$(ISA)) -D$(TYPE) -I. -I$(GENERATED) \
|
||||
$(SHARED_FLAG) $(LFLAGS_JVM_DB) -o $@ $(DTRACE_SRCDIR)/$(JVM_DB).c -lc
|
||||
[ -f $(XLIBJVM_DB_G) ] || { ln -s $(LIBJVM_DB) $(XLIBJVM_DB_G); }
|
||||
|
||||
$(XLIBJVM_DTRACE): $(DTRACE_SRCDIR)/$(JVM_DTRACE).c $(DTRACE_SRCDIR)/$(JVM_DTRACE).h $(LIBJVM_DTRACE_MAPFILE)
|
||||
@echo Making $@
|
||||
$(QUIETLY) mkdir -p 64/ ; \
|
||||
$(CC) $(SYMFLAG) $(ARCHFLAG/$(ISA)) -D$(TYPE) -I. \
|
||||
$(SHARED_FLAG) $(LFLAGS_JVM_DTRACE) -o $@ $(DTRACE_SRCDIR)/$(JVM_DTRACE).c -lc -lthread -ldoor
|
||||
[ -f $(XLIBJVM_DTRACE_G) ] || { ln -s $(LIBJVM_DTRACE) $(XLIBJVM_DTRACE_G); }
|
||||
|
||||
endif # ifneq ("${ISA}","${BUILDARCH}")
|
||||
|
||||
ifdef USE_GCC
|
||||
@ -142,11 +149,13 @@ $(LIBJVM_DB): $(DTRACE_SRCDIR)/$(JVM_DB).c $(JVMOFFS.o) $(XLIBJVM_DB) $(LIBJVM_D
|
||||
@echo Making $@
|
||||
$(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) -D$(TYPE) -I. -I$(GENERATED) \
|
||||
$(SHARED_FLAG) $(LFLAGS_JVM_DB) -o $@ $(DTRACE_SRCDIR)/$(JVM_DB).c -lc
|
||||
[ -f $(LIBJVM_DB_G) ] || { ln -s $@ $(LIBJVM_DB_G); }
|
||||
|
||||
$(LIBJVM_DTRACE): $(DTRACE_SRCDIR)/$(JVM_DTRACE).c $(XLIBJVM_DTRACE) $(DTRACE_SRCDIR)/$(JVM_DTRACE).h $(LIBJVM_DTRACE_MAPFILE)
|
||||
@echo Making $@
|
||||
$(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) -D$(TYPE) -I. \
|
||||
$(SHARED_FLAG) $(LFLAGS_JVM_DTRACE) -o $@ $(DTRACE_SRCDIR)/$(JVM_DTRACE).c -lc -lthread -ldoor
|
||||
[ -f $(LIBJVM_DTRACE_G) ] || { ln -s $@ $(LIBJVM_DTRACE_G); }
|
||||
|
||||
$(DTRACE).d: $(DTRACE_SRCDIR)/hotspot.d $(DTRACE_SRCDIR)/hotspot_jni.d \
|
||||
$(DTRACE_SRCDIR)/hs_private.d $(DTRACE_SRCDIR)/jhelper.d
|
||||
|
@ -90,7 +90,6 @@ endif # Platform_compiler == sparcWorks
|
||||
# for this method for now. (fix this when dtrace bug 6258412 is fixed)
|
||||
OPT_CFLAGS/ciEnv.o = $(OPT_CFLAGS) -xinline=no%__1cFciEnvbFpost_compiled_method_load_event6MpnHnmethod__v_
|
||||
|
||||
|
||||
# (OPT_CFLAGS/SLOWER is also available, to alter compilation of buggy files)
|
||||
|
||||
# If you set HOTSPARC_GENERIC=yes, you disable all OPT_CFLAGS settings
|
||||
@ -115,8 +114,7 @@ MAPFILE = $(GAMMADIR)/make/solaris/makefiles/mapfile-vers \
|
||||
# and mustn't be otherwise.
|
||||
MAPFILE_DTRACE = $(GAMMADIR)/make/solaris/makefiles/mapfile-vers-$(TYPE)
|
||||
|
||||
|
||||
G_SUFFIX =
|
||||
G_SUFFIX = _g
|
||||
VERSION = optimized
|
||||
SYSDEFS += -DASSERT -DFASTDEBUG -DCHECK_UNHANDLED_OOPS
|
||||
PICFLAGS = DEFAULT
|
||||
|
@ -25,8 +25,11 @@
|
||||
# Rules to build signal interposition library, used by vm.make
|
||||
|
||||
# libjsig[_g].so: signal interposition library
|
||||
JSIG = jsig$(G_SUFFIX)
|
||||
LIBJSIG = lib$(JSIG).so
|
||||
JSIG = jsig
|
||||
LIBJSIG = lib$(JSIG).so
|
||||
|
||||
JSIG_G = $(JSIG)$(G_SUFFIX)
|
||||
LIBJSIG_G = lib$(JSIG_G).so
|
||||
|
||||
JSIGSRCDIR = $(GAMMADIR)/src/os/$(Platform_os_family)/vm
|
||||
|
||||
@ -46,6 +49,7 @@ $(LIBJSIG): $(JSIGSRCDIR)/jsig.c $(LIBJSIG_MAPFILE)
|
||||
@echo Making signal interposition lib...
|
||||
$(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) $(SHARED_FLAG) $(PICFLAG) \
|
||||
$(LFLAGS_JSIG) -o $@ $< -ldl
|
||||
[ -f $(LIBJSIG_G) ] || { ln -s $@ $(LIBJSIG_G); }
|
||||
|
||||
install_jsig: $(LIBJSIG)
|
||||
@echo "Copying $(LIBJSIG) to $(DEST_JSIG)"
|
||||
|
@ -51,7 +51,7 @@ MAPFILE = $(GAMMADIR)/make/solaris/makefiles/mapfile-vers \
|
||||
# and mustn't be otherwise.
|
||||
MAPFILE_DTRACE = $(GAMMADIR)/make/solaris/makefiles/mapfile-vers-$(TYPE)
|
||||
|
||||
G_SUFFIX =
|
||||
G_SUFFIX = _g
|
||||
VERSION = debug
|
||||
SYSDEFS += -DASSERT -DDEBUG
|
||||
PICFLAGS = DEFAULT
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Rules to build gamma launcher, used by vm.make
|
||||
|
||||
# gamma[_g]: launcher
|
||||
LAUNCHER = gamma$(G_SUFFIX)
|
||||
LAUNCHER = gamma
|
||||
LAUNCHER_G = $(LAUNCHER)$(G_SUFFIX)
|
||||
|
||||
LAUNCHERDIR = $(GAMMADIR)/src/os/$(Platform_os_family)/launcher
|
||||
LAUNCHERFLAGS = $(ARCHFLAG) \
|
||||
@ -88,5 +89,6 @@ $(LAUNCHER): $(LAUNCHER.o) $(LIBJVM) $(LAUNCHER_MAPFILE)
|
||||
$(LINK_LAUNCHER/PRE_HOOK) \
|
||||
$(LINK_LAUNCHER) $(LFLAGS_LAUNCHER) -o $@ $(LAUNCHER.o) $(LIBS_LAUNCHER); \
|
||||
$(LINK_LAUNCHER/POST_HOOK) \
|
||||
[ -f $(LAUNCHER_G) ] || { ln -s $@ $(LAUNCHER_G); }; \
|
||||
;; \
|
||||
esac
|
||||
|
@ -25,9 +25,13 @@
|
||||
# Rules to build serviceability agent library, used by vm.make
|
||||
|
||||
# libsaproc[_g].so: serviceability agent
|
||||
SAPROC = saproc$(G_SUFFIX)
|
||||
|
||||
SAPROC = saproc
|
||||
LIBSAPROC = lib$(SAPROC).so
|
||||
|
||||
SAPROC_G = $(SAPROC)$(G_SUFFIX)
|
||||
LIBSAPROC_G = lib$(SAPROC_G).so
|
||||
|
||||
AGENT_DIR = $(GAMMADIR)/agent
|
||||
|
||||
SASRCDIR = $(AGENT_DIR)/src/os/$(Platform_os_family)/proc
|
||||
@ -69,6 +73,7 @@ $(LIBSAPROC): $(SASRCFILES) $(SAMAPFILE)
|
||||
$(SA_LFLAGS) \
|
||||
-o $@ \
|
||||
-ldl -ldemangle -lthread -lc
|
||||
[ -f $(LIBSAPROC_G) ] || { ln -s $@ $(LIBSAPROC_G); }
|
||||
|
||||
install_saproc: checkAndBuildSA
|
||||
$(QUIETLY) if [ -f $(LIBSAPROC) ] ; then \
|
||||
|
@ -281,8 +281,6 @@ else
|
||||
OPT_CFLAGS=-xO4 $(EXTRA_OPT_CFLAGS)
|
||||
endif
|
||||
|
||||
CFLAGS += $(GAMMADIR)/src/os_cpu/solaris_sparc/vm/solaris_sparc.il
|
||||
|
||||
endif # sparc
|
||||
|
||||
ifeq ("${Platform_arch_model}", "x86_32")
|
||||
@ -293,13 +291,14 @@ OPT_CFLAGS=-xtarget=pentium $(EXTRA_OPT_CFLAGS)
|
||||
# [phh] Is this still true for 6.1?
|
||||
OPT_CFLAGS+=-xO3
|
||||
|
||||
CFLAGS += $(GAMMADIR)/src/os_cpu/solaris_x86/vm/solaris_x86_32.il
|
||||
|
||||
endif # 32bit x86
|
||||
|
||||
# no more exceptions
|
||||
CFLAGS/NOEX=-noex
|
||||
|
||||
# Inline functions
|
||||
CFLAGS += $(GAMMADIR)/src/os_cpu/solaris_${Platform_arch}/vm/solaris_${Platform_arch_model}.il
|
||||
|
||||
# Reduce code bloat by reverting back to 5.0 behavior for static initializers
|
||||
CFLAGS += -Qoption ccfe -one_static_init
|
||||
|
||||
@ -312,6 +311,15 @@ PICFLAG/DEFAULT = $(PICFLAG)
|
||||
PICFLAG/BETTER = $(PICFLAG/DEFAULT)
|
||||
PICFLAG/BYFILE = $(PICFLAG/$@)$(PICFLAG/DEFAULT$(PICFLAG/$@))
|
||||
|
||||
# Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file.
|
||||
MAPFLAG = -M FILENAME
|
||||
|
||||
# Use $(SONAMEFLAG:SONAME=soname) to specify the intrinsic name of a shared obj
|
||||
SONAMEFLAG = -h SONAME
|
||||
|
||||
# Build shared library
|
||||
SHARED_FLAG = -G
|
||||
|
||||
# Would be better if these weren't needed, since we link with CC, but
|
||||
# at present removing them causes run-time errors
|
||||
LFLAGS += -library=Crun
|
||||
|
@ -108,11 +108,16 @@ ifeq ($(shell expr $(COMPILER_REV_NUMERIC) \>= 505), 1)
|
||||
# older libm before libCrun, just to make sure it's found and used first.
|
||||
LIBS += -lsocket -lsched -ldl $(LIBM) -lCrun -lthread -ldoor -lc
|
||||
else
|
||||
ifeq ($(COMPILER_REV_NUMERIC), 502)
|
||||
# SC6.1 has it's own libm.so: specifying anything else provokes a name conflict.
|
||||
LIBS += -ldl -lthread -lsocket -lm -lsched -ldoor
|
||||
else
|
||||
LIBS += -ldl -lthread -lsocket $(LIBM) -lsched -ldoor
|
||||
endif
|
||||
endif # 502
|
||||
endif # 505
|
||||
else
|
||||
LIBS += -lsocket -lsched -ldl $(LIBM) -lthread -lc
|
||||
endif
|
||||
endif # sparcWorks
|
||||
|
||||
# By default, link the *.o into the library, not the executable.
|
||||
LINK_INTO$(LINK_INTO) = LIBJVM
|
||||
@ -126,8 +131,9 @@ include $(MAKEFILES_DIR)/dtrace.make
|
||||
#----------------------------------------------------------------------
|
||||
# JVM
|
||||
|
||||
JVM = jvm$(G_SUFFIX)
|
||||
LIBJVM = lib$(JVM).so
|
||||
JVM = jvm
|
||||
LIBJVM = lib$(JVM).so
|
||||
LIBJVM_G = lib$(JVM)$(G_SUFFIX).so
|
||||
|
||||
JVM_OBJ_FILES = $(Obj_Files) $(DTRACE_OBJS)
|
||||
|
||||
@ -173,11 +179,12 @@ $(LIBJVM): $(LIBJVM.o) $(LIBJVM_MAPFILE)
|
||||
-sbfast|-xsbfast) \
|
||||
;; \
|
||||
*) \
|
||||
echo Linking vm...; \
|
||||
$(LINK_LIB.CC/PRE_HOOK) \
|
||||
$(LINK_VM) $(LFLAGS_VM) -o $@ $(LIBJVM.o) $(LIBS_VM); \
|
||||
$(LINK_LIB.CC/POST_HOOK) \
|
||||
rm -f $@.1; ln -s $@ $@.1; \
|
||||
echo Linking vm...; \
|
||||
$(LINK_LIB.CC/PRE_HOOK) \
|
||||
$(LINK_VM) $(LFLAGS_VM) -o $@ $(LIBJVM.o) $(LIBS_VM); \
|
||||
$(LINK_LIB.CC/POST_HOOK) \
|
||||
rm -f $@.1; ln -s $@ $@.1; \
|
||||
[ -f $(LIBJVM_G) ] || { ln -s $@ $(LIBJVM_G); ln -s $@.1 $(LIBJVM_G).1; }; \
|
||||
;; \
|
||||
esac
|
||||
|
||||
|
@ -223,8 +223,8 @@ static const char *unstable_chroot_error = "/proc file system not found.\n"
|
||||
"environment on Linux when /proc filesystem is not mounted.";
|
||||
|
||||
void os::Linux::initialize_system_info() {
|
||||
_processor_count = sysconf(_SC_NPROCESSORS_CONF);
|
||||
if (_processor_count == 1) {
|
||||
set_processor_count(sysconf(_SC_NPROCESSORS_CONF));
|
||||
if (processor_count() == 1) {
|
||||
pid_t pid = os::Linux::gettid();
|
||||
char fname[32];
|
||||
jio_snprintf(fname, sizeof(fname), "/proc/%d", pid);
|
||||
@ -236,7 +236,7 @@ void os::Linux::initialize_system_info() {
|
||||
}
|
||||
}
|
||||
_physical_memory = (julong)sysconf(_SC_PHYS_PAGES) * (julong)sysconf(_SC_PAGESIZE);
|
||||
assert(_processor_count > 0, "linux error");
|
||||
assert(processor_count() > 0, "linux error");
|
||||
}
|
||||
|
||||
void os::init_system_properties_values() {
|
||||
@ -4683,6 +4683,7 @@ void Parker::park(bool isAbsolute, jlong time) {
|
||||
// Return immediately if a permit is available.
|
||||
if (_counter > 0) {
|
||||
_counter = 0 ;
|
||||
OrderAccess::fence();
|
||||
return ;
|
||||
}
|
||||
|
||||
@ -4725,6 +4726,7 @@ void Parker::park(bool isAbsolute, jlong time) {
|
||||
_counter = 0;
|
||||
status = pthread_mutex_unlock(_mutex);
|
||||
assert (status == 0, "invariant") ;
|
||||
OrderAccess::fence();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -4765,6 +4767,7 @@ void Parker::park(bool isAbsolute, jlong time) {
|
||||
jt->java_suspend_self();
|
||||
}
|
||||
|
||||
OrderAccess::fence();
|
||||
}
|
||||
|
||||
void Parker::unpark() {
|
||||
|
@ -937,54 +937,56 @@ scope_desc_at(Nmethod_t *N, int32_t decode_offset, Vframe_t *vf)
|
||||
return err;
|
||||
}
|
||||
|
||||
static int
|
||||
scopeDesc_chain(Nmethod_t *N)
|
||||
{
|
||||
static int scopeDesc_chain(Nmethod_t *N) {
|
||||
int32_t decode_offset = 0;
|
||||
int32_t err;
|
||||
|
||||
if (debug > 2)
|
||||
fprintf(stderr, "\t scopeDesc_chain: BEGIN\n");
|
||||
if (debug > 2) {
|
||||
fprintf(stderr, "\t scopeDesc_chain: BEGIN\n");
|
||||
}
|
||||
|
||||
err = ps_pread(N->J->P, N->pc_desc + OFFSET_PcDesc_scope_decode_offset,
|
||||
&decode_offset, SZ32);
|
||||
CHECK_FAIL(err);
|
||||
|
||||
while (decode_offset > 0) {
|
||||
if (debug > 2)
|
||||
fprintf(stderr, "\t scopeDesc_chain: decode_offset: %#x\n", decode_offset);
|
||||
Vframe_t *vf = &N->vframes[N->vf_cnt];
|
||||
|
||||
Vframe_t *vf = &N->vframes[N->vf_cnt];
|
||||
if (debug > 2) {
|
||||
fprintf(stderr, "\t scopeDesc_chain: decode_offset: %#x\n", decode_offset);
|
||||
}
|
||||
|
||||
err = scope_desc_at(N, decode_offset, vf);
|
||||
err = scope_desc_at(N, decode_offset, vf);
|
||||
CHECK_FAIL(err);
|
||||
|
||||
if (vf->methodIdx > N->oops_len) {
|
||||
fprintf(stderr, "\t scopeDesc_chain: (methodIdx > oops_len) !\n");
|
||||
return -1;
|
||||
}
|
||||
err = read_pointer(N->J, N->nm + N->oops_beg + (vf->methodIdx-1)*POINTER_SIZE,
|
||||
&vf->methodOop);
|
||||
CHECK_FAIL(err);
|
||||
|
||||
if (vf->methodOop) {
|
||||
N->vf_cnt++;
|
||||
err = line_number_from_bci(N->J, vf);
|
||||
CHECK_FAIL(err);
|
||||
|
||||
if (vf->methodIdx > N->oops_len) {
|
||||
fprintf(stderr, "\t scopeDesc_chain: (methodIdx > oops_len) !\n");
|
||||
return -1;
|
||||
if (debug > 2) {
|
||||
fprintf(stderr, "\t scopeDesc_chain: methodOop: %#8llx, line: %ld\n",
|
||||
vf->methodOop, vf->line);
|
||||
}
|
||||
err = read_pointer(N->J, N->nm + N->oops_beg + (vf->methodIdx-1)*POINTER_SIZE,
|
||||
&vf->methodOop);
|
||||
CHECK_FAIL(err);
|
||||
|
||||
if (vf->methodOop) {
|
||||
N->vf_cnt++;
|
||||
err = line_number_from_bci(N->J, vf);
|
||||
CHECK_FAIL(err);
|
||||
if (debug > 2) {
|
||||
fprintf(stderr, "\t scopeDesc_chain: methodOop: %#8llx, line: %ld\n",
|
||||
vf->methodOop, vf->line);
|
||||
}
|
||||
}
|
||||
decode_offset = vf->sender_decode_offset;
|
||||
}
|
||||
decode_offset = vf->sender_decode_offset;
|
||||
}
|
||||
if (debug > 2) {
|
||||
fprintf(stderr, "\t scopeDesc_chain: END \n\n");
|
||||
}
|
||||
if (debug > 2)
|
||||
fprintf(stderr, "\t scopeDesc_chain: END \n\n");
|
||||
return PS_OK;
|
||||
|
||||
fail:
|
||||
if (debug)
|
||||
fprintf(stderr, "\t scopeDesc_chain: FAIL \n\n");
|
||||
if (debug) {
|
||||
fprintf(stderr, "\t scopeDesc_chain: FAIL \n\n");
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -457,7 +457,7 @@ static volatile int max_hrtime_lock = LOCK_FREE; // Update counter with LSB
|
||||
|
||||
|
||||
void os::Solaris::initialize_system_info() {
|
||||
_processor_count = sysconf(_SC_NPROCESSORS_CONF);
|
||||
set_processor_count(sysconf(_SC_NPROCESSORS_CONF));
|
||||
_processors_online = sysconf (_SC_NPROCESSORS_ONLN);
|
||||
_physical_memory = (julong)sysconf(_SC_PHYS_PAGES) * (julong)sysconf(_SC_PAGESIZE);
|
||||
}
|
||||
@ -5803,6 +5803,7 @@ void Parker::park(bool isAbsolute, jlong time) {
|
||||
// Return immediately if a permit is available.
|
||||
if (_counter > 0) {
|
||||
_counter = 0 ;
|
||||
OrderAccess::fence();
|
||||
return ;
|
||||
}
|
||||
|
||||
@ -5846,6 +5847,7 @@ void Parker::park(bool isAbsolute, jlong time) {
|
||||
_counter = 0;
|
||||
status = os::Solaris::mutex_unlock(_mutex);
|
||||
assert (status == 0, "invariant") ;
|
||||
OrderAccess::fence();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -5892,6 +5894,7 @@ void Parker::park(bool isAbsolute, jlong time) {
|
||||
jt->java_suspend_self();
|
||||
}
|
||||
|
||||
OrderAccess::fence();
|
||||
}
|
||||
|
||||
void Parker::unpark() {
|
||||
|
@ -3150,7 +3150,7 @@ void os::win32::initialize_system_info() {
|
||||
_vm_allocation_granularity = si.dwAllocationGranularity;
|
||||
_processor_type = si.dwProcessorType;
|
||||
_processor_level = si.wProcessorLevel;
|
||||
_processor_count = si.dwNumberOfProcessors;
|
||||
set_processor_count(si.dwNumberOfProcessors);
|
||||
|
||||
MEMORYSTATUSEX ms;
|
||||
ms.dwLength = sizeof(ms);
|
||||
|
@ -61,9 +61,11 @@ class BCEscapeAnalyzer : public ResourceObj {
|
||||
BCEscapeAnalyzer* _parent;
|
||||
int _level;
|
||||
|
||||
public:
|
||||
class ArgumentMap;
|
||||
class StateInfo;
|
||||
|
||||
private:
|
||||
// helper functions
|
||||
bool is_argument(int i) { return i >= 0 && i < _arg_size; }
|
||||
|
||||
|
@ -3755,8 +3755,9 @@ bool ClassFileParser::has_illegal_visibility(jint flags) {
|
||||
}
|
||||
|
||||
bool ClassFileParser::is_supported_version(u2 major, u2 minor) {
|
||||
u2 max_version = JDK_Version::is_gte_jdk17x_version() ?
|
||||
JAVA_MAX_SUPPORTED_VERSION : JAVA_6_VERSION;
|
||||
u2 max_version =
|
||||
JDK_Version::is_gte_jdk17x_version() ? JAVA_MAX_SUPPORTED_VERSION :
|
||||
(JDK_Version::is_gte_jdk16x_version() ? JAVA_6_VERSION : JAVA_1_5_VERSION);
|
||||
return (major >= JAVA_MIN_SUPPORTED_VERSION) &&
|
||||
(major <= max_version) &&
|
||||
((major != max_version) ||
|
||||
|
@ -105,6 +105,7 @@
|
||||
template(java_lang_AssertionStatusDirectives, "java/lang/AssertionStatusDirectives") \
|
||||
template(sun_jkernel_DownloadManager, "sun/jkernel/DownloadManager") \
|
||||
template(getBootClassPathEntryForClass_name, "getBootClassPathEntryForClass") \
|
||||
template(setBootClassLoaderHook_name, "setBootClassLoaderHook") \
|
||||
\
|
||||
/* class file format tags */ \
|
||||
template(tag_source_file, "SourceFile") \
|
||||
|
@ -1528,19 +1528,23 @@ void DepChange::print() {
|
||||
int nsup = 0, nint = 0;
|
||||
for (ContextStream str(*this); str.next(); ) {
|
||||
klassOop k = str.klass();
|
||||
switch (str._change_type) {
|
||||
switch (str.change_type()) {
|
||||
case Change_new_type:
|
||||
tty->print_cr(" dependee = %s", instanceKlass::cast(k)->external_name());
|
||||
break;
|
||||
case Change_new_sub:
|
||||
if (!WizardMode)
|
||||
++nsup;
|
||||
else tty->print_cr(" context super = %s", instanceKlass::cast(k)->external_name());
|
||||
if (!WizardMode) {
|
||||
++nsup;
|
||||
} else {
|
||||
tty->print_cr(" context super = %s", instanceKlass::cast(k)->external_name());
|
||||
}
|
||||
break;
|
||||
case Change_new_impl:
|
||||
if (!WizardMode)
|
||||
++nint;
|
||||
else tty->print_cr(" context interface = %s", instanceKlass::cast(k)->external_name());
|
||||
if (!WizardMode) {
|
||||
++nint;
|
||||
} else {
|
||||
tty->print_cr(" context interface = %s", instanceKlass::cast(k)->external_name());
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -470,7 +470,7 @@ class Dependencies: public ResourceObj {
|
||||
// super types can be context types for a relevant dependency, which the
|
||||
// new type could invalidate.
|
||||
class DepChange : public StackObj {
|
||||
private:
|
||||
public:
|
||||
enum ChangeType {
|
||||
NO_CHANGE = 0, // an uninvolved klass
|
||||
Change_new_type, // a newly loaded type
|
||||
@ -480,6 +480,7 @@ class DepChange : public StackObj {
|
||||
Start_Klass = CHANGE_LIMIT // internal indicator for ContextStream
|
||||
};
|
||||
|
||||
private:
|
||||
// each change set is rooted in exactly one new type (at present):
|
||||
KlassHandle _new_type;
|
||||
|
||||
@ -510,15 +511,15 @@ class DepChange : public StackObj {
|
||||
// }
|
||||
class ContextStream : public StackObj {
|
||||
private:
|
||||
DepChange& _changes;
|
||||
DepChange& _changes;
|
||||
friend class DepChange;
|
||||
|
||||
// iteration variables:
|
||||
ChangeType _change_type;
|
||||
klassOop _klass;
|
||||
objArrayOop _ti_base; // i.e., transitive_interfaces
|
||||
int _ti_index;
|
||||
int _ti_limit;
|
||||
ChangeType _change_type;
|
||||
klassOop _klass;
|
||||
objArrayOop _ti_base; // i.e., transitive_interfaces
|
||||
int _ti_index;
|
||||
int _ti_limit;
|
||||
|
||||
// start at the beginning:
|
||||
void start() {
|
||||
@ -530,11 +531,11 @@ class DepChange : public StackObj {
|
||||
_ti_limit = 0;
|
||||
}
|
||||
|
||||
public:
|
||||
ContextStream(DepChange& changes)
|
||||
: _changes(changes)
|
||||
{ start(); }
|
||||
|
||||
public:
|
||||
ContextStream(DepChange& changes, No_Safepoint_Verifier& nsv)
|
||||
: _changes(changes)
|
||||
// the nsv argument makes it safe to hold oops like _klass
|
||||
@ -542,6 +543,7 @@ class DepChange : public StackObj {
|
||||
|
||||
bool next();
|
||||
|
||||
ChangeType change_type() { return _change_type; }
|
||||
klassOop klass() { return _klass; }
|
||||
};
|
||||
friend class DepChange::ContextStream;
|
||||
|
@ -464,7 +464,7 @@ void CodeHeap::verify() {
|
||||
}
|
||||
|
||||
// Verify that freelist contains the right amount of free space
|
||||
guarantee(len == _free_segments, "wrong freelist");
|
||||
// guarantee(len == _free_segments, "wrong freelist");
|
||||
|
||||
// Verify that the number of free blocks is not out of hand.
|
||||
static int free_block_threshold = 10000;
|
||||
@ -479,5 +479,5 @@ void CodeHeap::verify() {
|
||||
for(HeapBlock *h = first_block(); h != NULL; h = next_block(h)) {
|
||||
if (h->free()) count--;
|
||||
}
|
||||
guarantee(count == 0, "missing free blocks");
|
||||
// guarantee(count == 0, "missing free blocks");
|
||||
}
|
||||
|
@ -299,8 +299,8 @@ void ReferenceProcessor::process_phaseJNI(BoolObjectClosure* is_alive,
|
||||
|
||||
|
||||
template <class T>
|
||||
static bool enqueue_discovered_ref_helper(ReferenceProcessor* ref,
|
||||
AbstractRefProcTaskExecutor* task_executor) {
|
||||
bool enqueue_discovered_ref_helper(ReferenceProcessor* ref,
|
||||
AbstractRefProcTaskExecutor* task_executor) {
|
||||
|
||||
// Remember old value of pending references list
|
||||
T* pending_list_addr = (T*)java_lang_ref_Reference::pending_list_addr();
|
||||
|
@ -2045,8 +2045,9 @@ bool instanceKlass::is_same_package_member_impl(instanceKlassHandle class1,
|
||||
// As we walk along, look for equalities between outer1 and class2.
|
||||
// Eventually, the walks will terminate as outer1 stops
|
||||
// at the top-level class around the original class.
|
||||
symbolOop ignore_name;
|
||||
klassOop next = outer1->compute_enclosing_class(ignore_name, CHECK_false);
|
||||
bool ignore_inner_is_member;
|
||||
klassOop next = outer1->compute_enclosing_class(&ignore_inner_is_member,
|
||||
CHECK_false);
|
||||
if (next == NULL) break;
|
||||
if (next == class2()) return true;
|
||||
outer1 = instanceKlassHandle(THREAD, next);
|
||||
@ -2055,8 +2056,9 @@ bool instanceKlass::is_same_package_member_impl(instanceKlassHandle class1,
|
||||
// Now do the same for class2.
|
||||
instanceKlassHandle outer2 = class2;
|
||||
for (;;) {
|
||||
symbolOop ignore_name;
|
||||
klassOop next = outer2->compute_enclosing_class(ignore_name, CHECK_false);
|
||||
bool ignore_inner_is_member;
|
||||
klassOop next = outer2->compute_enclosing_class(&ignore_inner_is_member,
|
||||
CHECK_false);
|
||||
if (next == NULL) break;
|
||||
// Might as well check the new outer against all available values.
|
||||
if (next == class1()) return true;
|
||||
|
@ -337,12 +337,12 @@ class instanceKlass: public Klass {
|
||||
static bool is_same_class_package(oop class_loader1, symbolOop class_name1, oop class_loader2, symbolOop class_name2);
|
||||
|
||||
// find an enclosing class (defined where original code was, in jvm.cpp!)
|
||||
klassOop compute_enclosing_class(symbolOop& simple_name_result, TRAPS) {
|
||||
klassOop compute_enclosing_class(bool* inner_is_member, TRAPS) {
|
||||
instanceKlassHandle self(THREAD, this->as_klassOop());
|
||||
return compute_enclosing_class_impl(self, simple_name_result, THREAD);
|
||||
return compute_enclosing_class_impl(self, inner_is_member, THREAD);
|
||||
}
|
||||
static klassOop compute_enclosing_class_impl(instanceKlassHandle self,
|
||||
symbolOop& simple_name_result, TRAPS);
|
||||
bool* inner_is_member, TRAPS);
|
||||
|
||||
// tell if two classes have the same enclosing class (at package level)
|
||||
bool is_same_package_member(klassOop class2, TRAPS) {
|
||||
|
@ -78,9 +78,9 @@ void instanceRefKlass::oop_follow_contents(oop obj) {
|
||||
|
||||
#ifndef SERIALGC
|
||||
template <class T>
|
||||
static void specialized_oop_follow_contents(instanceRefKlass* ref,
|
||||
ParCompactionManager* cm,
|
||||
oop obj) {
|
||||
void specialized_oop_follow_contents(instanceRefKlass* ref,
|
||||
ParCompactionManager* cm,
|
||||
oop obj) {
|
||||
T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);
|
||||
T heap_oop = oopDesc::load_heap_oop(referent_addr);
|
||||
debug_only(
|
||||
|
@ -30,13 +30,12 @@
|
||||
// no virtual functions allowed
|
||||
|
||||
// store into oop with store check
|
||||
template <class T> void oop_store(T* p, oop v);
|
||||
template <class T> void oop_store(volatile T* p, oop v);
|
||||
template <class T> inline void oop_store(T* p, oop v);
|
||||
template <class T> inline void oop_store(volatile T* p, oop v);
|
||||
|
||||
// store into oop without store check
|
||||
template <class T> void oop_store_without_check(T* p, oop v);
|
||||
template <class T> void oop_store_without_check(volatile T* p, oop v);
|
||||
|
||||
template <class T> inline void oop_store_without_check(T* p, oop v);
|
||||
template <class T> inline void oop_store_without_check(volatile T* p, oop v);
|
||||
|
||||
extern bool always_do_update_barrier;
|
||||
|
||||
|
@ -1318,19 +1318,20 @@ JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass))
|
||||
return NULL;
|
||||
}
|
||||
|
||||
symbolOop simple_name = NULL;
|
||||
bool inner_is_member = false;
|
||||
klassOop outer_klass
|
||||
= instanceKlass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass))
|
||||
)->compute_enclosing_class(simple_name, CHECK_NULL);
|
||||
)->compute_enclosing_class(&inner_is_member, CHECK_NULL);
|
||||
if (outer_klass == NULL) return NULL; // already a top-level class
|
||||
if (simple_name == NULL) return NULL; // an anonymous class (inside a method)
|
||||
if (!inner_is_member) return NULL; // an anonymous class (inside a method)
|
||||
return (jclass) JNIHandles::make_local(env, Klass::cast(outer_klass)->java_mirror());
|
||||
}
|
||||
JVM_END
|
||||
|
||||
// should be in instanceKlass.cpp, but is here for historical reasons
|
||||
klassOop instanceKlass::compute_enclosing_class_impl(instanceKlassHandle k,
|
||||
symbolOop& simple_name_result, TRAPS) {
|
||||
bool* inner_is_member,
|
||||
TRAPS) {
|
||||
Thread* thread = THREAD;
|
||||
const int inner_class_info_index = inner_class_inner_class_info_offset;
|
||||
const int outer_class_info_index = inner_class_outer_class_info_offset;
|
||||
@ -1347,8 +1348,7 @@ klassOop instanceKlass::compute_enclosing_class_impl(instanceKlassHandle k,
|
||||
bool found = false;
|
||||
klassOop ok;
|
||||
instanceKlassHandle outer_klass;
|
||||
bool inner_is_member = false;
|
||||
int simple_name_index = 0;
|
||||
*inner_is_member = false;
|
||||
|
||||
// Find inner_klass attribute
|
||||
for (int i = 0; i < i_length && !found; i += inner_class_next_offset) {
|
||||
@ -1364,8 +1364,7 @@ klassOop instanceKlass::compute_enclosing_class_impl(instanceKlassHandle k,
|
||||
if (found && ooff != 0) {
|
||||
ok = i_cp->klass_at(ooff, CHECK_NULL);
|
||||
outer_klass = instanceKlassHandle(thread, ok);
|
||||
simple_name_index = noff;
|
||||
inner_is_member = true;
|
||||
*inner_is_member = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1377,7 +1376,7 @@ klassOop instanceKlass::compute_enclosing_class_impl(instanceKlassHandle k,
|
||||
if (encl_method_class_idx != 0) {
|
||||
ok = i_cp->klass_at(encl_method_class_idx, CHECK_NULL);
|
||||
outer_klass = instanceKlassHandle(thread, ok);
|
||||
inner_is_member = false;
|
||||
*inner_is_member = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1387,9 +1386,7 @@ klassOop instanceKlass::compute_enclosing_class_impl(instanceKlassHandle k,
|
||||
// Throws an exception if outer klass has not declared k as an inner klass
|
||||
// We need evidence that each klass knows about the other, or else
|
||||
// the system could allow a spoof of an inner class to gain access rights.
|
||||
Reflection::check_for_inner_class(outer_klass, k, inner_is_member, CHECK_NULL);
|
||||
|
||||
simple_name_result = (inner_is_member ? i_cp->symbol_at(simple_name_index) : symbolOop(NULL));
|
||||
Reflection::check_for_inner_class(outer_klass, k, *inner_is_member, CHECK_NULL);
|
||||
return outer_klass();
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -32,15 +32,15 @@
|
||||
// FIXLATER: hook into JvmtiTrace
|
||||
#define TraceJVMTICalls false
|
||||
|
||||
JvmtiEnv::JvmtiEnv() : JvmtiEnvBase() {
|
||||
JvmtiEnv::JvmtiEnv(jint version) : JvmtiEnvBase(version) {
|
||||
}
|
||||
|
||||
JvmtiEnv::~JvmtiEnv() {
|
||||
}
|
||||
|
||||
JvmtiEnv*
|
||||
JvmtiEnv::create_a_jvmti() {
|
||||
return new JvmtiEnv();
|
||||
JvmtiEnv::create_a_jvmti(jint version) {
|
||||
return new JvmtiEnv(version);
|
||||
}
|
||||
|
||||
// VM operation class to copy jni function table at safepoint.
|
||||
@ -411,8 +411,15 @@ JvmtiEnv::AddToBootstrapClassLoaderSearch(const char* segment) {
|
||||
if (phase == JVMTI_PHASE_ONLOAD) {
|
||||
Arguments::append_sysclasspath(segment);
|
||||
return JVMTI_ERROR_NONE;
|
||||
} else {
|
||||
assert(phase == JVMTI_PHASE_LIVE, "sanity check");
|
||||
} else if (use_version_1_0_semantics()) {
|
||||
// This JvmtiEnv requested version 1.0 semantics and this function
|
||||
// is only allowed in the ONLOAD phase in version 1.0 so we need to
|
||||
// return an error here.
|
||||
return JVMTI_ERROR_WRONG_PHASE;
|
||||
} else if (phase == JVMTI_PHASE_LIVE) {
|
||||
// The phase is checked by the wrapper that called this function,
|
||||
// but this thread could be racing with the thread that is
|
||||
// terminating the VM so we check one more time.
|
||||
|
||||
// create the zip entry
|
||||
ClassPathZipEntry* zip_entry = ClassLoader::create_class_path_zip_entry(segment);
|
||||
@ -433,6 +440,8 @@ JvmtiEnv::AddToBootstrapClassLoaderSearch(const char* segment) {
|
||||
}
|
||||
ClassLoader::add_to_list(zip_entry);
|
||||
return JVMTI_ERROR_NONE;
|
||||
} else {
|
||||
return JVMTI_ERROR_WRONG_PHASE;
|
||||
}
|
||||
|
||||
} /* end AddToBootstrapClassLoaderSearch */
|
||||
@ -451,11 +460,12 @@ JvmtiEnv::AddToSystemClassLoaderSearch(const char* segment) {
|
||||
}
|
||||
}
|
||||
return JVMTI_ERROR_NONE;
|
||||
} else {
|
||||
} else if (phase == JVMTI_PHASE_LIVE) {
|
||||
// The phase is checked by the wrapper that called this function,
|
||||
// but this thread could be racing with the thread that is
|
||||
// terminating the VM so we check one more time.
|
||||
HandleMark hm;
|
||||
|
||||
assert(phase == JVMTI_PHASE_LIVE, "sanity check");
|
||||
|
||||
// create the zip entry (which will open the zip file and hence
|
||||
// check that the segment is indeed a zip file).
|
||||
ClassPathZipEntry* zip_entry = ClassLoader::create_class_path_zip_entry(segment);
|
||||
@ -504,6 +514,8 @@ JvmtiEnv::AddToSystemClassLoaderSearch(const char* segment) {
|
||||
}
|
||||
|
||||
return JVMTI_ERROR_NONE;
|
||||
} else {
|
||||
return JVMTI_ERROR_WRONG_PHASE;
|
||||
}
|
||||
} /* end AddToSystemClassLoaderSearch */
|
||||
|
||||
@ -2863,6 +2875,14 @@ JvmtiEnv::IsMethodSynthetic(methodOop method_oop, jboolean* is_synthetic_ptr) {
|
||||
// is_obsolete_ptr - pre-checked for NULL
|
||||
jvmtiError
|
||||
JvmtiEnv::IsMethodObsolete(methodOop method_oop, jboolean* is_obsolete_ptr) {
|
||||
if (use_version_1_0_semantics() &&
|
||||
get_capabilities()->can_redefine_classes == 0) {
|
||||
// This JvmtiEnv requested version 1.0 semantics and this function
|
||||
// requires the can_redefine_classes capability in version 1.0 so
|
||||
// we need to return an error here.
|
||||
return JVMTI_ERROR_MUST_POSSESS_CAPABILITY;
|
||||
}
|
||||
|
||||
if (method_oop == NULL || method_oop->is_obsolete()) {
|
||||
*is_obsolete_ptr = true;
|
||||
} else {
|
||||
|
@ -123,7 +123,26 @@ JvmtiEnvBase::is_valid() {
|
||||
}
|
||||
|
||||
|
||||
JvmtiEnvBase::JvmtiEnvBase() : _env_event_enable() {
|
||||
bool
|
||||
JvmtiEnvBase::use_version_1_0_semantics() {
|
||||
int major, minor, micro;
|
||||
|
||||
JvmtiExport::decode_version_values(_version, &major, &minor, µ);
|
||||
return major == 1 && minor == 0; // micro version doesn't matter here
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
JvmtiEnvBase::use_version_1_1_semantics() {
|
||||
int major, minor, micro;
|
||||
|
||||
JvmtiExport::decode_version_values(_version, &major, &minor, µ);
|
||||
return major == 1 && minor == 1; // micro version doesn't matter here
|
||||
}
|
||||
|
||||
|
||||
JvmtiEnvBase::JvmtiEnvBase(jint version) : _env_event_enable() {
|
||||
_version = version;
|
||||
_env_local_storage = NULL;
|
||||
_tag_map = NULL;
|
||||
_native_method_prefix_count = 0;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -76,6 +76,7 @@ class JvmtiEnvBase : public CHeapObj {
|
||||
|
||||
jvmtiEnv _jvmti_external;
|
||||
jint _magic;
|
||||
jint _version; // version value passed to JNI GetEnv()
|
||||
JvmtiEnvBase* _next;
|
||||
bool _is_retransformable;
|
||||
const void *_env_local_storage; // per env agent allocated data.
|
||||
@ -91,7 +92,7 @@ class JvmtiEnvBase : public CHeapObj {
|
||||
int _native_method_prefix_count;
|
||||
|
||||
protected:
|
||||
JvmtiEnvBase();
|
||||
JvmtiEnvBase(jint version);
|
||||
~JvmtiEnvBase();
|
||||
void dispose();
|
||||
void env_dispose();
|
||||
@ -122,6 +123,9 @@ class JvmtiEnvBase : public CHeapObj {
|
||||
|
||||
bool is_valid();
|
||||
|
||||
bool use_version_1_0_semantics(); // agent asked for version 1.0
|
||||
bool use_version_1_1_semantics(); // agent asked for version 1.1
|
||||
|
||||
bool is_retransformable() { return _is_retransformable; }
|
||||
|
||||
static ByteSize jvmti_external_offset() {
|
||||
|
@ -319,7 +319,27 @@ address JvmtiExport::get_field_modification_count_addr() {
|
||||
|
||||
jint
|
||||
JvmtiExport::get_jvmti_interface(JavaVM *jvm, void **penv, jint version) {
|
||||
/* To Do: add version checks */
|
||||
// The JVMTI_VERSION_INTERFACE_JVMTI part of the version number
|
||||
// has already been validated in JNI GetEnv().
|
||||
int major, minor, micro;
|
||||
|
||||
// micro version doesn't matter here (yet?)
|
||||
decode_version_values(version, &major, &minor, µ);
|
||||
switch (major) {
|
||||
case 1:
|
||||
switch (minor) {
|
||||
case 0: // version 1.0.<micro> is recognized
|
||||
case 1: // version 1.1.<micro> is recognized
|
||||
break;
|
||||
|
||||
default:
|
||||
return JNI_EVERSION; // unsupported minor version number
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return JNI_EVERSION; // unsupported major version number
|
||||
}
|
||||
|
||||
if (JvmtiEnv::get_phase() == JVMTI_PHASE_LIVE) {
|
||||
JavaThread* current_thread = (JavaThread*) ThreadLocalStorage::thread();
|
||||
@ -328,13 +348,13 @@ JvmtiExport::get_jvmti_interface(JavaVM *jvm, void **penv, jint version) {
|
||||
__ENTRY(jvmtiEnv*, JvmtiExport::get_jvmti_interface, current_thread)
|
||||
debug_only(VMNativeEntryWrapper __vew;)
|
||||
|
||||
JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti();
|
||||
JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti(version);
|
||||
*penv = jvmti_env->jvmti_external(); // actual type is jvmtiEnv* -- not to be confused with JvmtiEnv*
|
||||
return JNI_OK;
|
||||
|
||||
} else if (JvmtiEnv::get_phase() == JVMTI_PHASE_ONLOAD) {
|
||||
// not live, no thread to transition
|
||||
JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti();
|
||||
JvmtiEnv *jvmti_env = JvmtiEnv::create_a_jvmti(version);
|
||||
*penv = jvmti_env->jvmti_external(); // actual type is jvmtiEnv* -- not to be confused with JvmtiEnv*
|
||||
return JNI_OK;
|
||||
|
||||
@ -345,6 +365,15 @@ JvmtiExport::get_jvmti_interface(JavaVM *jvm, void **penv, jint version) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
JvmtiExport::decode_version_values(jint version, int * major, int * minor,
|
||||
int * micro) {
|
||||
*major = (version & JVMTI_VERSION_MASK_MAJOR) >> JVMTI_VERSION_SHIFT_MAJOR;
|
||||
*minor = (version & JVMTI_VERSION_MASK_MINOR) >> JVMTI_VERSION_SHIFT_MINOR;
|
||||
*micro = (version & JVMTI_VERSION_MASK_MICRO) >> JVMTI_VERSION_SHIFT_MICRO;
|
||||
}
|
||||
|
||||
void JvmtiExport::enter_primordial_phase() {
|
||||
JvmtiEnvBase::set_phase(JVMTI_PHASE_PRIMORDIAL);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -236,6 +236,8 @@ class JvmtiExport : public AllStatic {
|
||||
static bool is_jvmti_version(jint version) { return (version & JVMTI_VERSION_MASK) == JVMTI_VERSION_VALUE; }
|
||||
static bool is_jvmdi_version(jint version) { return (version & JVMTI_VERSION_MASK) == JVMDI_VERSION_VALUE; }
|
||||
static jint get_jvmti_interface(JavaVM *jvm, void **penv, jint version);
|
||||
static void decode_version_values(jint version, int * major, int * minor,
|
||||
int * micro);
|
||||
|
||||
// single stepping management methods
|
||||
static void at_single_stepping_point(JavaThread *thread, methodOop method, address location) KERNEL_RETURN;
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0"?>
|
||||
<!--
|
||||
Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved.
|
||||
Copyright 2002-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
|
||||
This code is free software; you can redistribute it and/or modify it
|
||||
@ -48,12 +48,12 @@ class JvmtiEnv : public JvmtiEnvBase {
|
||||
|
||||
private:
|
||||
|
||||
JvmtiEnv();
|
||||
JvmtiEnv(jint version);
|
||||
~JvmtiEnv();
|
||||
|
||||
public:
|
||||
|
||||
static JvmtiEnv* create_a_jvmti();
|
||||
static JvmtiEnv* create_a_jvmti(jint version);
|
||||
|
||||
</xsl:text>
|
||||
<xsl:apply-templates select="functionsection"/>
|
||||
|
@ -1190,9 +1190,19 @@ void frame::oops_entry_do(OopClosure* f, const RegisterMap* map) {
|
||||
|
||||
|
||||
void frame::oops_do_internal(OopClosure* f, CodeBlobClosure* cf, RegisterMap* map, bool use_interpreter_oop_map_cache) {
|
||||
if (is_interpreted_frame()) { oops_interpreted_do(f, map, use_interpreter_oop_map_cache);
|
||||
} else if (is_entry_frame()) { oops_entry_do (f, map);
|
||||
} else if (CodeCache::contains(pc())) { oops_code_blob_do (f, cf, map);
|
||||
#ifndef PRODUCT
|
||||
// simulate GC crash here to dump java thread in error report
|
||||
if (CrashGCForDumpingJavaThread) {
|
||||
char *t = NULL;
|
||||
*t = 'c';
|
||||
}
|
||||
#endif
|
||||
if (is_interpreted_frame()) {
|
||||
oops_interpreted_do(f, map, use_interpreter_oop_map_cache);
|
||||
} else if (is_entry_frame()) {
|
||||
oops_entry_do(f, map);
|
||||
} else if (CodeCache::contains(pc())) {
|
||||
oops_code_blob_do(f, cf, map);
|
||||
} else {
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
|
@ -2554,6 +2554,9 @@ class CommandLineFlags {
|
||||
"Include miscellaneous runtime verifications in nmethod code; " \
|
||||
"default off because it disturbs nmethod size heuristics") \
|
||||
\
|
||||
notproduct(bool, CrashGCForDumpingJavaThread, false, \
|
||||
"Manually make GC thread crash then dump java stack trace; " \
|
||||
"Test only") \
|
||||
\
|
||||
/* compilation */ \
|
||||
product(bool, UseCompiler, true, \
|
||||
|
@ -60,24 +60,26 @@ enum ThreadPriority { // JLS 20.20.1-3
|
||||
typedef void (*java_call_t)(JavaValue* value, methodHandle* method, JavaCallArguments* args, Thread* thread);
|
||||
|
||||
class os: AllStatic {
|
||||
private:
|
||||
public:
|
||||
enum { page_sizes_max = 9 }; // Size of _page_sizes array (8 plus a sentinel)
|
||||
|
||||
private:
|
||||
static OSThread* _starting_thread;
|
||||
static address _polling_page;
|
||||
static volatile int32_t * _mem_serialize_page;
|
||||
static uintptr_t _serialize_page_mask;
|
||||
public:
|
||||
static size_t _page_sizes[page_sizes_max];
|
||||
|
||||
private:
|
||||
static void init_page_sizes(size_t default_page_size) {
|
||||
_page_sizes[0] = default_page_size;
|
||||
_page_sizes[1] = 0; // sentinel
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
static void init(void); // Called before command line parsing
|
||||
static jint init_2(void); // Called after command line parsing
|
||||
static void init(void); // Called before command line parsing
|
||||
static jint init_2(void); // Called after command line parsing
|
||||
|
||||
// File names are case-insensitive on windows only
|
||||
// Override me as needed
|
||||
@ -141,6 +143,7 @@ class os: AllStatic {
|
||||
static int processor_count() {
|
||||
return _processor_count;
|
||||
}
|
||||
static void set_processor_count(int count) { _processor_count = count; }
|
||||
|
||||
// Returns the number of CPUs this process is currently allowed to run on.
|
||||
// Note that on some OSes this can change dynamically.
|
||||
|
@ -884,6 +884,22 @@ static void call_initializeSystemClass(TRAPS) {
|
||||
vmSymbolHandles::void_method_signature(), CHECK);
|
||||
}
|
||||
|
||||
#ifdef KERNEL
|
||||
static void set_jkernel_boot_classloader_hook(TRAPS) {
|
||||
klassOop k = SystemDictionary::sun_jkernel_DownloadManager_klass();
|
||||
instanceKlassHandle klass (THREAD, k);
|
||||
|
||||
if (k == NULL) {
|
||||
// sun.jkernel.DownloadManager may not present in the JDK; just return
|
||||
return;
|
||||
}
|
||||
|
||||
JavaValue result(T_VOID);
|
||||
JavaCalls::call_static(&result, klass, vmSymbolHandles::setBootClassLoaderHook_name(),
|
||||
vmSymbolHandles::void_method_signature(), CHECK);
|
||||
}
|
||||
#endif // KERNEL
|
||||
|
||||
static void reset_vm_info_property(TRAPS) {
|
||||
// the vm info string
|
||||
ResourceMark rm(THREAD);
|
||||
@ -975,6 +991,7 @@ void JavaThread::allocate_threadObj(Handle thread_group, char* thread_name, bool
|
||||
// uniquely named instances should derive from this.
|
||||
NamedThread::NamedThread() : Thread() {
|
||||
_name = NULL;
|
||||
_processed_thread = NULL;
|
||||
}
|
||||
|
||||
NamedThread::~NamedThread() {
|
||||
@ -2317,6 +2334,27 @@ void JavaThread::gc_prologue() {
|
||||
frames_do(frame_gc_prologue);
|
||||
}
|
||||
|
||||
// If the caller is a NamedThread, then remember, in the current scope,
|
||||
// the given JavaThread in its _processed_thread field.
|
||||
class RememberProcessedThread: public StackObj {
|
||||
NamedThread* _cur_thr;
|
||||
public:
|
||||
RememberProcessedThread(JavaThread* jthr) {
|
||||
Thread* thread = Thread::current();
|
||||
if (thread->is_Named_thread()) {
|
||||
_cur_thr = (NamedThread *)thread;
|
||||
_cur_thr->set_processed_thread(jthr);
|
||||
} else {
|
||||
_cur_thr = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
~RememberProcessedThread() {
|
||||
if (_cur_thr) {
|
||||
_cur_thr->set_processed_thread(NULL);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void JavaThread::oops_do(OopClosure* f, CodeBlobClosure* cf) {
|
||||
// Flush deferred store-barriers, if any, associated with
|
||||
@ -2333,6 +2371,8 @@ void JavaThread::oops_do(OopClosure* f, CodeBlobClosure* cf) {
|
||||
(has_last_Java_frame() && java_call_counter() > 0), "wrong java_sp info!");
|
||||
|
||||
if (has_last_Java_frame()) {
|
||||
// Record JavaThread to GC thread
|
||||
RememberProcessedThread rpt(this);
|
||||
|
||||
// Traverse the privileged stack
|
||||
if (_privileged_stack_top != NULL) {
|
||||
@ -3102,6 +3142,12 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
|
||||
vm_exit_during_initialization(Handle(THREAD, PENDING_EXCEPTION));
|
||||
}
|
||||
|
||||
#ifdef KERNEL
|
||||
if (JDK_Version::is_gte_jdk17x_version()) {
|
||||
set_jkernel_boot_classloader_hook(THREAD);
|
||||
}
|
||||
#endif // KERNEL
|
||||
|
||||
#ifndef SERIALGC
|
||||
// Support for ConcurrentMarkSweep. This should be cleaned up
|
||||
// and better encapsulated. The ugly nested if test would go away
|
||||
|
@ -48,7 +48,12 @@ class IdealGraphPrinter;
|
||||
|
||||
// Class hierarchy
|
||||
// - Thread
|
||||
// - VMThread
|
||||
// - NamedThread
|
||||
// - VMThread
|
||||
// - ConcurrentGCThread
|
||||
// - WorkerThread
|
||||
// - GangWorker
|
||||
// - GCTaskThread
|
||||
// - JavaThread
|
||||
// - WatcherThread
|
||||
|
||||
@ -249,6 +254,7 @@ class Thread: public ThreadShadow {
|
||||
virtual bool is_GC_task_thread() const { return false; }
|
||||
virtual bool is_Watcher_thread() const { return false; }
|
||||
virtual bool is_ConcurrentGC_thread() const { return false; }
|
||||
virtual bool is_Named_thread() const { return false; }
|
||||
|
||||
virtual char* name() const { return (char*)"Unknown thread"; }
|
||||
|
||||
@ -568,12 +574,18 @@ class NamedThread: public Thread {
|
||||
};
|
||||
private:
|
||||
char* _name;
|
||||
// log JavaThread being processed by oops_do
|
||||
JavaThread* _processed_thread;
|
||||
|
||||
public:
|
||||
NamedThread();
|
||||
~NamedThread();
|
||||
// May only be called once per thread.
|
||||
void set_name(const char* format, ...);
|
||||
virtual bool is_Named_thread() const { return true; }
|
||||
virtual char* name() const { return _name == NULL ? (char*)"Unknown Thread" : _name; }
|
||||
JavaThread *processed_thread() { return _processed_thread; }
|
||||
void set_processed_thread(JavaThread *thread) { _processed_thread = thread; }
|
||||
};
|
||||
|
||||
// Worker threads are named and have an id of an assigned work.
|
||||
|
@ -666,6 +666,7 @@ static inline uint64_t cast_uint64_t(size_t x)
|
||||
nonstatic_field(Thread, _current_pending_monitor_is_from_java, bool) \
|
||||
nonstatic_field(Thread, _current_waiting_monitor, ObjectMonitor*) \
|
||||
nonstatic_field(NamedThread, _name, char*) \
|
||||
nonstatic_field(NamedThread, _processed_thread, JavaThread*) \
|
||||
nonstatic_field(JavaThread, _next, JavaThread*) \
|
||||
nonstatic_field(JavaThread, _threadObj, oop) \
|
||||
nonstatic_field(JavaThread, _anchor, JavaFrameAnchor) \
|
||||
|
@ -204,8 +204,8 @@ void VMThread::create() {
|
||||
}
|
||||
|
||||
|
||||
VMThread::VMThread() : Thread() {
|
||||
// nothing to do
|
||||
VMThread::VMThread() : NamedThread() {
|
||||
set_name("VM Thread");
|
||||
}
|
||||
|
||||
void VMThread::destroy() {
|
||||
|
@ -83,7 +83,7 @@ class VMOperationQueue : public CHeapObj {
|
||||
// like scavenge, garbage_collect etc.
|
||||
//
|
||||
|
||||
class VMThread: public Thread {
|
||||
class VMThread: public NamedThread {
|
||||
private:
|
||||
static ThreadPriority _current_priority;
|
||||
|
||||
@ -101,8 +101,6 @@ class VMThread: public Thread {
|
||||
bool is_VM_thread() const { return true; }
|
||||
bool is_GC_thread() const { return true; }
|
||||
|
||||
char* name() const { return (char*)"VM Thread"; }
|
||||
|
||||
// The ever running loop for the VMThread
|
||||
void loop();
|
||||
|
||||
|
@ -502,6 +502,23 @@ void VMError::report(outputStream* st) {
|
||||
#endif // ZERO
|
||||
}
|
||||
|
||||
STEP(135, "(printing target Java thread stack)" )
|
||||
|
||||
// printing Java thread stack trace if it is involved in GC crash
|
||||
if (_verbose && (_thread->is_Named_thread())) {
|
||||
JavaThread* jt = ((NamedThread *)_thread)->processed_thread();
|
||||
if (jt != NULL) {
|
||||
st->print_cr("JavaThread " PTR_FORMAT " (nid = " UINTX_FORMAT ") was being processed", jt, jt->osthread()->thread_id());
|
||||
if (jt->has_last_Java_frame()) {
|
||||
st->print_cr("Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)");
|
||||
for(StackFrameStream sfs(jt); !sfs.is_done(); sfs.next()) {
|
||||
sfs.current()->print_on_error(st, buf, sizeof(buf), true);
|
||||
st->cr();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
STEP(140, "(printing VM operation)" )
|
||||
|
||||
if (_verbose && _thread && _thread->is_VM_thread()) {
|
||||
|
Loading…
Reference in New Issue
Block a user