Mercurial > hg > release > icedtea6-1.9
changeset 2041:254982e12a63
Merge
author | Andrew John Hughes <ahughes@redhat.com> |
---|---|
date | Fri, 12 Mar 2010 02:56:31 +0000 |
parents | e5632a8b43c9 (current diff) 39180582f106 (diff) |
children | c20d20b055cc |
files | ChangeLog Makefile.am |
diffstat | 21 files changed, 559 insertions(+), 268 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Fri Mar 12 02:52:23 2010 +0000 +++ b/ChangeLog Fri Mar 12 02:56:31 2010 +0000 @@ -5,6 +5,192 @@ http://hg.openjdk.java.net/jdk6/jdk6/jdk/rev/178f954e1fd1 * Makefile.am: Drop above patch. +2010-03-11 Gary Benson <gbenson@redhat.com> + + * ports/hotspot/src/share/vm/shark/sharkCompiler.cpp + (SharkCompiler::compile_method): Catch typeflow failures more + generally. + * ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp + (SharkTopLevelBlock::scan_for_traps): New trap. + (SharkTopLevelBlock::do_call): Add assertion to check the above. + (SharkTopLevelBlock::static_subtype_check): Deal with unloaded + object_klass. + +2010-03-11 Gary Benson <gbenson@redhat.com> + + * ports/hotspot/src/os_cpu/linux_zero/vm/globals_linux_zero.hpp + (ThreadStackSize): Increased by 512kb on 32-bit platforms so as + to work on systems with 64kb page sizes. + +2010-03-11 Gary Benson <gbenson@redhat.com> + + * ports/hotspot/src/cpu/zero/vm/shark_globals_zero.hpp: + Whitespace changes. + +2010-03-10 Andrew John Hughes <ahughes@redhat.com> + + * Makefile.am: + Add new patch. + * patches/openjdk/6822370-reentrantreadwritelock.patch: + Backported patch from HotSpot 16 to fix bug S6822370; + threads blocked when the ReentrantReadWriteLock is + not held. + +2010-03-10 Andrew John Hughes <ahughes@redhat.com> + + * Makefile.am: + (JAXP): Removed, redundant. + (ABS_SOURCE_DIRS): No source code in $(abs_top_srcdir)/rt. + (ICEDTEA_BOOTSTRAP_CLASSES): Unneeded. + (HOTSPOT_MAKE_DIR): Redundant since switch to hs14. + (stamps/ports.stamp): Remove use of HOTSPOT_MAKE_DIR. + +2010-03-10 Hideki Yamane <henrich@debian.or.jp> + + * patches/icedtea-fonts.patch: Use Sazanami instead of Kochi for + Japanese font on Debian/Ubuntu. + +2010-03-09 Deepak Bhole <dbhole@redhat.com> + + * plugin/icedteanp/IcedTeaNPPlugin.cc + (consume_message): Handle the new reference field and send it back when + sending proxy and cookie info. + (get_proxy_info): Update response format for proxy information to make it + consistent with new Gecko API. + * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc + (newMessageOnBus): Account for the new reference field and send it back + with the response. + (sendWindow): Same. + (eval): Same. + (call): Same. + (sendString): Same. + (setMember): Same. Also, move responding code from _setMember to setMember + for consistency and to solve a rather bad race condition that affected + reliability. + (sendMember): Account for the new reference field and send it back + with the response. + (queue_processor): Move array index slots based on new positions with + reference ids. + (_setMember): Move response code back to setMember. + * plugin/icedteanp/java/sun/applet/GetMemberPluginCallRequest.java + (GetMemberPluginCallRequest): Change method signature to receive a + reference identifier. + (parse): Update to handle new reference identifiers. + (serviceable): Removed method. serviceable() is now implemented in the + parent class and uses unique reference identifiers. + * plugin/icedteanp/java/sun/applet/GetWindowPluginCallRequest.java + (GetWindowPluginCallRequest): Change method signature to receive a + reference identifier. + (serviceable): Removed method. serviceable() is now implemented in the + parent class and uses unique reference identifiers. + * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: Added new + statis private requestIdentityCounter variable that provides unique + reference numbers. + (createPanel): Send a dummy (0) reference number with initialization msg. + (getRequestIdentifier): New method. Returns a unique reference number + and then increments requestIdentityCounter in a thread-safe manner. + (getWindow): Send reference id to getPluginCallRequest. + (getMember): Same. + (setMember): Same. + (setSlot): Same. + (getSlot): Same. + (eval): Same. + (removeMember): Same. + (call): Same. + (requestPluginCookieInfo): Same. + (requestPluginProxyInfo): Same. + (JavaScriptFinalize): Same. + (javascriptToString): Same. + * plugin/icedteanp/java/sun/applet/PluginCallRequest.java: Track reference + numbers instead of the 'return string' marker. + (serviceable): Change from abstract to implemented method, returns weather + or not the given message is servicable by this request based on unique + reference numbers. + * plugin/icedteanp/java/sun/applet/PluginCallRequestFactory.java + (getPluginCallRequest): Pass reference numbers to concrete class + constructors. + * plugin/icedteanp/java/sun/applet/PluginCookieInfoRequest.java + (PluginCookieInfoRequest): Receive new reference number and pass it to + parent. + (parseString): Update to handle new reference numbers in message. + (serviceable): Removed method. serviceable() is now implemented in the + parent class and uses unique reference identifiers. + * plugin/icedteanp/java/sun/applet/PluginProxyInfoRequest.java + (PluginProxyInfoRequest): Receive new reference number and pass it to + parent. + (parseReturn): Update to handle new reference numbers in message. Also, + parse based on new format returned by the C++ side. + (serviceable): Removed method. serviceable() is now implemented in the + parent class and uses unique reference identifiers. + * plugin/icedteanp/java/sun/applet/PluginStreamHandler.java + (handleMessage): Pass reference to finishCallRequest(). + * plugin/icedteanp/java/sun/applet/VoidPluginCallRequest.java + (VoidPluginCallRequest): Update to handle new reference numbers in + message. + * plugin/tests/LiveConnect/common.js + (testAll): Check eval tests checkbox before calling doTest(); + +2010-03-08 Andrew John Hughes <ahughes@redhat.com> + + * Makefile.am: + (IT_CFLAGS): General CFLAGS for all IcedTea + C builds, which includes ARCHFLAG. + (ICEDTEA_ENV): Set ZERO_ARCHFLAG from ARCHFLAG. + (ICEDTEA_ECJ_ENV): Likewise. + (stamps/native-ecj.stamp): Use IT_CFLAGS. + ($(PULSE_JAVA_NATIVE_BUILDDIR)/%.o): Use IT_CFLAGS. + * acinclude.m4: + (IT_SET_ARCH_SETTINGS): Renamed from SET_ARCH_DIRS. + Use host_cpu rather than host. Add sections for + sparc and s390x. Set ARCHFLAG to m64 for x86_64, + sparc64, powerpc64 and s390x, m31 for s390 and m32 + for i?86, powerpc and sparc. + (ENABLE_ZERO_BUILD): Remove setting of ZERO_ARCHFLAG, + generalised to ARCHFLAG. + * configure.ac: Call renamed IT_SET_ARCH_SETTINGS. + +2010-03-08 Andrew John Hughes <ahughes@redhat.com> + + * Makefile.am: + (stamps/extract-ecj.stamp): Revert previous change + to copying. Patch will break hard links. + +2010-03-08 Matthias Klose <doko@ubuntu.com> + + * Makefile.am (ICEDTEA_ECJ_PATCHES): Add DISTRIBUTION_ECJ_PATCHES. + +2010-03-08 Andrew John Hughes <ahughes@redhat.com> + + * Makefile.am: + (SHARE): Use openjdk-ecj for building bootstrap classes. + (SOLARIS): Likewise. + (LANGTOOLS): Likewise. + (CORBA): Likewise. + (JAXP): Likewise. + (OPENJDK_ECJ_TREE): Target for obtaining a patched OpenJDK-ecj tree. + (stamps/extract-ecj.stamp): Copy, don't link. + (stamps/icedtea-boot.stamp): Use OPENJDK_ECJ_TREE rather than + patch-ecj.stamp. + (rt-source-files.txt): Depend on $(OPENJDK_ECJ_TREE) ensuring + ecj patched versions are used. + +2010-03-04 Andrew John Hughes <ahughes@redhat.com> + + * Makefile.am: + Don't unset ICEDTEA_BUILD_TARGET if unused. + (hotspot): Support the WITH_OPENJDK configuration. + Pass ICEDTEA_BUILD_TARGET=hotspot to make rather + than having an additional hotspot-helper target. + Don't remove bootstrap-directory-symlink-ecj.stamp + as this just forces the bootstrap classes to be rebuilt. + (hotspot-helper): Removed. + +2010-03-04 Xerxes RĂ„nby <xerxes@zafena.se> + + * ports/hotspot/src/share/vm/shark/sharkCompiler.cpp + (sharkCompiler::sharkCompiler): Move mattr define to make its memory + valid in the scope where it are used by the args vector. + 2010-03-02 Andrew John Hughes <ahughes@redhat.com> * patches/openjdk/6928623-verbose-langtools.patch:
--- a/Makefile.am Fri Mar 12 02:52:23 2010 +0000 +++ b/Makefile.am Fri Mar 12 02:56:31 2010 +0000 @@ -56,20 +56,19 @@ # Source directories -SHARE = openjdk/jdk/src/share/classes -SOLARIS = openjdk/jdk/src/solaris/classes -LANGTOOLS = openjdk/langtools/src/share/classes -JAXP = openjdk/jaxp/src/share/classes -CORBA = openjdk/corba/src/share/classes +SHARE = openjdk-ecj/jdk/src/share/classes +SOLARIS = openjdk-ecj/jdk/src/solaris/classes +LANGTOOLS = openjdk-ecj/langtools/src/share/classes +CORBA = openjdk-ecj/corba/src/share/classes # FIXME (netx): NetX source directories go here OPENJDK_SOURCEPATH_DIRS = \ $(SHARE):$(SOLARIS):$(LANGTOOLS):$(CORBA) -ABS_SOURCE_DIRS = $(abs_top_builddir)/generated:$(abs_top_builddir)/rt:$(abs_top_srcdir)/rt:$(LIVECONNECT_SRCS) +ABS_SOURCE_DIRS = $(abs_top_builddir)/generated:$(abs_top_srcdir)/rt:$(LIVECONNECT_SRCS) -# Sources copied from OpenJDK. +# Sources used from OpenJDK. ICEDTEA_BOOTSTRAP_DIRS = \ $(SHARE)/com/sun/jdi \ $(SHARE)/com/sun/jmx/snmp/agent \ @@ -90,11 +89,10 @@ $(LANGTOOLS)/com/sun/mirror \ $(LANGTOOLS)/com/sun/tools/apt -ICEDTEA_BOOTSTRAP_CLASSES = \ - $(SHARE)/java/nio/StringCharBuffer.java \ - $(SHARE)/sun/misc/Unsafe.java +# FIXME (javac): Settings for javac go here -# FIXME (javac): Settings for javac go here +# Flags +IT_CFLAGS=$(CFLAGS) $(ARCHFLAG) # Conditional defintions @@ -177,9 +175,6 @@ PULSE_JAVA_CLEAN_TARGET = clean-pulse-java endif -# FIXME (HotSpot): no longer needed -HOTSPOT_MAKE_DIR = make - # FIXME: This should not depend on bootstrapping # but on whether MEMORY_LIMIT is accepted # as an argument to javac @@ -193,7 +188,6 @@ ICEDTEA_BUILD_TARGET=j2se_only ICEDTEA_DEBUG_BUILD_TARGET=j2se_fastdebug_only else - ICEDTEA_BUILD_TARGET= ICEDTEA_DEBUG_BUILD_TARGET=debug_build endif @@ -214,6 +208,11 @@ # and any overlays is available in $(abs_top_builddir)/openjdk OPENJDK_TREE = stamps/overlay.stamp +# Target to ensure a patched OpenJDK bootstrap tree containing +# Zero & Shark, any other overlays and the bootstrapping patches +# is available in $(abs_top_builddir)/openjdk-ecj +OPENJDK_ECJ_TREE = stamps/patch-ecj.stamp + # Sources list PLUGIN_TEST_SRCS = $(abs_top_srcdir)/plugin/tests/LiveConnect/*.java @@ -339,6 +338,8 @@ endif if ENABLE_XRENDER +# match against $(abs_top_srcdir) and then remove it again, +# because stamps/patch.stamp target will also add it XRENDER_PATCHES = patches/xrender/icedtea-???.patch XRENDER_PATCH_FILES = $(sort $(wildcard $(abs_top_srcdir)/$(XRENDER_PATCHES))) ICEDTEA_PATCHES += $(sort $(subst $(abs_top_srcdir)/,,$(XRENDER_PATCH_FILES))) @@ -374,6 +375,8 @@ patches/ecj/icedtea-jaxws-getdtdtype.patch endif +ICEDTEA_ECJ_PATCHES += $(DISTRIBUTION_ECJ_PATCHES) + # OpenJDK build environment. if ZERO_BUILD ICEDTEA_ZERO_BUILD = true @@ -424,7 +427,7 @@ ARCH_DATA_MODEL="$(ZERO_BITSPERWORD)" \ ZERO_ENDIANNESS="$(ZERO_ENDIANNESS)" \ ZERO_ARCHDEF="$(ZERO_ARCHDEF)" \ - ZERO_ARCHFLAG="$(ZERO_ARCHFLAG)" \ + ZERO_ARCHFLAG="$(ARCHFLAG)" \ LIBFFI_CFLAGS="$(LIBFFI_CFLAGS)" \ LIBFFI_LIBS="$(LIBFFI_LIBS)" \ LLVM_CFLAGS="$(LLVM_CFLAGS)" \ @@ -514,7 +517,7 @@ ARCH_DATA_MODEL="$(ZERO_BITSPERWORD)" \ ZERO_ENDIANNESS="$(ZERO_ENDIANNESS)" \ ZERO_ARCHDEF="$(ZERO_ARCHDEF)" \ - ZERO_ARCHFLAG="$(ZERO_ARCHFLAG)" \ + ZERO_ARCHFLAG="$(ARCHFLAG)" \ LIBFFI_CFLAGS="$(LIBFFI_CFLAGS)" \ LIBFFI_LIBS="$(LIBFFI_LIBS)" \ LLVM_CFLAGS="$(LLVM_CFLAGS)" \ @@ -974,7 +977,7 @@ $(abs_top_srcdir)/ports/hotspot/tools \ $(abs_top_srcdir)/ports/hotspot/src/*cpu/* \ $(abs_top_srcdir)/ports/hotspot/src/share/vm/*; do \ - link=$$(dirname $$target | sed 's/^.*ports/openjdk/'|sed "s#hotspot/build#hotspot/$(HOTSPOT_MAKE_DIR)#"); \ + link=$$(dirname $$target | sed 's/^.*ports/openjdk/'); \ cp -rv $$target $$link; \ done if ! test "x$(WITH_CACAO)" = "xno" ; then \ @@ -1213,8 +1216,8 @@ stamps/native-ecj.stamp: mkdir -p stamps ; \ - if test "x${GCJ}" != "xno"; then \ - ${GCJ} ${CFLAGS} -Wl,-Bsymbolic -findirect-dispatch -o native-ecj \ + if test "x$(GCJ)" != "xno"; then \ + $(GCJ) $(IT_CFLAGS) -Wl,-Bsymbolic -findirect-dispatch -o native-ecj \ --main=org.eclipse.jdt.internal.compiler.batch.Main ${ECJ_JAR} ; \ fi ; \ touch stamps/native-ecj.stamp @@ -1541,7 +1544,7 @@ # =================== stamps/icedtea-ecj.stamp: stamps/bootstrap-directory-symlink-ecj.stamp \ - stamps/plugs.stamp stamps/patch-ecj.stamp stamps/cacao.stamp \ + stamps/plugs.stamp $(OPENJDK_ECJ_TREE) stamps/cacao.stamp \ stamps/rewrite-rhino.stamp $(ARCH_PREFIX) $(MAKE) \ $(ICEDTEA_ENV_ECJ) \ @@ -1553,21 +1556,25 @@ touch stamps/icedtea-ecj.stamp hotspot: - rm -f stamps/bootstrap-directory-symlink-ecj.stamp +if WITH_OPENJDK + rm -f stamps/icedtea.stamp + rm -f stamps/icedtea-against-icedtea.stamp + $(ARCH_PREFIX) $(MAKE) ICEDTEA_BUILD_TARGET=hotspot icedtea-against-icedtea + mkdir -p \ + $(BUILD_OUTPUT_DIR)/j2sdk-image/jre/lib/$(INSTALL_ARCH_DIR)/server + cp $(BUILD_OUTPUT_DIR)/$(SERVER_DIR)/libjvm.so \ + $(BUILD_OUTPUT_DIR)/j2sdk-image/jre/lib/$(INSTALL_ARCH_DIR)/server + @echo "Hotspot is served:" $(BUILD_OUTPUT_DIR)/j2sdk-image +else rm -f stamps/icedtea-ecj.stamp rm -f stamps/icedtea-against-ecj.stamp - $(ARCH_PREFIX) $(MAKE) hotspot-helper + $(ARCH_PREFIX) $(MAKE) ICEDTEA_BUILD_TARGET=hotspot icedtea-against-ecj mkdir -p \ $(ECJ_BUILD_OUTPUT_DIR)/j2sdk-image/jre/lib/$(INSTALL_ARCH_DIR)/server cp $(ECJ_BUILD_OUTPUT_DIR)/$(SERVER_DIR)/libjvm.so \ $(ECJ_BUILD_OUTPUT_DIR)/j2sdk-image/jre/lib/$(INSTALL_ARCH_DIR)/server @echo "Hotspot is served:" $(ECJ_BUILD_OUTPUT_DIR)/j2sdk-image - -hotspot-helper: stamps/bootstrap-directory-symlink-ecj.stamp \ - stamps/plugs.stamp stamps/patch-ecj.stamp - $(ARCH_PREFIX) $(MAKE) \ - $(ICEDTEA_ENV_ECJ) \ - -C openjdk-ecj/ hotspot +endif clean-icedtea-ecj: stamps/extract-ecj.stamp rm -f stamps/icedtea-ecj.stamp @@ -1703,7 +1710,7 @@ if ENABLE_PULSE_JAVA $(PULSE_JAVA_NATIVE_BUILDDIR)/%.o: $(PULSE_JAVA_NATIVE_SRCDIR)/%.c stamps/pulse-java-headers.stamp - $(CC) $(CFLAGS) -fPIC -I$(ICEDTEA_BOOT_DIR)/include/linux -I$(ICEDTEA_BOOT_DIR)/include \ + $(CC) $(IT_CFLAGS) -fPIC -I$(ICEDTEA_BOOT_DIR)/include/linux -I$(ICEDTEA_BOOT_DIR)/include \ -I$(PULSE_JAVA_NATIVE_BUILDDIR) -o $@ -c $< $(PULSE_JAVA_NATIVE_BUILDDIR)/libpulse-java.so: $(PULSE_JAVA_NATIVE_OBJECTS) @@ -2115,7 +2122,7 @@ # Support classes for non-OpenJDK bootstraps # rt.jar additional class files. -rt-source-files.txt: $(OPENJDK_TREE) +rt-source-files.txt: $(OPENJDK_ECJ_TREE) find $(abs_top_srcdir)/rt $(abs_top_builddir)/rt $(LIVECONNECT_SRCS) -name '*.java' \ | sort -u > $@ for dir in $(ICEDTEA_BOOTSTRAP_DIRS) ; \
--- a/acinclude.m4 Fri Mar 12 02:52:23 2010 +0000 +++ b/acinclude.m4 Fri Mar 12 02:56:31 2010 +0000 @@ -1,68 +1,89 @@ -AC_DEFUN([SET_ARCH_DIRS], +AC_DEFUN([IT_SET_ARCH_SETTINGS], [ - case "${host}" in - x86_64-*-*) + case "${host_cpu}" in + x86_64) BUILD_ARCH_DIR=amd64 INSTALL_ARCH_DIR=amd64 JRE_ARCH_DIR=amd64 CROSS_TARGET_ARCH=x86_64 + ARCHFLAG="-m64" ;; - i?86-*-*) + i?86) BUILD_ARCH_DIR=i586 INSTALL_ARCH_DIR=i386 JRE_ARCH_DIR=i386 ARCH_PREFIX=${LINUX32} CROSS_TARGET_ARCH=i386 + ARCHFLAG="-m32" ;; - alpha*-*-*) + alpha*) BUILD_ARCH_DIR=alpha INSTALL_ARCH_DIR=alpha JRE_ARCH_DIR=alpha CROSS_TARGET_ARCH=alpha ;; - arm*-*-*) + arm*) BUILD_ARCH_DIR=arm INSTALL_ARCH_DIR=arm JRE_ARCH_DIR=arm CROSS_TARGET_ARCH=arm ;; - mips-*-*) + mips) BUILD_ARCH_DIR=mips INSTALL_ARCH_DIR=mips JRE_ARCH_DIR=mips CROSS_TARGET_ARCH=mips ;; - mipsel-*-*) + mipsel) BUILD_ARCH_DIR=mipsel INSTALL_ARCH_DIR=mipsel JRE_ARCH_DIR=mipsel CROSS_TARGET_ARCH=mipsel ;; - powerpc-*-*) + powerpc) BUILD_ARCH_DIR=ppc INSTALL_ARCH_DIR=ppc JRE_ARCH_DIR=ppc ARCH_PREFIX=${LINUX32} CROSS_TARGET_ARCH=ppc + ARCHFLAG="-m32" ;; - powerpc64-*-*) + powerpc64) BUILD_ARCH_DIR=ppc64 INSTALL_ARCH_DIR=ppc64 JRE_ARCH_DIR=ppc64 CROSS_TARGET_ARCH=ppc64 + ARCHFLAG="-m64" ;; - sparc64-*-*) + sparc) + BUILD_ARCH_DIR=sparc + INSTALL_ARCH_DIR=sparc + JRE_ARCH_DIR=sparc + CROSS_TARGET_ARCH=sparc + ARCH_PREFIX=${LINUX32} + ARCHFLAG="-m32" + ;; + sparc64) BUILD_ARCH_DIR=sparcv9 INSTALL_ARCH_DIR=sparcv9 JRE_ARCH_DIR=sparc64 CROSS_TARGET_ARCH=sparc64 + ARCHFLAG="-m64" ;; - s390-*-*) + s390) BUILD_ARCH_DIR=s390 INSTALL_ARCH_DIR=s390 JRE_ARCH_DIR=s390 ARCH_PREFIX=${LINUX32} CROSS_TARGET_ARCH=s390 + ARCHFLAG="-m31" + ;; + s390x) + BUILD_ARCH_DIR=s390x + INSTALL_ARCH_DIR=s390x + JRE_ARCH_DIR=s390x + CROSS_TARGET_ARCH=s390x + ARCHFLAG="-m64" ;; *) BUILD_ARCH_DIR=`uname -m` @@ -76,6 +97,7 @@ AC_SUBST(JRE_ARCH_DIR) AC_SUBST(ARCH_PREFIX) AC_SUBST(CROSS_TARGET_ARCH) + AC_SUBST(ARCHFLAG) ]) AC_DEFUN([SET_OS_DIRS], @@ -764,23 +786,10 @@ *) ZERO_ARCHDEF=`echo ${ZERO_LIBARCH} | tr a-z A-Z` esac - dnl multilib machines need telling which mode to build for - case "${ZERO_LIBARCH}" in - i386|ppc|sparc) - ZERO_ARCHFLAG="-m32" - ;; - s390) - ZERO_ARCHFLAG="-m31" - ;; - amd64|ppc64|s390x|sparc64) - ZERO_ARCHFLAG="-m64" - ;; - esac AC_SUBST(ZERO_LIBARCH) AC_SUBST(ZERO_BITSPERWORD) AC_SUBST(ZERO_ENDIANNESS) AC_SUBST(ZERO_ARCHDEF) - AC_SUBST(ZERO_ARCHFLAG) AC_CONFIG_FILES([jvm.cfg]) AC_CONFIG_FILES([ergo.c]) ])
--- a/configure.ac Fri Mar 12 02:52:23 2010 +0000 +++ b/configure.ac Fri Mar 12 02:56:31 2010 +0000 @@ -154,7 +154,7 @@ IT_GET_PKGVERSION IT_GET_LSB_DATA -SET_ARCH_DIRS +IT_SET_ARCH_SETTINGS SET_OS_DIRS if test "${with_openjdk}" = true
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/openjdk/6822370-reentrantreadwritelock.patch Fri Mar 12 02:56:31 2010 +0000 @@ -0,0 +1,65 @@ +# HG changeset patch +# User dholmes +# Date 1259712624 18000 +# Node ID 49bd3de668dc35ba7cff876422d114a91f35bbd2 +# Parent b6e6e189e1db90e044c24be709bc581e2356a910 +6822370: ReentrantReadWriteLock: threads hung when there are no threads holding onto the lock (Netra x4450) +Summary: This day one bug is caused by missing memory barriers in various Parker::park() paths that can result in lost wakeups and hangs. +Reviewed-by: dice, acorn + +diff -r b6e6e189e1db -r 49bd3de668dc src/os/linux/vm/os_linux.cpp +--- openjdk.orig/hotspot/src/os/linux/vm/os_linux.cpp Wed Nov 25 19:15:17 2009 -0800 ++++ openjdk/hotspot/src/os/linux/vm/os_linux.cpp Tue Dec 01 19:10:24 2009 -0500 +@@ -4656,6 +4656,7 @@ + // Return immediately if a permit is available. + if (_counter > 0) { + _counter = 0 ; ++ OrderAccess::fence(); + return ; + } + +@@ -4698,6 +4699,7 @@ + _counter = 0; + status = pthread_mutex_unlock(_mutex); + assert (status == 0, "invariant") ; ++ OrderAccess::fence(); + return; + } + +@@ -4737,7 +4739,7 @@ + if (jt->handle_special_suspend_equivalent_condition()) { + jt->java_suspend_self(); + } +- ++ OrderAccess::fence(); + } + + void Parker::unpark() { +diff -r b6e6e189e1db -r 49bd3de668dc src/os/solaris/vm/os_solaris.cpp +--- openjdk.orig/hotspot/src/os/solaris/vm/os_solaris.cpp Wed Nov 25 19:15:17 2009 -0800 ++++ openjdk/hotspot/src/os/solaris/vm/os_solaris.cpp Tue Dec 01 19:10:24 2009 -0500 +@@ -5803,6 +5803,7 @@ + // Return immediately if a permit is available. + if (_counter > 0) { + _counter = 0 ; ++ OrderAccess::fence(); + return ; + } + +@@ -5846,6 +5847,7 @@ + _counter = 0; + status = os::Solaris::mutex_unlock(_mutex); + assert (status == 0, "invariant") ; ++ OrderAccess::fence(); + return; + } + +@@ -5891,7 +5893,7 @@ + if (jt->handle_special_suspend_equivalent_condition()) { + jt->java_suspend_self(); + } +- ++ OrderAccess::fence(); + } + + void Parker::unpark() {
--- a/plugin/icedteanp/IcedTeaNPPlugin.cc Fri Mar 12 02:52:23 2010 +0000 +++ b/plugin/icedteanp/IcedTeaNPPlugin.cc Fri Mar 12 02:56:31 2010 +0000 @@ -1222,15 +1222,15 @@ else if (g_str_has_prefix (message, "plugin ")) { // internal plugin related message - gchar** parts = g_strsplit (message, " ", 3); + gchar** parts = g_strsplit (message, " ", 5); if (g_str_has_prefix(parts[1], "PluginProxyInfo")) { gchar* proxy; uint32_t len; - gchar* decoded_url = (gchar*) calloc(strlen(parts[2]) + 1, sizeof(gchar)); - IcedTeaPluginUtilities::decodeURL(parts[2], &decoded_url); - PLUGIN_DEBUG_4ARG("parts[0]=%s, parts[1]=%s, parts[2]=%s -- decoded_url=%s\n", parts[0], parts[1], parts[2], decoded_url); + gchar* decoded_url = (gchar*) calloc(strlen(parts[4]) + 1, sizeof(gchar)); + IcedTeaPluginUtilities::decodeURL(parts[4], &decoded_url); + PLUGIN_DEBUG_5ARG("parts[0]=%s, parts[1]=%s, reference, parts[3]=%s, parts[4]=%s -- decoded_url=%s\n", parts[0], parts[1], parts[3], parts[4], decoded_url); gchar* proxy_info; @@ -1238,7 +1238,7 @@ proxy = (char*) malloc(sizeof(char)*2048); #endif - proxy_info = g_strconcat ("plugin PluginProxyInfo ", NULL); + proxy_info = g_strconcat ("plugin PluginProxyInfo reference ", parts[3], " ", NULL); if (get_proxy_info(decoded_url, &proxy, &len) == NPERR_NO_ERROR) { proxy_info = g_strconcat (proxy_info, proxy, NULL); @@ -1259,10 +1259,10 @@ } else if (g_str_has_prefix(parts[1], "PluginCookieInfo")) { - gchar* decoded_url = (gchar*) calloc(strlen(parts[2])+1, sizeof(gchar)); - IcedTeaPluginUtilities::decodeURL(parts[2], &decoded_url); + gchar* decoded_url = (gchar*) calloc(strlen(parts[4])+1, sizeof(gchar)); + IcedTeaPluginUtilities::decodeURL(parts[4], &decoded_url); - gchar* cookie_info = g_strconcat ("plugin PluginCookieInfo ", parts[2], " ", NULL); + gchar* cookie_info = g_strconcat ("plugin PluginCookieInfo reference ", parts[3], " ", NULL); gchar* cookie_string; uint32_t len; if (get_cookie_info(decoded_url, &cookie_string, &len) == NPERR_NO_ERROR) @@ -1358,7 +1358,14 @@ nsDependentCString ipAddr; record->GetNextAddrAsString(ipAddr); - snprintf(*proxy, sizeof(char)*1024, "%s://%s:%d", ptype.get(), ipAddr.get(), pport); + if (!strcmp(ptype.get(), "http")) + { + snprintf(*proxy, sizeof(char)*1024, "%s %s:%d", "PROXY", ipAddr.get(), pport); + } else + { + snprintf(*proxy, sizeof(char)*1024, "%s %s:%d", "SOCKS", ipAddr.get(), pport); + } + *len = strlen(*proxy); PLUGIN_DEBUG_2ARG("Proxy info for %s: %s\n", siteAddr, *proxy);
--- a/plugin/icedteanp/IcedTeaPluginRequestProcessor.cc Fri Mar 12 02:52:23 2010 +0000 +++ b/plugin/icedteanp/IcedTeaPluginRequestProcessor.cc Fri Mar 12 02:56:31 2010 +0000 @@ -103,7 +103,7 @@ IcedTeaPluginUtilities::printStringVector("PluginRequestProcessor::newMessageOnBus:", message_parts); type = message_parts->at(0); - command = message_parts->at(2); + command = message_parts->at(4); if (type == "instance") { @@ -122,7 +122,7 @@ command == "Eval") { - // Update queue synchronously + // Update queue synchronously pthread_mutex_lock(&message_queue_mutex); message_queue->push_back(message_parts); pthread_mutex_unlock(&message_queue_mutex); @@ -152,6 +152,7 @@ { std::string type; std::string command; + int reference; std::string response = std::string(); std::string window_ptr_str = std::string(); NPVariant* variant = new NPVariant(); @@ -160,7 +161,8 @@ type = message_parts->at(0); id = atoi(message_parts->at(1).c_str()); - command = message_parts->at(2); + reference = atoi(message_parts->at(3).c_str()); + command = message_parts->at(4); NPP instance; get_instance_from_id(id, instance); @@ -173,7 +175,7 @@ IcedTeaPluginUtilities::JSIDToString(variant, &window_ptr_str); // We need the context 0 for backwards compatibility with the Java side - IcedTeaPluginUtilities::constructMessagePrefix(0, &response); + IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response); response += " JavaScriptGetWindow "; response += window_ptr_str; @@ -201,14 +203,16 @@ NPP instance; std::string script; NPVariant result; + int reference; std::string response = std::string(); std::string return_type = std::string(); int id; - window_ptr = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(message_parts->at(3)); + reference = atoi(message_parts->at(3).c_str()); + window_ptr = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(message_parts->at(5)); instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(window_ptr); - java_result = request_processor.getString(message_parts->at(4)); + java_result = request_processor.getString(message_parts->at(6)); CHECK_JAVA_RESULT(java_result); script.append(*(java_result->return_string)); @@ -240,7 +244,7 @@ std::string result_variant_jniid = std::string(); createJavaObjectFromVariant(instance, *result_variant, &result_variant_jniid); - IcedTeaPluginUtilities::constructMessagePrefix(0, &response); + IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response); response += " JavaScriptEval "; response += result_variant_jniid; @@ -262,6 +266,7 @@ NPP instance; std::string window_ptr_str; NPVariant* window_ptr; + int reference; std::string window_function_name; std::vector<NPVariant> args = std::vector<NPVariant>(); std::vector<std::string> arg_ids = std::vector<std::string>(); @@ -270,20 +275,22 @@ JavaRequestProcessor java_request = JavaRequestProcessor(); JavaResultData* java_result; + reference = atoi(message_parts->at(3).c_str()); + // window - window_ptr_str = message_parts->at(3); + window_ptr_str = message_parts->at(5); window_ptr = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(window_ptr_str); // instance instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(window_ptr); // function name - java_result = java_request.getString(message_parts->at(4)); + java_result = java_request.getString(message_parts->at(6)); CHECK_JAVA_RESULT(java_result); window_function_name.append(*(java_result->return_string)); // arguments - for (int i=5; i < message_parts->size(); i++) + for (int i=7; i < message_parts->size(); i++) { arg_ids.push_back(message_parts->at(i)); } @@ -342,7 +349,7 @@ result_variant_jniid = "0"; } - IcedTeaPluginUtilities::constructMessagePrefix(0, &response); + IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response); response += " JavaScriptCall "; response += result_variant_jniid; @@ -364,9 +371,11 @@ NPVariant* variant; JavaRequestProcessor java_request = JavaRequestProcessor(); JavaResultData* java_result; + int reference; std::string response = std::string(); - variant_ptr = message_parts->at(3); + reference = atoi(message_parts->at(3).c_str()); + variant_ptr = message_parts->at(5); variant = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(variant_ptr); AsyncCallThreadData thread_data = AsyncCallThreadData(); @@ -393,7 +402,7 @@ #endif // We need the context 0 for backwards compatibility with the Java side - IcedTeaPluginUtilities::constructMessagePrefix(0, &response); + IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response); response += " JavaScriptToString "; response += thread_data.result; @@ -418,6 +427,8 @@ { std::string propertyNameID; std::string value = std::string(); + std::string response = std::string(); + int reference; NPP instance; NPVariant* member; @@ -428,24 +439,26 @@ IcedTeaPluginUtilities::printStringVector("PluginRequestProcessor::_setMember - ", message_parts); - member = (NPVariant*) (IcedTeaPluginUtilities::stringToJSID(message_parts->at(3))); - propertyNameID = message_parts->at(4); + reference = atoi(message_parts->at(3).c_str()); + + member = (NPVariant*) (IcedTeaPluginUtilities::stringToJSID(message_parts->at(5))); + propertyNameID = message_parts->at(6); - if (message_parts->at(5) == "literalreturn") + if (message_parts->at(7) == "literalreturn") { - value.append(message_parts->at(5)); + value.append(message_parts->at(7)); value.append(" "); - value.append(message_parts->at(6)); + value.append(message_parts->at(8)); } else { - value.append(message_parts->at(5)); + value.append(message_parts->at(7)); } instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(member); - if (message_parts->at(2) == "SetSlot") + if (message_parts->at(4) == "SetSlot") { - property_identifier = browser_functions.getintidentifier(atoi(message_parts->at(4).c_str())); + property_identifier = browser_functions.getintidentifier(atoi(message_parts->at(6).c_str())); } else { java_result = java_request.getString(propertyNameID); @@ -485,6 +498,10 @@ } #endif + IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response); + response.append(" JavaScriptSetMember "); + plugin_to_java_bus->post(response.c_str()); + cleanup: delete message_parts; @@ -514,6 +531,7 @@ JavaResultData* java_result; NPVariant* parent_ptr; + //int reference; std::string member_id = std::string(); std::string jsObjectClassID = std::string(); std::string jsObjectConstructorID = std::string(); @@ -523,18 +541,20 @@ int method_id; int instance_id; - long reference; + int reference; // debug printout of parent thread data IcedTeaPluginUtilities::printStringVector("PluginRequestProcessor::getMember:", message_parts); + reference = atoi(message_parts->at(3).c_str()); + // store info in local variables for easy access instance_id = atoi(message_parts->at(1).c_str()); - parent_ptr = (NPVariant*) (IcedTeaPluginUtilities::stringToJSID(message_parts->at(3))); - member_id += message_parts->at(4); + parent_ptr = (NPVariant*) (IcedTeaPluginUtilities::stringToJSID(message_parts->at(5))); + member_id += message_parts->at(6); /** Request data from Java if necessary **/ - if (message_parts->at(2) == "GetSlot") + if (message_parts->at(4) == "GetSlot") { member_identifier = browser_functions.getintidentifier(atoi(member_id.c_str())); } else @@ -552,10 +572,6 @@ member_identifier = browser_functions.getstringidentifier(java_result->return_string->c_str()); } - /** Make an internal request for the main thread to handle, to get the member pointer **/ - - reference = internal_req_ref_counter++; - AsyncCallThreadData thread_data = AsyncCallThreadData(); thread_data.result_ready = false; thread_data.parameters = std::vector<void*>(); @@ -584,8 +600,6 @@ PLUGIN_DEBUG_1ARG("Member PTR after internal request: %s\n", thread_data.result.c_str()); - internal_req_ref_counter--; - java_result = java_request.findClass(0, "netscape.javascript.JSObject"); // the result we want is in result_string (assuming there was no error) @@ -631,7 +645,7 @@ } - IcedTeaPluginUtilities::constructMessagePrefix(0, &response); + IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response); if (message_parts->at(2) == "GetSlot") { response.append(" JavaScriptGetMember "); @@ -674,7 +688,7 @@ if (message_parts) { - command = message_parts->at(2); + command = message_parts->at(4); if (command == "GetMember") { @@ -739,7 +753,6 @@ _setMember(void* data) { std::string* value; - std::string response = std::string(); NPP instance; NPVariant value_variant = NPVariant(); @@ -758,12 +771,7 @@ ((AsyncCallThreadData*) data)->call_successful = browser_functions.setproperty(instance, member, *property, &value_variant); - IcedTeaPluginUtilities::constructMessagePrefix(0, &response); - response.append(" JavaScriptSetMember "); - plugin_to_java_bus->post(response.c_str()); - ((AsyncCallThreadData*) data)->result_ready = true; - } void
--- a/plugin/icedteanp/java/sun/applet/GetMemberPluginCallRequest.java Fri Mar 12 02:52:23 2010 +0000 +++ b/plugin/icedteanp/java/sun/applet/GetMemberPluginCallRequest.java Fri Mar 12 02:56:31 2010 +0000 @@ -41,35 +41,21 @@ public class GetMemberPluginCallRequest extends PluginCallRequest { Object object = null; - public GetMemberPluginCallRequest(String message, String returnString) { - super(message, returnString); - PluginDebug.debug ("GetMEMBerPLUGINCAlL " + message + " " + returnString); + public GetMemberPluginCallRequest(String message, Long reference) { + super(message, reference); + PluginDebug.debug ("GetMemberPluginCall " + message); } public void parseReturn(String message) { - PluginDebug.debug ("GetMEMBerparseReturn GOT: " + message); + PluginDebug.debug ("GetMemberParseReturn GOT: " + message); String[] args = message.split(" "); // FIXME: Is it even possible to distinguish between null and void // here? - if (args[1] != "null" && args[1] != "void") - object = AppletSecurityContextManager.getSecurityContext(0).getObject(Integer.parseInt(args[1])); + if (args[3] != "null" && args[3] != "void") + object = AppletSecurityContextManager.getSecurityContext(0).getObject(Integer.parseInt(args[3])); setDone(true); } - /** - * Returns whether the given message is serviceable by this object - * - * @param message The message to service - * @return boolean indicating if message is serviceable - */ - public boolean serviceable(String message) { - return message.contains("JavaScriptCall") || - message.contains("JavaScriptEval") || - message.contains("JavaScriptGetMember") || - message.contains("JavaScriptGetSlot") || - message.contains("JavaScriptToString"); - } - public Object getObject() { return this.object; }
--- a/plugin/icedteanp/java/sun/applet/GetWindowPluginCallRequest.java Fri Mar 12 02:52:23 2010 +0000 +++ b/plugin/icedteanp/java/sun/applet/GetWindowPluginCallRequest.java Fri Mar 12 02:56:31 2010 +0000 @@ -46,28 +46,18 @@ // FIXME: look into int vs long JavaScript internal values. long internal; - public GetWindowPluginCallRequest(String message, String returnString) { - super(message, returnString); + public GetWindowPluginCallRequest(String message, Long reference) { + super(message, reference); } public void parseReturn(String message) { - PluginDebug.debug ("GetWINDOWparseReturn GOT: " + message); + PluginDebug.debug ("GetWindowParseReturn GOT: " + message); String[] args = message.split(" "); // FIXME: add thread ID to messages to support multiple // threads using the netscape.javascript package. - internal = Long.parseLong(args[1]); + internal = Long.parseLong(args[3]); setDone(true); } - - /** - * Returns whether the given message is serviceable by this object - * - * @param message The message to service - * @return boolean indicating if message is serviceable - */ - public boolean serviceable(String message) { - return message.contains("JavaScriptGetWindow"); - } public Long getObject() { return this.internal;
--- a/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java Fri Mar 12 02:52:23 2010 +0000 +++ b/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java Fri Mar 12 02:56:31 2010 +0000 @@ -209,7 +209,7 @@ } PluginDebug.debug("Applet " + a.getClass() + " initialized"); - streamhandler.write("instance " + identifier + " initialized"); + streamhandler.write("instance " + identifier + " reference 0 initialized"); AppletSecurityContextManager.getSecurityContext(0).associateSrc(((NetxPanel) panel).getAppletClassLoader(), doc); AppletSecurityContextManager.getSecurityContext(0).associateInstance(identifier, ((NetxPanel) panel).getAppletClassLoader()); @@ -371,6 +371,8 @@ public static final int APPLET_TIMEOUT = 60000; + private static Long requestIdentityCounter = 0L; + /** * Null constructor to allow instantiation via newInstance() */ @@ -952,11 +954,30 @@ } } + /** + * Returns an incremental number (unique identifier) for a message. + * If identifier hits Long.MAX_VALUE it loops back starting at 0. + * + * @return A unique Long identifier for the request + */ + private static Long getRequestIdentifier() { + synchronized (requestIdentityCounter) { + + if (requestIdentityCounter == Long.MAX_VALUE) + requestIdentityCounter = 0L; + + return requestIdentityCounter++; + } + } + public long getWindow() { PluginDebug.debug ("STARTING getWindow"); + Long reference = getRequestIdentifier(); + PluginCallRequest request = requestFactory.getPluginCallRequest("window", - "instance " + identifier + " " + "GetWindow", - "JavaScriptGetWindow"); + "instance " + identifier + " reference " + + + reference + " " + "GetWindow", reference); + PluginDebug.debug ("STARTING postCallRequest"); streamhandler.postCallRequest(request); PluginDebug.debug ("STARTING postCallRequest done"); @@ -983,11 +1004,13 @@ { AppletSecurityContextManager.getSecurityContext(0).store(name); int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name); + Long reference = getRequestIdentifier(); // Prefix with dummy instance for convenience. PluginCallRequest request = requestFactory.getPluginCallRequest("member", - "instance " + 0 + " GetMember " + internal + " " + nameID, - "JavaScriptGetMember"); + "instance " + 0 + " reference " + reference + " GetMember " + + internal + " " + nameID, reference); + streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { @@ -1010,6 +1033,7 @@ System.err.println("Setting to class " + value.getClass() + ":" + value.getClass().isPrimitive()); AppletSecurityContextManager.getSecurityContext(0).store(name); int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name); + Long reference = getRequestIdentifier(); // work on a copy of value, as we don't want to be manipulating // complex objects @@ -1041,8 +1065,9 @@ // Prefix with dummy instance for convenience. PluginCallRequest request = requestFactory.getPluginCallRequest("void", - "instance " + 0 + " SetMember " + internal + " " + nameID + " " + valueToSetTo, - "JavaScriptSetMember"); + "instance " + 0 + " reference " + reference + " SetMember " + + internal + " " + nameID + " " + valueToSetTo, reference); + streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { @@ -1064,6 +1089,7 @@ // FIXME: handle long index as well. public static void setSlot(long internal, int index, Object value) { AppletSecurityContextManager.getSecurityContext(0).store(value); + Long reference = getRequestIdentifier(); // work on a copy of value, as we don't want to be manipulating // complex objects @@ -1095,8 +1121,9 @@ // Prefix with dummy instance for convenience. PluginCallRequest request = requestFactory.getPluginCallRequest("void", - "instance " + 0 + " SetSlot " + internal + " " + index + " " + valueToSetTo, - "JavaScriptSetSlot"); + "instance " + 0 + " reference " + reference + " SetSlot " + + internal + " " + index + " " + valueToSetTo, reference); + streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { @@ -1116,10 +1143,12 @@ public static Object getSlot(long internal, int index) { + Long reference = getRequestIdentifier(); + // Prefix with dummy instance for convenience. PluginCallRequest request = requestFactory.getPluginCallRequest("member", - "instance " + 0 + " GetSlot " + internal + " " + index, - "JavaScriptGetSlot"); + "instance " + 0 + " reference " + reference + " GetSlot " + + internal + " " + index, reference); streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { @@ -1142,11 +1171,13 @@ { AppletSecurityContextManager.getSecurityContext(0).store(s); int stringID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(s); + Long reference = getRequestIdentifier(); + // Prefix with dummy instance for convenience. // FIXME: rename GetMemberPluginCallRequest ObjectPluginCallRequest. PluginCallRequest request = requestFactory.getPluginCallRequest("member", - "instance " + 0 + " Eval " + internal + " " + stringID, - "JavaScriptEval"); + "instance " + 0 + " reference " + reference + " Eval " + + internal + " " + stringID, reference); streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { @@ -1168,11 +1199,13 @@ public static void removeMember (long internal, String name) { AppletSecurityContextManager.getSecurityContext(0).store(name); int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name); + Long reference = getRequestIdentifier(); // Prefix with dummy instance for convenience. PluginCallRequest request = requestFactory.getPluginCallRequest("void", - "instance " + 0 + " RemoveMember " + internal + " " + nameID, - "JavaScriptRemoveMember"); + "instance " + 0 + " reference " + reference + " RemoveMember " + + internal + " " + nameID, reference); + streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { @@ -1197,6 +1230,7 @@ // FIXME: convenience method for this long line. AppletSecurityContextManager.getSecurityContext(0).store(name); int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name); + Long reference = getRequestIdentifier(); String argIDs = ""; for (Object arg : args) @@ -1208,8 +1242,9 @@ // Prefix with dummy instance for convenience. PluginCallRequest request = requestFactory.getPluginCallRequest("member", - "instance " + 0 + " Call " + internal + " " + nameID + " " + argIDs, - "JavaScriptCall"); + "instance " + 0 + " reference " + reference + " Call " + + internal + " " + nameID + " " + argIDs, reference); + streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { @@ -1231,12 +1266,14 @@ public static Object requestPluginCookieInfo(URI uri) { PluginCallRequest request; + Long reference = getRequestIdentifier(); + try { String encodedURI = UrlUtil.encode(uri.toString(), "UTF-8"); request = requestFactory.getPluginCallRequest("cookieinfo", - "plugin PluginCookieInfo " + encodedURI, - "plugin PluginCookieInfo " + encodedURI); + "plugin PluginCookieInfo " + "reference " + reference + + " " + encodedURI, reference); } catch (UnsupportedEncodingException e) { @@ -1265,6 +1302,7 @@ public static Object requestPluginProxyInfo(URI uri) { String requestURI = null; + Long reference = getRequestIdentifier(); try { @@ -1285,8 +1323,9 @@ } PluginCallRequest request = requestFactory.getPluginCallRequest("proxyinfo", - "plugin PluginProxyInfo " + requestURI, - "plugin"); + "plugin PluginProxyInfo reference " + reference + " " + + requestURI, reference); + streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { @@ -1307,10 +1346,13 @@ public static void JavaScriptFinalize(long internal) { + Long reference = getRequestIdentifier(); + // Prefix with dummy instance for convenience. PluginCallRequest request = requestFactory.getPluginCallRequest("void", - "instance " + 0 + " Finalize " + internal, - "JavaScriptFinalize"); + "instance " + 0 + " reference " + reference + " Finalize " + + internal, reference); + streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { @@ -1330,10 +1372,13 @@ public static String javascriptToString(long internal) { + Long reference = getRequestIdentifier(); + // Prefix with dummy instance for convenience. PluginCallRequest request = requestFactory.getPluginCallRequest("member", - "instance " + 0 + " ToString " + internal, - "JavaScriptToString"); + "instance " + 0 + " reference " + reference + " ToString " + + internal, reference); + streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try {
--- a/plugin/icedteanp/java/sun/applet/PluginCallRequest.java Fri Mar 12 02:52:23 2010 +0000 +++ b/plugin/icedteanp/java/sun/applet/PluginCallRequest.java Fri Mar 12 02:56:31 2010 +0000 @@ -44,23 +44,19 @@ // PluginCallRequest. public abstract class PluginCallRequest { String message; - String returnString; + Long reference; PluginCallRequest next; boolean done = false; - public PluginCallRequest(String message, String returnString) { + public PluginCallRequest(String message, Long reference) { this.message = message; - this.returnString = returnString; + this.reference = reference; } public String getMessage() { return this.message; } - public String getReturnString() { - return this.returnString; - } - public boolean isDone() { return this.done; } @@ -77,9 +73,17 @@ return this.next; } - public abstract void parseReturn(String message); + /** + * Returns whether the given message is serviceable by this object + * + * @param message The message to service + * @return boolean indicating if message is serviceable + */ + public boolean serviceable(String message) { + return message.contains("reference " + reference); + } - public abstract boolean serviceable(String message); + public abstract void parseReturn(String message); public abstract Object getObject(); }
--- a/plugin/icedteanp/java/sun/applet/PluginCallRequestFactory.java Fri Mar 12 02:52:23 2010 +0000 +++ b/plugin/icedteanp/java/sun/applet/PluginCallRequestFactory.java Fri Mar 12 02:56:31 2010 +0000 @@ -40,19 +40,19 @@ public class PluginCallRequestFactory { - - public PluginCallRequest getPluginCallRequest(String id, String message, String returnString) { + + public PluginCallRequest getPluginCallRequest(String id, String message, Long reference) { if (id == "member") { - return new GetMemberPluginCallRequest(message, returnString); + return new GetMemberPluginCallRequest(message, reference); } else if (id == "void") { - return new VoidPluginCallRequest(message, returnString); + return new VoidPluginCallRequest(message, reference); } else if (id == "window") { - return new GetWindowPluginCallRequest(message, returnString); + return new GetWindowPluginCallRequest(message, reference); } else if (id == "proxyinfo") { - return new PluginProxyInfoRequest(message, returnString); + return new PluginProxyInfoRequest(message, reference); } else if (id == "cookieinfo") { - return new PluginCookieInfoRequest(message, returnString); + return new PluginCookieInfoRequest(message, reference); } else { throw new RuntimeException ("Unknown plugin call request type requested from factory"); }
--- a/plugin/icedteanp/java/sun/applet/PluginCookieInfoRequest.java Fri Mar 12 02:52:23 2010 +0000 +++ b/plugin/icedteanp/java/sun/applet/PluginCookieInfoRequest.java Fri Mar 12 02:56:31 2010 +0000 @@ -46,10 +46,10 @@ String cookieString = new String(); - public PluginCookieInfoRequest(String message, String returnString) { - super(message, returnString); + public PluginCookieInfoRequest(String message, Long reference) { + super(message, reference); } - + public void parseReturn(String cookieInfo) { // try to parse the proxy information. If things go wrong, do nothing .. @@ -57,25 +57,17 @@ PluginDebug.debug ("PluginCookieInfoRequest GOT: " + cookieInfo); - // Skip the first 3 components. We are guaranteed 3 components, + // Skip the first 5 components. We are guaranteed 5 components, // so no index -1 to worry about cookieInfo = cookieInfo.substring(cookieInfo.indexOf(' ')+1); cookieInfo = cookieInfo.substring(cookieInfo.indexOf(' ')+1); + cookieInfo = cookieInfo.substring(cookieInfo.indexOf(' ')+1); + cookieInfo = cookieInfo.substring(cookieInfo.indexOf(' ')+1); cookieString = cookieInfo.substring(cookieInfo.indexOf(' ')+1); setDone(true); } - /** - * Returns whether the given message is serviceable by this object - * - * @param message The message to service - * @return boolean indicating if message is serviceable - */ - public boolean serviceable(String message) { - return message.startsWith(returnString); - } - public String getObject() { return this.cookieString; }
--- a/plugin/icedteanp/java/sun/applet/PluginProxyInfoRequest.java Fri Mar 12 02:52:23 2010 +0000 +++ b/plugin/icedteanp/java/sun/applet/PluginProxyInfoRequest.java Fri Mar 12 02:56:31 2010 +0000 @@ -48,8 +48,8 @@ URI internal = null; - public PluginProxyInfoRequest(String message, String returnString) { - super(message, returnString); + public PluginProxyInfoRequest(String message, Long reference) { + super(message, reference); } public void parseReturn(String proxyInfo) { @@ -61,24 +61,18 @@ String[] messageComponents = proxyInfo.split(" "); try { - internal = new URI(messageComponents[2], null, messageComponents[3], Integer.parseInt(messageComponents[4]), null, null, null); + String protocol = messageComponents[4].equals("PROXY") ? "http" : "socks"; + String host = messageComponents[5].split(":")[0]; + int port = Integer.parseInt(messageComponents[5].split(":")[1]); + + internal = new URI(protocol, null, host, port, null, null, null); } catch (Exception e) { - // do nothing + e.printStackTrace(); } setDone(true); } - /** - * Returns whether the given message is serviceable by this object - * - * @param message The message to service - * @return boolean indicating if message is serviceable - */ - public boolean serviceable(String message) { - return message.startsWith("plugin PluginProxyInfo"); - } - public URI getObject() { return this.internal; }
--- a/plugin/icedteanp/java/sun/applet/PluginStreamHandler.java Fri Mar 12 02:52:23 2010 +0000 +++ b/plugin/icedteanp/java/sun/applet/PluginStreamHandler.java Fri Mar 12 02:56:31 2010 +0000 @@ -260,7 +260,7 @@ privileges = privs.split(","); nextIndex += 2; } - + // rest for (int i=nextIndex; i < msgComponents.length; i++) { rest += msgComponents[i]; @@ -284,7 +284,7 @@ || rest.contains("JavaScriptFinalize") || rest.contains("JavaScriptToString")) { - finishCallRequest(rest); + finishCallRequest("reference " + reference + " " + rest); return; }
--- a/plugin/icedteanp/java/sun/applet/VoidPluginCallRequest.java Fri Mar 12 02:52:23 2010 +0000 +++ b/plugin/icedteanp/java/sun/applet/VoidPluginCallRequest.java Fri Mar 12 02:56:31 2010 +0000 @@ -39,28 +39,15 @@ public class VoidPluginCallRequest extends PluginCallRequest { - public VoidPluginCallRequest(String message, String returnString) { - super(message, returnString); - PluginDebug.debug ("VoidPLUGINCAlL " + message + " " + returnString); + public VoidPluginCallRequest(String message, Long reference) { + super(message, reference); + PluginDebug.debug ("VoidPluginCall " + message); } public void parseReturn(String message) { setDone(true); } - /** - * Returns whether the given message is serviceable by this object - * - * @param message The message to service - * @return boolean indicating if message is serviceable - */ - public boolean serviceable(String message) { - return message.contains("JavaScriptFinalize") || - message.contains("JavaScriptRemoveMember") || - message.contains("JavaScriptSetMember") || - message.contains("JavaScriptSetSlot"); - } - public Object getObject() { return null; }
--- a/plugin/tests/LiveConnect/common.js Fri Mar 12 02:52:23 2010 +0000 +++ b/plugin/tests/LiveConnect/common.js Fri Mar 12 02:56:31 2010 +0000 @@ -66,7 +66,7 @@ errored = 0; document.getElementById("results").innerHTML = ""; updateTotals(); - + try { if (document.getElementById("testForm").jsjget.checked == 1) getMemberTests(); @@ -116,6 +116,7 @@ document.getElementById("testForm").jjsset.checked = 1; document.getElementById("testForm").jjcparam.checked = 1; document.getElementById("testForm").jjcrt.checked = 1; + document.getElementById("testForm").jjeval.checked = 1; doTest(); }
--- a/ports/hotspot/src/cpu/zero/vm/shark_globals_zero.hpp Fri Mar 12 02:52:23 2010 +0000 +++ b/ports/hotspot/src/cpu/zero/vm/shark_globals_zero.hpp Fri Mar 12 02:56:31 2010 +0000 @@ -26,36 +26,36 @@ // Set the default values for platform dependent flags used by the // Shark compiler. See globals.hpp for details of what they do. -define_pd_global(bool, BackgroundCompilation, true ); -define_pd_global(bool, UseTLAB, true ); -define_pd_global(bool, ResizeTLAB, true ); -define_pd_global(bool, InlineIntrinsics, false); -define_pd_global(bool, PreferInterpreterNativeStubs, false); -define_pd_global(bool, ProfileTraps, false); -define_pd_global(bool, UseOnStackReplacement, true ); -define_pd_global(bool, TieredCompilation, false); +define_pd_global(bool, BackgroundCompilation, true ); +define_pd_global(bool, UseTLAB, true ); +define_pd_global(bool, ResizeTLAB, true ); +define_pd_global(bool, InlineIntrinsics, false); +define_pd_global(bool, PreferInterpreterNativeStubs, false); +define_pd_global(bool, ProfileTraps, false); +define_pd_global(bool, UseOnStackReplacement, true ); +define_pd_global(bool, TieredCompilation, false); -define_pd_global(intx, CompileThreshold, 1500); -define_pd_global(intx, Tier2CompileThreshold, 1500); -define_pd_global(intx, Tier3CompileThreshold, 2500); -define_pd_global(intx, Tier4CompileThreshold, 4500); +define_pd_global(intx, CompileThreshold, 1500); +define_pd_global(intx, Tier2CompileThreshold, 1500); +define_pd_global(intx, Tier3CompileThreshold, 2500); +define_pd_global(intx, Tier4CompileThreshold, 4500); -define_pd_global(intx, BackEdgeThreshold, 100000); -define_pd_global(intx, Tier2BackEdgeThreshold, 100000); -define_pd_global(intx, Tier3BackEdgeThreshold, 100000); -define_pd_global(intx, Tier4BackEdgeThreshold, 100000); +define_pd_global(intx, BackEdgeThreshold, 100000); +define_pd_global(intx, Tier2BackEdgeThreshold, 100000); +define_pd_global(intx, Tier3BackEdgeThreshold, 100000); +define_pd_global(intx, Tier4BackEdgeThreshold, 100000); -define_pd_global(intx, OnStackReplacePercentage, 933 ); -define_pd_global(intx, FreqInlineSize, 325 ); -define_pd_global(intx, NewRatio, 12 ); -define_pd_global(intx, NewSizeThreadIncrease, 4*K ); -define_pd_global(intx, InitialCodeCacheSize, 160*K); -define_pd_global(intx, ReservedCodeCacheSize, 32*M ); -define_pd_global(bool, ProfileInterpreter, false); -define_pd_global(intx, CodeCacheExpansionSize, 32*K ); -define_pd_global(uintx, CodeCacheMinBlockLength, 1 ); -define_pd_global(uintx, PermSize, 12*M ); -define_pd_global(uintx, MaxPermSize, 64*M ); -define_pd_global(bool, NeverActAsServerClassMachine, true ); -define_pd_global(uintx, DefaultMaxRAM, 1*G ); -define_pd_global(bool, CICompileOSR, true ); +define_pd_global(intx, OnStackReplacePercentage, 933 ); +define_pd_global(intx, FreqInlineSize, 325 ); +define_pd_global(intx, NewRatio, 12 ); +define_pd_global(intx, NewSizeThreadIncrease, 4*K ); +define_pd_global(intx, InitialCodeCacheSize, 160*K); +define_pd_global(intx, ReservedCodeCacheSize, 32*M ); +define_pd_global(bool, ProfileInterpreter, false); +define_pd_global(intx, CodeCacheExpansionSize, 32*K ); +define_pd_global(uintx, CodeCacheMinBlockLength, 1 ); +define_pd_global(uintx, PermSize, 12*M ); +define_pd_global(uintx, MaxPermSize, 64*M ); +define_pd_global(bool, NeverActAsServerClassMachine, true ); +define_pd_global(uintx, DefaultMaxRAM, 1*G ); +define_pd_global(bool, CICompileOSR, true );
--- a/ports/hotspot/src/os_cpu/linux_zero/vm/globals_linux_zero.hpp Fri Mar 12 02:52:23 2010 +0000 +++ b/ports/hotspot/src/os_cpu/linux_zero/vm/globals_linux_zero.hpp Fri Mar 12 02:56:31 2010 +0000 @@ -1,6 +1,6 @@ /* * Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved. - * Copyright 2007, 2008 Red Hat, Inc. + * Copyright 2007, 2008, 2010 Red Hat, Inc. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,11 +29,10 @@ // define_pd_global(bool, DontYieldALot, false); +define_pd_global(intx, ThreadStackSize, 1536); #ifdef _LP64 -define_pd_global(intx, ThreadStackSize, 1536); define_pd_global(intx, VMThreadStackSize, 1024); #else -define_pd_global(intx, ThreadStackSize, 1024); define_pd_global(intx, VMThreadStackSize, 512); #endif // _LP64 define_pd_global(intx, SurvivorRatio, 8);
--- a/ports/hotspot/src/share/vm/shark/sharkCompiler.cpp Fri Mar 12 02:52:23 2010 +0000 +++ b/ports/hotspot/src/share/vm/shark/sharkCompiler.cpp Fri Mar 12 02:56:31 2010 +0000 @@ -71,8 +71,8 @@ args.push_back(""); // program name args.push_back(cpu.c_str()); + std::string mattr("-mattr="); if(gotCpuFeatures){ - std::string mattr("-mattr="); for(StringMap<bool>::iterator I = Features.begin(), E = Features.end(); I != E; ++I){ if(I->second){ @@ -137,7 +137,7 @@ flow = target->get_flow_analysis(); else flow = target->get_osr_flow_analysis(entry_bci); - if (env->failing()) + if (flow->failing()) return; if (SharkPrintTypeflowOf != NULL) { if (!fnmatch(SharkPrintTypeflowOf, name, 0)) @@ -259,7 +259,7 @@ llvm::SetCurrentDebugType(""); llvm::DebugFlag = false; } -#endif +#endif // !NDEBUG #else // NB you need to patch LLVM with http://tinyurl.com/yf3baln for this std::vector<const char*> args;
--- a/ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp Fri Mar 12 02:52:23 2010 +0000 +++ b/ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp Fri Mar 12 02:56:31 2010 +0000 @@ -88,6 +88,18 @@ Deoptimization::Action_reinterpret), bci()); return; } + + if (bc() == Bytecodes::_invokevirtual) { + klass = ciEnv::get_instance_klass_for_declared_method_holder( + iter()->get_declared_method_holder()); + if (!klass->is_linked()) { + set_trap( + Deoptimization::make_trap_request( + Deoptimization::Reason_uninitialized, + Deoptimization::Action_reinterpret), bci()); + return; + } + } break; case Bytecodes::_new: @@ -1099,6 +1111,7 @@ Value *callee; if (call_is_virtual) { if (is_virtual) { + assert(klass->is_linked(), "scan_for_traps responsibility"); int vtable_index = call_method->resolve_vtable_index( target()->holder(), klass); assert(vtable_index >= 0, "should be"); @@ -1153,14 +1166,12 @@ // (GraphKit::static_subtype_check) it says that static // interface types cannot be trusted, and if opto can't // trust them then I assume we can't either. - if (!object_klass->is_interface()) { + if (object_klass->is_loaded() && !object_klass->is_interface()) { if (object_klass == check_klass) return true; - if (object_klass->is_loaded() && check_klass->is_loaded()) { - if (object_klass->is_subtype_of(check_klass)) - return true; - } + if (check_klass->is_loaded() && object_klass->is_subtype_of(check_klass)) + return true; } return false;