From koutheir at gmail.com Thu Oct 9 01:06:22 2014 From: koutheir at gmail.com (Koutheir Attouchi) Date: Thu, 09 Oct 2014 08:06:22 -0000 Subject: [vmkit-commits] [vmkit] r219389 - Creating an accurate memory monitor. Message-ID: <20141009075616.4933A2A6C028@llvm.org> Author: koutheir Date: Thu Oct 9 02:56:16 2014 New Revision: 219389 URL: http://llvm.org/viewvc/llvm-project?rev=219389&view=rev Log: Creating an accurate memory monitor. Added: vmkit/branches/memory-monitor/ (props changed) - copied from r219388, vmkit/trunk/ Propchange: vmkit/branches/memory-monitor/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 02:56:16 2014 @@ -0,0 +1,17 @@ +do-find +Makefile.config +Makefile.llvmbuild +replace.sh +config.log +*.tmp +Release +do-conf +configure.out +config.status +Makefile.common +Release-Asserts +Release+Asserts +Debug+Asserts +Debug +.project + Propchange: vmkit/branches/memory-monitor/ ------------------------------------------------------------------------------ --- svn:mergeinfo (added) +++ svn:mergeinfo Thu Oct 9 02:56:16 2014 @@ -0,0 +1,2 @@ +/vmkit/branches/precise:112509-120199 +/vmkit/branches/release_028:115466-116298 From koutheir at gmail.com Thu Oct 9 01:53:56 2014 From: koutheir at gmail.com (Koutheir Attouchi) Date: Thu, 09 Oct 2014 08:53:56 -0000 Subject: [vmkit-commits] [vmkit] r219392 - Creating an accurate memory monitor. Message-ID: <20141009084346.6A3912A6C028@llvm.org> Author: koutheir Date: Thu Oct 9 03:43:38 2014 New Revision: 219392 URL: http://llvm.org/viewvc/llvm-project?rev=219392&view=rev Log: Creating an accurate memory monitor. Added: vmkit/branches/memory-monitor/include/vmkit/StackEmbeddedList.h vmkit/branches/memory-monitor/include/vmkit/StackWalker.h vmkit/branches/memory-monitor/include/vmkit/config.h vmkit/branches/memory-monitor/lib/j3/VMCore/AccountingConfiguration.cpp vmkit/branches/memory-monitor/lib/j3/VMCore/AccountingConfiguration.h vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiBundleStateMonitor.cpp vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiBundleStateMonitor.h vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiTierManager.cpp vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiTierManager.h vmkit/branches/memory-monitor/lib/vmkit/CommonThread/StackEmbeddedList.cpp vmkit/branches/memory-monitor/osgi/ vmkit/branches/memory-monitor/osgi/j3mgr/ (with props) vmkit/branches/memory-monitor/osgi/j3mgr/bundle.manifest vmkit/branches/memory-monitor/osgi/j3mgr/src/ vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/ vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/J3Mgr.java vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/vm/ vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/vm/OSGi.java vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/vm/Tier.java vmkit/branches/memory-monitor/osgi/j3mgr/src/j3mgr/ vmkit/branches/memory-monitor/osgi/j3mgr/src/j3mgr/Activator.java vmkit/branches/memory-monitor/osgi/j3mgr/src/j3mgr/J3MgrImpl.java vmkit/branches/memory-monitor/osgi/knopflerfish.patch vmkit/branches/memory-monitor/osgi/tests/ vmkit/branches/memory-monitor/osgi/tests/TierConfigParser/ (with props) vmkit/branches/memory-monitor/osgi/tests/TierConfigParser/src/ vmkit/branches/memory-monitor/osgi/tests/TierConfigParser/src/j3mgr/ vmkit/branches/memory-monitor/osgi/tests/TierConfigParser/src/j3mgr/Main.java vmkit/branches/memory-monitor/osgi/tests/TierConfigParser/src/j3mgr/TierConfigParser.java vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/ (with props) vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/bundle.manifest vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/src/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/src/ijvm/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/src/ijvm/tests/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/src/ijvm/tests/A/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/src/ijvm/tests/A/A.java vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/src/ijvm/tests/A/Token.java vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/ (with props) vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/bundle.manifest vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/AImpl.java vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/Activator.java vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/InfiniteResurrecter.java vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/TokenImpl.java vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.BImpl/ (with props) vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.BImpl/bundle.manifest vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.BImpl/src/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.BImpl/src/ijvm/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.BImpl/src/ijvm/tests/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.BImpl/src/ijvm/tests/B/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.BImpl/src/ijvm/tests/B/B.java vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/Activator.java vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/BImpl.java vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.C/ (with props) vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.C/bundle.manifest vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.C/src/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.C/src/ijvm/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.C/src/ijvm/tests/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.C/src/ijvm/tests/C/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.C/src/ijvm/tests/C/C.java vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/ (with props) vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/bundle.manifest vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/src/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/src/ijvm/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/src/ijvm/tests/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/Activator.java vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/CImpl.java vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/ (with props) vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/bundle.manifest vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/D/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/D/D.java vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/Activator.java vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/DImpl.java vmkit/branches/memory-monitor/osgi/tests/tests.A/ (with props) vmkit/branches/memory-monitor/osgi/tests/tests.A/bundle.manifest vmkit/branches/memory-monitor/osgi/tests/tests.A/src/ vmkit/branches/memory-monitor/osgi/tests/tests.A/src/tests/ vmkit/branches/memory-monitor/osgi/tests/tests.A/src/tests/A/ vmkit/branches/memory-monitor/osgi/tests/tests.A/src/tests/A/A.java vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/ (with props) vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/bundle.manifest vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/ vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/ vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/AImpl/ vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/AImpl/AImpl.java vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/AImpl/Activator.java vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/AImpl/EImpl.java vmkit/branches/memory-monitor/osgi/tests/tests.B/ (with props) vmkit/branches/memory-monitor/osgi/tests/tests.B/bundle.manifest vmkit/branches/memory-monitor/osgi/tests/tests.B/src/ vmkit/branches/memory-monitor/osgi/tests/tests.B/src/tests/ vmkit/branches/memory-monitor/osgi/tests/tests.B/src/tests/B/ vmkit/branches/memory-monitor/osgi/tests/tests.B/src/tests/B/BEvent.java vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/ (with props) vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/bundle.manifest vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/src/ vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/src/tests/ vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/src/tests/BImpl/ vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/src/tests/BImpl/Activator.java vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/src/tests/BImpl/BImpl.java vmkit/branches/memory-monitor/osgi/tests/tests.E/ (with props) vmkit/branches/memory-monitor/osgi/tests/tests.E/bundle.manifest vmkit/branches/memory-monitor/osgi/tests/tests.E/src/ vmkit/branches/memory-monitor/osgi/tests/tests.E/src/tests/ vmkit/branches/memory-monitor/osgi/tests/tests.E/src/tests/E/ vmkit/branches/memory-monitor/osgi/tests/tests.E/src/tests/E/E.java vmkit/branches/memory-monitor/osgi/tests/tests.FImpl/ (with props) vmkit/branches/memory-monitor/osgi/tests/tests.FImpl/bundle.manifest vmkit/branches/memory-monitor/osgi/tests/tests.FImpl/src/ vmkit/branches/memory-monitor/osgi/tests/tests.FImpl/src/tests/ vmkit/branches/memory-monitor/osgi/tests/tests.FImpl/src/tests/FImpl/ vmkit/branches/memory-monitor/osgi/tests/tests.FImpl/src/tests/FImpl/Activator.java vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/ (with props) vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/bundle.manifest vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/src/ vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/src/tests/ vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/src/tests/GImpl/ vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/src/tests/GImpl/Activator.java vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/src/tests/GImpl/EImpl.java vmkit/branches/memory-monitor/tests/dacapo/2006-10-MR2/Makefile vmkit/branches/memory-monitor/tests/dacapo/Makefile.inc vmkit/branches/memory-monitor/tests/dacapo/compare-dacapo-synthesized-logs.plot vmkit/branches/memory-monitor/tests/dacapo/compare-dacapo-synthesized-logs.sh vmkit/branches/memory-monitor/tests/dacapo/jars/download.sh vmkit/branches/memory-monitor/tests/dacapo/synth-dacapo-logs.plot vmkit/branches/memory-monitor/tests/dacapo/synth-dacapo-logs.sh vmkit/branches/memory-monitor/tests/debug.txt vmkit/branches/memory-monitor/tests/full.xargs vmkit/branches/memory-monitor/tests/java-grant-all.policy vmkit/branches/memory-monitor/tests/min.xargs vmkit/branches/memory-monitor/tests/monitor-bench/ (with props) vmkit/branches/memory-monitor/tests/monitor-bench/Makefile vmkit/branches/memory-monitor/tests/monitor-bench/micro-benchmarks-MethodCallBenchmark.png (with props) vmkit/branches/memory-monitor/tests/monitor-bench/micro-benchmarks-SmallObjectsBenchmark.png (with props) vmkit/branches/memory-monitor/tests/monitor-bench/src/ vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/ vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/Benchmark.java vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/BenchmarkRunner.java vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/Main.java vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/MethodCallBenchmark.java vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/SmallObjectsBenchmark.java vmkit/branches/memory-monitor/tests/monitor-bench/synth.plot vmkit/branches/memory-monitor/tests/monitor-bench/synth.sh vmkit/branches/memory-monitor/tests/monitor.xargs vmkit/branches/memory-monitor/tests/monitoring.rules vmkit/branches/memory-monitor/tests/tier.description Removed: vmkit/branches/memory-monitor/include/vmkit/config.h.in.orig vmkit/branches/memory-monitor/lib/prepare-code/ vmkit/branches/memory-monitor/lib/vmkit/StaticGCPass/ vmkit/branches/memory-monitor/lib/vmkit/StaticGCPrinter/ vmkit/branches/memory-monitor/tests/AnnotationClassTest.java vmkit/branches/memory-monitor/tests/MyAnnotation.java vmkit/branches/memory-monitor/tests/benchmarks/ vmkit/branches/memory-monitor/tests/dacapo/2006-10/ vmkit/branches/memory-monitor/tests/dacapo/9.12-bach/ vmkit/branches/memory-monitor/tests/dacapo/tablet-incinerator-dacapo-2006-10-MR2.logs/ vmkit/branches/memory-monitor/tests/dacapo/tablet-j3-dacapo-2006-10-MR2.logs/ vmkit/branches/memory-monitor/tests/ijvm.isolate.IsolateManager/ vmkit/branches/memory-monitor/tests/ijvm.tests.A/ vmkit/branches/memory-monitor/tests/ijvm.tests.AImpl/ vmkit/branches/memory-monitor/tests/ijvm.tests.BImpl/ vmkit/branches/memory-monitor/tests/ijvm.tests.BundleMgmtStress/ vmkit/branches/memory-monitor/tests/ijvm.tests.C/ vmkit/branches/memory-monitor/tests/ijvm.tests.CImpl/ vmkit/branches/memory-monitor/tests/ijvm.tests.DImpl/ vmkit/branches/memory-monitor/tests/ijvm.tests.Runner/ vmkit/branches/memory-monitor/tests/ijvm.tests.StaticClient/ vmkit/branches/memory-monitor/tests/ijvm.tests.StaticExposer/ vmkit/branches/memory-monitor/tests/ijvm.tests.loopClient/ vmkit/branches/memory-monitor/tests/ijvm.tests.looper/ vmkit/branches/memory-monitor/tests/ijvm.tests.tier/ vmkit/branches/memory-monitor/tests/ijvm.tests.tierImpl/ vmkit/branches/memory-monitor/tools/precompiler/trainer/ vmkit/branches/memory-monitor/www/publis/ Modified: vmkit/branches/memory-monitor/ (props changed) vmkit/branches/memory-monitor/Makefile.rules vmkit/branches/memory-monitor/README.TXT vmkit/branches/memory-monitor/include/debug.h vmkit/branches/memory-monitor/include/j3/J3Intrinsics.h vmkit/branches/memory-monitor/include/vmkit/GC.h vmkit/branches/memory-monitor/include/vmkit/System.h vmkit/branches/memory-monitor/include/vmkit/Thread.h vmkit/branches/memory-monitor/include/vmkit/UTF8.h vmkit/branches/memory-monitor/include/vmkit/VirtualMachine.h vmkit/branches/memory-monitor/include/vmkit/config.h.in vmkit/branches/memory-monitor/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc vmkit/branches/memory-monitor/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp vmkit/branches/memory-monitor/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h vmkit/branches/memory-monitor/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp vmkit/branches/memory-monitor/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h vmkit/branches/memory-monitor/lib/j3/Compiler/J3Intrinsics.cpp vmkit/branches/memory-monitor/lib/j3/Compiler/JavaAOTCompiler.cpp vmkit/branches/memory-monitor/lib/j3/Compiler/JavaJIT.cpp vmkit/branches/memory-monitor/lib/j3/Compiler/JavaJIT.h vmkit/branches/memory-monitor/lib/j3/Compiler/JavaJITOpcodes.cpp vmkit/branches/memory-monitor/lib/j3/Compiler/LowerConstantCalls.cpp vmkit/branches/memory-monitor/lib/j3/LLVMRuntime/runtime-default.ll vmkit/branches/memory-monitor/lib/j3/VMCore/JavaClass.cpp vmkit/branches/memory-monitor/lib/j3/VMCore/JavaClass.h vmkit/branches/memory-monitor/lib/j3/VMCore/JavaMetaJIT.cpp vmkit/branches/memory-monitor/lib/j3/VMCore/JavaObject.cpp vmkit/branches/memory-monitor/lib/j3/VMCore/JavaObject.h vmkit/branches/memory-monitor/lib/j3/VMCore/JavaRuntimeJIT.cpp vmkit/branches/memory-monitor/lib/j3/VMCore/JavaString.cpp vmkit/branches/memory-monitor/lib/j3/VMCore/JavaString.h vmkit/branches/memory-monitor/lib/j3/VMCore/JavaThread.cpp vmkit/branches/memory-monitor/lib/j3/VMCore/JavaThread.h vmkit/branches/memory-monitor/lib/j3/VMCore/Jnjvm.cpp vmkit/branches/memory-monitor/lib/j3/VMCore/Jnjvm.h vmkit/branches/memory-monitor/lib/j3/VMCore/JnjvmClassLoader.cpp vmkit/branches/memory-monitor/lib/j3/VMCore/Precompiled.cpp vmkit/branches/memory-monitor/lib/vmkit/CommonThread/CollectionRV.cpp vmkit/branches/memory-monitor/lib/vmkit/CommonThread/ObjectLocks.cpp vmkit/branches/memory-monitor/lib/vmkit/CommonThread/Sigsegv-linux-x64.inc vmkit/branches/memory-monitor/lib/vmkit/CommonThread/Sigsegv-linux-x86.inc vmkit/branches/memory-monitor/lib/vmkit/CommonThread/ctthread.cpp vmkit/branches/memory-monitor/lib/vmkit/Runtime/MethodInfo.cpp vmkit/branches/memory-monitor/lib/vmkit/Runtime/UTF8.cpp vmkit/branches/memory-monitor/mmtk/mmtk-alloc/Selected.cpp vmkit/branches/memory-monitor/tests/ (props changed) vmkit/branches/memory-monitor/tests/dacapo/jars/ (props changed) vmkit/branches/memory-monitor/tools/j3/Main.cpp vmkit/branches/memory-monitor/www/get_started.html vmkit/branches/memory-monitor/www/index.html vmkit/branches/memory-monitor/www/menu.html.incl vmkit/branches/memory-monitor/www/tuto/toy-vm-base.tar.gz Propchange: vmkit/branches/memory-monitor/ ------------------------------------------------------------------------------ --- svn:ignore (original) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -14,4 +14,9 @@ Release+Asserts Debug+Asserts Debug .project +.cproject +.settings +.autotools +fwdir +generated.bc Modified: vmkit/branches/memory-monitor/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/Makefile.rules?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/Makefile.rules (original) +++ vmkit/branches/memory-monitor/Makefile.rules Thu Oct 9 03:43:38 2014 @@ -23,7 +23,7 @@ ifeq ($(OPTIMIZED),1) LLC_FLAGS+= -O=3 OPT_FLAGS+= -disable-opt CPPGEN_FLAGS+=-strip-debug - COMMON_CFLAGS+= -O3 + COMMON_CFLAGS+=-O3 else LLC_FLAGS+=-O=0 -asm-verbose OPT_FLAGS+=-disable-opt -inline @@ -36,7 +36,7 @@ LLC_FLAGS+=-disable-cfi -disable-fp-elim OPT_FLAGS+=-disable-cfi -disable-fp-elim INCLUDES+=-I$(PROJ_SRC_CWD) -I$(PROJ_SRC_ROOT)/include -I$(PROJ_SRC_ROOT)/lib/vmkit/MMTk -I$(BUILD_DIR) \ - -I$(shell $(LLVM_CONFIG) --includedir) -I$(shell $(LLVM_CONFIG) --obj-root)/include -I$(shell $(LLVM_CONFIG) --src-root) + -I$(shell $(LLVM_CONFIG) --includedir) -I$(shell $(LLVM_CONFIG) --bindir)/../include -I$(shell $(LLVM_CONFIG) --src-root) WARN_CFLAGS= -Wall -Wno-long-long -Wno-variadic-macros -Wno-unused-private-field -Wno-unused-variable COMMON_CFLAGS+= $(INCLUDES) -ansi -pedantic $(WARN_CFLAGS) -fPIC \ @@ -44,10 +44,10 @@ COMMON_CFLAGS+= $(INCLUDES) -ansi -pedan -fno-strict-aliasing -fno-omit-frame-pointer -fvisibility-inlines-hidden CFLAGS+=$(COMMON_CFLAGS) -CXXFLAGS+=$(COMMON_CFLAGS) -Woverloaded-virtual -Wcast-qual -fno-exceptions $(LLVM_RTTI) +CXXFLAGS+=$(COMMON_CFLAGS) -std=c++11 -stdlib=libc++ -Woverloaded-virtual -Wcast-qual -fno-exceptions $(LLVM_RTTI) LDFLAGS+=$(COMMON_CFLAGS) $(shell $(LLVM_CONFIG) --ldflags) $(LDOPT) -SHOPT+=$(COMMON_CFLAGS) -LIBS+=$(shell $(LLVM_CONFIG) --libs) -lz +SHOPT+=$(COMMON_CFLAGS) -lc++ -lc++abi +LIBS+=$(shell $(LLVM_CONFIG) --libs) -lz -lpthread -ldl -lc++ -lc++abi DEPEND_OPTIONS=-MMD -MP -MF "$(BUILD_DIR)/$$*.d.tmp" -MT "$(BUILD_DIR)/$$*.bc" -MT "$(BUILD_DIR)/$$*.d" DOM=then mv -f "$(BUILD_DIR)/$$*.d.tmp" "$(BUILD_DIR)/$$*.d"; else rm -f "$(BUILD_DIR)/$$*.d.tmp"; exit 1; fi @@ -262,11 +262,11 @@ DEP_LIBS=$(patsubst %,$(LIB_DIR)/lib%.a, $(BIN_DIR)/$(TOOL)$(EXEEXT): $(MODULE_A) $(DEP_LIBS) $(BUILD_DIR)/frametables.o $(SELF) $(BIN_DIR)/.dir $(Echo) "Linking executable '$(notdir $@)'" - $(Verb) $(CLANGXX) -o $@ $(LDFLAGS) $(MODULE_A) $(BUILD_DIR)/frametables.o $(DEP_LIBS) $(DEP_LIBS) $(LIBS) + $(Verb) $(CLANGXX) -std=c++11 -stdlib=libc++ -o $@ $(LDFLAGS) $(MODULE_A) $(BUILD_DIR)/frametables.o $(DEP_LIBS) $(DEP_LIBS) $(LIBS) $(LIB_DIR)/$(LIBRARY)$(SHLIBEXT): $(MODULE_A) $(DEP_LIBS) $(SELF) $(LIB_DIR)/.dir $(Echo) "Linking shared library '$(notdir $@)'" - $(Verb) $(CLANGXX) -o $@ $(SHOPT) -shared -Wl,--whole-archive $(MODULE_A) -Wl,--no-whole-archive $(DEP_LIBS) + $(Verb) $(CLANGXX) -std=c++11 -stdlib=libc++ -L$(shell $(LLVM_CONFIG) --bindir)/../lib -o $@ $(SHOPT) -shared -Wl,--whole-archive $(MODULE_A) -Wl,--no-whole-archive $(DEP_LIBS) ############################################################################### # Frametables Modified: vmkit/branches/memory-monitor/README.TXT URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/README.TXT?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/README.TXT (original) +++ vmkit/branches/memory-monitor/README.TXT Thu Oct 9 03:43:38 2014 @@ -24,14 +24,14 @@ cd classpath-0.99 ./configure --disable-plugin --disable-examples --disable-Werror --with-antlr-jar=/opt//local/share/java/antlr.jar make -j12 cd lib -ln -s ../native/jni/gtk-peer/.libs/libgtkpeer.dylib; -ln -s ../native/jni/gconf-peer/.libs/libgconfpeer.dylib; -ln -s ../native/jni/java-io/.libs/libjavaio.dylib; -ln -s ../native/jni/java-lang/.libs/libjavalangreflect.dylib; -ln -s ../native/jni/java-lang/.libs/libjavalang.dylib; -ln -s ../native/jni/java-net/.libs/libjavanet.dylib; -ln -s ../native/jni/java-nio/.libs/libjavanio.dylib; -ln -s ../native/jni/java-util/.libs/libjavautil.dylib; +ln -s ../native/jni/gtk-peer/.libs/libgtkpeer.so; +ln -s ../native/jni/gconf-peer/.libs/libgconfpeer.so; +ln -s ../native/jni/java-io/.libs/libjavaio.so; +ln -s ../native/jni/java-lang/.libs/libjavalangreflect.so; +ln -s ../native/jni/java-lang/.libs/libjavalang.so; +ln -s ../native/jni/java-net/.libs/libjavanet.so; +ln -s ../native/jni/java-nio/.libs/libjavanio.so; +ln -s ../native/jni/java-util/.libs/libjavautil.so; * For Linux users: wget http://ftp.gnu.org/gnu/classpath/classpath-0.99.tar.gz @@ -80,8 +80,8 @@ NOTICE: * Make it (release mode): -./configure --enable-optimized --enable-assertions --enable-jit --enable-cxx11 --enable-threads --enable-pthreads --enable-pic --enable-targets=host,cpp --enable-zlib --disable-docs --disable-doxygen -make -j12 BUILD_EXAMPLES=0 ENABLE_DOCS=0 +./configure --enable-optimized --enable-assertions --enable-jit --enable-cxx11 --enable-libcpp --enable-threads --enable-pthreads --enable-pic --enable-targets=host,cpp --enable-zlib --disable-docs --disable-doxygen +make -j12 * You can also make it in debug mode, but this is is not necessary to debug compiled programs: @@ -105,15 +105,15 @@ svn co https://YOUR_USER_NAME at llvm.org/s * Make it (release mode): -./configure --with-llvm-config-path=@PATH_TO_LLVM@/Release+Asserts/bin/llvm-config --with-gnu-classpath-libs=@PATH_TO_GNUCLASSPATH@/lib --with-gnu-classpath-glibj=@PATH_TO_GNUCLASSPATH@/lib/glibj.zip +./configure --with-llvm-config-path=@PATH_TO_LLVM@/Release+Asserts/bin/llvm-config --with-clang-path=@PATH_TO_LLVM@/Release+Asserts/bin --with-gnu-classpath-libs=@PATH_TO_GNUCLASSPATH@/lib --with-gnu-classpath-glibj=@PATH_TO_GNUCLASSPATH@/lib/glibj.zip * Or you can make it in debug mode: -./configure --with-llvm-config-path=@PATH_TO_LLVM@/Release+Asserts/bin/llvm-config --with-gnu-classpath-libs=@PATH_TO_GNUCLASSPATH@/lib --with-gnu-classpath-glibj=@PATH_TO_GNUCLASSPATH@/lib/glibj.zip --enable-assert=yes --disable-optimized --enable-debug=yes +./configure --with-llvm-config-path=@PATH_TO_LLVM@/Release+Asserts/bin/llvm-config --with-clang-path=@PATH_TO_LLVM@/Release+Asserts/bin --with-gnu-classpath-libs=@PATH_TO_GNUCLASSPATH@/lib --with-gnu-classpath-glibj=@PATH_TO_GNUCLASSPATH@/lib/glibj.zip --enable-assert=yes --disable-optimized --enable-debug=yes * Or you can enable OSGi Incinerator build: -./configure --with-llvm-config-path=@PATH_TO_LLVM@/Release+Asserts/bin/llvm-config --with-gnu-classpath-libs=@PATH_TO_GNUCLASSPATH@/lib --with-gnu-classpath-glibj=@PATH_TO_GNUCLASSPATH@/lib/glibj.zip --enable-incinerator=yes +./configure --with-llvm-config-path=@PATH_TO_LLVM@/Release+Asserts/bin/llvm-config --with-clang-path=@PATH_TO_LLVM@/Release+Asserts/bin --with-gnu-classpath-libs=@PATH_TO_GNUCLASSPATH@/lib --with-gnu-classpath-glibj=@PATH_TO_GNUCLASSPATH@/lib/glibj.zip --enable-incinerator=yes * Build it: Modified: vmkit/branches/memory-monitor/include/debug.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/include/debug.h?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/include/debug.h (original) +++ vmkit/branches/memory-monitor/include/debug.h Thu Oct 9 03:43:38 2014 @@ -27,7 +27,7 @@ #define _BOLD "01" #define _SOULIGNE "04" -#define MK_COLOR(type, bg) type";"bg +#define MK_COLOR(type, bg) type";" bg /* #define MK_COLOR(type, bg, fg) type";"bg";"fg Modified: vmkit/branches/memory-monitor/include/j3/J3Intrinsics.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/include/j3/J3Intrinsics.h?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/include/j3/J3Intrinsics.h (original) +++ vmkit/branches/memory-monitor/include/j3/J3Intrinsics.h Thu Oct 9 03:43:38 2014 @@ -45,10 +45,19 @@ public: llvm::Type* JavaMethodType; llvm::Type* JavaFieldType; llvm::Type* AttributeType; + llvm::Type* ThreadType; llvm::Type* JavaThreadType; llvm::Type* MutatorThreadType; llvm::Type* J3DenseMapType; - + +#if OSGI_BUNDLE_TIER_TAGGING + llvm::Type* TierIDType; +#endif + +#if EMBEDDED_LIST_IN_CALL_STACK + llvm::Type* StackEmbeddedListNodeType; +#endif + llvm::Function* VTAllocateFunction; llvm::Function* VTAllocateUnresolvedFunction; @@ -109,6 +118,16 @@ public: llvm::Function* GetFinalFloatFieldFunction; llvm::Function* GetFinalDoubleFieldFunction; +#if JAVA_CHARGED_TIER_CALL_STACK + llvm::Function* PushChargedTierNodeFunction; + llvm::Function* PopChargedTierNodeFunction; +#endif + +#if OSGI_BUNDLE_TIER_TAGGING + llvm::Constant* InvalidTierIDConstant; + llvm::Constant* OffsetChargedTierIDInThreadConstant; +#endif + llvm::Constant* JavaArraySizeOffsetConstant; llvm::Constant* JavaArrayElementsOffsetConstant; llvm::Constant* HeaderObjectLockOffsetConstant; @@ -131,6 +150,15 @@ public: llvm::Constant* OffsetJNIInJavaThreadConstant; llvm::Constant* OffsetJavaExceptionInJavaThreadConstant; +#if EMBEDDED_LIST_IN_CALL_STACK + llvm::Constant* OffsetStackEmbeddedListHeadInThreadConstant; + + llvm::Constant* OffsetCallerNodeInStackEmbeddedListNodeConstant; + llvm::Constant* OffsetDataInStackEmbeddedListNodeConstant; +#endif + + llvm::Constant* constantNullJavaMethodPtr; + llvm::Constant* OffsetClassInVTConstant; llvm::Constant* OffsetDepthInVTConstant; llvm::Constant* OffsetDisplayInVTConstant; @@ -140,12 +168,18 @@ public: llvm::Constant* OffsetBaseClassInArrayClassConstant; llvm::Constant* OffsetLogSizeInPrimitiveClassConstant; + llvm::Constant* OffsetOffsetInJavaMethodConstant; + llvm::Constant* ClassReadyConstant; llvm::Constant* JavaObjectNullConstant; llvm::Constant* MaxArraySizeConstant; llvm::Constant* JavaArraySizeConstant; +#if MONITOR_CREATED_OBJECTS_COUNT + llvm::Constant* OffsetTotalCalledMethodsCounterInThread; +#endif + llvm::Function* ThrowExceptionFunction; llvm::Function* NullPointerExceptionFunction; llvm::Function* IndexOutOfBoundsExceptionFunction; Modified: vmkit/branches/memory-monitor/include/vmkit/GC.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/include/vmkit/GC.h?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/include/vmkit/GC.h (original) +++ vmkit/branches/memory-monitor/include/vmkit/GC.h Thu Oct 9 03:43:38 2014 @@ -16,17 +16,63 @@ class gc; +#if OSGI_OBJECT_TIER_TAGGING + +/* + TierID bits = y xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx + y: marked bit, used to avoid counting one object twice + x...x: unsigned integer identifier +*/ + +#endif + class gcHeader { public: word_t _header; + +#if OSGI_OBJECT_TIER_TAGGING + typedef uint16_t TierIDType; // 16-bits wide tag + static const uint16_t TierIDBitMask_Mark = 0x8000, TierIDBitMask_ID = 0x7FFF; + + TierIDType _tier_id; +#endif + inline gc* toReference() { return (gc*)((uintptr_t)this + hiddenHeaderSize()); } static inline size_t hiddenHeaderSize() { return sizeof(gcHeader); } }; class gcRoot { public: - word_t& header(){return toHeader()->_header; } - inline gcHeader* toHeader() { return (gcHeader*)((uintptr_t)this - gcHeader::hiddenHeaderSize()); } +#if OSGI_OBJECT_TIER_TAGGING + inline gcHeader::TierIDType getTierID() const { + return (toHeader()->_tier_id & gcHeader::TierIDBitMask_ID);} + + inline void setTierID(gcHeader::TierIDType tierID) + { + gcHeader::TierIDType& tid = toHeader()->_tier_id; + tid &= gcHeader::TierIDBitMask_Mark; + tid |= (tierID & gcHeader::TierIDBitMask_ID); + } + + inline bool getTierObjectMarkState() const { + return ((toHeader()->_tier_id & gcHeader::TierIDBitMask_Mark) != 0);} + + inline void setTierObjectMarkState(bool markState) + { + gcHeader::TierIDType& tid = toHeader()->_tier_id; + if (markState) + tid |= gcHeader::TierIDBitMask_Mark; + else + tid &= ~gcHeader::TierIDBitMask_Mark; + } +#endif + + inline word_t& header() {return toHeader()->_header; } + inline const word_t& header() const {return const_cast(this)->header(); } + + inline gcHeader* toHeader() { + return (gcHeader*)((uintptr_t)this - gcHeader::hiddenHeaderSize()); } + inline const gcHeader* toHeader() const {return const_cast(this)->toHeader(); } }; namespace vmkit { Added: vmkit/branches/memory-monitor/include/vmkit/StackEmbeddedList.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/include/vmkit/StackEmbeddedList.h?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/include/vmkit/StackEmbeddedList.h (added) +++ vmkit/branches/memory-monitor/include/vmkit/StackEmbeddedList.h Thu Oct 9 03:43:38 2014 @@ -0,0 +1,63 @@ + +#ifndef STACK_EMBEDDED_LIST_H_ +#define STACK_EMBEDDED_LIST_H_ + +#include "vmkit/System.h" +#include "vmkit/StackWalker.h" + +#include + +#if EMBEDDED_LIST_IN_CALL_STACK + +namespace vmkit { + +class Thread; + +enum StackEmbeddedListID { + StackEmbeddedListChargedTier = 0, + + StackEmbeddedListNodeCountPerThread +}; + +struct StackEmbeddedListNode { + StackEmbeddedListNode* callerNode; + word_t data[1]; + + void dump() const __attribute__((noinline)); +}; + +} + +/* +class StackEmbeddedListWalker +{ +protected: + const StackEmbeddedListNode* _current_node; + StackWalker _stack_walker; + std::list _walked_stack; + +public: + StackEmbeddedListWalker(Thread* thread) : + _current_node(nullptr), _stack_walker(thread) {} + virtual ~StackEmbeddedListWalker() {} + + bool findStackFrameOfEmbeddedNode(); + bool next(); + + StackWalker& getStackWalker() {return _stack_walker;} + uint32_t getChargedTierID() const { + return (!_current_node) + ? 0 : reinterpret_cast(_current_node->data[0]); + } +}; + +extern "C" void pushChargedTierNode(vmkit::Thread* thread, + vmkit::StackEmbeddedListNode* node); + +extern "C" void popChargedTierNode(vmkit::Thread* thread, + vmkit::StackEmbeddedListNode* node); +*/ + +#endif + +#endif Added: vmkit/branches/memory-monitor/include/vmkit/StackWalker.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/include/vmkit/StackWalker.h?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/include/vmkit/StackWalker.h (added) +++ vmkit/branches/memory-monitor/include/vmkit/StackWalker.h Thu Oct 9 03:43:38 2014 @@ -0,0 +1,36 @@ + +#ifndef _VMKIT_STACK_WALKER_H_ +#define _VMKIT_STACK_WALKER_H_ + +namespace vmkit { + +class Thread; +class KnownFrame; +class FrameInfo; + +/// StackWalker - This class walks the stack of threads, returning a FrameInfo +/// object at each iteration. +/// +class StackWalker +{ +public: + word_t callFrameAddress; + word_t returnAddress; + KnownFrame* frame; + Thread* thread; + + StackWalker() __attribute__ ((noinline)); + StackWalker(Thread* th) __attribute__ ((noinline)); + void operator++(); + word_t operator*(); + FrameInfo* get(); + + FrameInfo* getNextFrameWithMetadata(); + FrameInfo* getNextFrameWithMetadata(size_t& totalFrameSizeWithoutMetadata); + FrameInfo* getNextFrameWithMetadata( + word_t& callFrameAddress, word_t& returnAddress, KnownFrame*& frame); +}; + +} + +#endif Modified: vmkit/branches/memory-monitor/include/vmkit/System.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/include/vmkit/System.h?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/include/vmkit/System.h (original) +++ vmkit/branches/memory-monitor/include/vmkit/System.h Thu Oct 9 03:43:38 2014 @@ -17,6 +17,12 @@ #include #include +#include "vmkit/config.h" + +#if MONITOR_CREATED_OBJECTS_COUNT +extern "C" void Jnjvm_dumpGlobalStats(); +#endif + #if defined(__linux__) || defined(__FreeBSD__) #define LINUX_OS 1 #elif defined(__APPLE__) @@ -94,11 +100,36 @@ const word_t kVmkitThreadMask = 0xF00000 const word_t kGCMemorySize = 0x30000000; +#if JAVA_CHARGED_TIER_CALL_STACK + +#define TRY { \ + vmkit::Thread* __current_thread_ = vmkit::Thread::get(); \ + vmkit::StackEmbeddedListNode* node = __current_thread_-> \ + stackEmbeddedListHead[vmkit::StackEmbeddedListChargedTier]; \ + vmkit::ExceptionBuffer __buffer__; \ + if (!SETJMP(__buffer__.buffer)) + +#define CATCH else { \ + __current_thread_-> \ + stackEmbeddedListHead[vmkit::StackEmbeddedListChargedTier] = node; + +#define IGNORE else { \ + __current_thread_-> \ + stackEmbeddedListHead[vmkit::StackEmbeddedListChargedTier] = node; \ + __current_thread_->clearException(); \ +}} + +#define END_CATCH }} + +#else + #define TRY { vmkit::ExceptionBuffer __buffer__; if (!SETJMP(__buffer__.buffer)) #define CATCH else #define IGNORE else { vmkit::Thread::get()->clearException(); }} #define END_CATCH } +#endif + class System { public: static bool IsWordAligned(word_t ptr) { @@ -148,7 +179,7 @@ public: return pagesize; } - static word_t GetCallerAddress() __attribute((always_inline)) { + static word_t GetCallFrameAddress() __attribute((always_inline)) { #if defined(ARCH_X86) || defined(ARCH_X64) return (word_t)__builtin_frame_address(0); #else @@ -156,15 +187,15 @@ public: #endif } - static word_t GetCallerOfAddress(word_t addr) { - return ((word_t*)addr)[0]; + static word_t GetCallerCallFrame(word_t currentCallFrame) { + return *(word_t*)currentCallFrame; } - static word_t GetIPFromCallerAddress(word_t addr) { + static word_t GetReturnAddressOfCallFrame(word_t currentCallFrame) { #if defined(MACOS_OS) && defined(ARCH_PPC) - return ((word_t*)addr)[2]; + return ((word_t*)currentCallFrame)[2]; #else - return ((word_t*)addr)[1]; + return ((word_t*)currentCallFrame)[1]; #endif } @@ -233,7 +264,11 @@ public: } static void Exit(int value) { - _exit(value); +#if MONITOR_CREATED_OBJECTS_COUNT + Jnjvm_dumpGlobalStats(); +#endif + + _exit(value); } static bool SupportsHardwareNullCheck(); Modified: vmkit/branches/memory-monitor/include/vmkit/Thread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/include/vmkit/Thread.h?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/include/vmkit/Thread.h (original) +++ vmkit/branches/memory-monitor/include/vmkit/Thread.h Thu Oct 9 03:43:38 2014 @@ -18,7 +18,11 @@ #include "types.h" #include "vmkit/System.h" +#include "vmkit/StackWalker.h" +#if EMBEDDED_LIST_IN_CALL_STACK +#include "vmkit/StackEmbeddedList.h" +#endif namespace vmkit { @@ -117,6 +121,14 @@ public: Thread() { lastExceptionBuffer = 0; lastKnownFrame = 0; + +#if JAVA_CHARGED_TIER_CALL_STACK + stackEmbeddedListHead[StackEmbeddedListChargedTier] = nullptr; +#endif + +#if MONITOR_CREATED_OBJECTS_COUNT + total_called_methods_count = 0; +#endif } /// yield - Yield the processor to another thread. @@ -172,7 +184,7 @@ public: /// get - Get the thread specific data of the current thread. /// static Thread* get() { - return (Thread*)(System::GetCallerAddress() & System::GetThreadIDMask()); + return (Thread*)(System::GetCallFrameAddress() & System::GetThreadIDMask()); } private: @@ -239,7 +251,7 @@ public: /// stackOverflow - Returns if there is a stack overflow in Java land. /// bool stackOverflow() { - return (System::GetCallerAddress() & StackOverflowMask) == 0; + return (System::GetCallFrameAddress() & StackOverflowMask) == 0; } /// operator new - Allocate the Thread object as well as the stack for this @@ -276,6 +288,25 @@ public: /// ExceptionBuffer* lastExceptionBuffer; +#if JAVA_CHARGED_TIER_CALL_STACK + uint32_t chargedTierID; +#else + uint32_t unused_1; +#endif + +#if EMBEDDED_LIST_IN_CALL_STACK + StackEmbeddedListNode* + stackEmbeddedListHead[StackEmbeddedListNodeCountPerThread]; +#else + void* unused_2[1]; +#endif + +#if MONITOR_CREATED_OBJECTS_COUNT + uint64_t total_called_methods_count; +#else + uint64_t unused_3; +#endif + void internalThrowException(); void startKnownFrame(KnownFrame& F) __attribute__ ((noinline)); @@ -326,23 +357,6 @@ public: ExceptionBuffer* previousBuffer; }; -/// StackWalker - This class walks the stack of threads, returning a FrameInfo -/// object at each iteration. -/// -class StackWalker { -public: - word_t addr; - word_t ip; - KnownFrame* frame; - vmkit::Thread* thread; - - StackWalker(vmkit::Thread* th) __attribute__ ((noinline)); - void operator++(); - word_t operator*(); - FrameInfo* get(); - -}; - } // end namespace vmkit #endif // VMKIT_THREAD_H Modified: vmkit/branches/memory-monitor/include/vmkit/UTF8.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/include/vmkit/UTF8.h?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/include/vmkit/UTF8.h (original) +++ vmkit/branches/memory-monitor/include/vmkit/UTF8.h Thu Oct 9 03:43:38 2014 @@ -12,6 +12,25 @@ namespace vmkit { class UTF8Map; +template +int compare_null_terminated_arrays(const T1* array1, size_t size1, const T2* array2, size_t size2) +{ + // NULL array is treated as empty + if (!array1) size1 = 0; + if (!array2) size2 = 0; + + // Compute real sizes, excluding null terminators + for (; (size1 != 0) && (array1[size1 - 1] == 0); --size1); + for (; (size2 != 0) && (array2[size2 - 1] == 0); --size2); + + int diff = size1 - size2; // Compare sizes + if (diff == 0) { // Equal sizes, compare contents + for (; (size1 != 0) && (diff == 0); --size1, ++array1, ++array2) + diff = *array1 - *array2; + } + return diff; +} + class UTF8 { friend class UTF8Map; private: @@ -36,8 +55,7 @@ public: /// equals - Are the two UTF8s equal? bool equals(const UTF8* other) const { if (other == this) return true; - else if (size != other->size) return false; - else return !memcmp(elements, other->elements, size * sizeof(uint16)); + return (*this) == (*other); } /// equals - Does the UTF8 equal to the buffer? @@ -47,12 +65,8 @@ public: } /// lessThan - strcmp-like function for UTF8s, used by hash tables. - bool lessThan(const UTF8* other) const { - if (size < other->size) return true; - else if (size > other->size) return false; - else return memcmp((const char*)elements, (const char*)other->elements, - size * sizeof(uint16)) < 0; - } + bool lessThan(const UTF8* other) const + { return (*this) < (*other); } static uint32_t readerHasher(const uint16* buf, sint32 size); @@ -64,9 +78,26 @@ public: size = n; } + friend bool operator < (const UTF8& str1, const UTF8& str2) { + return UTF8::compare(&str1, &str2) < 0; + } + friend bool operator == (const UTF8& str1, const UTF8& str2) { + return UTF8::compare(&str1, &str2) == 0; + } friend std::ostream& operator << (std::ostream&, const UTF8&); + void dump() const __attribute__((noinline)); - int compare(const char *) const; + int compare(const char *str, int length = -1) const { + return compare_null_terminated_arrays( + elements, size, str, (length == -1) ? strlen(str) : length); + } + int compare(const UTF8& str) const {return UTF8::compare(this, &str);} + static int compare(const UTF8* str1, const UTF8* str2) { + if (!str1 && !str2) return 0; + return compare_null_terminated_arrays( + (!str1 ? NULL : str1->elements), (!str1 ? 0 : str1->size), + (!str2 ? NULL : str2->elements), (!str2 ? 0 : str2->size)); + } std::string& toString(std::string& buffer) const; }; @@ -83,6 +114,13 @@ struct UTF8MapKey { } }; +class UTF8_Comparator { +public: + bool operator() (const UTF8* str1, const UTF8* str2) const { + return (*str1) < (*str2); + } +}; + // Provide VmkitDenseMapInfo for UTF8. template<> struct VmkitDenseMapInfo { Modified: vmkit/branches/memory-monitor/include/vmkit/VirtualMachine.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/include/vmkit/VirtualMachine.h?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/include/vmkit/VirtualMachine.h (original) +++ vmkit/branches/memory-monitor/include/vmkit/VirtualMachine.h Thu Oct 9 03:43:38 2014 @@ -19,9 +19,6 @@ #include "vmkit/Locks.h" #include "vmkit/GC.h" -#include -#include - namespace vmkit { class CompiledFrames; @@ -104,7 +101,7 @@ public: /// doExit - Should the VM exit now? bool doExit; - + /// setMainThread - Set the main thread of this VM. /// void setMainThread(vmkit::Thread* th) { mainThread = th; } Added: vmkit/branches/memory-monitor/include/vmkit/config.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/include/vmkit/config.h?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/include/vmkit/config.h (added) +++ vmkit/branches/memory-monitor/include/vmkit/config.h Thu Oct 9 03:43:38 2014 @@ -0,0 +1,9 @@ +/* include/vmkit/config.h. Generated from config.h.in by configure. */ +#define OSGI_OBJECT_TIER_TAGGING 1 +#define OSGI_BUNDLE_STATE_INFO 1 +#define EMBEDDED_LIST_IN_CALL_STACK 1 +#define JAVA_CHARGED_TIER_CALL_STACK 1 +#define OSGI_BUNDLE_TIER_TAGGING 1 +#define OSGI_STACK_SPACE_TIER_TAGGING 1 +#define EMBEDDED_LIST_UPDATE 1 +#define MONITOR_CREATED_OBJECTS_COUNT 0 Modified: vmkit/branches/memory-monitor/include/vmkit/config.h.in URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/include/vmkit/config.h.in?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/include/vmkit/config.h.in (original) +++ vmkit/branches/memory-monitor/include/vmkit/config.h.in Thu Oct 9 03:43:38 2014 @@ -0,0 +1,8 @@ +#define OSGI_OBJECT_TIER_TAGGING 0 +#define OSGI_BUNDLE_STATE_INFO 0 +#define EMBEDDED_LIST_IN_CALL_STACK 0 +#define JAVA_CHARGED_TIER_CALL_STACK 0 +#define OSGI_BUNDLE_TIER_TAGGING 0 +#define OSGI_STACK_SPACE_TIER_TAGGING 0 +#define EMBEDDED_LIST_UPDATE 0 +#define MONITOR_CREATED_OBJECTS_COUNT 0 Removed: vmkit/branches/memory-monitor/include/vmkit/config.h.in.orig URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/include/vmkit/config.h.in.orig?rev=219391&view=auto ============================================================================== --- vmkit/branches/memory-monitor/include/vmkit/config.h.in.orig (original) +++ vmkit/branches/memory-monitor/include/vmkit/config.h.in.orig (removed) @@ -1,79 +0,0 @@ -/* include/vmkit/config.h.in. Generated from autoconf/configure.ac by autoheader. */ - -/* Define to 1 if the system has the type `int64_t'. */ -#undef HAVE_INT64_T - -/* Define to 1 if you have the header file. */ -#undef HAVE_INTTYPES_H - -/* Define to 1 if you have the `z' library (-lz). */ -#undef HAVE_LIBZ - -/* Define to 1 if you have the `longjmp' function. */ -#undef HAVE_LONGJMP - -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define to 1 if you have the `setjmp' function. */ -#undef HAVE_SETJMP - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_STAT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define to 1 if the system has the type `uint64_t'. */ -#undef HAVE_UINT64_T - -/* Define to 1 if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define to 1 if the system has the type `u_int64_t'. */ -#undef HAVE_U_INT64_T - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the home page for this package. */ -#undef PACKAGE_URL - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define to 1 if your declares `struct tm'. */ -#undef TM_IN_SYS_TIME - -/* Building on a platform with 64bit cas */ -#undef WITH_64 - -/* Define to `int' if does not define. */ -#undef pid_t - -/* Define to `unsigned int' if does not define. */ -#undef size_t Modified: vmkit/branches/memory-monitor/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc (original) +++ vmkit/branches/memory-monitor/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc Thu Oct 9 03:43:38 2014 @@ -289,6 +289,7 @@ JavaObject* proceedVMMethod(JavaObjectVM Jnjvm* vm = JavaThread::get()->getJVM(); JavaMethod* meth = JavaObjectVMMethod::getInternalMethod(Meth); + UserCommonClass* _cl = (UserCommonClass*)JavaObjectVMMethod::getClass(Meth); sint32 nbArgs = args ? ArrayObject::getSize(args) : 0; Modified: vmkit/branches/memory-monitor/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp (original) +++ vmkit/branches/memory-monitor/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp Thu Oct 9 03:43:38 2014 @@ -206,6 +206,7 @@ JavaMethod* Classpath::InitArithmeticExc JavaMethod* Classpath::InitCloneNotSupportedException; JavaMethod* Classpath::InitObject; JavaMethod* Classpath::FinalizeObject; +JavaMethod* Classpath::toString; JavaMethod* Classpath::IntToString; JavaMethod* Classpath::SystemArraycopy; @@ -905,6 +906,9 @@ void Classpath::initialiseClasspath(Jnjv FinalizeObject = UPCALL_METHOD(loader, "java/lang/Object", "finalize", "()V", ACC_VIRTUAL); + + toString = UPCALL_METHOD(loader, "java/lang/Object", "toString", + "()Ljava/lang/String;", ACC_VIRTUAL); IntToString = UPCALL_METHOD(loader, "java/lang/Integer", "toString", "(II)Ljava/lang/String;", ACC_STATIC); Modified: vmkit/branches/memory-monitor/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h (original) +++ vmkit/branches/memory-monitor/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h Thu Oct 9 03:43:38 2014 @@ -251,6 +251,7 @@ public: ISOLATE_STATIC JavaMethod* InitObject; ISOLATE_STATIC JavaMethod* FinalizeObject; + ISOLATE_STATIC JavaMethod* toString; ISOLATE_STATIC JavaMethod* ErrorWithExcpNoClassDefFoundError; ISOLATE_STATIC JavaMethod* ErrorWithExcpExceptionInInitializerError; Modified: vmkit/branches/memory-monitor/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp (original) +++ vmkit/branches/memory-monitor/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp Thu Oct 9 03:43:38 2014 @@ -197,6 +197,7 @@ JavaMethod* Classpath::InitArithmeticExc JavaMethod* Classpath::InitCloneNotSupportedException; JavaMethod* Classpath::InitObject; JavaMethod* Classpath::FinalizeObject; +JavaMethod* Classpath::toString; JavaMethod* Classpath::IntToString; JavaMethod* Classpath::SystemArraycopy; @@ -787,6 +788,9 @@ void Classpath::initialiseClasspath(Jnjv FinalizeObject = UPCALL_METHOD(loader, "java/lang/Object", "finalize", "()V", ACC_VIRTUAL); + toString = UPCALL_METHOD(loader, "java/lang/Object", "toString", + "()Ljava/lang/String;", ACC_VIRTUAL); + IntToString = UPCALL_METHOD(loader, "java/lang/Integer", "toString", "(II)Ljava/lang/String;", ACC_STATIC); Modified: vmkit/branches/memory-monitor/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h (original) +++ vmkit/branches/memory-monitor/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h Thu Oct 9 03:43:38 2014 @@ -240,6 +240,7 @@ public: ISOLATE_STATIC JavaMethod* InitObject; ISOLATE_STATIC JavaMethod* FinalizeObject; + ISOLATE_STATIC JavaMethod* toString; ISOLATE_STATIC JavaMethod* ErrorWithExcpNoClassDefFoundError; ISOLATE_STATIC JavaMethod* ErrorWithExcpExceptionInInitializerError; Modified: vmkit/branches/memory-monitor/lib/j3/Compiler/J3Intrinsics.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/Compiler/J3Intrinsics.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/Compiler/J3Intrinsics.cpp (original) +++ vmkit/branches/memory-monitor/lib/j3/Compiler/J3Intrinsics.cpp Thu Oct 9 03:43:38 2014 @@ -25,6 +25,7 @@ using namespace j3; using namespace llvm; + namespace j3 { namespace llvm_runtime { #include "LLVMRuntime.inc" @@ -47,6 +48,9 @@ void J3Intrinsics::init(llvm::Module* mo ResolvedConstantPoolType = ptrPtrType; +#if OSGI_BUNDLE_TIER_TAGGING + TierIDType = IntegerType::getInt32Ty(Context); +#endif ObjectHeaderType = PointerType::getUnqual(module->getPointerSize() == Module::Pointer32 ? Type::getInt32Ty(Context) : Type::getInt64Ty(Context)); @@ -99,15 +103,21 @@ void J3Intrinsics::init(llvm::Module* mo PointerType::getUnqual(module->getTypeByName("UTF8")); AttributeType = PointerType::getUnqual(module->getTypeByName("Attribute")); + ThreadType = + PointerType::getUnqual(module->getTypeByName("Thread")); JavaThreadType = PointerType::getUnqual(module->getTypeByName("JavaThread")); MutatorThreadType = PointerType::getUnqual(module->getTypeByName("MutatorThread")); +#if EMBEDDED_LIST_IN_CALL_STACK + StackEmbeddedListNodeType = + PointerType::getUnqual(module->getTypeByName("StackEmbeddedListNode")); +#endif + J3DenseMapType = PointerType::getUnqual(module->getTypeByName("J3DenseMap")); - - + JavaObjectNullConstant = Constant::getNullValue(J3Intrinsics::JavaObjectType); MaxArraySizeConstant = ConstantInt::get(Type::getInt32Ty(Context), @@ -125,6 +135,9 @@ void J3Intrinsics::init(llvm::Module* mo JavaObjectVTOffsetConstant = constantZero; +#if OSGI_BUNDLE_TIER_TAGGING + InvalidTierIDConstant = constantMinusOne; +#endif OffsetClassInVTConstant = ConstantInt::get(Type::getInt32Ty(Context), @@ -152,6 +165,16 @@ void J3Intrinsics::init(llvm::Module* mo OffsetBaseClassInArrayClassConstant = constantOne; OffsetLogSizeInPrimitiveClassConstant = constantOne; + OffsetOffsetInJavaMethodConstant = ConstantInt::get(Type::getInt32Ty(Context), 9); + +#if EMBEDDED_LIST_IN_CALL_STACK + OffsetCallerNodeInStackEmbeddedListNodeConstant = constantZero; + OffsetDataInStackEmbeddedListNodeConstant = constantOne; + OffsetStackEmbeddedListHeadInThreadConstant = ConstantInt::get(Type::getInt32Ty(Context), 13); +#endif + + constantNullJavaMethodPtr = Constant::getNullValue(this->JavaMethodType); + OffsetObjectSizeInClassConstant = constantOne; OffsetVTInClassConstant = ConstantInt::get(Type::getInt32Ty(Context), 7); OffsetTaskClassMirrorInClassConstant = constantThree; @@ -166,6 +189,10 @@ void J3Intrinsics::init(llvm::Module* mo OffsetJNIInJavaThreadConstant = ConstantInt::get(Type::getInt32Ty(Context), 1); OffsetJavaExceptionInJavaThreadConstant = ConstantInt::get(Type::getInt32Ty(Context), 2); +#if OSGI_BUNDLE_TIER_TAGGING + OffsetChargedTierIDInThreadConstant = ConstantInt::get(Type::getInt32Ty(Context), 12); +#endif + ClassReadyConstant = ConstantInt::get(Type::getInt8Ty(Context), ready); InterfaceLookupFunction = module->getFunction("j3InterfaceLookup"); @@ -246,5 +273,15 @@ void J3Intrinsics::init(llvm::Module* mo GetLockFunction = module->getFunction("getLock"); ThrowExceptionFromJITFunction = module->getFunction("j3ThrowExceptionFromJIT"); + +#if JAVA_CHARGED_TIER_CALL_STACK + PushChargedTierNodeFunction = module->getFunction("pushChargedTierNode"); + PopChargedTierNodeFunction = module->getFunction("popChargedTierNode"); +#endif + +#if MONITOR_CREATED_OBJECTS_COUNT + OffsetTotalCalledMethodsCounterInThread = + ConstantInt::get(Type::getInt32Ty(Context), 14); +#endif } Modified: vmkit/branches/memory-monitor/lib/j3/Compiler/JavaAOTCompiler.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/Compiler/JavaAOTCompiler.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/Compiler/JavaAOTCompiler.cpp (original) +++ vmkit/branches/memory-monitor/lib/j3/Compiler/JavaAOTCompiler.cpp Thu Oct 9 03:43:38 2014 @@ -2143,7 +2143,8 @@ void mainCompilerStart(JavaThread* th) { JavaJITCompiler* Comp = NULL; if (!M->clinits->empty()) { - Comp = JavaJITCompiler::CreateCompiler("JIT"); + Comp = JavaJITCompiler::CreateCompiler( + "JIT", M->isCompilingGarbageCollector()); Comp->EmitFunctionName = true; if (!M->useCooperativeGC()) { Comp->disableCooperativeGC(); Modified: vmkit/branches/memory-monitor/lib/j3/Compiler/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/Compiler/JavaJIT.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/Compiler/JavaJIT.cpp (original) +++ vmkit/branches/memory-monitor/lib/j3/Compiler/JavaJIT.cpp Thu Oct 9 03:43:38 2014 @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -47,6 +48,59 @@ using namespace j3; using namespace llvm; using namespace std; +#if MONITOR_CREATED_OBJECTS_COUNT + +void JavaJIT::incrementTotalCalledMethodsCounter() +{ + if (TheCompiler->isCompilingGarbageCollector()) return; + + auto TotalCalledMethodsCountPtr = getElementPtr( + "TotalCalledMethodsCountPtr", getThreadPtr(), intrinsics->constantZero, + intrinsics->OffsetTotalCalledMethodsCounterInThread, nullptr); + + auto value_type = + TotalCalledMethodsCountPtr->getType()->getPointerElementType(); + auto ui64_one = ConstantInt::get(value_type, 1); + auto old_val = new LoadInst(TotalCalledMethodsCountPtr, + "TotalCalledMethodsCountOldValue", currentBlock); + auto new_val = BinaryOperator::CreateAdd(old_val, ui64_one, + "TotalCalledMethodsCounterNewValue", currentBlock); + new StoreInst(new_val, TotalCalledMethodsCountPtr, currentBlock); +} + +#endif + +Value* JavaJIT::allocateOnStack( + const char* name, size_t byteCount, Type* realType) +{ + std::string bufferName(name); + bufferName += "Buffer"; + + auto wordCount = ConstantInt::get( + Type::getInt32Ty(*llvmContext), + vmkit::System::WordAlignUp(byteCount) / sizeof(void*)); + + auto buffer = new AllocaInst(intrinsics->ptrType, + wordCount, sizeof(void*), bufferName, currentBlock); + return new BitCastInst(buffer, realType, name, currentBlock); +} + +Value* JavaJIT::getElementPtr( + const char *name, Value* element, Value* firstIndex, ...) +{ + std::vector indexList; + indexList.push_back(firstIndex); + + va_list argList; + Value* arg; + va_start(argList, firstIndex); + while ((arg = va_arg(argList, Value*)) != nullptr) + indexList.push_back(arg); + va_end(argList); + + return GetElementPtrInst::Create(element, indexList, name, currentBlock); +} + void JavaJIT::updateStackInfo(Opinfo& info) { if (stackSize()) { if (!info.stack.size()) { @@ -196,6 +250,10 @@ void JavaJIT::invokeVirtual(uint16 index FunctionType::param_iterator it = virtualType->param_end(); llvm::Type* retType = virtualType->getReturnType(); +#if OSGI_BUNDLE_TIER_TAGGING + calculateChargedTierIDForInvokeVirtual(index); +#endif + bool needsInit = false; if (canBeDirect && canBeInlined(meth, customized)) { makeArgs(it, index, args, signature->nbArguments + 1); @@ -221,37 +279,47 @@ void JavaJIT::invokeVirtual(uint16 index indexes2[1] = Offset; } else { nullChecked = true; - GlobalVariable* GV = new GlobalVariable(*llvmFunction->getParent(), - Type::getInt32Ty(*llvmContext), - false, - GlobalValue::ExternalLinkage, - intrinsics->constantZero, ""); - + GlobalVariable* cachedMethodPtr = new GlobalVariable( + *llvmFunction->getParent(), intrinsics->JavaMethodType, + false, GlobalValue::ExternalLinkage, + intrinsics->constantNullJavaMethodPtr, "cachedMethodPtr"); + Value* cachedMethod = new LoadInst( + cachedMethodPtr, "cachedMethod", false, currentBlock); + BasicBlock* resolveVirtual = createBasicBlock("resolveVirtual"); BasicBlock* endResolveVirtual = createBasicBlock("endResolveVirtual"); - PHINode* node = PHINode::Create(Type::getInt32Ty(*llvmContext), 2, "", - endResolveVirtual); - - Value* load = new LoadInst(GV, "", false, currentBlock); - Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, load, - intrinsics->constantZero, ""); + PHINode* methodPtr = PHINode::Create( + intrinsics->JavaMethodType, 2, "methodPtr", endResolveVirtual); + methodPtr->addIncoming(cachedMethod, currentBlock); + + Value* test = new ICmpInst( + *currentBlock, ICmpInst::ICMP_EQ, cachedMethod, + intrinsics->constantNullJavaMethodPtr, "isCacheEmpty"); BranchInst::Create(resolveVirtual, endResolveVirtual, test, currentBlock); - node->addIncoming(load, currentBlock); + currentBlock = resolveVirtual; std::vector Args; Args.push_back(TheCompiler->getNativeClass(compilingClass)); Args.push_back(ConstantInt::get(Type::getInt32Ty(*llvmContext), index)); - Args.push_back(GV); + Args.push_back(cachedMethodPtr); Value* targetObject = getTarget(signature); - targetObject = new LoadInst(targetObject, "", false, currentBlock); + targetObject = new LoadInst( + targetObject, "targetObject", false, currentBlock); if (!thisReference) JITVerifyNull(targetObject); Args.push_back(targetObject); - load = invoke(intrinsics->VirtualLookupFunction, Args, "", currentBlock); - node->addIncoming(load, currentBlock); + Value* calculatedMethodPtr = invoke(intrinsics->VirtualLookupFunction, + Args, "calculatedMethod", currentBlock); + methodPtr->addIncoming(calculatedMethodPtr, currentBlock); + BranchInst::Create(endResolveVirtual, currentBlock); currentBlock = endResolveVirtual; - indexes2[1] = node; + Value* methodOffset = getElementPtr( + "methodOffsetPtr", methodPtr, intrinsics->constantZero, + intrinsics->OffsetOffsetInJavaMethodConstant, nullptr); + methodOffset = new LoadInst(methodOffset, "methodOffset", currentBlock); + + indexes2[1] = methodOffset; } makeArgs(it, index, args, signature->nbArguments + 1); @@ -287,22 +355,39 @@ void JavaJIT::invokeVirtual(uint16 index } } } + +#if OSGI_BUNDLE_TIER_TAGGING + resetChargedTierID(); +#endif } llvm::Value* JavaJIT::getMutatorThreadPtr() { - Value* FrameAddr = CallInst::Create(intrinsics->llvm_frameaddress, - intrinsics->constantZero, "", currentBlock); - Value* threadId = new PtrToIntInst(FrameAddr, intrinsics->pointerSizeType, "", - currentBlock); - threadId = BinaryOperator::CreateAnd(threadId, intrinsics->constantThreadIDMask, - "", currentBlock); - threadId = new IntToPtrInst(threadId, intrinsics->MutatorThreadType, "MutatorThreadPtr", currentBlock); + return new BitCastInst( + getThreadPtr(), intrinsics->MutatorThreadType, "MutatorThreadPtr", currentBlock); +} + +llvm::Value* JavaJIT::getThreadPtr() +{ + if (!currentThreadPtr) { + Value* frameAddr = CallInst::Create( + intrinsics->llvm_frameaddress, intrinsics->constantZero, + "frameAddress", currentBlock); + Value* ptr = new PtrToIntInst( + frameAddr, intrinsics->pointerSizeType, "", currentBlock); + ptr = BinaryOperator::CreateAnd( + ptr, intrinsics->constantThreadIDMask, "", currentBlock); + ptr = new IntToPtrInst( + ptr, intrinsics->ThreadType, "threadPtr", currentBlock); + + currentThreadPtr = ptr; + } - return threadId; + return currentThreadPtr; } -llvm::Value* JavaJIT::getJavaThreadPtr(llvm::Value* mutatorThreadPtr) { - return new BitCastInst(mutatorThreadPtr, intrinsics->JavaThreadType, "JavaThreadPtr", currentBlock); +llvm::Value* JavaJIT::getJavaThreadPtr() { + return new BitCastInst( + getThreadPtr(), intrinsics->JavaThreadType, "JavaThreadPtr", currentBlock); } llvm::Value* JavaJIT::getIsolateIDPtr(llvm::Value* mutatorThreadPtr) { @@ -420,7 +505,6 @@ llvm::Function* JavaJIT::nativeCompile(w return llvmFunction; } - Function* func = llvmFunction; if (j3) { Function* callee = Function::Create(llvmFunction->getFunctionType(), @@ -429,6 +513,19 @@ llvm::Function* JavaJIT::nativeCompile(w llvmFunction->getParent()); TheCompiler->setMethod(callee, (void*)natPtr, functionName); currentBlock = createBasicBlock("start"); + +#if OSGI_BUNDLE_TIER_TAGGING + getThreadPtr(); + allocateChargedTierID(); + initializeChargedTierID(); + calculateChargedTierIDForInvokeNative(); + setChargedTierID(); +#endif + +#if MONITOR_CREATED_OBJECTS_COUNT + incrementTotalCalledMethodsCounter(); +#endif + std::vector args; for (Function::arg_iterator i = func->arg_begin(), e = func->arg_end(); i != e; @@ -436,6 +533,11 @@ llvm::Function* JavaJIT::nativeCompile(w args.push_back(i); } Value* res = CallInst::Create(callee, args, "", currentBlock); + +#if OSGI_BUNDLE_TIER_TAGGING + restoreChargedTierID(); +#endif + if (returnType != Type::getVoidTy(*llvmContext)) { ReturnInst::Create(*llvmContext, res, currentBlock); } else { @@ -446,30 +548,37 @@ llvm::Function* JavaJIT::nativeCompile(w currentExceptionBlock = endExceptionBlock = 0; currentBlock = createBasicBlock("start"); - endBlock = createBasicBlock("end block"); + endBlock = createBasicBlock("endBlock"); + getThreadPtr(); + +#if JAVA_CHARGED_TIER_CALL_STACK + allocateChargedTierID(); +#endif + if (returnType != Type::getVoidTy(*llvmContext)) { endNode = PHINode::Create(returnType, 0, "", endBlock); } // Allocate currentLocalIndexNumber pointer - Value* temp = new AllocaInst(Type::getInt32Ty(*llvmContext), "", - currentBlock); + Value* temp = new AllocaInst( + Type::getInt32Ty(*llvmContext), "currentLocalIndexNumber", currentBlock); new StoreInst(intrinsics->constantZero, temp, false, currentBlock); // Allocate oldCurrentLocalIndexNumber pointer - Value* oldCLIN = new AllocaInst(PointerType::getUnqual(Type::getInt32Ty(*llvmContext)), "", - currentBlock); + Value* oldCLIN = new AllocaInst( + PointerType::getUnqual(Type::getInt32Ty(*llvmContext)), + "oldLocalIndexNumber", currentBlock); Constant* sizeF = ConstantInt::get(Type::getInt32Ty(*llvmContext), sizeof(vmkit::KnownFrame)); - Value* Frame = new AllocaInst(Type::getInt8Ty(*llvmContext), sizeF, "", currentBlock); + Value* Frame = new AllocaInst(Type::getInt8Ty(*llvmContext), sizeF, "knownFrame", currentBlock); uint32 nargs = func->arg_size() + 1 + (stat ? 1 : 0); std::vector nativeArgs; nativeArgs.push_back(NULL); // Will contain the callee - Value* jniEnv = getJNIEnvPtr(getJavaThreadPtr(getMutatorThreadPtr())); + Value* jniEnv = getJNIEnvPtr(getJavaThreadPtr()); jniEnv = new BitCastInst(jniEnv, intrinsics->ptrType, "", currentBlock); @@ -487,10 +596,10 @@ llvm::Function* JavaJIT::nativeCompile(w index < nargs; ++i, ++index) { if (i->getType() == intrinsics->JavaObjectType) { - BasicBlock* BB = createBasicBlock(""); - BasicBlock* NotZero = createBasicBlock(""); + BasicBlock* BB = createBasicBlock("continue"); + BasicBlock* NotZero = createBasicBlock("storeObjParamOnStack"); Type* Ty = PointerType::getUnqual(intrinsics->JavaObjectType); - PHINode* node = PHINode::Create(Ty, 2, "", BB); + PHINode* node = PHINode::Create(Ty, 2, "stack_obj_param_", BB); Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, i, intrinsics->JavaObjectNullConstant, ""); @@ -500,8 +609,9 @@ llvm::Function* JavaJIT::nativeCompile(w currentBlock = NotZero; - Instruction* temp = new AllocaInst(intrinsics->JavaObjectType, "", - func->begin()->getTerminator()); + Instruction* temp = new AllocaInst( + intrinsics->JavaObjectType, "nonNullObjParamOnStack", + func->begin()->getTerminator()); if (i == func->arg_begin() && !stat) { this->thisObject = temp; } @@ -529,11 +639,10 @@ llvm::Function* JavaJIT::nativeCompile(w } } - Instruction* ResultObject = 0; if (returnType == intrinsics->JavaObjectType) { - ResultObject = new AllocaInst(intrinsics->JavaObjectType, "", - func->begin()->begin()); + ResultObject = new AllocaInst( + intrinsics->JavaObjectType, "resultObjOnStack", func->begin()->begin()); if (TheCompiler->useCooperativeGC()) { @@ -549,14 +658,24 @@ llvm::Function* JavaJIT::nativeCompile(w currentBlock); } } - + +#if OSGI_BUNDLE_TIER_TAGGING + initializeChargedTierID(); + calculateChargedTierIDForInvokeNative(); + setChargedTierID(); +#endif + +#if MONITOR_CREATED_OBJECTS_COUNT + incrementTotalCalledMethodsCounter(); +#endif + Value* nativeFunc = TheCompiler->getNativeFunction(compilingMethod, (void*)natPtr); if (TheCompiler->isStaticCompiling()) { Value* Arg = TheCompiler->getMethodInClass(compilingMethod); // If the global variable is null, then load it. - BasicBlock* unloadedBlock = createBasicBlock(""); - BasicBlock* endBlock = createBasicBlock(""); + BasicBlock* unloadedBlock = createBasicBlock("unloadedBlock"); + BasicBlock* endBlock = createBasicBlock("endBlock"); Value* test = new LoadInst(nativeFunc, "", currentBlock); Type* Ty = test->getType(); PHINode* node = PHINode::Create(Ty, 2, "", endBlock); @@ -595,7 +714,7 @@ llvm::Function* JavaJIT::nativeCompile(w Type* Ty = PointerType::getUnqual(intrinsics->JavaObjectType); Constant* C = Constant::getNullValue(Ty); Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, result, C, ""); - BasicBlock* loadBlock = createBasicBlock(""); + BasicBlock* loadBlock = createBasicBlock("loadBlock"); endNode->addIncoming(intrinsics->JavaObjectNullConstant, currentBlock); BranchInst::Create(endBlock, loadBlock, cmp, currentBlock); @@ -612,7 +731,6 @@ llvm::Function* JavaJIT::nativeCompile(w BranchInst::Create(endBlock, currentBlock); - currentBlock = endBlock; Value* Args2[1] = { oldCLIN }; @@ -623,21 +741,31 @@ llvm::Function* JavaJIT::nativeCompile(w if (isSynchro(compilingMethod->access)) endSynchronize(); - BasicBlock* ifNormal = createBasicBlock(""); - BasicBlock* ifException = createBasicBlock(""); - Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr(getMutatorThreadPtr())); + BasicBlock* ifNormal = createBasicBlock("ifNormal"); + BasicBlock* ifException = createBasicBlock("ifException"); + Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr()); Value* obj = new LoadInst(javaExceptionPtr, "", currentBlock); Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, obj, intrinsics->JavaObjectNullConstant, ""); BranchInst::Create(ifException, ifNormal, test, currentBlock); currentBlock = ifException; + +#if OSGI_BUNDLE_TIER_TAGGING + restoreChargedTierID(); +#endif + // Clear exception. new StoreInst(intrinsics->JavaObjectNullConstant, javaExceptionPtr, currentBlock); CallInst::Create(intrinsics->ThrowExceptionFunction, obj, "", currentBlock); new UnreachableInst(*llvmContext, currentBlock); + currentBlock = ifNormal; - + +#if OSGI_BUNDLE_TIER_TAGGING + restoreChargedTierID(); +#endif + if (returnType != Type::getVoidTy(*llvmContext)) ReturnInst::Create(*llvmContext, endNode, currentBlock); else @@ -681,8 +809,8 @@ void JavaJIT::monitorEnter(Value* obj) { Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, atomic, lock, ""); - BasicBlock* OK = createBasicBlock("synchronize passed"); - BasicBlock* NotOK = createBasicBlock("synchronize did not pass"); + BasicBlock* OK = createBasicBlock("synchronizePassed"); + BasicBlock* NotOK = createBasicBlock("synchronizeDidNotPass"); BranchInst::Create(OK, NotOK, cmp, currentBlock); @@ -734,7 +862,7 @@ void JavaJIT::monitorExit(Value* obj) { Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, atomic, oldValMask, ""); - BasicBlock* LockFreeCASFailed = createBasicBlock("Lock-Free CAS Failed"); + BasicBlock* LockFreeCASFailed = createBasicBlock("LockFreeCASFailed"); BranchInst::Create(EndBlock, LockFreeCASFailed, cmp, currentBlock); @@ -1038,28 +1166,34 @@ llvm::Function* JavaJIT::javaCompile() { opcodeInfos[i].exceptionBlock = endExceptionBlock; } + getThreadPtr(); + +#if JAVA_CHARGED_TIER_CALL_STACK + allocateChargedTierID(); +#endif + Instruction* returnValue = NULL; if (returnType == intrinsics->JavaObjectType && TheCompiler->useCooperativeGC()) { - returnValue = new AllocaInst(intrinsics->JavaObjectType, "returnValue", - currentBlock); - Instruction* cast = - new BitCastInst(returnValue, intrinsics->ptrPtrType, "", currentBlock); + returnValue = new AllocaInst( + intrinsics->JavaObjectType, "returnValueStorage", currentBlock); + Instruction* cast = new BitCastInst( + returnValue, intrinsics->ptrPtrType, "returnValue", currentBlock); Value* GCArgs[2] = { cast, intrinsics->constantPtrNull }; CallInst::Create(intrinsics->llvm_gc_gcroot, GCArgs, "", currentBlock); } for (int i = 0; i < maxLocals; i++) { - intLocals.push_back(new AllocaInst(Type::getInt32Ty(*llvmContext), setInstructionName(instName, instNameLen, "int_%d", i), currentBlock)); + intLocals.push_back(new AllocaInst(Type::getInt32Ty(*llvmContext), setInstructionName(instName, instNameLen, "local_int_%d", i), currentBlock)); new StoreInst(Constant::getNullValue(Type::getInt32Ty(*llvmContext)), intLocals.back(), false, currentBlock); - doubleLocals.push_back(new AllocaInst(Type::getDoubleTy(*llvmContext), setInstructionName(instName, instNameLen, "double_%d", i), currentBlock)); + doubleLocals.push_back(new AllocaInst(Type::getDoubleTy(*llvmContext), setInstructionName(instName, instNameLen, "local_double_%d", i), currentBlock)); new StoreInst(Constant::getNullValue(Type::getDoubleTy(*llvmContext)), doubleLocals.back(), false, currentBlock); - longLocals.push_back(new AllocaInst(Type::getInt64Ty(*llvmContext), setInstructionName(instName, instNameLen, "long_%d", i), currentBlock)); + longLocals.push_back(new AllocaInst(Type::getInt64Ty(*llvmContext), setInstructionName(instName, instNameLen, "local_long_%d", i), currentBlock)); new StoreInst(Constant::getNullValue(Type::getInt64Ty(*llvmContext)), longLocals.back(), false, currentBlock); - floatLocals.push_back(new AllocaInst(Type::getFloatTy(*llvmContext), setInstructionName(instName, instNameLen, "float_%d", i), currentBlock)); + floatLocals.push_back(new AllocaInst(Type::getFloatTy(*llvmContext), setInstructionName(instName, instNameLen, "local_float_%d", i), currentBlock)); new StoreInst(Constant::getNullValue(Type::getFloatTy(*llvmContext)), floatLocals.back(), false, currentBlock); - objectLocals.push_back(new AllocaInst(intrinsics->JavaObjectType, setInstructionName(instName, instNameLen, "object_%d", i), currentBlock)); + objectLocals.push_back(new AllocaInst(intrinsics->JavaObjectType, setInstructionName(instName, instNameLen, "local_object_%d", i), currentBlock)); // The GCStrategy will already initialize the value. if (!TheCompiler->useCooperativeGC()) new StoreInst(Constant::getNullValue(intrinsics->JavaObjectType), objectLocals.back(), false, currentBlock); @@ -1131,7 +1265,7 @@ llvm::Function* JavaJIT::javaCompile() { nbHandlers = readExceptionTable(reader, codeLen); if (nbHandlers != 0) { - jmpBuffer = new AllocaInst(ArrayType::get(Type::getInt8Ty(*llvmContext), sizeof(vmkit::ExceptionBuffer)), "", currentBlock); + jmpBuffer = new AllocaInst(ArrayType::get(Type::getInt8Ty(*llvmContext), sizeof(vmkit::ExceptionBuffer)), "exceptionSavePointStorage", currentBlock); jmpBuffer = new BitCastInst(jmpBuffer, intrinsics->ptrType, "exceptionSavePoint", currentBlock); } @@ -1141,9 +1275,17 @@ llvm::Function* JavaJIT::javaCompile() { endBlock = createBasicBlock("end"); if (returnType != Type::getVoidTy(*llvmContext)) { - endNode = llvm::PHINode::Create(returnType, 0, "", endBlock); + endNode = llvm::PHINode::Create(returnType, 0, "returnValuePhi", endBlock); } +#if OSGI_BUNDLE_TIER_TAGGING + initializeChargedTierID(); +#endif + +#if MONITOR_CREATED_OBJECTS_COUNT + incrementTotalCalledMethodsCounter(); +#endif + checkYieldPoint(); if (isSynchro(compilingMethod->access)) { @@ -1165,8 +1307,8 @@ llvm::Function* JavaJIT::javaCompile() { stackCheck = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, stackCheck, intrinsics->constantPtrZero, ""); - BasicBlock* stackOverflow = createBasicBlock("stack overflow"); - BasicBlock* noStackOverflow = createBasicBlock("no stack overflow"); + BasicBlock* stackOverflow = createBasicBlock("stackOverflow"); + BasicBlock* noStackOverflow = createBasicBlock("noStackOverflow"); BranchInst::Create(stackOverflow, noStackOverflow, stackCheck, currentBlock); currentBlock = stackOverflow; @@ -1227,9 +1369,9 @@ llvm::Function* JavaJIT::javaCompile() { currentBlock->eraseFromParent(); } else { if (nbHandlers != 0) { - BasicBlock* ifNormal = createBasicBlock("No exception was thrown"); - BasicBlock* ifException = createBasicBlock("Rethrow Exception"); - Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr(getMutatorThreadPtr())); + BasicBlock* ifNormal = createBasicBlock("noExceptionThrown"); + BasicBlock* ifException = createBasicBlock("reThrowException"); + Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr()); Value* obj = new LoadInst(javaExceptionPtr, "pendingException", currentBlock); Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, obj, intrinsics->JavaObjectNullConstant, ""); BranchInst::Create(ifException, ifNormal, test, currentBlock); @@ -1381,8 +1523,8 @@ void JavaJIT::JITVerifyNull(Value* obj) } else { Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, obj, intrinsics->JavaObjectNullConstant, ""); - BasicBlock* nullObjBlock = createBasicBlock("object is null"); - BasicBlock* notNullObjBlock = createBasicBlock("object is not null"); + BasicBlock* nullObjBlock = createBasicBlock("objectIsNull"); + BasicBlock* notNullObjBlock = createBasicBlock("objectIsNotNull"); BranchInst::Create(nullObjBlock, notNullObjBlock, test, currentBlock); currentBlock = nullObjBlock; @@ -1408,8 +1550,8 @@ Value* JavaJIT::verifyAndComputePtr(Valu Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_ULT, index, size, ""); - BasicBlock* ifTrue = createBasicBlock("true verifyAndComputePtr"); - BasicBlock* ifFalse = createBasicBlock("false verifyAndComputePtr"); + BasicBlock* ifTrue = createBasicBlock("trueVerifyAndComputePtr"); + BasicBlock* ifFalse = createBasicBlock("falseVerifyAndComputePtr"); BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock); @@ -1659,6 +1801,10 @@ void JavaJIT::invokeSpecial(uint16 index func = TheCompiler->getMethod(meth, NULL); } +#if OSGI_BUNDLE_TIER_TAGGING + calculateChargedTierIDForInvokeSpecial(index); +#endif + std::vector args; FunctionType::param_iterator it = virtualType->param_end(); makeArgs(it, index, args, signature->nbArguments + 1); @@ -1688,6 +1834,10 @@ void JavaJIT::invokeSpecial(uint16 index } } } + +#if OSGI_BUNDLE_TIER_TAGGING + resetChargedTierID(); +#endif } void JavaJIT::invokeStatic(uint16 index) { @@ -1708,7 +1858,6 @@ void JavaJIT::invokeStatic(uint16 index) JavaMethod* meth = ctpInfo->infoOfStaticOrSpecialMethod(index, ACC_STATIC, signature); - uint32 clIndex = ctpInfo->getClassIndexFromMethod(index); UserClass* cl = 0; @@ -1717,6 +1866,10 @@ void JavaJIT::invokeStatic(uint16 index) CallInst::Create(intrinsics->ForceInitialisationCheckFunction, Cl, "", currentBlock); } + +#if OSGI_BUNDLE_TIER_TAGGING + calculateChargedTierIDForInvokeStatic(index); +#endif Value* func = 0; bool needsInit = false; @@ -1760,6 +1913,10 @@ void JavaJIT::invokeStatic(uint16 index) } } } + +#if OSGI_BUNDLE_TIER_TAGGING + resetChargedTierID(); +#endif } Value* JavaJIT::getConstantPoolAt(uint32 index, Function* resolver, @@ -1880,7 +2037,11 @@ void JavaJIT::invokeNew(uint16 index) { Size = CallInst::Create(intrinsics->GetObjectSizeFromClassFunction, Cl, "", currentBlock); } - + +#if OSGI_BUNDLE_TIER_TAGGING + calculateChargedTierIDForNew(index); +#endif + VT = new BitCastInst(VT, intrinsics->ptrType, "", currentBlock); Instruction* val = invoke(cl ? intrinsics->VTAllocateFunction : intrinsics->VTAllocateUnresolvedFunction, @@ -1895,6 +2056,10 @@ void JavaJIT::invokeNew(uint16 index) { if (cl && cl->virtualVT->hasDestructor()) { CallInst::Create(intrinsics->AddFinalizationCandidate, val, "", currentBlock); } + +#if OSGI_BUNDLE_TIER_TAGGING + resetChargedTierID(); +#endif } Value* JavaJIT::ldResolved(uint16 index, bool stat, Value* object, @@ -1911,10 +2076,8 @@ Value* JavaJIT::ldResolved(uint16 index, Value* Cl = TheCompiler->getNativeClass(field->classDef); bool needsCheck = needsInitialisationCheck(field->classDef); if (needsCheck) { - Cl = invoke(intrinsics->InitialisationCheckFunction, Cl, "", - currentBlock); - CallInst::Create(intrinsics->ForceInitialisationCheckFunction, Cl, "", - currentBlock); + Cl = invoke(intrinsics->InitialisationCheckFunction, Cl, "", currentBlock); + CallInst::Create(intrinsics->ForceInitialisationCheckFunction, Cl, "", currentBlock); } object = TheCompiler->getStaticInstance(field->classDef); @@ -2180,6 +2343,394 @@ void JavaJIT::getVirtualField(uint16 ind } } +#if JAVA_CHARGED_TIER_CALL_STACK + +void JavaJIT::pushChargedTier() +{ + if (!stackEmbeddedListNode) return; + + // Save the current head of the linked list into the node. + // node->callerNode = (*threadHead); + auto threadHeadPtr = new LoadInst(threadStackEmbeddedListHeadPtrPtr, + "threadHeadPtr", currentBlock); + new StoreInst( + threadHeadPtr, stackEmbeddedListHeadCallerNodePtr, currentBlock); + + // node->data[0] = reinterpret_cast(chargedTierID); + new StoreInst( + chargedTierID, stackEmbeddedListHeadChargedTierPtr, currentBlock); + + // *threadHead = node; + new StoreInst(stackEmbeddedListNode, threadStackEmbeddedListHeadPtrPtr, + true, currentBlock); // volatile = true +} + +void JavaJIT::popChargedTier() +{ + if (!stackEmbeddedListNode) return; + + // Restore the linked list head. + // *threadHead = node->callerNode; + auto callerNode = new LoadInst(stackEmbeddedListHeadCallerNodePtr, + "callerNode", currentBlock); + new StoreInst(callerNode, threadStackEmbeddedListHeadPtrPtr, + true, currentBlock); // volatile = true +} + +void JavaJIT::allocateChargedTierID() +{ + if (TheCompiler->isCompilingGarbageCollector()) return; + + assert(!stackEmbeddedListNode && "stackEmbeddedListNode already allocated"); + + // Allocate stack embedded list node + stackEmbeddedListNode = allocateOnStack("chargedTierNode", + sizeof(vmkit::StackEmbeddedListNode), + intrinsics->StackEmbeddedListNodeType); +} + +#endif + +#if OSGI_BUNDLE_TIER_TAGGING + +void JavaJIT::initializeChargedTierID() +{ + if (TheCompiler->isCompilingGarbageCollector()) return; + + // j3::StackEmbeddedListNode** threadHead = + // thread->stackEmbeddedListHead + StackEmbeddedListIntendedCaller; + threadStackEmbeddedListHeadPtrPtr = + getElementPtr("threadHeadPtrPtr", getThreadPtr(), + intrinsics->constantZero, + intrinsics->OffsetStackEmbeddedListHeadInThreadConstant, + intrinsics->constantZero, nullptr); + + // node->callerNode + stackEmbeddedListHeadCallerNodePtr = getElementPtr( + "callerNodePtr", stackEmbeddedListNode, + intrinsics->constantZero, + intrinsics->OffsetCallerNodeInStackEmbeddedListNodeConstant, nullptr); + + // node->data + 0 + stackEmbeddedListHeadChargedTierPtr = getElementPtr( + "nodeChargedTierPtr", stackEmbeddedListNode, + intrinsics->constantZero, + intrinsics->OffsetDataInStackEmbeddedListNodeConstant, + intrinsics->constantZero, nullptr); + + auto TierIDPtrType = PointerType::getUnqual(intrinsics->TierIDType); + stackEmbeddedListHeadChargedTierPtr = new BitCastInst( + stackEmbeddedListHeadChargedTierPtr, TierIDPtrType, + "nodeChargedTierPtrPtr", currentBlock); + + // Determine our own tier ID + auto vm = JavaThread::get()->getJVM(); + compilingClassTierID = vm->tier_manager.getAccountingConfig(). + getTierOfCommonClass(compilingClass); + + // Retrieve the thread-local charged tier ID + threadChargedTierIDPtr = getElementPtr("threadChargedTierIDPtr", + getThreadPtr(), intrinsics->constantZero, + intrinsics->OffsetChargedTierIDInThreadConstant, nullptr); + + threadChargedTierIDOldValue = new LoadInst(threadChargedTierIDPtr, + "threadChargedTierIDOldValue", true, // volatile = true + currentBlock); + + // We are in method prolog. We received a chargedTierID from the caller. + // If the caller thinks we should be charged, it must pass 0xffffffff, + // otherwise the caller should pass the tier ID to be charged. + + auto threadChargedTierIDIsInvalid = new ICmpInst(*currentBlock, + ICmpInst::ICMP_EQ, threadChargedTierIDOldValue, + intrinsics->InvalidTierIDConstant, "threadChargedTierIDIsInvalid"); + + auto chargeCalledTierID = createBasicBlock("chargeCalledTierID"); + auto chargeCallerTierID = createBasicBlock("chargeCallerTierID"); + auto chargeCalledTierIDEnd = createBasicBlock("chargeCalledTierIDEnd"); + + chargedTierID = PHINode::Create( + intrinsics->TierIDType, 2, "chargedTierID", chargeCalledTierIDEnd); + + BranchInst::Create(chargeCalledTierID, chargeCallerTierID, + threadChargedTierIDIsInvalid, currentBlock); + + // If we should charge the called, then our tier id becomes charged. + currentBlock = chargeCalledTierID; + + chargedTierID->addIncoming(ConstantInt::get(intrinsics->TierIDType, + compilingClassTierID, false), currentBlock); + + BranchInst::Create(chargeCalledTierIDEnd, currentBlock); + + // If we should charge the caller, then the charged continues to be + // the passed tier id. + currentBlock = chargeCallerTierID; + + chargedTierID->addIncoming(threadChargedTierIDOldValue, currentBlock); + + BranchInst::Create(chargeCalledTierIDEnd, currentBlock); + + currentBlock = chargeCalledTierIDEnd; + + newChargedTierID = threadChargedTierIDOldValue; +} + +void JavaJIT::calculateChargedTierIDForInvokeStatic(uint16_t index) +{ + if (!chargedTierID) return; + + // Gather information about the call destination. + const UTF8 *called_class_name = nullptr, *called_method_name = nullptr; + Signdef* signature = nullptr; + compilingClass->ctpInfo->nameOfStaticOrSpecialMethod( + index, called_class_name, called_method_name, signature); + auto method = compilingClass->ctpInfo->infoOfStaticOrSpecialMethod( + index, ACC_STATIC, signature); + + auto called_tier_id = OSGi::runtimeTierID; + const UTF8 *called_bundle_name = nullptr; + if (method != nullptr) { + OSGi::BundleStateMonitor::BundleInfoType::const_iterator info_iterator; + auto vm = JavaThread::get()->getJVM(); + if (vm->bundle_state_monitor.getBundleInfoByClassLoader( + method->classDef->classLoader, info_iterator)) + { + auto& accountingConfig = vm->tier_manager.getAccountingConfig(); + + called_bundle_name = info_iterator->second.name; + called_tier_id = + accountingConfig.getTierOfBundleName(called_bundle_name); + } + } + + calculateChargedTierIDForInvoke(OSGi::CallConfiguration( + compilingClassTierID, called_tier_id, + called_bundle_name, called_class_name, called_method_name)); +} + +void JavaJIT::calculateChargedTierIDForInvokeSpecial(uint16_t index) +{ + if (!chargedTierID) return; + + // Gather information about the call destination. + const UTF8 *called_class_name = nullptr, *called_method_name = nullptr; + Signdef* signature = nullptr; + compilingClass->ctpInfo->nameOfStaticOrSpecialMethod( + index, called_class_name, called_method_name, signature); + auto method = compilingClass->ctpInfo->infoOfStaticOrSpecialMethod( + index, ACC_VIRTUAL, signature); + + auto called_tier_id = OSGi::runtimeTierID; + const UTF8 *called_bundle_name = nullptr; + if (method != nullptr) { + OSGi::BundleStateMonitor::BundleInfoType::const_iterator info_iterator; + auto vm = JavaThread::get()->getJVM(); + if (vm->bundle_state_monitor.getBundleInfoByClassLoader( + method->classDef->classLoader, info_iterator)) + { + auto& accountingConfig = vm->tier_manager.getAccountingConfig(); + + called_bundle_name = info_iterator->second.name; + called_tier_id = + accountingConfig.getTierOfBundleName(called_bundle_name); + } + } + + calculateChargedTierIDForInvoke(OSGi::CallConfiguration( + compilingClassTierID, called_tier_id, + called_bundle_name, called_class_name, called_method_name)); +} + +void JavaJIT::calculateChargedTierIDForInvokeInterface(uint16_t index) +{ + if (!chargedTierID) return; + + // Gather information about the call destination. + auto vm = JavaThread::get()->getJVM(); + auto& accountingConfig = vm->tier_manager.getAccountingConfig(); + const UTF8* called_method_name = nullptr; + compilingClass->ctpInfo->infoOfInterfaceOrVirtualMethod( + index, called_method_name); + + CommonClass* cl = nullptr; + JavaMethod* meth = nullptr; + compilingClass->ctpInfo->infoOfMethod(index, ACC_VIRTUAL, cl, meth); + + auto called_tier_id = OSGi::runtimeTierID; + const UTF8 *called_bundle_name = nullptr, *called_interface_name = nullptr; + if (cl != nullptr) { + called_interface_name = cl->name; + + OSGi::BundleStateMonitor::BundleInfoType::const_iterator info_iterator; + if (vm->bundle_state_monitor.getBundleInfoByClassLoader( + cl->classLoader, info_iterator)) + { + called_bundle_name = info_iterator->second.name; + called_tier_id = + accountingConfig.getTierOfBundleName(called_bundle_name); + } + } else { + auto entry = compilingClass->ctpInfo->ctpDef[index]; + uint32 class_index = entry >> 16; + auto class_entry = compilingClass->ctpInfo->ctpDef[class_index]; + called_interface_name = compilingClass->ctpInfo->UTF8At(class_entry); + } + + calculateChargedTierIDForInvoke(OSGi::CallConfiguration( + compilingClassTierID, called_tier_id, + called_bundle_name, called_interface_name, called_method_name)); +} + +void JavaJIT::calculateChargedTierIDForInvokeVirtual(uint16_t index) +{ + if (!chargedTierID) return; + + // Gather information about the call destination. + auto vm = JavaThread::get()->getJVM(); + auto& accountingConfig = vm->tier_manager.getAccountingConfig(); + const UTF8* called_method_name = nullptr; + compilingClass->ctpInfo->infoOfInterfaceOrVirtualMethod( + index, called_method_name); + + CommonClass* cl = nullptr; + JavaMethod* meth = nullptr; + compilingClass->ctpInfo->infoOfMethod(index, ACC_VIRTUAL, cl, meth); + + auto called_tier_id = OSGi::runtimeTierID; + const UTF8 *called_bundle_name = nullptr, *called_interface_name = nullptr; + if (cl != nullptr) { + called_interface_name = cl->name; + + OSGi::BundleStateMonitor::BundleInfoType::const_iterator info_iterator; + if (vm->bundle_state_monitor.getBundleInfoByClassLoader( + cl->classLoader, info_iterator)) + { + called_bundle_name = info_iterator->second.name; + called_tier_id = + accountingConfig.getTierOfBundleName(called_bundle_name); + } + } else { + auto entry = compilingClass->ctpInfo->ctpDef[index]; + uint32 class_index = entry >> 16; + auto class_entry = compilingClass->ctpInfo->ctpDef[class_index]; + called_interface_name = compilingClass->ctpInfo->UTF8At(class_entry); + } + + calculateChargedTierIDForInvoke(OSGi::CallConfiguration( + compilingClassTierID, called_tier_id, + called_bundle_name, called_interface_name, called_method_name)); +} + +void JavaJIT::calculateChargedTierIDForInvokeNative() +{ + if (!chargedTierID) return; + + // Gather information about the call destination. + auto called_method_name = compilingMethod->name; + + auto called_tier_id = OSGi::runtimeTierID; + const UTF8 *called_bundle_name = nullptr, *called_class_name = nullptr; + if (compilingMethod->classDef != nullptr) { + called_class_name = compilingMethod->classDef->name; + + OSGi::BundleStateMonitor::BundleInfoType::const_iterator info_iterator; + auto vm = JavaThread::get()->getJVM(); + if (vm->bundle_state_monitor.getBundleInfoByClassLoader( + compilingMethod->classDef->classLoader, info_iterator)) + { + auto& accountingConfig = vm->tier_manager.getAccountingConfig(); + + called_bundle_name = info_iterator->second.name; + called_tier_id = + accountingConfig.getTierOfBundleName(called_bundle_name); + } + } + + calculateChargedTierIDForInvoke(OSGi::CallConfiguration( + compilingClassTierID, called_tier_id, + called_bundle_name, called_class_name, called_method_name)); +} + +void JavaJIT::calculateChargedTierIDForNew(uint16_t index) +{ + // Gather information about the call destination. + auto called_method_name = upcalls->InitObject->name; + const UTF8 *called_class_name = nullptr, *called_bundle_name = nullptr; + + auto called_tier_id = OSGi::runtimeTierID; + Class* cl = nullptr; + getResolvedClass(index, false, false, &cl); + if (cl != nullptr) { + called_class_name = cl->name; + + auto vm = JavaThread::get()->getJVM(); + OSGi::BundleStateMonitor::BundleInfoType::const_iterator info_iterator; + if (vm->bundle_state_monitor.getBundleInfoByClassLoader( + cl->classLoader, info_iterator)) + { + auto& accountingConfig = vm->tier_manager.getAccountingConfig(); + + called_bundle_name = info_iterator->second.name; + called_tier_id = + accountingConfig.getTierOfBundleName(called_bundle_name); + } + } else { + called_class_name = compilingClass->ctpInfo->resolveClassName(index); + } + + calculateChargedTierIDForInvoke(OSGi::CallConfiguration( + compilingClassTierID, called_tier_id, + called_bundle_name, called_class_name, called_method_name)); +} + +void JavaJIT::calculateChargedTierIDForInvoke(const OSGi::CallConfiguration& cc) +{ + // Decide who should be charged for this call. + auto& accountingConfig = + JavaThread::get()->getJVM()->tier_manager.getAccountingConfig(); + auto chargeToCaller = accountingConfig.isAccountingChargedToCaller(cc); + + // If the caller is charged then pass the currently charged tier id, which + // is either our own tier id, or the tier is that was passed by our caller. + // If the called is charged then pass "invalidTierID", and the called + // method will change the currently charged tier id to its own + // implementation tier id. + newChargedTierID = (chargeToCaller ? + static_cast(chargedTierID) : + static_cast(intrinsics->InvalidTierIDConstant)); +} + +void JavaJIT::setChargedTierID() +{ +#if EMBEDDED_LIST_UPDATE + if (!chargedTierID) return; + + new StoreInst(newChargedTierID, threadChargedTierIDPtr, currentBlock); + + pushChargedTier(); +#endif +} + +void JavaJIT::resetChargedTierID() +{ + if (!chargedTierID) return; + + newChargedTierID = threadChargedTierIDOldValue; +} + +void JavaJIT::restoreChargedTierID() +{ +#if EMBEDDED_LIST_UPDATE + if (!chargedTierID) return; + + new StoreInst(threadChargedTierIDOldValue, threadChargedTierIDPtr, currentBlock); + + popChargedTier(); +#endif +} + +#endif void JavaJIT::invokeInterface(uint16 index) { @@ -2321,6 +2872,10 @@ void JavaJIT::invokeInterface(uint16 ind node = new BitCastInst(node, virtualPtrType, "", currentBlock); #endif +#if OSGI_BUNDLE_TIER_TAGGING + calculateChargedTierIDForInvokeInterface(index); +#endif + std::vector args; // size = [signature->nbIn + 3]; FunctionType::param_iterator it = virtualType->param_end(); makeArgs(it, index, args, signature->nbArguments + 1); @@ -2337,6 +2892,10 @@ void JavaJIT::invokeInterface(uint16 ind } } } + +#if OSGI_BUNDLE_TIER_TAGGING + resetChargedTierID(); +#endif } DebugLoc JavaJIT::CreateLocation() { @@ -2345,14 +2904,13 @@ DebugLoc JavaJIT::CreateLocation() { } Instruction* JavaJIT::invoke(Value *F, std::vector& args, - const char* Name, - BasicBlock *InsertAtEnd) { + const char* Name, BasicBlock *InsertAtEnd) { assert(!inlining); BasicBlock* ifException = NULL; if (jmpBuffer != NULL) { - BasicBlock* doCall = createBasicBlock("Perform call"); - ifException = createBasicBlock("Exception thrown"); + BasicBlock* doCall = createBasicBlock("performCall"); + ifException = createBasicBlock("exceptionThrown"); Instruction* check = CallInst::Create(intrinsics->SetjmpFunction, jmpBuffer, "", currentBlock); check = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, check, intrinsics->constantZero, ""); BranchInst::Create(doCall, ifException, check, currentBlock); @@ -2360,17 +2918,31 @@ Instruction* JavaJIT::invoke(Value *F, s CallInst::Create(intrinsics->RegisterSetjmpFunction, jmpBuffer, "", currentBlock); } +#if OSGI_BUNDLE_TIER_TAGGING + setChargedTierID(); +#endif + Instruction* res = CallInst::Create(F, args, Name, currentBlock); DebugLoc DL = CreateLocation(); res->setDebugLoc(DL); - + +#if OSGI_BUNDLE_TIER_TAGGING + restoreChargedTierID(); +#endif + if (jmpBuffer != NULL) { CallInst::Create(intrinsics->UnregisterSetjmpFunction, jmpBuffer, "", currentBlock); - BasicBlock* ifNormal = createBasicBlock("no exception block"); + BasicBlock* ifNormal = createBasicBlock("noExceptionBlock"); BranchInst::Create(ifNormal, currentBlock); currentBlock = ifException; + +#if OSGI_BUNDLE_TIER_TAGGING + restoreChargedTierID(); +#endif + CallInst::Create(intrinsics->UnregisterSetjmpFunction, jmpBuffer, "", currentBlock); + BranchInst::Create(currentExceptionBlock, currentBlock); currentBlock = ifNormal; } @@ -2379,14 +2951,14 @@ Instruction* JavaJIT::invoke(Value *F, s } Instruction* JavaJIT::invoke(Value *F, Value* arg1, const char* Name, - BasicBlock *InsertAtEnd) { + BasicBlock *InsertAtEnd) { std::vector args; args.push_back(arg1); return invoke(F, args, Name, InsertAtEnd); } Instruction* JavaJIT::invoke(Value *F, Value* arg1, Value* arg2, - const char* Name, BasicBlock *InsertAtEnd) { + const char* Name, BasicBlock *InsertAtEnd) { std::vector args; args.push_back(arg1); args.push_back(arg2); @@ -2394,7 +2966,7 @@ Instruction* JavaJIT::invoke(Value *F, V } Instruction* JavaJIT::invoke(Value *F, const char* Name, - BasicBlock *InsertAtEnd) { + BasicBlock *InsertAtEnd) { std::vector args; return invoke(F, args, Name, InsertAtEnd); } @@ -2405,7 +2977,7 @@ void JavaJIT::throwException(Value* obj, CallInst::Create(intrinsics->ThrowExceptionFunction, obj, "", currentBlock); new UnreachableInst(*llvmContext, currentBlock); } else { - Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr(getMutatorThreadPtr())); + Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr()); if (vmkit::Collector::needsNonHeapWriteBarrier()) { Instruction* ptr = new BitCastInst(javaExceptionPtr, intrinsics->ptrPtrType, "", currentBlock); Instruction* val = new BitCastInst(obj, intrinsics->ptrType, "", currentBlock); @@ -2557,7 +3129,7 @@ unsigned JavaJIT::readExceptionTable(Rea Value* VTVar = TheCompiler->getVirtualTable(cur->catchClass->virtualVT); // Get the Java exception. - Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr(getMutatorThreadPtr())); + Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr()); Value* obj = new LoadInst(javaExceptionPtr, "pendingException", currentBlock); Value* objVT = CallInst::Create(intrinsics->GetVTFunction, obj, "objectVT", Modified: vmkit/branches/memory-monitor/lib/j3/Compiler/JavaJIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/Compiler/JavaJIT.h?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/Compiler/JavaJIT.h (original) +++ vmkit/branches/memory-monitor/lib/j3/Compiler/JavaJIT.h Thu Oct 9 03:43:38 2014 @@ -31,6 +31,8 @@ #include "JavaClass.h" #include "JavaUpcalls.h" +#include "AccountingConfiguration.h" + namespace j3 { class Class; @@ -107,6 +109,25 @@ public: overridesThis = false; nbHandlers = 0; jmpBuffer = NULL; + currentThreadPtr = nullptr; + +#if JAVA_CHARGED_TIER_CALL_STACK + chargedTierID = nullptr; + stackEmbeddedListHeadChargedTierPtr = nullptr; +#endif + +#if OSGI_BUNDLE_TIER_TAGGING + threadChargedTierIDPtr = nullptr; + threadChargedTierIDOldValue = nullptr; + newChargedTierID = nullptr; + compilingClassTierID = OSGi::runtimeTierID; +#endif + +#if EMBEDDED_LIST_IN_CALL_STACK + stackEmbeddedListNode = nullptr; + threadStackEmbeddedListHeadPtrPtr = nullptr; + stackEmbeddedListHeadCallerNodePtr = nullptr; +#endif } /// javaCompile - Compile the Java method. @@ -168,6 +189,8 @@ private: llvm::Value* jmpBuffer; + llvm::Value* currentThreadPtr; + /// return the header of an object llvm::Value* objectToHeader(llvm::Value* obj); @@ -182,6 +205,8 @@ private: llvm::BasicBlock* currentBlock, bool usign); /// getMutatorThreadPtr - Emit code to get a pointer to the current MutatorThread. + llvm::Value* getThreadPtr(); + llvm::Value* getJavaThreadPtr(); llvm::Value* getMutatorThreadPtr(); /// getIsolateIDPtr - Emit code to get a pointer to IsolateID. @@ -570,6 +595,49 @@ private: //===--------------------- Yield point support ---------------------------===// void checkYieldPoint(); + + llvm::Value* getElementPtr( + const char *name, llvm::Value* element, llvm::Value* firstIndex, ...); + llvm::Value* allocateOnStack( + const char* name, size_t byteCount, llvm::Type* realType); + +#if JAVA_CHARGED_TIER_CALL_STACK + void allocateChargedTierID(); + void pushChargedTier(); + void popChargedTier(); + + llvm::PHINode* chargedTierID; + llvm::Value* stackEmbeddedListHeadChargedTierPtr; +#endif + +#if OSGI_BUNDLE_TIER_TAGGING + void initializeChargedTierID(); + void setChargedTierID(); + void resetChargedTierID(); + void restoreChargedTierID(); + void calculateChargedTierIDForInvoke(const OSGi::CallConfiguration&); + void calculateChargedTierIDForInvokeStatic(uint16_t index); + void calculateChargedTierIDForInvokeSpecial(uint16_t index); + void calculateChargedTierIDForInvokeInterface(uint16_t index); + void calculateChargedTierIDForInvokeVirtual(uint16_t index); + void calculateChargedTierIDForInvokeNative(); + void calculateChargedTierIDForNew(uint16_t index); + + OSGi::tier_id_t compilingClassTierID; + llvm::Value* threadChargedTierIDPtr; + llvm::Value* threadChargedTierIDOldValue; + llvm::Value* newChargedTierID; +#endif + +#if EMBEDDED_LIST_IN_CALL_STACK + llvm::Value* stackEmbeddedListNode; + llvm::Value* threadStackEmbeddedListHeadPtrPtr; + llvm::Value* stackEmbeddedListHeadCallerNodePtr; +#endif + +#if MONITOR_CREATED_OBJECTS_COUNT + void incrementTotalCalledMethodsCounter(); +#endif }; enum Opcode { Modified: vmkit/branches/memory-monitor/lib/j3/Compiler/JavaJITOpcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/Compiler/JavaJITOpcodes.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/Compiler/JavaJITOpcodes.cpp (original) +++ vmkit/branches/memory-monitor/lib/j3/Compiler/JavaJITOpcodes.cpp Thu Oct 9 03:43:38 2014 @@ -376,7 +376,7 @@ void JavaJIT::compileOpcodes(Reader& rea stack.clear(); if (opinfo->handler) { // If it's a handler, put the exception object in the stack. - Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr(getMutatorThreadPtr())); + Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr()); Value* obj = new LoadInst(javaExceptionPtr, "pendingException", currentBlock); new StoreInst(obj, objectStack[0], "", currentBlock); // And clear the exception. @@ -940,10 +940,10 @@ void JavaJIT::compileOpcodes(Reader& rea Value* res = 0; if (TheCompiler->isStaticCompiling()) { - BasicBlock* endBlock = createBasicBlock("end array store check"); - BasicBlock* checkBlock = createBasicBlock("array store check"); + BasicBlock* endBlock = createBasicBlock("endArrayStoreCheck"); + BasicBlock* checkBlock = createBasicBlock("arrayStoreCheck"); BasicBlock* exceptionBlock = - createBasicBlock("array store exception"); + createBasicBlock("arrayStoreException"); Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val, intrinsics->JavaObjectNullConstant, ""); @@ -1262,8 +1262,8 @@ void JavaJIT::compileOpcodes(Reader& rea if (TheCompiler->hasExceptionsEnabled()) { Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val2, intrinsics->constantZero, ""); - BasicBlock* ifFalse = createBasicBlock("non null div"); - BasicBlock* ifTrue = createBasicBlock("null div"); + BasicBlock* ifFalse = createBasicBlock("nonNullDiv"); + BasicBlock* ifTrue = createBasicBlock("nullDiv"); BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock); currentBlock = ifTrue; @@ -1272,9 +1272,9 @@ void JavaJIT::compileOpcodes(Reader& rea } Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val2, intrinsics->constantMinusOne, ""); - BasicBlock* ifFalse = createBasicBlock("non -1 div"); - BasicBlock* ifTrue = createBasicBlock("-1 div"); - BasicBlock* endBlock = createBasicBlock("End division"); + BasicBlock* ifFalse = createBasicBlock("nonMinusOneDiv"); + BasicBlock* ifTrue = createBasicBlock("minusOneDiv"); + BasicBlock* endBlock = createBasicBlock("endDivision"); PHINode* node = PHINode::Create(val1->getType(), 2, "", endBlock); BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock); currentBlock = ifTrue; @@ -1300,8 +1300,8 @@ void JavaJIT::compileOpcodes(Reader& rea if (TheCompiler->hasExceptionsEnabled()) { Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val2, intrinsics->constantLongZero, ""); - BasicBlock* ifFalse = createBasicBlock("non null div"); - BasicBlock* ifTrue = createBasicBlock("null div"); + BasicBlock* ifFalse = createBasicBlock("nonNullDiv"); + BasicBlock* ifTrue = createBasicBlock("nullDiv"); BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock); currentBlock = ifTrue; @@ -1339,8 +1339,8 @@ void JavaJIT::compileOpcodes(Reader& rea if (TheCompiler->hasExceptionsEnabled()) { Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val2, intrinsics->constantZero, ""); - BasicBlock* ifFalse = createBasicBlock("non null rem"); - BasicBlock* ifTrue = createBasicBlock("null rem"); + BasicBlock* ifFalse = createBasicBlock("nonNullRem"); + BasicBlock* ifTrue = createBasicBlock("nullRem"); BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock); currentBlock = ifTrue; @@ -1349,8 +1349,8 @@ void JavaJIT::compileOpcodes(Reader& rea } Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val2, intrinsics->constantMinusOne, ""); - BasicBlock* ifFalse = createBasicBlock("non -1 rem"); - BasicBlock* endBlock = createBasicBlock("end block"); + BasicBlock* ifFalse = createBasicBlock("nonMinusOneRem"); + BasicBlock* endBlock = createBasicBlock("endBlock"); PHINode* node = PHINode::Create(val1->getType(), 2, "", endBlock); node->addIncoming(intrinsics->constantZero, currentBlock); BranchInst::Create(endBlock, ifFalse, cmp, currentBlock); @@ -1372,8 +1372,8 @@ void JavaJIT::compileOpcodes(Reader& rea if (TheCompiler->hasExceptionsEnabled()) { Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val2, intrinsics->constantLongZero, ""); - BasicBlock* ifFalse = createBasicBlock("non null div"); - BasicBlock* ifTrue = createBasicBlock("null div"); + BasicBlock* ifFalse = createBasicBlock("nonNullDiv"); + BasicBlock* ifTrue = createBasicBlock("nullDiv"); BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock); currentBlock = ifTrue; @@ -1911,7 +1911,7 @@ void JavaJIT::compileOpcodes(Reader& rea Constant* val = Constant::getNullValue(type); llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, op, val, ""); - BasicBlock* ifFalse = createBasicBlock("false IFEQ"); + BasicBlock* ifFalse = createBasicBlock("falseIFEQ"); branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo); currentBlock = ifFalse; break; @@ -1928,7 +1928,7 @@ void JavaJIT::compileOpcodes(Reader& rea Constant* val = Constant::getNullValue(type); llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, op, val, ""); - BasicBlock* ifFalse = createBasicBlock("false IFNE"); + BasicBlock* ifFalse = createBasicBlock("falseIFNE"); branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo); currentBlock = ifFalse; break; @@ -1944,7 +1944,7 @@ void JavaJIT::compileOpcodes(Reader& rea Constant* val = Constant::getNullValue(type); llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_SLT, op, val, ""); - BasicBlock* ifFalse = createBasicBlock("false IFLT"); + BasicBlock* ifFalse = createBasicBlock("falseIFLT"); branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo); currentBlock = ifFalse; break; @@ -1960,7 +1960,7 @@ void JavaJIT::compileOpcodes(Reader& rea Constant* val = Constant::getNullValue(type); llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_SGE, op, val, ""); - BasicBlock* ifFalse = createBasicBlock("false IFGE"); + BasicBlock* ifFalse = createBasicBlock("falseIFGE"); branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo); currentBlock = ifFalse; break; @@ -1976,7 +1976,7 @@ void JavaJIT::compileOpcodes(Reader& rea Constant* val = Constant::getNullValue(type); llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_SGT, op, val, ""); - BasicBlock* ifFalse = createBasicBlock("false IFGT"); + BasicBlock* ifFalse = createBasicBlock("falseIFGT"); branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo); currentBlock = ifFalse; break; @@ -1992,7 +1992,7 @@ void JavaJIT::compileOpcodes(Reader& rea Constant* val = Constant::getNullValue(type); llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_SLE, op, val, ""); - BasicBlock* ifFalse = createBasicBlock("false IFLE"); + BasicBlock* ifFalse = createBasicBlock("falseIFLE"); branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo); currentBlock = ifFalse; break; @@ -2007,7 +2007,7 @@ void JavaJIT::compileOpcodes(Reader& rea BasicBlock* ifTrue = ifTrueInfo.newBlock; llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val1, val2, ""); - BasicBlock* ifFalse = createBasicBlock("false IF_ICMPEQ"); + BasicBlock* ifFalse = createBasicBlock("falseIF_ICMPEQ"); branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo); currentBlock = ifFalse; break; @@ -2022,7 +2022,7 @@ void JavaJIT::compileOpcodes(Reader& rea BasicBlock* ifTrue = ifTrueInfo.newBlock; llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, val1, val2, ""); - BasicBlock* ifFalse = createBasicBlock("false IF_ICMPNE"); + BasicBlock* ifFalse = createBasicBlock("falseIF_ICMPNE"); branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo); currentBlock = ifFalse; break; @@ -2037,7 +2037,7 @@ void JavaJIT::compileOpcodes(Reader& rea BasicBlock* ifTrue = ifTrueInfo.newBlock; llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_SLT, val1, val2, ""); - BasicBlock* ifFalse = createBasicBlock("false IF_IFCMPLT"); + BasicBlock* ifFalse = createBasicBlock("falseIF_IFCMPLT"); branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo); currentBlock = ifFalse; break; @@ -2052,7 +2052,7 @@ void JavaJIT::compileOpcodes(Reader& rea BasicBlock* ifTrue = ifTrueInfo.newBlock; llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_SGE, val1, val2, ""); - BasicBlock* ifFalse = createBasicBlock("false IF_ICMPGE"); + BasicBlock* ifFalse = createBasicBlock("falseIF_ICMPGE"); branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo); currentBlock = ifFalse; break; @@ -2067,7 +2067,7 @@ void JavaJIT::compileOpcodes(Reader& rea BasicBlock* ifTrue = ifTrueInfo.newBlock; llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_SGT, val1, val2, ""); - BasicBlock* ifFalse = createBasicBlock("false IF_ICMPGT"); + BasicBlock* ifFalse = createBasicBlock("falseIF_ICMPGT"); branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo); currentBlock = ifFalse; break; @@ -2082,7 +2082,7 @@ void JavaJIT::compileOpcodes(Reader& rea BasicBlock* ifTrue = ifTrueInfo.newBlock; llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_SLE, val1, val2, ""); - BasicBlock* ifFalse = createBasicBlock("false IF_ICMPLE"); + BasicBlock* ifFalse = createBasicBlock("falseIF_ICMPLE"); branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo); currentBlock = ifFalse; break; @@ -2097,7 +2097,7 @@ void JavaJIT::compileOpcodes(Reader& rea BasicBlock* ifTrue = ifTrueInfo.newBlock; llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val1, val2, ""); - BasicBlock* ifFalse = createBasicBlock("false IF_ACMPEQ"); + BasicBlock* ifFalse = createBasicBlock("falseIF_ACMPEQ"); branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo); currentBlock = ifFalse; break; @@ -2112,7 +2112,7 @@ void JavaJIT::compileOpcodes(Reader& rea BasicBlock* ifTrue = ifTrueInfo.newBlock; llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, val1, val2, ""); - BasicBlock* ifFalse = createBasicBlock("false IF_ACMPNE"); + BasicBlock* ifFalse = createBasicBlock("falseIF_ACMPNE"); branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo); currentBlock = ifFalse; break; @@ -2178,7 +2178,7 @@ void JavaJIT::compileOpcodes(Reader& rea for (sint32 cur = low; cur < high; ++cur) { Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, ConstantInt::get(type, cur), index, ""); - BasicBlock* falseBlock = createBasicBlock("continue tableswitch"); + BasicBlock* falseBlock = createBasicBlock("continueTableswitch"); Opinfo& info = opcodeInfos[tmp + reader.readU4()]; i += 4; branch(cmp, info.newBlock, falseBlock, currentBlock, info); @@ -2208,7 +2208,7 @@ void JavaJIT::compileOpcodes(Reader& rea i += 4; Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val, key, ""); - BasicBlock* falseBlock = createBasicBlock("continue lookupswitch"); + BasicBlock* falseBlock = createBasicBlock("continueLookupswitch"); Opinfo& info = opcodeInfos[tmp + reader.readU4()]; i += 4; branch(cmp, info.newBlock, falseBlock, currentBlock, info); @@ -2420,7 +2420,7 @@ void JavaJIT::compileOpcodes(Reader& rea "", currentBlock); TheVT = new BitCastInst(TheVT, intrinsics->ptrType, "", currentBlock); Instruction* res = invoke(intrinsics->VTAllocateFunction, size, TheVT, "", - currentBlock); + currentBlock); Value* cast = new BitCastInst(res, intrinsics->JavaArrayType, "", currentBlock); @@ -2474,22 +2474,22 @@ void JavaJIT::compileOpcodes(Reader& rea Value* args[2] = { obj, clVar }; Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, obj, intrinsics->JavaObjectNullConstant, ""); - BasicBlock* endBlock = createBasicBlock("end type compare"); + BasicBlock* endBlock = createBasicBlock("endTypeCompare"); PHINode* node = PHINode::Create(Type::getInt1Ty(*llvmContext), 2, "", endBlock); if (checkcast) { - exceptionCheckcast = createBasicBlock("false checkcast"); + exceptionCheckcast = createBasicBlock("falseCheckcast"); - endCheckcast = createBasicBlock("null checkcast"); - BasicBlock* ifFalse = createBasicBlock("non null checkcast"); + endCheckcast = createBasicBlock("nullCheckcast"); + BasicBlock* ifFalse = createBasicBlock("nonNullCheckcast"); BranchInst::Create(endCheckcast, ifFalse, cmp, currentBlock); currentBlock = exceptionCheckcast; throwRuntimeException(intrinsics->ClassCastExceptionFunction, args, 2); currentBlock = ifFalse; } else { - BasicBlock* ifFalse = createBasicBlock("false type compare"); + BasicBlock* ifFalse = createBasicBlock("falseTypeCompare"); BranchInst::Create(endBlock, ifFalse, cmp, currentBlock); node->addIncoming(ConstantInt::getFalse(*llvmContext), currentBlock); currentBlock = ifFalse; @@ -2607,7 +2607,7 @@ void JavaJIT::compileOpcodes(Reader& rea Constant* nil = Constant::getNullValue(val->getType()); llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val, nil, ""); - BasicBlock* ifFalse = createBasicBlock("true IFNULL"); + BasicBlock* ifFalse = createBasicBlock("trueIFNULL"); Opinfo& ifTrueInfo = opcodeInfos[tmp + reader.readS2()]; i += 2; BasicBlock* ifTrue = ifTrueInfo.newBlock; @@ -2622,7 +2622,7 @@ void JavaJIT::compileOpcodes(Reader& rea Constant* nil = Constant::getNullValue(val->getType()); llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, val, nil, ""); - BasicBlock* ifFalse = createBasicBlock("false IFNONNULL"); + BasicBlock* ifFalse = createBasicBlock("falseIFNONNULL"); Opinfo& ifTrueInfo = opcodeInfos[tmp + reader.readS2()]; i += 2; BasicBlock* ifTrue = ifTrueInfo.newBlock; Modified: vmkit/branches/memory-monitor/lib/j3/Compiler/LowerConstantCalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/Compiler/LowerConstantCalls.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/Compiler/LowerConstantCalls.cpp (original) +++ vmkit/branches/memory-monitor/lib/j3/Compiler/LowerConstantCalls.cpp Thu Oct 9 03:43:38 2014 @@ -287,8 +287,8 @@ bool LowerConstantCalls::runOnFunction(F Value* cmp = new ICmpInst(CI, ICmpInst::ICMP_EQ, Del, intrinsics->JavaObjectNullConstant, ""); - BasicBlock* NoDelegatee = BasicBlock::Create(*Context, "No delegatee", &F); - BasicBlock* DelegateeOK = BasicBlock::Create(*Context, "Delegatee OK", &F); + BasicBlock* NoDelegatee = BasicBlock::Create(*Context, "noDelegatee", &F); + BasicBlock* DelegateeOK = BasicBlock::Create(*Context, "delegateeOK", &F); BranchInst::Create(NoDelegatee, DelegateeOK, cmp, CI); PHINode* phi = PHINode::Create(intrinsics->JavaObjectType, 2, "", DelegateeOK); phi->addIncoming(Del, CI->getParent()); @@ -398,8 +398,8 @@ bool LowerConstantCalls::runOnFunction(F Value* test = new ICmpInst(CI, ICmpInst::ICMP_EQ, arg1, intrinsics->constantPtrNull, ""); - BasicBlock* trueCl = BasicBlock::Create(*Context, "Ctp OK", &F); - BasicBlock* falseCl = BasicBlock::Create(*Context, "Ctp Not OK", &F); + BasicBlock* trueCl = BasicBlock::Create(*Context, "CtpOK", &F); + BasicBlock* falseCl = BasicBlock::Create(*Context, "CtpNotOK", &F); PHINode* node = llvm::PHINode::Create(returnType, 2, "", trueCl); node->addIncoming(arg1, CI->getParent()); BranchInst::Create(falseCl, trueCl, test, CI); @@ -465,8 +465,8 @@ bool LowerConstantCalls::runOnFunction(F Value* cmp = new ICmpInst(CI, ICmpInst::ICMP_EQ, LoadedGV, init, ""); - BasicBlock* OKBlock = BasicBlock::Create(*Context, "", &F); - BasicBlock* NotOKBlock = BasicBlock::Create(*Context, "", &F); + BasicBlock* OKBlock = BasicBlock::Create(*Context, "OK", &F); + BasicBlock* NotOKBlock = BasicBlock::Create(*Context, "NotOK", &F); PHINode* node = PHINode::Create(intrinsics->VTType, 2, "", OKBlock); node->addIncoming(LoadedGV, CI->getParent()); @@ -509,8 +509,8 @@ bool LowerConstantCalls::runOnFunction(F BasicBlock* EndBlock = II->getParent()->splitBasicBlock(II); I->getParent()->getTerminator()->eraseFromParent(); - BasicBlock* CurEndBlock = BasicBlock::Create(*Context, "", &F); - BasicBlock* FailedBlock = BasicBlock::Create(*Context, "", &F); + BasicBlock* CurEndBlock = BasicBlock::Create(*Context, "currentEnd", &F); + BasicBlock* FailedBlock = BasicBlock::Create(*Context, "failed", &F); PHINode* node = PHINode::Create(Type::getInt1Ty(*Context), 2, "", CurEndBlock); ConstantInt* CC = ConstantInt::get(Type::getInt32Ty(*Context), Modified: vmkit/branches/memory-monitor/lib/j3/LLVMRuntime/runtime-default.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/LLVMRuntime/runtime-default.ll?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/LLVMRuntime/runtime-default.ll (original) +++ vmkit/branches/memory-monitor/lib/j3/LLVMRuntime/runtime-default.ll Thu Oct 9 03:43:38 2014 @@ -27,6 +27,10 @@ ;;; Field 2: The static instance %TaskClassMirror = type { i8, i1, i8* } +;;; Field 0: callerNode +;;; Field 1: data +%StackEmbeddedListNode = type { %StackEmbeddedListNode*, [1 x i8*] } + %CircularBase = type { %VT*, %CircularBase*, %CircularBase* } ;;; Field 0: the parent (circular base) @@ -41,7 +45,13 @@ ;;; field 9: void* routine ;;; field 10: void* lastKnownFrame ;;; field 11: void* lastExceptionBuffer -%Thread = type { %CircularBase, i32, i8*, i8*, i1, i1, i1, i8*, i8*, i8*, i8*, i8* } +;;; field 12: uint32_t chargedTierID +;;; field 13: void* stackEmbeddedListHead ( 1 = vmkit::StackEmbeddedListNodeCountPerThread ) +;;; field 14: uint64_t total_called_methods_count +%Thread = type { + %CircularBase, i32, i8*, i8*, i1, i1, i1, i8*, i8*, i8*, i8*, i8*, i32, + [1 x %StackEmbeddedListNode*], i64 +} %JavaThread = type { %MutatorThread, i8*, %JavaObject* } @@ -184,7 +194,7 @@ declare i8* @getConstantPoolAt(i8* (%Jav ;;; j3VirtualTableLookup - Look up the offset in a virtual table of a ;;; specific function. -declare i32 @j3VirtualTableLookup(%JavaClass*, i32, i32*, %JavaObject*) +declare %JavaMethod* @j3VirtualTableLookup(%JavaClass*, i32, %JavaMethod**, %JavaObject*) ;;; j3ClassLookup - Look up a specific class. The function takes a class and ;;; an index to lookup in the constant pool and returns and stores it in the @@ -276,3 +286,5 @@ declare void @j3StartJNI(i32*, i32**, i8 declare void @j3PrintExecution(i32, i32, %JavaMethod*) declare void @j3PrintMethodStart(%JavaMethod*) declare void @j3PrintMethodEnd(%JavaMethod*) + +declare void @Jnjvm_incrementTotalCalledMethodsCounter() Added: vmkit/branches/memory-monitor/lib/j3/VMCore/AccountingConfiguration.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/AccountingConfiguration.cpp?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/AccountingConfiguration.cpp (added) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/AccountingConfiguration.cpp Thu Oct 9 03:43:38 2014 @@ -0,0 +1,578 @@ + +#include "AccountingConfiguration.h" + +#if JAVA_CHARGED_TIER_CALL_STACK + + +namespace j3 { +namespace OSGi { + +//######################################################################### +// +// CallConfiguration +// +//######################################################################### + +CallConfiguration::CallConfiguration( + tier_id_t callerTierID, tier_id_t calledTierID, + const vmkit::UTF8* calledBundleName, const vmkit::UTF8* calledInterfaceName, + const vmkit::UTF8* calledMethodName) +{ + set(callerTierID, calledTierID, + calledBundleName, calledInterfaceName, calledMethodName); +} + +void CallConfiguration::set( + tier_id_t callerTierID, tier_id_t calledTierID, + const vmkit::UTF8* calledBundleName, const vmkit::UTF8* calledInterfaceName, + const vmkit::UTF8* calledMethodName) +{ + _caller_tier_id = callerTierID; + _called_tier_id = calledTierID; + _called_interface_name = calledInterfaceName; + _called_method_name = calledMethodName; + + // The runtime does not hold a bundle name. + _called_bundle_name = + ((calledBundleName != nullptr) && (calledTierID != runtimeTierID)) ? + calledBundleName : + nullptr; +} + +int CallConfiguration::compare(const CallConfiguration& other) const +{ + // Compare based on caller tiers, if they are not equal and not generic + int diff = 0; + + if (_caller_tier_id != invalidTierID && + other._caller_tier_id != invalidTierID) + { + diff = (int)(_caller_tier_id - other._caller_tier_id); + if (diff != 0) return diff; + } + + // Compare based on called tiers, if they are not equal not generic + if (_called_tier_id != invalidTierID && + other._called_tier_id != invalidTierID) + { + diff = (int)(_called_tier_id - other._called_tier_id); + if (diff != 0) return diff; + } + + // Compare based on bundleName, if they are not equal + diff = UTF8::compare(_called_bundle_name, other._called_bundle_name); + if (diff != 0) return diff; + + // Compare based on interfaceName + diff = UTF8::compare(_called_interface_name, other._called_interface_name); + if (diff != 0) return diff; + + return UTF8::compare(_called_method_name, other._called_method_name); +} + +bool CallConfiguration::genericize() +{ + if (_called_method_name != nullptr) { + _called_method_name = nullptr; return true; + } + if (_called_interface_name != nullptr) { + _called_interface_name = nullptr; return true; + } + if (_called_bundle_name != nullptr) { + _called_bundle_name = nullptr; return true; + } + return false; +} + +std::ostream& operator << (std::ostream& os, const CallConfiguration& obj) +{ + if (obj._caller_tier_id == invalidTierID) + os << '*'; + else + os << (int)obj._caller_tier_id; + + os << " => "; + + if (obj._called_tier_id == invalidTierID) + os << '*'; + else + os << (int)obj._called_tier_id; + + if (obj._called_bundle_name != nullptr) + os << " bundle=" << *obj._called_bundle_name; + + if (obj._called_interface_name != nullptr) + os << " interface=" << *obj._called_interface_name; + + if (obj._called_method_name != nullptr) + os << " method=" << *obj._called_method_name; + return os; +} + +void CallConfiguration::dump() const +{ + std::cout << *this << std::endl; +} + +} +} + +#endif + +#if OSGI_BUNDLE_TIER_TAGGING + +#include +#include +#include + +#include "JnjvmClassLoader.h" +#include "JavaThread.h" +#include "Jnjvm.h" +#include "JavaClass.h" + +using namespace std; + +template +IteratorType& const_cast_iterator( + ContainerType& cont, ConstIteratorType& const_iter, IteratorType& iter) +{ + iter = cont.begin(); + std::advance(iter, std::distance(iter, const_iter)); + return iter; +} + +namespace j3 { +namespace OSGi { + +//######################################################################### +// +// AccountingConfigurationParser +// +//######################################################################### + +const std::vector AccountingConfigurationParser::_token_name { + "error", + "*", + "integer", + "identifier", + "tier", + "account", + "caller", + "called" +}; + +AccountingConfigurationParser::AccountingConfigurationParser( + AccountingConfiguration& config, UTF8Map* hashMap) : + _input(nullptr), _token_start(nullptr), _token(0), _integer_token(0), + _hash_map(hashMap), _errorDescription("Success"), _config(config) +{ +} + +int AccountingConfigurationParser::load( + AccountingConfiguration& config, + const char* config_file, std::string& errorDescription, UTF8Map* hashMap) +{ + auto r = 0; + ifstream f; + f.open(config_file); + if (!f.is_open()) { + r = errno; + errorDescription = strerror(r); + return r; + } + + f.seekg(0, fstream::end); + size_t fsize = f.tellg(); + f.seekg(0, fstream::beg); + if (fsize == 0) return 0; + + unique_ptr buffer(new char[fsize+1]); + f.read(buffer.get(), fsize); + f.close(); + + buffer[fsize] = '\0'; + + AccountingConfigurationParser parser(config, hashMap); + r = parser.parse(buffer.get()); + + errorDescription = parser.getErrorDescription(); + return r; +} + +int AccountingConfigurationParser::parseError(int r, const std::string& message) +{ + _errorDescription = message + ". At: '"; + _errorDescription.append(_token_start, 32); + _errorDescription += "'..."; + return r; +} + +int AccountingConfigurationParser::unexpectedToken(int r, const std::string& expected) +{ + return parseError( + r, "Expecting " + expected + ". Got '" + tokenName(_token) + "'"); +} + +int AccountingConfigurationParser::parseTier() +{ + if (_token != token_tier) return ENOENT; + + if ((_token = nextToken()) != token_integer) + return unexpectedToken(EBADF, "tier identifier (integer)"); + + tier_id_t tier_id = _integer_token; + + if (tier_id == unspecifiedTierID || tier_id == runtimeTierID) + return unexpectedToken(EBADF, "non-reserved tier identifier"); + + if ((_token = nextToken()) != '{') + return unexpectedToken(EBADF, "'{'"); + + auto& bundles = _config._tier_list.insert( + AccountingConfiguration::TierListType::value_type( + tier_id, AccountingConfiguration::TierInformation())) + .first->second; + + _token = nextToken(); + while (_token != '}') { + if (_token != token_identifier) + return unexpectedToken(EBADF, "bundle name (identifier) or '}'"); + + bundles.insert(getUTF8(_identifier_token.c_str())); + + if ((_token = nextToken()) == ',') + _token = nextToken(); + } + + return 0; +} + +int AccountingConfigurationParser::parseAccount() +{ + if (_token != token_account) return ENOENT; + + if ((_token = nextToken()) != '{') + return unexpectedToken(EBADF, "'{'"); + + tier_id_t caller_tier_id, called_tier_id; + + _token = nextToken(); + if (_token == token_any_tier) + caller_tier_id = invalidTierID; + else if (_token == token_integer) + caller_tier_id = _integer_token; + else + return unexpectedToken(EBADF, "caller tier identifier (integer)"); + + if ((_token = nextToken()) != ',') + return unexpectedToken(EBADF, "','"); + + _token = nextToken(); + if (_token == token_any_tier) + called_tier_id = invalidTierID; + else if (_token == token_integer) + called_tier_id = _integer_token; + else + return unexpectedToken(EBADF, "called tier identifier (integer)"); + + const UTF8 *bundle_name = nullptr, *interface_name = nullptr; + const UTF8 *method_name = nullptr; + + if ((_token = nextToken()) == '/') { + if ((_token = nextToken()) != token_identifier) + return unexpectedToken(EBADF, "bundle name (identifier)"); + + if (_identifier_token.length() > 0 && + _identifier_token.compare("_") != 0) + { + bundle_name = getUTF8(_identifier_token.c_str()); + } + + if ((_token = nextToken()) == '/') { + if ((_token = nextToken()) != token_identifier) + return unexpectedToken(EBADF, "interface name (identifier)"); + + if (_identifier_token.length() > 0) { + // Convert interface name to internal name + std::replace(_identifier_token.begin(), _identifier_token.end(), '.', '/'); + interface_name = getUTF8(_identifier_token.c_str()); + } + + if ((_token = nextToken()) == '/') { + if ((_token = nextToken()) != token_identifier) + return unexpectedToken(EBADF, "method name (identifier)"); + + if (_identifier_token.length() > 0) + method_name = getUTF8(_identifier_token.c_str()); + _token = nextToken(); + } + } + } + + if (_token != ',') + return unexpectedToken(EBADF, "'/' or ','"); + + bool charge_called; + + _token = nextToken(); + if (_token == token_called) + charge_called = true; + else if (_token == token_caller) + charge_called = false; + else + return unexpectedToken(EBADF, "'caller' or 'called'"); + + if ((_token = nextToken()) != '}') + return unexpectedToken(EBADF, "'}'"); + + _config._accounting_rule_list.insert( + AccountingConfiguration::AccountingRuleListType::value_type( + CallConfiguration(caller_tier_id, called_tier_id, + bundle_name, interface_name, method_name), + charge_called)); + + return 0; +} + +int AccountingConfigurationParser::parse(const char* sourceText) +{ + if (!sourceText || !(*sourceText)) return 0; + + _input = sourceText; + + auto r = 0; + + for (;;) { + if ((_token = nextToken()) == 0) return 0; // Done + if (_token == token_error) + return unexpectedToken(EBADF, "'tier' or 'account'"); + + if ((r = parseTier()) == 0) continue; + if (r != ENOENT) return r; + + if ((r = parseAccount()) == 0) continue; + if (r != ENOENT) return r; + + return unexpectedToken(EBADF, "'tier' or 'account'"); + } + + return r; +} + +int AccountingConfigurationParser::nextToken() +{ + while (*_input != '\0') { + for (; isspace(*_input); ++_input); // Skip spaces and tabs + + if (*_input == '#') { // Comment + for (; (*_input != '\n') && (*_input != '\0'); ++_input); + for (; (*_input == '\n') || (*_input == '\r'); ++_input); + } else { + break; + } + } + if (!(*_input)) return 0; + + _token_start = _input; + if (*_input == '*') {++_input; return token_any_tier;} + + if (isdigit(*_input)) { + char *endp = nullptr; + + _integer_token = (int)strtol(_input, &endp, 10); + if (errno == ERANGE) + return parseError(token_error, "Integer is out of range"); + + _input = endp; + return token_integer; + } + + if ((*_input == '_') || (*_input == '-') || isalpha(*_input)) { + const char* start = _input; + for (++_input; (*_input == '_') || (*_input == '-') || + (*_input == '.') || isalnum(*_input); + ++_input); + + size_t count = _input - start; + if (count == 4 && !strncmp(start, "tier", count)) + return token_tier; + if (count == 7 && !strncmp(start, "account", count)) + return token_account; + if (count == 6 && !strncmp(start, "caller", count)) + return token_caller; + if (count == 6 && !strncmp(start, "called", count)) + return token_called; + + _identifier_token.assign(start, count); + return token_identifier; + } + + return *(_input++); +} + +//######################################################################### +// +// AccountingConfiguration +// +//######################################################################### + +bool RuntimeAccountingConfiguration::setFrameworkBundleName() +{ + BundleStateMonitor::BundleInformation bi; + if (!_bundle_state_monitor.getBundleInfoByID(0, bi)) return false; + + TierInformation ti { bi.name }; + _tier_list[frameworkTierID] = ti; + return true; +} + +tier_id_t AccountingConfiguration::getTierOfBundleName( + const vmkit::UTF8* bundleName) const +{ + auto e = _tier_list.end(); + auto f = std::find_if(_tier_list.begin(), e, + [bundleName] (const TierListType::value_type& element) { + assert(element.first != unspecifiedTierID && + element.first != runtimeTierID); + return element.second.find(bundleName) != element.second.end(); + }); + + // Some bundles are not associated with any tiers + return (f == e) ? unspecifiedTierID : f->first; +} + +bool AccountingConfiguration::findNearestCallConfiguration( + const CallConfiguration& call_config, + AccountingRuleListType::const_iterator& found) const +{ + if (call_config._called_tier_id == invalidTierID) return false; + + // Look for the rule, from exact form to all possible generic forms. + auto e = _accounting_rule_list.end(); + auto f = e; + auto notFound = false; + auto called(call_config); + + do { + f = std::find_if(_accounting_rule_list.begin(), e, + [&called] (const AccountingRuleListType::value_type& element) { + return element.first == called; + }); + notFound = (f == e); + } while (notFound && called.genericize()); + + if (!notFound) found = f; + return !notFound; +} + +bool AccountingConfiguration::findNearestCallConfiguration( + const CallConfiguration& call_config, + AccountingRuleListType::iterator& found) +{ + AccountingRuleListType::const_iterator i; + auto r = this->findNearestCallConfiguration(call_config, i); + if (r) const_cast_iterator(_accounting_rule_list, i, found); + return r; +} + +bool AccountingConfiguration::getDefaultAccountingChargedToCaller( + const CallConfiguration& call_config) const +{ + // By default, the runtime is not charged for resources allocated + // in order to serve requests. However, it is charged for independent + // threads (running only runtime code). + + if (call_config._caller_tier_id == runtimeTierID && + call_config._called_tier_id == runtimeTierID) + return true; + + if (call_config._caller_tier_id == runtimeTierID) + return false; + + if (call_config._called_tier_id == runtimeTierID) + return true; + + return true; // Default behavior: charge to the caller +} + +bool AccountingConfiguration::isAccountingChargedToCaller( + const CallConfiguration& call_config) const +{ + assert(((call_config._caller_tier_id != invalidTierID) + && (call_config._called_tier_id != invalidTierID)) + && "Invalid tierID for caller and called"); + + if ((call_config._caller_tier_id != call_config._called_tier_id) || + (call_config._called_bundle_name != nullptr) || + (call_config._called_interface_name != nullptr) || + (call_config._called_method_name != nullptr)) + { + AccountingRuleListType::const_iterator i; + if (this->findNearestCallConfiguration(call_config, i)) + return !i->second; + } + + return getDefaultAccountingChargedToCaller(call_config); +} + +std::ostream& operator << ( + std::ostream& os, const AccountingConfiguration::TierInformation& obj) +{ + os << '{'; + for (const auto& i : obj) + os << *i << ' '; + return os << '}'; +} + +std::ostream& operator << (std::ostream& os, + const AccountingConfiguration::AccountingRuleListType& obj) +{ + os << '{'; + for (const auto& i : obj) { + os << i.first << (i.second ? ":called " : ":caller "); + } + return os << '}'; +} + +std::ostream& operator << (std::ostream& os, const AccountingConfiguration& obj) +{ + os << "AccountingConfiguration=tiers{"; + + for (const auto& i : obj.getTierList()) + os << (int)i.first << '=' << i.second << ','; + + return os << "},rules=" << obj.getAccountingRuleList() << endl; +} + +//######################################################################### +// +// RuntimeAccountingConfiguration +// +//######################################################################### + +tier_id_t RuntimeAccountingConfiguration::getTierOfBundleID( + bundle_id_t bundleID) const +{ + BundleStateMonitor::BundleInformation bi; + if (!_bundle_state_monitor.getBundleInfoByID(bundleID, bi)) + return invalidTierID; // Invalid bundle ID + + return getTierOfBundleName(bi.name); +} + +tier_id_t RuntimeAccountingConfiguration::getTierOfCommonClass( + const j3::CommonClass* ccl) const +{ + BundleStateMonitor::BundleInfoType::const_iterator i; + if (!_bundle_state_monitor.getBundleInfoByClassLoader(ccl->classLoader, i)){ + // Class loader without a bundle ID: Not a bundle class loader. + return runtimeTierID; + } + + return getTierOfBundleName(i->second.name); +} + +} +} + +#endif Added: vmkit/branches/memory-monitor/lib/j3/VMCore/AccountingConfiguration.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/AccountingConfiguration.h?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/AccountingConfiguration.h (added) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/AccountingConfiguration.h Thu Oct 9 03:43:38 2014 @@ -0,0 +1,197 @@ + +#ifndef ACCOUNTING_CONFIGURATION_H_ +#define ACCOUNTING_CONFIGURATION_H_ + +#include +#include +#include "vmkit/config.h" +#include "UTF8.h" + +#if JAVA_CHARGED_TIER_CALL_STACK + +namespace j3 { +namespace OSGi { + +typedef uint16_t tier_id_t; + +static const size_t tierCountBits = 16; +static const tier_id_t invalidTierID = (1 << tierCountBits) - 1; +static const tier_id_t unspecifiedTierID = invalidTierID - 1; +static const tier_id_t runtimeTierID = 0; +static const tier_id_t frameworkTierID = 1; + + +class CallConfiguration +{ +public: + tier_id_t _caller_tier_id, _called_tier_id; + const vmkit::UTF8* _called_bundle_name; + const vmkit::UTF8* _called_interface_name; + const vmkit::UTF8* _called_method_name; + + CallConfiguration( + tier_id_t callerTierID = invalidTierID, + tier_id_t calledTierID = invalidTierID, + const vmkit::UTF8* calledBundleName = nullptr, + const vmkit::UTF8* calledInterfaceName = nullptr, + const vmkit::UTF8* calledMethodName = nullptr); + + void reset() {set(invalidTierID, invalidTierID, nullptr, nullptr, nullptr);} + void set( + tier_id_t callerTierID, tier_id_t calledTierID, + const vmkit::UTF8* calledBundleName, + const vmkit::UTF8* calledInterfaceName, + const vmkit::UTF8* calledMethodName); + + int compare(const CallConfiguration&) const; + bool genericize(); + + void dump() const __attribute__((noinline)); + + bool operator == (const CallConfiguration& o) const + {return this->compare(o) == 0;} + bool operator < (const CallConfiguration& o) const + {return this->compare(o) < 0;} + + friend std::ostream& operator << (std::ostream&, const CallConfiguration&); +}; + +} +} + +#endif + +#if OSGI_BUNDLE_TIER_TAGGING + +#include +#include +#include +#include + +#include "OSGiBundleStateMonitor.h" + +namespace j3 { +namespace OSGi { + +class AccountingConfigurationParser +{ +protected: + enum TokenID { + token_error = -1, + token_any_tier = -100, + token_integer, + token_identifier, + token_tier, + token_account, + token_caller, + token_called + }; + + const char *_input, *_token_start; + std::string _identifier_token; + int _token, _integer_token; + static const std::vector _token_name; + UTF8Map* _hash_map; + std::string _errorDescription; + class AccountingConfiguration& _config; + +public: + AccountingConfigurationParser( + AccountingConfiguration& config, UTF8Map* hashMap); + virtual ~AccountingConfigurationParser() {} + + static int load(AccountingConfiguration& config, + const char* config_file, std::string& errorDescription, + UTF8Map* hashMap); + + const std::string& getErrorDescription() const {return _errorDescription;} + +protected: + int parse(const char* sourceText); + int parseTier(); + int parseAccount(); + + int unexpectedToken(int r, const std::string& expected); + int parseError(int r, const std::string& message); + int nextToken(); + + const std::string& tokenName(int token) const + {return _token_name[token - token_error];} + + const UTF8* getUTF8(const char* str) + {return _hash_map->lookupOrCreateAsciiz(str);} +}; + +// This configuration is supposed to be immutable before any Java code +// starts running. +class AccountingConfiguration +{ +public: + typedef std::set< + const vmkit::UTF8* /* bundle name */, + vmkit::UTF8_Comparator> TierInformation; + typedef std::map TierListType; + typedef std::map< + const CallConfiguration, + bool /* charge called? */> AccountingRuleListType; + +protected: + TierListType _tier_list; + AccountingRuleListType _accounting_rule_list; + +public: + virtual ~AccountingConfiguration() {} + + const TierListType& getTierList() const {return _tier_list;} + const AccountingRuleListType& getAccountingRuleList() const + {return _accounting_rule_list;} + + bool isValidTier(tier_id_t tierID) const + {return (_tier_list.find(tierID) != _tier_list.end());} + + tier_id_t getTierOfBundleName(const vmkit::UTF8* bundleName) const; + + bool findNearestCallConfiguration(const CallConfiguration&, + AccountingRuleListType::const_iterator&) const; + bool findNearestCallConfiguration(const CallConfiguration&, + AccountingRuleListType::iterator&); + + bool getDefaultAccountingChargedToCaller( + const CallConfiguration& call_config) const; + + bool isAccountingChargedToCaller( + const CallConfiguration& call_config) const; + + friend std::ostream& operator << ( + std::ostream&, const AccountingConfiguration&); + friend std::ostream& operator << ( + std::ostream&, const TierInformation&); + friend std::ostream& operator << ( + std::ostream&, const AccountingRuleListType&); + + friend class AccountingConfigurationParser; +}; + +// This class adds the variable information to the accounting configuration. +class RuntimeAccountingConfiguration : + public AccountingConfiguration +{ +protected: + const BundleStateMonitor& _bundle_state_monitor; + +public: + RuntimeAccountingConfiguration(const BundleStateMonitor& bsm) : + _bundle_state_monitor(bsm) {} + +public: + tier_id_t getTierOfBundleID(bundle_id_t bundleID) const; + tier_id_t getTierOfCommonClass(const j3::CommonClass* ccl) const; + + bool setFrameworkBundleName(); +}; + +} +} + +#endif +#endif Modified: vmkit/branches/memory-monitor/lib/j3/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/JavaClass.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/JavaClass.cpp (original) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/JavaClass.cpp Thu Oct 9 03:43:38 2014 @@ -2349,8 +2349,8 @@ void JavaField::setStaticField(JavaObjec std::ostream& j3::operator << (std::ostream& os, const CommonClass& ccl) { - os << *ccl.name; - return (!ccl.super) ? (os << ';') : (os << ':' << *ccl.super); + return os << *ccl.name << ';'; +// return (!ccl.super) ? (os << ';') : (os << ':' << *ccl.super); } void CommonClass::dump() const Modified: vmkit/branches/memory-monitor/lib/j3/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/JavaClass.h?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/JavaClass.h (original) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/JavaClass.h Thu Oct 9 03:43:38 2014 @@ -1015,7 +1015,7 @@ public: // Upcalls from JnJVM code to Java code. // //===----------------------------------------------------------------------===// - + #define DO_TRY #define DO_CATCH if (th->pendingException) { th->throwFromJava(); } @@ -1023,12 +1023,15 @@ private: jvalue* marshalArguments(vmkit::ThreadAllocator& allocator, va_list ap); template - TYPE invokeSpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) __attribute__((noinline)) { + TYPE invokeSpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) + __attribute__((noinline)) + { llvm_gcroot(obj, 0); verifyNull(obj); void* func = this->compiledPtr(); - FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)getSignature()->getVirtualCallBuf(); + FUNC_TYPE_VIRTUAL_BUF call = + (FUNC_TYPE_VIRTUAL_BUF)getSignature()->getVirtualCallBuf(); JavaThread* th = JavaThread::get(); th->startJava(); @@ -1043,11 +1046,14 @@ private: } template - TYPE invokeVirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) __attribute__((noinline)) { + TYPE invokeVirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) + __attribute__((noinline)) + { llvm_gcroot(obj, 0); UserCommonClass* theClass = JavaObject::getClass(obj); - UserClass* objCl = theClass->isArray() ? theClass->super : theClass->asClass(); + UserClass* objCl = + theClass->isArray() ? theClass->super : theClass->asClass(); JavaMethod* meth = this; if ((objCl != classDef) && !isFinal(access)) { @@ -1057,18 +1063,22 @@ private: assert(objCl->isSubclassOf(meth->classDef) && "Wrong type"); - return meth->invokeSpecialBuf(vm, cl, obj, buf); + return meth->invokeSpecialBuf( + vm, cl, obj, buf); } template - TYPE invokeStaticBuf(Jnjvm* vm, UserClass* cl, void* buf) __attribute__((noinline)) { + TYPE invokeStaticBuf(Jnjvm* vm, UserClass* cl, void* buf) + __attribute__((noinline)) + { if (!cl->isReady()) { cl->resolveClass(); cl->initialiseClass(vm); } void* func = this->compiledPtr(); - FUNC_TYPE_STATIC_BUF call = (FUNC_TYPE_STATIC_BUF)getSignature()->getStaticCallBuf(); + FUNC_TYPE_STATIC_BUF call = + (FUNC_TYPE_STATIC_BUF)getSignature()->getStaticCallBuf(); JavaThread* th = JavaThread::get(); th->startJava(); @@ -1083,44 +1093,64 @@ private: } template - TYPE invokeVirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) __attribute__((noinline)) { + TYPE invokeVirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) + __attribute__((noinline)) + { llvm_gcroot(obj, 0); assert(cl && "Class is NULL"); vmkit::ThreadAllocator allocator; jvalue* buffer = marshalArguments(allocator, ap); - return invokeVirtualBuf(vm, cl, obj, buffer); + return invokeVirtualBuf( + vm, cl, obj, buffer); } template - TYPE invokeSpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) __attribute__((noinline)) { + TYPE invokeSpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) + __attribute__((noinline)) + { llvm_gcroot(obj, 0); assert(cl && "Class is NULL"); vmkit::ThreadAllocator allocator; jvalue* buffer = marshalArguments(allocator, ap); - return invokeSpecialBuf(vm, cl, obj, buffer); + return invokeSpecialBuf( + vm, cl, obj, buffer); } template - TYPE invokeStaticAP(Jnjvm* vm, UserClass* cl, va_list ap) __attribute__((noinline)) { + TYPE invokeStaticAP(Jnjvm* vm, UserClass* cl, va_list ap) + __attribute__((noinline)) + { assert(cl && "Class is NULL"); vmkit::ThreadAllocator allocator; jvalue* buffer = marshalArguments(allocator, ap); return invokeStaticBuf(vm, cl, buffer); } +#undef DO_TRY +#undef DO_CATCH + #define JavaMethod_DECL_INVOKE_VA(TYPE, TYPE_NAME) \ + TYPE invoke##TYPE_NAME##Virtual(Jnjvm* vm, JavaMethod* intendedMethodToCall, UserClass* cl, JavaObject* obj, ...) __attribute__ ((noinline)); \ TYPE invoke##TYPE_NAME##Virtual(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) __attribute__ ((noinline)); \ + TYPE invoke##TYPE_NAME##Special(Jnjvm* vm, JavaMethod* intendedMethodToCall, UserClass* cl, JavaObject* obj, ...) __attribute__ ((noinline)); \ TYPE invoke##TYPE_NAME##Special(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) __attribute__ ((noinline)); \ + TYPE invoke##TYPE_NAME##Static(Jnjvm* vm, JavaMethod* intendedMethodToCall, UserClass* cl, ...) __attribute__ ((noinline)); \ TYPE invoke##TYPE_NAME##Static(Jnjvm* vm, UserClass* cl, ...) __attribute__ ((noinline)); #define JavaMethod_DECL_INVOKE_AP(TYPE, TYPE_NAME) \ + TYPE invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap, JavaMethod* intendedMethodToCall) __attribute__ ((noinline)); \ TYPE invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) __attribute__ ((noinline)); \ + TYPE invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap, JavaMethod* intendedMethodToCall) __attribute__ ((noinline)); \ TYPE invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) __attribute__ ((noinline)); \ + TYPE invoke##TYPE_NAME##StaticAP(Jnjvm* vm, UserClass* cl, va_list ap, JavaMethod* intendedMethodToCall) __attribute__ ((noinline)); \ TYPE invoke##TYPE_NAME##StaticAP(Jnjvm* vm, UserClass* cl, va_list ap) __attribute__ ((noinline)); #define JavaMethod_DECL_INVOKE_BUF(TYPE, TYPE_NAME) \ + TYPE invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf, JavaMethod* intendedMethodToCall) __attribute__ ((noinline)); \ TYPE invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) __attribute__ ((noinline)); \ + TYPE invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf, JavaMethod* intendedMethodToCall) __attribute__ ((noinline)); \ TYPE invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) __attribute__ ((noinline)); \ + TYPE invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, UserClass* cl, void* buf, JavaMethod* intendedMethodToCall) __attribute__ ((noinline)); \ TYPE invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, UserClass* cl, void* buf) __attribute__ ((noinline)); #define JavaMethod_DECL_INVOKE(TYPE, TYPE_NAME) \ Modified: vmkit/branches/memory-monitor/lib/j3/VMCore/JavaMetaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/JavaMetaJIT.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/JavaMetaJIT.cpp (original) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/JavaMetaJIT.cpp Thu Oct 9 03:43:38 2014 @@ -69,19 +69,19 @@ jvalue* JavaMethod::marshalArguments(vmk return res; \ } \ TYPE JavaMethod::invoke##TYPE_NAME##Special(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) { \ - llvm_gcroot(obj, 0); \ - va_list ap; \ - va_start(ap, obj); \ - TYPE res = invokeSpecialAP(vm, cl, obj, ap); \ - va_end(ap); \ - return res; \ + llvm_gcroot(obj, 0); \ + va_list ap; \ + va_start(ap, obj); \ + TYPE res = invokeSpecialAP(vm, cl, obj, ap); \ + va_end(ap); \ + return res; \ } \ TYPE JavaMethod::invoke##TYPE_NAME##Static(Jnjvm* vm, UserClass* cl, ...) { \ - va_list ap; \ - va_start(ap, cl); \ - TYPE res = invokeStaticAP(vm, cl, ap); \ - va_end(ap); \ - return res; \ + va_list ap; \ + va_start(ap, cl); \ + TYPE res = invokeStaticAP(vm, cl, ap); \ + va_end(ap); \ + return res; \ } #define JavaMethod_INVOKE_AP(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \ @@ -104,7 +104,7 @@ jvalue* JavaMethod::marshalArguments(vmk } \ TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) { \ llvm_gcroot(obj, 0); \ - return invokeSpecialBuf(vm, cl, obj, buf); \ + return invokeSpecialBuf(vm, cl, obj, buf); \ } \ TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, UserClass* cl, void* buf) { \ return invokeStaticBuf(vm, cl, buf); \ Modified: vmkit/branches/memory-monitor/lib/j3/VMCore/JavaObject.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/JavaObject.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/JavaObject.cpp (original) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/JavaObject.cpp Thu Oct 9 03:43:38 2014 @@ -387,9 +387,11 @@ bool JavaObject::instanceOf(JavaObject* std::ostream& j3::operator << (std::ostream& os, const JavaObject& obj) { JavaObject* javaLoader = NULL; - const JavaString* threadNameObj = NULL; + const JavaString* jstr = NULL; + const JavaObjectVMThread* vmthObj = NULL; llvm_gcroot(javaLoader, 0); - llvm_gcroot(threadNameObj, 0); + llvm_gcroot(jstr, 0); + llvm_gcroot(vmthObj, 0); if (VMClassLoader::isVMClassLoader(&obj)) { JnjvmClassLoader* loader = ((const VMClassLoader&)obj).getClassLoader(); @@ -416,24 +418,31 @@ std::ostream& j3::operator << (std::ostr os << &obj << "(class=" << *ccl; if (ccl == vm->upcalls->newThread) { - threadNameObj = static_cast( + jstr = static_cast( vm->upcalls->threadName->getInstanceObjectField( const_cast(&obj))); - char *threadName = JavaString::strToAsciiz(threadNameObj); - os << ",name=\"" << threadName << '\"'; - delete [] threadName; + os << ",name=" << *jstr; } #ifndef OpenJDKPath else if (ccl == vm->upcalls->newVMThread) { - const JavaObjectVMThread& vmthObj = (const JavaObjectVMThread&)obj; - for (int retries = 10; (!vmthObj.vmdata) && (retries >= 0); --retries) + vmthObj = static_cast(&obj); + for (int retries = 10; (!vmthObj->vmdata) && (retries >= 0); --retries) usleep(100); - if (const JavaObject* thObj = vmthObj.vmdata->currentThread()) + if (const JavaObject* thObj = vmthObj->vmdata->currentThread()) os << ",thread=" << *thObj; } #endif + else if (ccl == vm->upcalls->newClass) { + ccl = JavaObjectClass::getClass( + const_cast( + static_cast(&obj))); + + os << ",name=\"" << *ccl->asClass() << '\"'; + } else if (ccl == vm->upcalls->newString) { + os << ',' << static_cast(obj); + } os << ')'; } @@ -450,3 +459,22 @@ void JavaObject::dumpClass() const { JavaObject::getClass(this)->dump(); } + +void JavaObject::dumpToString() const +{ + JavaString* jstr = NULL; + llvm_gcroot(jstr, 0); + + if (VMClassLoader::isVMClassLoader(this) || VMStaticInstance::isVMStaticInstance(this)) + {cerr << "" << endl; return;} + + Class* cl = JavaObject::getClass(this)->asClass(); + if (!cl) {cerr << "" << endl; return;} + + Jnjvm* vm = cl->classLoader->getJVM(); + jstr = static_cast( + vm->upcalls->toString->invokeJavaObjectVirtual( + vm, cl, const_cast(this))); + + cerr << *jstr << endl; +} Modified: vmkit/branches/memory-monitor/lib/j3/VMCore/JavaObject.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/JavaObject.h?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/JavaObject.h (original) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/JavaObject.h Thu Oct 9 03:43:38 2014 @@ -334,6 +334,7 @@ public: void dumpClass() const __attribute__((noinline)); void dump() const __attribute__((noinline)); friend std::ostream& operator << (std::ostream&, const JavaObject&); + void dumpToString() const __attribute__((noinline)); }; Modified: vmkit/branches/memory-monitor/lib/j3/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/JavaRuntimeJIT.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/JavaRuntimeJIT.cpp Thu Oct 9 03:43:38 2014 @@ -110,10 +110,9 @@ extern "C" void* j3StaticFieldLookup(Use } // Throws if the method is not found. -extern "C" uint32 j3VirtualTableLookup(UserClass* caller, uint32 index, - uint32* offset, JavaObject* obj) { +extern "C" void* j3VirtualTableLookup(UserClass* caller, uint32 index, + void** javaMethod, JavaObject* obj) { llvm_gcroot(obj, 0); - uint32 res = 0; UserCommonClass* cl = 0; const UTF8* utf8 = 0; @@ -134,15 +133,13 @@ extern "C" uint32 j3VirtualTableLookup(U JavaObject::getClass(obj)->asClass(); dmeth = lookup->lookupMethod(utf8, sign->keyName, false, true, 0); } else { - *offset = dmeth->offset; + *javaMethod = dmeth; } assert(dmeth->classDef->isInitializing() && "Class not ready in a virtual lookup."); - res = dmeth->offset; - - return res; + return dmeth; } // Throws if the class is not found. Modified: vmkit/branches/memory-monitor/lib/j3/VMCore/JavaString.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/JavaString.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/JavaString.cpp (original) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/JavaString.cpp Thu Oct 9 03:43:38 2014 @@ -120,4 +120,28 @@ const UTF8* JavaString::javaToInternal(c return res; } +std::ostream& operator << (std::ostream& os, const JavaString& jstr) +{ + char *str = JavaString::strToAsciiz(&jstr); + os << '\"' << str << '\"'; + delete [] str; + return os; +} + +const UTF8* JavaString::toUTF8(const JavaString* self, UTF8Map* hashMap) +{ + if (!self) return NULL; + if (!hashMap) { + Jnjvm* vm = JavaThread::get()->getJVM(); + hashMap = vm->bootstrapLoader->hashUTF8; + } + + const j3::ArrayUInt16 *array = j3::JavaString::getValue(self); + const j3::ArrayUInt16::ElementType *elts = + j3::ArrayUInt16::getElements(array); + size_t count = j3::ArrayUInt16::getSize(array); + + return hashMap->lookupOrCreateReader(elts, count); +} + } Modified: vmkit/branches/memory-monitor/lib/j3/VMCore/JavaString.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/JavaString.h?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/JavaString.h (original) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/JavaString.h Thu Oct 9 03:43:38 2014 @@ -59,9 +59,12 @@ class JavaString : public JavaObject { static char* strToAsciiz(const JavaString* self); static char* strToAsciiz(const JavaString* self, vmkit::ThreadAllocator* allocator); static const ArrayUInt16* strToArray(JavaString* self, Jnjvm* vm); + static const UTF8* toUTF8(const JavaString* self, UTF8Map* hashMap); /// javaToInternal - Replaces all '/' into '.'. static const UTF8* javaToInternal(const JavaString* self, UTF8Map* map); + + friend std::ostream& operator << (std::ostream&, const JavaString&); }; } // end namespace j3 Modified: vmkit/branches/memory-monitor/lib/j3/VMCore/JavaThread.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/JavaThread.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/JavaThread.cpp (original) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/JavaThread.cpp Thu Oct 9 03:43:38 2014 @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include +#include #include "vmkit/Locks.h" #include "vmkit/Thread.h" @@ -132,7 +133,7 @@ void JavaThread::printJavaBacktrace() { while (vmkit::FrameInfo* FI = Walker.get()) { if (FI->Metadata != NULL) { - MyVM->printMethod(FI, Walker.ip, Walker.addr); + MyVM->printMethod(FI, Walker.returnAddress, Walker.callFrameAddress); } ++Walker; } Modified: vmkit/branches/memory-monitor/lib/j3/VMCore/JavaThread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/JavaThread.h?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/JavaThread.h (original) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/JavaThread.h Thu Oct 9 03:43:38 2014 @@ -11,6 +11,7 @@ #define JNJVM_JAVA_THREAD_H #include +#include #include "vmkit/Cond.h" #include "vmkit/Locks.h" Modified: vmkit/branches/memory-monitor/lib/j3/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/Jnjvm.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/Jnjvm.cpp (original) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/Jnjvm.cpp Thu Oct 9 03:43:38 2014 @@ -44,6 +44,7 @@ const char* Jnjvm::dirSeparator = "/"; const char* Jnjvm::envSeparator = ":"; const unsigned int Jnjvm::Magic = 0xcafebabe; + /** * In JVM specification, the virtual machine should execute some code when * the application finish. @@ -1079,18 +1080,42 @@ JnjvmClassLoader* Jnjvm::loadAppClassLoa JavaObject* loader = 0; llvm_gcroot(loader, 0); - if (appClassLoader == NULL) { - UserClass* cl = upcalls->newClassLoader; - loader = upcalls->getSystemClassLoader->invokeJavaObjectStatic(this, cl); - appClassLoader = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, - this); - if (argumentsInfo.jarFile) { - appClassLoader->loadLibFromJar(this, argumentsInfo.jarFile, - argumentsInfo.className); - } else if (argumentsInfo.className) { - appClassLoader->loadLibFromFile(this, argumentsInfo.className); + if (appClassLoader != nullptr) return appClassLoader; + + UserClass* cl = upcalls->newClassLoader; + loader = upcalls->getSystemClassLoader->invokeJavaObjectStatic(this, cl); + appClassLoader = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, this); + +#if OSGI_BUNDLE_STATE_INFO + if (argumentsInfo.className != nullptr) { + bundle_state_monitor.setFrameworkFromMainClass( + argumentsInfo.className, appClassLoader); + } +#endif + +#if OSGI_BUNDLE_TIER_TAGGING + if (argumentsInfo.className != nullptr) { + const char* filename = "./tests/monitoring.rules"; + std::string errorDescription; + auto r = tier_manager.loadAccountingRules(filename, errorDescription); + + if (!r) { + std::cout << "Accounting configuration rules loaded from '" << filename + << "'. Status: " << errorDescription << "." << std::endl; + } else { + std::cout << "Failed to load accounting configuration rules from '" + << filename << "'. Error: " << errorDescription << "." << std::endl; } } +#endif + + if (argumentsInfo.jarFile) { + appClassLoader->loadLibFromJar(this, argumentsInfo.jarFile, + argumentsInfo.className); + } else if (argumentsInfo.className) { + appClassLoader->loadLibFromFile(this, argumentsInfo.className); + } + return appClassLoader; } @@ -1320,6 +1345,7 @@ void Jnjvm::mainJavaStart(JavaThread* th vm->executeClass(info.className, args); } + vm->threadSystem.leave(); } @@ -1350,6 +1376,10 @@ Jnjvm::Jnjvm(vmkit::BumpPtrAllocator& Al vmkit::CompiledFrames** frames, JnjvmBootstrapLoader* loader) : VirtualMachine(Alloc, frames), lockSystem(Alloc) + +#if OSGI_BUNDLE_TIER_TAGGING + , tier_manager(bundle_state_monitor, loader->hashUTF8) +#endif { classpath = getenv("CLASSPATH"); if (classpath == NULL) classpath = "."; @@ -1553,3 +1583,37 @@ void Jnjvm::printBacktrace() std::cerr << "Back trace:" << std::endl; JavaThread::get()->printJavaBacktrace(); } + +#if MONITOR_CREATED_OBJECTS_COUNT + +static std::atomic total_created_objects(0); +static std::atomic total_called_methods_count(0); + +extern "C" void Jnjvm_newlyCreatedObject() +{ + ++total_created_objects; +} + +extern "C" void Jnjvm_incrementTotalCalledMethodsCounter(vmkit::Thread* thread) +{ + total_called_methods_count += thread->total_called_methods_count; + thread->total_called_methods_count = 0; +} + +extern "C" void Jnjvm_dumpGlobalStats() +{ + auto th = vmkit::Thread::get(); + auto tcur = th; + + do { + Jnjvm_incrementTotalCalledMethodsCounter(tcur); + tcur = (vmkit::Thread*)tcur->next(); + } while (tcur != th); + + std::cout << "==== STATS ====" << std::endl + << "TotalCreatedObjectsCount=" << total_created_objects + << ",TotalCalledMethodsCount=" << total_called_methods_count + << std::endl; +} + +#endif Modified: vmkit/branches/memory-monitor/lib/j3/VMCore/Jnjvm.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/Jnjvm.h?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/Jnjvm.h (original) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/Jnjvm.h Thu Oct 9 03:43:38 2014 @@ -27,6 +27,14 @@ #include "JNIReferences.h" #include "LockedMap.h" +#if OSGI_BUNDLE_STATE_INFO +#include "OSGiBundleStateMonitor.h" +#endif + +#if OSGI_BUNDLE_TIER_TAGGING +#include "OSGiTierManager.h" +#endif + namespace j3 { class ArrayUInt16; @@ -365,6 +373,14 @@ public: void loadBootstrap(); static void printBacktrace() __attribute__((noinline)); + +#if OSGI_BUNDLE_STATE_INFO + OSGi::BundleStateMonitor bundle_state_monitor; +#endif + +#if OSGI_BUNDLE_TIER_TAGGING + OSGi::TierManager tier_manager; +#endif }; } // end namespace j3 Modified: vmkit/branches/memory-monitor/lib/j3/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/JnjvmClassLoader.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/JnjvmClassLoader.cpp Thu Oct 9 03:43:38 2014 @@ -44,7 +44,6 @@ #include "Reader.h" #include "Zip.h" - using namespace j3; using namespace std; @@ -883,6 +882,10 @@ const UTF8* JnjvmClassLoader::readerCons JnjvmClassLoader::~JnjvmClassLoader() { +#if OSGI_BUNDLE_STATE_INFO + OSGi::BundleStateMonitor::get()->onClassLoaderUnloaded(this); +#endif + if (vm) { vm->removeFrameInfos(TheCompiler); } Added: vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiBundleStateMonitor.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiBundleStateMonitor.cpp?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiBundleStateMonitor.cpp (added) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiBundleStateMonitor.cpp Thu Oct 9 03:43:38 2014 @@ -0,0 +1,340 @@ + +#include "OSGiBundleStateMonitor.h" + +#if OSGI_BUNDLE_STATE_INFO + +#include "ClasspathReflect.h" +#include "Jnjvm.h" + +#include +#include + +#define DEBUG_VERBOSE_OSGI_STATE_CHANGE 0 + +using namespace std; + +namespace j3 { +namespace OSGi { + +void BundleStateMonitor::BundleInformation::reset() +{ + loader = NULL; + name = NULL; + previousLoaders.clear(); +} + +BundleStateMonitor::BundleStateMonitor() : + stateEL(NULL), stateEL_user_param(NULL), frameworkFromMainClassSet(false) +{ + stateEL = new BundleStateEventListener; +} + +BundleStateMonitor* BundleStateMonitor::get() +{ + vmkit::Thread* th = vmkit::Thread::get(); + assert(th && "Invalid current thread."); + if (!th) return NULL; + + Jnjvm* vm = static_cast(th->MyVM); + if (!vm) return NULL; + + return &vm->bundle_state_monitor; +} + +void BundleStateMonitor::setStateEventListener( + void *user_param, BundleStateEventListener& l) +{ + stateEL_user_param = user_param; + stateEL = &l; +} + +bool BundleStateMonitor::getBundleInfoByID( + bundle_id_t id, BundleInformation& info) const +{ + vmkit::LockGuard lg(lock); + BundleInfoType::const_iterator i = bundleInfo.find(id), e=bundleInfo.end(); + if (i == e) return false; + + info = i->second; + return true; +} + +bool BundleStateMonitor::getBundleInfoByID( + bundle_id_t id, BundleInfoType::iterator& iterator) +{ + vmkit::LockGuard lg(lock); + iterator = bundleInfo.find(id); + return (iterator != bundleInfo.end()); +} + +bool BundleStateMonitor::getBundleInfoByClassLoader( + const j3::JnjvmClassLoader* loader, + BundleInfoType::const_iterator& iterator) const +{ + vmkit::LockGuard lg(lock); + BundleInfoType::const_iterator i = bundleInfo.begin(), e = bundleInfo.end(); + for (; i != e; ++i) { + if (i->second.loader != loader) { + ClassLoaderQueue::const_iterator + plb = i->second.previousLoaders.begin(), + ple = i->second.previousLoaders.end(); + + if (std::find(plb, ple, loader) == ple) + continue; + } + + iterator = i; + return true; + } + + return false; +} + +bool BundleStateMonitor::getBundleInfoByClassLoader( + const j3::JnjvmClassLoader* loader, BundleInfoType::iterator& iterator) +{ + vmkit::LockGuard lg(lock); + BundleInfoType::iterator i = bundleInfo.begin(), e = bundleInfo.end(); + for (; i != e; ++i) { + if (i->second.loader != loader) { + ClassLoaderQueue::const_iterator + plb = i->second.previousLoaders.begin(), + ple = i->second.previousLoaders.end(); + + if (std::find(plb, ple, loader) == ple) + continue; + } + + iterator = i; + return true; + } + + return false; +} + +bool BundleStateMonitor::getBundleInfoByClassLoader( + const j3::JnjvmClassLoader* loader, + bundle_id_t &id, BundleInformation& info) const +{ + vmkit::LockGuard lg(lock); + BundleInfoType::const_iterator i; + bool found = const_cast(this)-> + getBundleInfoByClassLoader(loader, i); + + if (found) { + id = i->first; + info = i->second; + } else { + id = invalidBundleID; + info.reset(); + } + return found; +} + +size_t BundleStateMonitor::getBundleInfoByName( + const vmkit::UTF8* name, BundleInfoType& info) const +{ + info.clear(); + size_t count = 0; + + vmkit::LockGuard lg(lock); + BundleInfoType::const_iterator i = bundleInfo.begin(), e = bundleInfo.end(); + for (; i != e; ++i) { + if (i->second.name->equals(name)) { + info.insert(BundleInfoType::value_type(i->first, i->second)); + ++count; + } + } + + return count; +} + +void BundleStateMonitor::onBundleResolved( + const j3::JavaString* bundleNameObj, + jlong bundleID, j3::JavaObject* loaderObject) +{ + llvm_gcroot(bundleNameObj, 0); + llvm_gcroot(loaderObject, 0); + + Jnjvm* vm = JavaThread::get()->getJVM(); + j3::JnjvmClassLoader* loader = + j3::JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loaderObject, vm); + assert((loader != NULL) && "Invalid class loader"); + + const vmkit::UTF8* bundleName = + j3::JavaString::toUTF8(bundleNameObj, loader->hashUTF8); + + vmkit::LockGuard lg(lock); + + BundleInfoType::iterator info_iterator; + if (getBundleInfoByID(bundleID, info_iterator) == false) { + // Bundle installed and resolved + BundleInformation info; + info.loader = loader; + info.name = bundleName; + bundleInfo.insert(BundleInfoType::value_type(bundleID, info)); + + stateEL->onBundleClassLoaderSet( + stateEL_user_param, bundleName, bundleID, *loader); + +#if DEBUG_VERBOSE_OSGI_STATE_CHANGE + cerr << "Bundle resolved: ID=" << bundleID + << "\tclassLoader=" << loader << "\tname=" << *bundleName << endl; +#endif + } else { + BundleInformation& info = info_iterator->second; + if (info.loader == loader) + return; // Same class loader already associated with the bundle + + // Bundle updated + const j3::JnjvmClassLoader* previous_loader = info.loader; + if (info.loader == NULL) { + if (!info.previousLoaders.empty()) + previous_loader = info.previousLoaders.front(); + } else { + info.previousLoaders.push_front(info.loader); + } + info.loader = loader; + info.name = bundleName; + + stateEL->onBundleClassLoaderUpdated( + stateEL_user_param, bundleName, bundleID, + *previous_loader, *loader); + +#if DEBUG_VERBOSE_OSGI_STATE_CHANGE + cerr << "Bundle updated/resolved: ID=" << bundleID + << "\tclassLoader=" << loader + << "\tpreviousClassLoader=" << previous_loader + << "\tname=" << *bundleName << endl; +#endif + } +} + +void BundleStateMonitor::onBundleUnresolved( + const j3::JavaString* bundleNameObj, jlong bundleID) +{ + llvm_gcroot(bundleNameObj, 0); + + vmkit::LockGuard lg(lock); + + // Uninstalled bundle + BundleInfoType::iterator info_iterator; + bool got_state = getBundleInfoByID(bundleID, info_iterator); + assert(got_state && "Bundle unresolved but never seen."); + + BundleInformation& info = info_iterator->second; + const vmkit::UTF8* bundleName = + j3::JavaString::toUTF8(bundleNameObj, + (info.loader == NULL) ? NULL : info.loader->hashUTF8); + + const j3::JnjvmClassLoader* previous_loader = info.loader; + info.previousLoaders.push_front(info.loader); + info.loader = NULL; + + stateEL->onBundleClassLoaderCleared( + stateEL_user_param, bundleName, bundleID, *previous_loader); + +#if DEBUG_VERBOSE_OSGI_STATE_CHANGE + cerr << "Bundle unresolved: ID=" << bundleID + << "\tclassLoader=" << previous_loader + << "\tname=" << *bundleName << endl; +#endif +} + +void BundleStateMonitor::onClassLoaderUnloaded( + const j3::JnjvmClassLoader* loader) +{ + vmkit::LockGuard lg(lock); + BundleInfoType::iterator info_iterator; + if (!getBundleInfoByClassLoader(loader, info_iterator)) return; + + BundleInformation& info = info_iterator->second; + assert((info.loader != loader) && "Bundle being unloaded while resolved."); + + info.previousLoaders.remove(loader); + +#if DEBUG_VERBOSE_OSGI_STATE_CHANGE + cerr << "Bundle class loader unloaded: ID=" << info_iterator->first + << "\tclassLoader=" << loader + << "\tname=" << *info.name << endl; +#endif + + if ((info.loader == NULL) && info.previousLoaders.empty()) { +#if DEBUG_VERBOSE_OSGI_STATE_CHANGE + cerr << "Bundle unloaded: ID=" << info_iterator->first + << "\tname=" << *info.name << endl; +#endif + + bundleInfo.erase(info_iterator); + } +} + +void BundleStateMonitor::dump() const +{ + vmkit::LockGuard lg(lock); + BundleInfoType::const_iterator i = bundleInfo.begin(), e = bundleInfo.end(); + ClassLoaderQueue::const_iterator cli, cle; + + for (; i != e; ++i) { + cerr << "Bundle ID=" << i->first + << "\tname=" << *i->second.name + << "\tclassLoader=" << i->second.loader + << "\tpreviousClassLoaders={"; + + cli = i->second.previousLoaders.begin(); + cle = i->second.previousLoaders.end(); + for (; cli != cle; ++cli) + cerr << *cli << ','; + + cerr << '}' << endl; + } +} + +void BundleStateMonitor::setFrameworkFromMainClass( + const char* mainClassName, const j3::JnjvmClassLoader* loader) +{ + // We suppose the framework bundle is the bundle loaded by the main class. + + const auto lastOccurence = strrchr(mainClassName, '.'); + if (!lastOccurence) + return; + string packageName(mainClassName, lastOccurence - mainClassName); + + BundleInformation info; + info.loader = loader; + info.name = loader->hashUTF8->lookupOrCreateAsciiz(packageName.c_str()); + + vmkit::LockGuard lg(lock); + bundleInfo.insert(BundleInfoType::value_type(0, info)); + + frameworkFromMainClassSet = true; +} + +} +} + +extern "C" void Java_j3_vm_OSGi_bundleResolved( + j3::JavaString* bundleName, jlong bundleID, j3::JavaObject* loaderObject) +{ + llvm_gcroot(bundleName, 0); + llvm_gcroot(loaderObject, 0); + + j3::OSGi::BundleStateMonitor::get()-> + onBundleResolved(bundleName, bundleID, loaderObject); +} + +extern "C" void Java_j3_vm_OSGi_bundleUnresolved( + j3::JavaString* bundleName, jlong bundleID) +{ + llvm_gcroot(bundleName, 0); + + j3::OSGi::BundleStateMonitor::get()-> + onBundleUnresolved(bundleName, bundleID); +} + +extern "C" void Java_j3_vm_OSGi_dumpClassLoaderBundles() +{ + j3::OSGi::BundleStateMonitor::get()->dump(); +} + +#endif Added: vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiBundleStateMonitor.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiBundleStateMonitor.h?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiBundleStateMonitor.h (added) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiBundleStateMonitor.h Thu Oct 9 03:43:38 2014 @@ -0,0 +1,119 @@ + +#ifndef OSGIGATEWAY_H_ +#define OSGIGATEWAY_H_ + +#include + +#if OSGI_BUNDLE_STATE_INFO + +#include "vmkit/Locks.h" +#include "vmkit/UTF8.h" +#include "j3/jni.h" +#include "JavaString.h" + +#include +#include + +#include + +namespace j3 { + +class JnjvmClassLoader; +class JavaObjectClass; +class JavaObject; + +namespace OSGi { + +typedef int64_t bundle_id_t; +static const bundle_id_t invalidBundleID = (bundle_id_t)-1; + + +class BundleStateEventListener +{ +public: + virtual ~BundleStateEventListener() {} + + virtual void onBundleClassLoaderSet(void *user_param, + const vmkit::UTF8* bundleName, bundle_id_t bundleID, + const j3::JnjvmClassLoader& loader) {} + + virtual void onBundleClassLoaderUpdated(void *user_param, + const vmkit::UTF8* bundleName, bundle_id_t bundleID, + const j3::JnjvmClassLoader& previous_loader, + const j3::JnjvmClassLoader& new_loader) {} + + virtual void onBundleClassLoaderCleared(void *user_param, + const vmkit::UTF8* bundleName, bundle_id_t bundleID, + const j3::JnjvmClassLoader& previous_loader) {} +}; + + +class BundleStateMonitor +{ +public: + typedef std::list ClassLoaderQueue; + + struct BundleInformation { + const j3::JnjvmClassLoader* loader; + const vmkit::UTF8* name; + ClassLoaderQueue previousLoaders; + + BundleInformation() : loader(nullptr), name(nullptr) {} + void reset(); + }; + + typedef std::map BundleInfoType; + +protected: + + mutable vmkit::LockRecursive lock; + BundleInfoType bundleInfo; + BundleStateEventListener *stateEL; + void *stateEL_user_param; + bool frameworkFromMainClassSet; + +public: + BundleStateMonitor(); + virtual ~BundleStateMonitor() {} + + static BundleStateMonitor* get(); + + bool getBundleInfoByID( + bundle_id_t id, BundleInformation& info) const; + bool getBundleInfoByID( + bundle_id_t id, BundleInfoType::iterator& iterator); + bool getBundleInfoByClassLoader(const j3::JnjvmClassLoader* loader, + bundle_id_t &id, BundleInformation& info) const; + bool getBundleInfoByClassLoader(const j3::JnjvmClassLoader* loader, + BundleInfoType::iterator& iterator); + bool getBundleInfoByClassLoader(const j3::JnjvmClassLoader* loader, + BundleInfoType::const_iterator& iterator) const; + size_t getBundleInfoByName( + const vmkit::UTF8* name, BundleInfoType& info) const; + + void dump() const; + + void setFrameworkFromMainClass( + const char* mainClassName, const j3::JnjvmClassLoader* loader); + bool isFrameworkFromMainClassSet() {return frameworkFromMainClassSet;} + + void setStateEventListener( + void *user_param, BundleStateEventListener& l); + + void onBundleResolved(const j3::JavaString* bundleName, jlong bundleID, + j3::JavaObject* loaderObject); + void onBundleUnresolved(const j3::JavaString* bundleName, jlong bundleID); + void onClassLoaderUnloaded(const j3::JnjvmClassLoader* loader); +}; + +} +} + +extern "C" void Java_j3_vm_OSGi_bundleResolved( + j3::JavaString* bundleName, jlong bundleID, j3::JavaObject* loaderObject); +extern "C" void Java_j3_vm_OSGi_bundleUnresolved( + j3::JavaString* bundleName, jlong bundleID); +extern "C" void Java_j3_vm_OSGi_dumpClassLoaderBundles(); + +#endif +#endif Added: vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiTierManager.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiTierManager.cpp?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiTierManager.cpp (added) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiTierManager.cpp Thu Oct 9 03:43:38 2014 @@ -0,0 +1,328 @@ + +#include "OSGiTierManager.h" +#include "vmkit/StackEmbeddedList.h" + +#if OSGI_BUNDLE_TIER_TAGGING + +#include "JavaThread.h" +#include "Jnjvm.h" +#include "VMStaticInstance.h" + +#include +#include + +#include + +using namespace std; + +#define DEBUG_VERBOSE_ACCOUNTING_OBJECTS 0 +#define DEBUG_VERBOSE_ACCOUNTING_STACK 1 + +namespace j3 { +namespace OSGi { + +//######################################################################### +// +// AccountingStatsDataBase +// +//######################################################################### + +AccountingStatsDataBase::AccountingStatsDataBase() : + _now_collecting_stats(false) + +#if OSGI_OBJECT_TIER_TAGGING + , _mark_state(false) +#endif +{ +} + +void AccountingStatsDataBase::collectStats() +{ + // Initialize counters + _db.clear(); + +#if OSGI_OBJECT_TIER_TAGGING + _mark_state = !_mark_state; +#endif + + // Perform a garbage collection to stop all threads and count memory usage + _now_collecting_stats.store(true, memory_order_release); + + vmkit::Collector::collect(); + + _now_collecting_stats.store(false, memory_order_release); +} + +std::ostream& operator << (std::ostream& os, const AccountingStatsDataBase& db) +{ + os << "Tier memory dump:" << endl; + + for (const auto& i : db._db) { + os << "Tier " << (int)i.first; +#if OSGI_STACK_SPACE_TIER_TAGGING + os << "\tstackSize=" << i.second.stack_size; +#endif + +#if OSGI_OBJECT_TIER_TAGGING + os << "\tobjectCount=" << i.second.object_count << + "\tclassCount=" << i.second.classes.size() << + "\theapStaticSize=" << i.second.heap_static_size << + "\theapVirtualSize=" << i.second.heap_virtual_size; +#endif + os << endl; + } + return os << "Tier memory dump [done]." << endl; +} + +//######################################################################### +// +// TierManager +// +//######################################################################### + +TierManager::TierManager(const BundleStateMonitor& bsm, UTF8Map* hashMap) : + _bundle_state_monitor(bsm), _accounting_config(bsm), _hash_map(hashMap) +{ +} + +int TierManager::loadAccountingRules( + const char* config_file, std::string& errorDescription) +{ + _accounting_config.setFrameworkBundleName(); + + return AccountingConfigurationParser::load( + _accounting_config, config_file, errorDescription, _hash_map); +} + +void TierManager::dumpStats() +{ + _stats_data_base.collectStats(); + cout << _stats_data_base << endl; +} + +#if OSGI_OBJECT_TIER_TAGGING + +void TierManager::updateTierChargedToNewlyCreatedObject(j3::JavaObject* obj) +{ + llvm_gcroot(obj, 0); + + auto thread = j3::JavaThread::get(); + + obj->setTierID( + (thread->chargedTierID == (uint32_t)-1) ? + runtimeTierID : + (tier_id_t)thread->chargedTierID); + + obj->setTierObjectMarkState( + thread->getJVM()->tier_manager._stats_data_base._mark_state); +} + +void TierManager::accountForLiveObject(j3::JavaObject* obj) +{ + llvm_gcroot(obj, 0); + + auto& tm = j3::JavaThread::get()->getJVM()->tier_manager; + if (!tm.isCollectingStats()) return; + + if (j3::VMClassLoader::isVMClassLoader(obj) || + j3::VMStaticInstance::isVMStaticInstance(obj)) + return; + + if (obj->getTierObjectMarkState() == tm._stats_data_base._mark_state) + return; // Already accounted for + + obj->setTierObjectMarkState(tm._stats_data_base._mark_state); + + const auto cl = j3::JavaObject::getClass(obj)->asClass(); + if (!cl) return; + + tier_id_t tierID = (tier_id_t)obj->getTierID(); + auto& tier_iter = tm._stats_data_base._db[tierID]; + +#if DEBUG_VERBOSE_ACCOUNTING_OBJECTS + if (tierID != 0) + std::cerr << "Tier " << (int)tierID << " object " << *obj << std::endl; +#endif + + ++tier_iter.object_count; + tier_iter.heap_virtual_size += cl->getVirtualSize(); + + if (tier_iter.classes.insert(cl).second) + tier_iter.heap_static_size += cl->getStaticSize(); +} + +#endif + +#if OSGI_STACK_SPACE_TIER_TAGGING + +void TierManager::accountForThreadStack(vmkit::Thread* thread) +{ + /* x86 stack frame: + +|-| (last method called) +| | ... +| | BP(i-2) +| | | ret addr(i-2) +| | | args(i-2) +|a| | saved regs(i-1) +|d| V locals(i-1) +|d| BP(i-1) +|r| | ret addr(i-1) +|e| | args(i-1) +|s| | saved regs(i) +|s| V locals(i) +| | BP(i ) +| | ret addr(i) +| | args(i) +| | ... +|+| (first caller method) + + BP := call frame address (base pointer). +*/ + + auto& tm = j3::JavaThread::get()->getJVM()->tier_manager; + if (!tm.isCollectingStats()) return; + + auto& db = tm._stats_data_base._db; + vmkit::StackWalker stackWalker(thread); + std::stack stackFrames; + auto lastFrameAddress = stackWalker.callFrameAddress; + size_t frameSize; + + vmkit::StackEmbeddedListNode *current_node = + thread->stackEmbeddedListHead[vmkit::StackEmbeddedListChargedTier]; + + for (; current_node != nullptr; current_node = current_node->callerNode) { + // Look for the method frame holding the node + auto nodeStart = reinterpret_cast(current_node); + auto nodeEnd = nodeStart + sizeof(*current_node); + auto callFrameStart = stackWalker.callFrameAddress; + auto callFrameEnd = callFrameStart; + auto checkPointFrameAddress = stackWalker.callFrameAddress; + auto found = false; + + for (; + !found && stackWalker.get() != nullptr; + stackFrames.push(stackWalker), ++stackWalker) + { + callFrameEnd = stackWalker.callFrameAddress; + found = (nodeStart >= callFrameStart) && (nodeEnd <= callFrameEnd); + callFrameStart = callFrameEnd; + } + + if (!found) { + // Incomplete stack :-( + while (stackFrames.size() != 0 && + stackFrames.top().callFrameAddress != checkPointFrameAddress) + { + stackFrames.pop(); + } + + stackWalker = stackFrames.top(); + stackFrames.pop(); + continue; + } + + if (stackFrames.size() < 2) { + // Incomplete stack :-( + continue; + } + + // Method frame found + callFrameEnd = stackFrames.top().callFrameAddress; + frameSize = callFrameEnd - lastFrameAddress; + + stackFrames.pop(); + stackWalker = stackFrames.top(); + stackFrames.pop(); + +#if DEBUG_VERBOSE_ACCOUNTING_STACK + cout << "# [" << current_node->data[0] << " += " + << frameSize << "]\t"; + + if (const auto FI = stackWalker.get()) { + if (!FI->Metadata) { + Dl_info si = {}; + auto ra =reinterpret_cast(stackWalker.returnAddress); + if (dladdr(ra, &si) != 0 && si.dli_sname != nullptr) + cout << si.dli_sname << endl; + else + cout << "" << endl; + } else { + cout << *reinterpret_cast(FI->Metadata) + << endl; + } + } +#endif + + db[current_node->data[0]].stack_size += frameSize; + lastFrameAddress = callFrameEnd; + } + + frameSize = thread->baseSP - lastFrameAddress; + db[runtimeTierID].stack_size += frameSize; + +#if DEBUG_VERBOSE_ACCOUNTING_STACK + cout << "# [0 += " << frameSize << "]\t" << endl << endl; +#endif +} + +#endif + +} +} + +#if OSGI_STACK_SPACE_TIER_TAGGING + +extern "C" void OSGi_TierManager_accountForThreadStack(vmkit::Thread* thread) +{ + if (!thread) return; + j3::OSGi::TierManager::accountForThreadStack(thread); +} + +#endif + +extern "C" void Java_j3_vm_Tier_dumpTierStats() +{ + auto& tm = j3::JavaThread::get()->getJVM()->tier_manager; + tm.dumpStats(); +} + +#endif + +#if OSGI_OBJECT_TIER_TAGGING + +extern "C" void OSGi_TierManager_updateTierChargedToNewlyCreatedObject(gc* obj) +{ +#if OSGI_BUNDLE_TIER_TAGGING + llvm_gcroot(obj, 0); + + if (!obj) return; + j3::OSGi::TierManager::updateTierChargedToNewlyCreatedObject( + static_cast(obj)); +#endif +} + +extern "C" void OSGi_TierManager_accountForLiveObject(void* obj) +{ +#if OSGI_BUNDLE_TIER_TAGGING + llvm_gcroot(obj, 0); + + if (!obj) return; + j3::OSGi::TierManager::accountForLiveObject( + static_cast(obj)); +#endif +} + +extern "C" jlong Java_j3_vm_Tier_getTierChargedForObject( + const j3::JavaObject* obj) +{ +#if OSGI_BUNDLE_TIER_TAGGING + llvm_gcroot(obj, 0); + return obj->getTierID(); +#else + return 0; +#endif +} + +#endif Added: vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiTierManager.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiTierManager.h?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiTierManager.h (added) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/OSGiTierManager.h Thu Oct 9 03:43:38 2014 @@ -0,0 +1,125 @@ + +#ifndef OSGITIER_H_ +#define OSGITIER_H_ + +#include "vmkit/config.h" +#include "j3/jni.h" + +class gc; + + +namespace vmkit { + +class UTF8Map; +class Thread; + +} + +namespace j3 { + +class JnjvmClassLoader; +class CommonClass; +class JavaObject; + +} + +#if OSGI_BUNDLE_TIER_TAGGING + +#include "AccountingConfiguration.h" + +#include +#include +#include + +namespace j3 { +namespace OSGi { + +class AccountingStatsDataBase +{ +public: + struct Record { + size_t object_count; + +#if OSGI_STACK_SPACE_TIER_TAGGING + size_t stack_size; +#endif + +#if OSGI_OBJECT_TIER_TAGGING + size_t heap_virtual_size, heap_static_size; + std::set classes; +#endif + }; + + std::atomic _now_collecting_stats; + std::map _db; + +#if OSGI_OBJECT_TIER_TAGGING + bool _mark_state; +#endif + + AccountingStatsDataBase(); + virtual ~AccountingStatsDataBase() {} + + bool isCollectingStats() const + {return _now_collecting_stats.load(std::memory_order_acquire);} + void collectStats(); + + friend std::ostream& operator << ( + std::ostream&, const AccountingStatsDataBase&); +}; + + +class TierManager +{ +protected: + const BundleStateMonitor& _bundle_state_monitor; + AccountingStatsDataBase _stats_data_base; + RuntimeAccountingConfiguration _accounting_config; + vmkit::UTF8Map* _hash_map; + +public: + TierManager(const BundleStateMonitor& bsm, UTF8Map* hashMap); + virtual ~TierManager() {} + + int loadAccountingRules( + const char* config_file, std::string& errorDescription); + + const RuntimeAccountingConfiguration& getAccountingConfig() const + {return _accounting_config;} + + bool isCollectingStats() const + {return _stats_data_base.isCollectingStats();} + void dumpStats(); + +#if OSGI_OBJECT_TIER_TAGGING + static void updateTierChargedToNewlyCreatedObject(j3::JavaObject* obj); + static void accountForLiveObject(j3::JavaObject* obj); +#endif + +#if OSGI_STACK_SPACE_TIER_TAGGING + static void accountForThreadStack(vmkit::Thread* thread); +#endif +}; + +} +} + +#if OSGI_STACK_SPACE_TIER_TAGGING + +extern "C" void OSGi_TierManager_accountForThreadStack(vmkit::Thread* th); + +#endif + +extern "C" void Java_j3_vm_Tier_dumpTierStats(); + +#endif +#endif + +#if OSGI_OBJECT_TIER_TAGGING + +extern "C" void OSGi_TierManager_updateTierChargedToNewlyCreatedObject(gc*); +extern "C" void OSGi_TierManager_accountForLiveObject(void* obj); +extern "C" jlong Java_j3_vm_Tier_getTierChargedForObject( + const j3::JavaObject* obj); + +#endif Modified: vmkit/branches/memory-monitor/lib/j3/VMCore/Precompiled.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/j3/VMCore/Precompiled.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/j3/VMCore/Precompiled.cpp (original) +++ vmkit/branches/memory-monitor/lib/j3/VMCore/Precompiled.cpp Thu Oct 9 03:43:38 2014 @@ -119,7 +119,7 @@ bool Precompiled::Init(JnjvmBootstrapLoa Class* javaLangObject = (Class*)dlsym(SELF_HANDLE, "java_lang_Object"); void* nativeHandle = vmkit::System::GetSelfHandle(); if (javaLangObject == NULL) { - void* handle = dlopen("libvmjc"DYLD_EXTENSION, RTLD_LAZY | RTLD_GLOBAL); + void* handle = dlopen("libvmjc" DYLD_EXTENSION, RTLD_LAZY | RTLD_GLOBAL); if (handle != NULL) { nativeHandle = handle; javaLangObject = (Class*)dlsym(nativeHandle, "java_lang_Object"); Modified: vmkit/branches/memory-monitor/lib/vmkit/CommonThread/CollectionRV.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/vmkit/CommonThread/CollectionRV.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/vmkit/CommonThread/CollectionRV.cpp (original) +++ vmkit/branches/memory-monitor/lib/vmkit/CommonThread/CollectionRV.cpp Thu Oct 9 03:43:38 2014 @@ -103,7 +103,7 @@ void CooperativeCollectionRV::join() { th->inRV = true; lockRV(); - th->setLastSP(System::GetCallerAddress()); + th->setLastSP(System::GetCallFrameAddress()); th->joinedRV = true; another_mark(); waitEndOfRV(); Modified: vmkit/branches/memory-monitor/lib/vmkit/CommonThread/ObjectLocks.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/vmkit/CommonThread/ObjectLocks.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/vmkit/CommonThread/ObjectLocks.cpp (original) +++ vmkit/branches/memory-monitor/lib/vmkit/CommonThread/ObjectLocks.cpp Thu Oct 9 03:43:38 2014 @@ -7,21 +7,9 @@ // //===----------------------------------------------------------------------===// -#include - -#include "vmkit/Cond.h" -#include "vmkit/Locks.h" #include "vmkit/ObjectLocks.h" -#include "vmkit/Thread.h" -#include "vmkit/VirtualMachine.h" #include "VmkitGC.h" -#include -#include -#include - -#include "../../j3/VMCore/JavaObject.h" -#include "../../j3/VMCore/JavaClass.h" -#include "../../j3/VMCore/UTF8.h" +#include "vmkit/VirtualMachine.h" namespace vmkit { @@ -336,8 +324,8 @@ bool FatLock::acquire(gc* obj, LockSyste // if (lockingThreads == 0) // table.deallocate(this); - word_t methodIP = System::GetCallerAddress(); - methodIP = System::GetIPFromCallerAddress(methodIP); + word_t methodIP = System::GetCallFrameAddress(); + methodIP = System::GetReturnAddressOfCallFrame(methodIP); Thread::get()->throwNullPointerException(methodIP); } Modified: vmkit/branches/memory-monitor/lib/vmkit/CommonThread/Sigsegv-linux-x64.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/vmkit/CommonThread/Sigsegv-linux-x64.inc?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/vmkit/CommonThread/Sigsegv-linux-x64.inc (original) +++ vmkit/branches/memory-monitor/lib/vmkit/CommonThread/Sigsegv-linux-x64.inc Thu Oct 9 03:43:38 2014 @@ -38,7 +38,7 @@ void Handler::UpdateRegistersForNPE() { void Handler::UpdateRegistersForStackOverflow() { word_t alt_stack = vmkit::Thread::get()->GetAlternativeStackStart(); - ((ucontext_t*)context)->uc_mcontext.gregs[REG_RDI] = System::GetIPFromCallerAddress(((ucontext_t*)context)->uc_mcontext.gregs[REG_RBP]); + ((ucontext_t*)context)->uc_mcontext.gregs[REG_RDI] = System::GetReturnAddressOfCallFrame(((ucontext_t*)context)->uc_mcontext.gregs[REG_RBP]); ((ucontext_t*)context)->uc_mcontext.gregs[REG_RSI] = ((ucontext_t*)context)->uc_mcontext.gregs[REG_RBP]; ((ucontext_t*)context)->uc_mcontext.gregs[REG_RSP] = alt_stack; ((ucontext_t*)context)->uc_mcontext.gregs[REG_RIP] = (word_t)HandleStackOverflow; Modified: vmkit/branches/memory-monitor/lib/vmkit/CommonThread/Sigsegv-linux-x86.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/vmkit/CommonThread/Sigsegv-linux-x86.inc?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/vmkit/CommonThread/Sigsegv-linux-x86.inc (original) +++ vmkit/branches/memory-monitor/lib/vmkit/CommonThread/Sigsegv-linux-x86.inc Thu Oct 9 03:43:38 2014 @@ -40,7 +40,7 @@ void Handler::UpdateRegistersForNPE() { void Handler::UpdateRegistersForStackOverflow() { word_t alt_stack = vmkit::Thread::get()->GetAlternativeStackStart(); - ((ucontext_t*)context)->uc_mcontext.gregs[REG_EBX] = System::GetIPFromCallerAddress(((ucontext_t*)context)->uc_mcontext.gregs[REG_EBP]); + ((ucontext_t*)context)->uc_mcontext.gregs[REG_EBX] = System::GetReturnAddressOfCallFrame(((ucontext_t*)context)->uc_mcontext.gregs[REG_EBP]); ((ucontext_t*)context)->uc_mcontext.gregs[REG_EAX] = ((ucontext_t*)context)->uc_mcontext.gregs[REG_EBP]; ((ucontext_t*)context)->uc_mcontext.gregs[REG_ESP] = alt_stack; ((ucontext_t*)context)->uc_mcontext.gregs[REG_EIP] = (word_t)HandleStackOverflow; Added: vmkit/branches/memory-monitor/lib/vmkit/CommonThread/StackEmbeddedList.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/vmkit/CommonThread/StackEmbeddedList.cpp?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/lib/vmkit/CommonThread/StackEmbeddedList.cpp (added) +++ vmkit/branches/memory-monitor/lib/vmkit/CommonThread/StackEmbeddedList.cpp Thu Oct 9 03:43:38 2014 @@ -0,0 +1,134 @@ + +#include "vmkit/StackEmbeddedList.h" +#include "vmkit/MethodInfo.h" + +#include + +#if 0 +// #if EMBEDDED_LIST_IN_CALL_STACK + +namespace vmkit { + +bool StackEmbeddedListWalker::findStackFrameOfEmbeddedNode() +{ + /* Consider the following x86 stack frame: + +|-| (last method called) +| | ... +| | BP(i-2) +| | | ret addr(i-2) +| | | args(i-2) +|a| | saved regs(i-1) +|d| V locals(i-1) +|d| BP(i-1) +|r| | ret addr(i-1) +|e| | args(i-1) +|s| | saved regs(i) +|s| V locals(i) +| | BP(i ) +| | ret addr(i) +| | args(i) +| | ... +|+| (first caller method) + + BP := call frame address (base pointer). + The intended caller linked list nodes are generated in the locals area of + the caller method frame. + + In order to find the given node in "locals(i)", we need to know where + "locals(i)" is located = [BP(i-1), BP(i)]. + If the node is found in "locals(i)", this means that the frame "i-1" is the + caller of the intended method, so the intended method frame itself is "i-2". + This is why we need to keep track of the last two stack frames when walking + the stack. + Because some frames are Java method stub frames, we need to know which + frame they call (the actual called Java method). Thus we need to keep the + last three stack frames. + Because we need to preserve those 4 stack frames, and because we might go + backward in the stack queue by at most 3 elements, we need to preserve the + stack queue. This is the purpose of walkedStack. + */ + + word_t nodeStart = (word_t)_current_node; + word_t nodeEnd = nodeStart + sizeof(*_current_node); + + auto callFrameStart = _walked_stack.empty() ? + _stack_walker.callFrameAddress : + _walked_stack.front().callFrameAddress; + + for (; _stack_walker.get() != nullptr; + _walked_stack.push_front(_stack_walker), ++_stack_walker) + { + auto callFrameEnd = _stack_walker.callFrameAddress; + + if ((nodeStart >= callFrameStart) && (nodeEnd <= callFrameEnd)) { + // Found the node, go backward two frames, if possible. + switch (_walked_stack.size()) { + case 0: + // We actually have an incomplete stack frame (VMKit bug). + // We don't have access neither to the called frame nor the + // called frame. + // Report the caller of the caller frame (basically no op). + break; + + case 1: + // We actually have an incomplete stack frame (VMKit bug). + // We don't have access to the called frame. + // Report the caller frame. + _stack_walker = _walked_stack.front(); + _walked_stack.pop_front(); + break; + + default: // _walked_stack.size() >= 2 + _walked_stack.pop_front(); // Remove the frame -1. + _stack_walker = _walked_stack.front(); // Get the frame -2. + _walked_stack.pop_front(); // Remove the frame -2. + + // If the frame is a stub, then return the actual Java method. + auto FI = _stack_walker.get(); + if (!FI->Metadata && (FI->FrameSize > 0) && + !_walked_stack.empty()) + { + _stack_walker = _walked_stack.front(); // Get the frame -3. + _walked_stack.pop_front(); // Remove the frame -3. + } + } + + return true; + } + + callFrameStart = callFrameEnd; + } + + return false; // Node not found +} + +bool StackEmbeddedListWalker::next() +{ + if (!_current_node) { // Initial _current_node + _current_node = _stack_walker.thread-> + stackEmbeddedListHead[StackEmbeddedListChargedTier]; + } else { + _current_node = _current_node->callerNode; // Get the next node + } + + while (_current_node != nullptr) { // Find the caller Java method frame. + if (findStackFrameOfEmbeddedNode()) + break; + + _current_node = _current_node->callerNode; + } + + return _current_node != nullptr; +} + +void StackEmbeddedListNode::dump() const +{ + std::cout << "tierID=" << reinterpret_cast(data[0]) << std::endl; + if (!callerNode) return; + callerNode->dump(); +} + +} + +#endif Modified: vmkit/branches/memory-monitor/lib/vmkit/CommonThread/ctthread.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/vmkit/CommonThread/ctthread.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/vmkit/CommonThread/ctthread.cpp (original) +++ vmkit/branches/memory-monitor/lib/vmkit/CommonThread/ctthread.cpp Thu Oct 9 03:43:38 2014 @@ -26,6 +26,10 @@ #include #include +#if MONITOR_CREATED_OBJECTS_COUNT +extern "C" void Jnjvm_incrementTotalCalledMethodsCounter(vmkit::Thread*); +#endif + using namespace vmkit; int Thread::kill(void* tid, int signo) { @@ -60,7 +64,7 @@ void Thread::joinRVAfterLeave(word_t sav void Thread::startKnownFrame(KnownFrame& F) { // Get the caller of this function - word_t cur = System::GetCallerAddress(); + word_t cur = System::GetCallFrameAddress(); F.previousFrame = lastKnownFrame; F.currentFP = cur; // This is used as a marker. @@ -75,12 +79,12 @@ void Thread::endKnownFrame() { void Thread::startUnknownFrame(KnownFrame& F) { // Get the caller of this function - word_t cur = System::GetCallerAddress(); + word_t cur = System::GetCallFrameAddress(); // Get the caller of the caller. - cur = System::GetCallerOfAddress(cur); + cur = System::GetCallerCallFrame(cur); F.previousFrame = lastKnownFrame; F.currentFP = cur; - F.currentIP = System::GetIPFromCallerAddress(cur); + F.currentIP = System::GetReturnAddressOfCallFrame(cur); lastKnownFrame = &F; } @@ -97,7 +101,7 @@ void Thread::printBacktrace() { StackWalker Walker(this); while (FrameInfo* FI = Walker.get()) { - MyVM->printMethod(FI, Walker.ip, Walker.addr); + MyVM->printMethod(FI, Walker.returnAddress, Walker.callFrameAddress); ++Walker; } } @@ -124,42 +128,89 @@ uint32_t Thread::getFrameContextLength() } FrameInfo* StackWalker::get() { - if (addr == thread->baseSP) return 0; - ip = System::GetIPFromCallerAddress(addr); - return thread->MyVM->IPToFrameInfo(ip); + if (callFrameAddress == thread->baseSP) return 0; + returnAddress = System::GetReturnAddressOfCallFrame(callFrameAddress); + return thread->MyVM->IPToFrameInfo(returnAddress); +} + +FrameInfo* StackWalker::getNextFrameWithMetadata() +{ + FrameInfo* FI; + for (void *metadata = NULL; // (1) + (!metadata) && ((FI = this->get()) != NULL); // (2)+ + metadata = FI->Metadata, ++(*this)); // (3)* + return FI; +} + +FrameInfo* StackWalker::getNextFrameWithMetadata( + size_t& totalFrameSizeWithoutMetadata) +{ + size_t frameSize = 0; + FrameInfo* FI = NULL; + for (void *metadata = NULL; // (1) + (!metadata) && ((FI = this->get()) != NULL); // (2)+ + + frameSize += FI->FrameSize, // (3)* + metadata = FI->Metadata, + ++(*this)); + + if (FI != NULL) frameSize -= FI->FrameSize; + totalFrameSizeWithoutMetadata = frameSize; + return FI; +} + +FrameInfo* StackWalker::getNextFrameWithMetadata( + word_t& callFrameAddress_, word_t& returnAddress_, KnownFrame*& frame_) +{ + FrameInfo* FI; + word_t _callFrameAddress, _returnAddress; + KnownFrame* _frame; + void *metadata = NULL; + + for (; (!metadata) && ((FI = this->get()) != NULL); // (1)+ + metadata = FI->Metadata, // (2)* + _callFrameAddress = callFrameAddress, _returnAddress = returnAddress, _frame = frame, + ++(*this)); + + callFrameAddress_ = _callFrameAddress; + returnAddress_ = _returnAddress; + frame_ = _frame; + return FI; } word_t StackWalker::operator*() { - if (addr == thread->baseSP) return 0; - ip = System::GetIPFromCallerAddress(addr); - return ip; + if (callFrameAddress == thread->baseSP) return 0; + returnAddress = System::GetReturnAddressOfCallFrame(callFrameAddress); + return returnAddress; } void StackWalker::operator++() { - if (addr != thread->baseSP) { - //assert((addr < thread->baseSP) && "Corrupted stack"); - //assert((addr < System::GetCallerOfAddress(addr)) && "Corrupted stack"); - if ((frame != NULL) && (addr == frame->currentFP)) { + if (callFrameAddress != thread->baseSP) { + assert((callFrameAddress < thread->baseSP) && "Corrupted stack"); + assert((callFrameAddress < System::GetCallerCallFrame(callFrameAddress)) && "Corrupted stack"); + if ((frame != NULL) && (callFrameAddress == frame->currentFP)) { assert(frame->currentIP == 0); frame = frame->previousFrame; assert(frame != NULL); assert(frame->currentIP != 0); - addr = frame->currentFP; + callFrameAddress = frame->currentFP; frame = frame->previousFrame; } else { - addr = System::GetCallerOfAddress(addr); + callFrameAddress = System::GetCallerCallFrame(callFrameAddress); } } } -StackWalker::StackWalker(vmkit::Thread* th) { +StackWalker::StackWalker(vmkit::Thread* th) : + returnAddress(0) +{ thread = th; frame = th->lastKnownFrame; if (vmkit::Thread::get() == th) { - addr = System::GetCallerAddress(); - addr = System::GetCallerOfAddress(addr); + callFrameAddress = System::GetCallFrameAddress(); + callFrameAddress = System::GetCallerCallFrame(callFrameAddress); } else { - addr = th->waitOnSP(); + callFrameAddress = th->waitOnSP(); if (frame) { // if (frame->currentFP < addr) { // fprintf(stderr, "Error in thread with pointer %p because %x < %x\n", th, frame->currentFP, addr); @@ -167,9 +218,9 @@ StackWalker::StackWalker(vmkit::Thread* // } - assert(frame->currentFP >= addr); + assert(frame->currentFP >= callFrameAddress); } - if (frame && (addr == frame->currentFP)) { + if (frame && (callFrameAddress == frame->currentFP)) { frame = frame->previousFrame; // Let this be called from JNI, as in // OpenJDK's JVM_FillInStackTrace: @@ -178,14 +229,32 @@ StackWalker::StackWalker(vmkit::Thread* assert((frame == NULL) || (frame->currentIP == 0)); } } - assert(addr && "No address to start with"); + assert(callFrameAddress && "No address to start with"); } +StackWalker::StackWalker() : + returnAddress(0) +{ + thread = vmkit::Thread::get(); + frame = thread->lastKnownFrame; + callFrameAddress = System::GetCallFrameAddress(); + callFrameAddress = System::GetCallerCallFrame(callFrameAddress); + assert(callFrameAddress && "No address to start with"); +} + +#if OSGI_STACK_SPACE_TIER_TAGGING +extern "C" void OSGi_TierManager_accountForThreadStack(vmkit::Thread* thread); +#endif void Thread::scanStack(word_t closure) { + +#if OSGI_STACK_SPACE_TIER_TAGGING + OSGi_TierManager_accountForThreadStack(this); +#endif + StackWalker Walker(this); while (FrameInfo* MI = Walker.get()) { - MethodInfoHelper::scan(closure, MI, Walker.ip, Walker.addr); + MethodInfoHelper::scan(closure, MI, Walker.returnAddress, Walker.callFrameAddress); ++Walker; } } @@ -195,11 +264,11 @@ void Thread::enterUncooperativeCode(uint if (!inRV) { assert(!lastSP && "SP already set when entering uncooperative code"); // Get the caller. - word_t temp = System::GetCallerAddress(); + word_t temp = System::GetCallFrameAddress(); // Make sure to at least get the caller of the caller. ++level; while (level--) - temp = System::GetCallerOfAddress(temp); + temp = System::GetCallerCallFrame(temp); // The cas is not necessary, but it does a memory barrier. __sync_bool_compare_and_swap(&lastSP, 0, temp); if (doYield) joinRVBeforeEnter(); @@ -337,7 +406,20 @@ extern void sigsTermHandler(int n, sigin /// given routine of th. /// void Thread::internalThreadStart(vmkit::Thread* th) { - th->baseSP = System::GetCallerAddress(); + th->baseSP = System::GetCallFrameAddress(); + +#if JAVA_CHARGED_TIER_CALL_STACK + th->chargedTierID = (uint32_t)-1; +#endif + +#if EMBEDDED_LIST_IN_CALL_STACK + memset(th->stackEmbeddedListHead, 0, + sizeof(*th->stackEmbeddedListHead) * StackEmbeddedListNodeCountPerThread); +#endif + +#if MONITOR_CREATED_OBJECTS_COUNT + th->total_called_methods_count = 0; +#endif // Set the alternate stack as the second page of the thread's // stack. @@ -374,6 +456,10 @@ void Thread::internalThreadStart(vmkit:: th->MyVM->rendezvous.addThread(th); th->routine(th); th->MyVM->removeThread(th); + +#if MONITOR_CREATED_OBJECTS_COUNT + Jnjvm_incrementTotalCalledMethodsCounter(th); +#endif } @@ -420,6 +506,10 @@ void Thread::releaseThread(vmkit::Thread word_t index = ((word_t)th & System::GetThreadIDMask()); index = (index & ~TheStackManager.baseAddr) >> 20; TheStackManager.used[index] = 0; + +#if MONITOR_CREATED_OBJECTS_COUNT + Jnjvm_incrementTotalCalledMethodsCounter(th); +#endif } void Thread::throwNullPointerException(word_t methodIP) Modified: vmkit/branches/memory-monitor/lib/vmkit/Runtime/MethodInfo.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/vmkit/Runtime/MethodInfo.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/vmkit/Runtime/MethodInfo.cpp (original) +++ vmkit/branches/memory-monitor/lib/vmkit/Runtime/MethodInfo.cpp Thu Oct 9 03:43:38 2014 @@ -21,7 +21,7 @@ namespace vmkit { void MethodInfoHelper::scan(word_t closure, FrameInfo* FI, word_t ip, word_t addr) { //word_t spaddr = (word_t)addr + FI->FrameSize + sizeof(void*); - word_t spaddr = System::GetCallerOfAddress(addr); + word_t spaddr = System::GetCallerCallFrame(addr); for (uint16 i = 0; i < FI->NumLiveOffsets; ++i) { word_t obj = *(word_t*)(spaddr + FI->LiveOffsets[i]); // Verify that obj does not come from a JSR bytecode. Modified: vmkit/branches/memory-monitor/lib/vmkit/Runtime/UTF8.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/lib/vmkit/Runtime/UTF8.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/lib/vmkit/Runtime/UTF8.cpp (original) +++ vmkit/branches/memory-monitor/lib/vmkit/Runtime/UTF8.cpp Thu Oct 9 03:43:38 2014 @@ -41,17 +41,6 @@ uint32 UTF8::readerHasher(const uint16* return (r1 & 255) + ((r0 & 255) << 8); } -int UTF8::compare(const char *s) const -{ - int len = strlen(s); - int diff = size - len; - if (diff != 0) return diff; - - for (int i = 0; (i < size) && (diff == 0); ++i) - diff = (char)(elements[i]) - s[i]; - return diff; -} - std::string& UTF8::toString(std::string& buffer) const { buffer.resize(size); @@ -64,7 +53,7 @@ std::string& UTF8::toString(std::string& std::ostream& operator << (std::ostream& os, const UTF8& utf8) { - for (ssize_t i = 0; i < utf8.size; ++i) + for (ssize_t i = 0; (i < utf8.size) && (utf8.elements[i] != 0); ++i) os << (std::string::value_type)(utf8.elements[i]); return os; } Modified: vmkit/branches/memory-monitor/mmtk/mmtk-alloc/Selected.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/mmtk/mmtk-alloc/Selected.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/mmtk/mmtk-alloc/Selected.cpp (original) +++ vmkit/branches/memory-monitor/mmtk/mmtk-alloc/Selected.cpp Thu Oct 9 03:43:38 2014 @@ -98,12 +98,29 @@ extern "C" void postalloc(gc* obj, void* JnJVM_org_j3_bindings_Bindings_postalloc__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2I(obj, type, size); } +#if OSGI_OBJECT_TIER_TAGGING +extern "C" void OSGi_TierManager_updateTierChargedToNewlyCreatedObject(gc*); +#endif + +#if MONITOR_CREATED_OBJECTS_COUNT +extern "C" void Jnjvm_newlyCreatedObject(); +#endif + extern "C" void* vmkitgcmalloc(uint32_t sz, void* type) { gc* res = 0; llvm_gcroot(res, 0); sz += gcHeader::hiddenHeaderSize(); sz = llvm::RoundUpToAlignment(sz, sizeof(void*)); res = ((gcHeader*)JnJVM_org_j3_bindings_Bindings_vmkitgcmalloc__ILorg_vmmagic_unboxed_ObjectReference_2(sz, type))->toReference(); + +#if OSGI_OBJECT_TIER_TAGGING + OSGi_TierManager_updateTierChargedToNewlyCreatedObject(res); +#endif + +#if MONITOR_CREATED_OBJECTS_COUNT + Jnjvm_newlyCreatedObject(); +#endif + return res; } @@ -125,6 +142,15 @@ extern "C" void* VTgcmalloc(uint32_t sz, sz += gcHeader::hiddenHeaderSize(); sz = llvm::RoundUpToAlignment(sz, sizeof(void*)); res = ((gcHeader*)JnJVM_org_j3_bindings_Bindings_VTgcmalloc__ILorg_vmmagic_unboxed_ObjectReference_2(sz, VT))->toReference(); + +#if OSGI_OBJECT_TIER_TAGGING + OSGi_TierManager_updateTierChargedToNewlyCreatedObject(res); +#endif + +#if MONITOR_CREATED_OBJECTS_COUNT + Jnjvm_newlyCreatedObject(); +#endif + return res; } @@ -180,10 +206,19 @@ bool Collector::isLive(gc* ptr, word_t c return JnJVM_org_j3_bindings_Bindings_isLive__Lorg_mmtk_plan_TraceLocal_2Lorg_vmmagic_unboxed_ObjectReference_2(closure, ptr); } +#if OSGI_OBJECT_TIER_TAGGING +extern "C" void OSGi_TierManager_accountForLiveObject(void* obj); +#endif + void Collector::scanObject(FrameInfo* FI, void** ptr, word_t closure) { if ((*ptr) != NULL) { assert(vmkit::Thread::get()->MyVM->isCorruptedType((gc*)(*ptr))); } + +#if OSGI_OBJECT_TIER_TAGGING + OSGi_TierManager_accountForLiveObject(*ptr); +#endif + JnJVM_org_j3_bindings_Bindings_reportDelayedRootEdge__Lorg_mmtk_plan_TraceLocal_2Lorg_vmmagic_unboxed_Address_2(closure, ptr); } @@ -194,6 +229,11 @@ void Collector::markAndTrace(void* sourc assert(vmkit::Thread::get()->MyVM->isCorruptedType((gc*)(*ptr_))); } if ((*(void**)ptr) != NULL) assert(vmkit::Thread::get()->MyVM->isCorruptedType((gc*)(*(void**)ptr))); + +#if OSGI_OBJECT_TIER_TAGGING + OSGi_TierManager_accountForLiveObject(*ptr_); +#endif + JnJVM_org_j3_bindings_Bindings_processEdge__Lorg_mmtk_plan_TransitiveClosure_2Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Address_2(closure, source, ptr); } @@ -203,6 +243,11 @@ void Collector::markAndTraceRoot(void* s if ((*ptr_) != NULL) { assert(vmkit::Thread::get()->MyVM->isCorruptedType((gc*)(*ptr_))); } + +#if OSGI_OBJECT_TIER_TAGGING + OSGi_TierManager_accountForLiveObject(*ptr_); +#endif + JnJVM_org_j3_bindings_Bindings_processRootEdge__Lorg_mmtk_plan_TraceLocal_2Lorg_vmmagic_unboxed_Address_2Z(closure, ptr, true); } Propchange: vmkit/branches/memory-monitor/osgi/j3mgr/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +out +.bundle-pack +.classpath +.git* +.project + Added: vmkit/branches/memory-monitor/osgi/j3mgr/bundle.manifest URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/j3mgr/bundle.manifest?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/j3mgr/bundle.manifest (added) +++ vmkit/branches/memory-monitor/osgi/j3mgr/bundle.manifest Thu Oct 9 03:43:38 2014 @@ -0,0 +1,9 @@ +Manifest-Version: 1.0 +Bundle-Version: 1.0.0 +Bundle-Name: J3 Manager +Bundle-ManifestVersion: 2 +Bundle-Activator: j3mgr.Activator +Bundle-SymbolicName: j3mgr +Bundle-Vendor: Koutheir Attouchi +Export-Package: j3 +Import-Package: org.osgi.framework Added: vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/J3Mgr.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/J3Mgr.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/J3Mgr.java (added) +++ vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/J3Mgr.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,10 @@ +package j3; + +public interface J3Mgr +{ + // THE FOLLOWING METHODS ARE DEBUGGING HELPERS + // THEY SHOULD BE REMOVED IN PRODUCTION + + public void dumpClassLoaderBundles() throws Throwable; + public void dumpTierStats(String delayedSec) throws Throwable; +} Added: vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/vm/OSGi.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/vm/OSGi.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/vm/OSGi.java (added) +++ vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/vm/OSGi.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,10 @@ +package j3.vm; + +public class OSGi +{ + public static native void bundleResolved( + String bundleName, long bundleID, ClassLoader loaderObject); + public static native void bundleUnresolved( + String bundleName, long bundleID); + public static native void dumpClassLoaderBundles(); +} Added: vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/vm/Tier.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/vm/Tier.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/vm/Tier.java (added) +++ vmkit/branches/memory-monitor/osgi/j3mgr/src/j3/vm/Tier.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,7 @@ +package j3.vm; + +public class Tier +{ + public static native long getTierChargedForObject(Object obj); + public static native void dumpTierStats(); +} Added: vmkit/branches/memory-monitor/osgi/j3mgr/src/j3mgr/Activator.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/j3mgr/src/j3mgr/Activator.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/j3mgr/src/j3mgr/Activator.java (added) +++ vmkit/branches/memory-monitor/osgi/j3mgr/src/j3mgr/Activator.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,28 @@ + +package j3mgr; + +import j3.J3Mgr; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +public class Activator + implements BundleActivator +{ + J3MgrImpl j3mgr; + + public void start(BundleContext context) throws Exception + { + j3mgr = new J3MgrImpl(); + try { + j3mgr.open(context); + } catch (Throwable e) {throw new Exception(e);} + + context.registerService(J3Mgr.class, j3mgr, null); + } + + public void stop(BundleContext context) throws Exception + { + j3mgr.close(); + } +} \ No newline at end of file Added: vmkit/branches/memory-monitor/osgi/j3mgr/src/j3mgr/J3MgrImpl.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/j3mgr/src/j3mgr/J3MgrImpl.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/j3mgr/src/j3mgr/J3MgrImpl.java (added) +++ vmkit/branches/memory-monitor/osgi/j3mgr/src/j3mgr/J3MgrImpl.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,87 @@ +package j3mgr; + +import j3.J3Mgr; + +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; + +public class J3MgrImpl + implements J3Mgr +{ + class dumpTierStatsRunner implements Runnable + { + final long delayedMillisec; + + public dumpTierStatsRunner(long delayedMillisec) + { + this.delayedMillisec = delayedMillisec; + } + + public void run() { + try { + Thread.sleep(delayedMillisec); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + j3.vm.Tier.dumpTierStats(); + } + } + + BundleContext context; + + public void open(BundleContext bundleContext) throws Throwable + { + context = bundleContext; + } + + public void close() + { + context = null; + } + + // THE FOLLOWING METHODS ARE DEBUGGING HELPERS + // THEY SHOULD BE REMOVED IN PRODUCTION + + long getBundleID(String symbolicNameOrID) + { + try { + long bundleID = Long.parseLong(symbolicNameOrID); + + if (context.getBundle(bundleID) == null) { + System.out.println( + "WARNING: bundleID=" + bundleID + + " is invalid, probably already uninstalled."); + } + + return (bundleID < 0) ? -1 : bundleID; + } catch (NumberFormatException e) { + // This is not a bundle ID, it must be a symbolic name + } + + Bundle[] bundles = context.getBundles(); + for (int i=0; i < bundles.length; ++i) { + if (symbolicNameOrID.equals(bundles[i].getSymbolicName())) + return bundles[i].getBundleId(); + } + return -1; + } + + public void dumpClassLoaderBundles() throws Throwable + { + j3.vm.OSGi.dumpClassLoaderBundles(); + } + + public void dumpTierStats(String delayedSec) throws Throwable + { + long delay = Long.parseLong(delayedSec); + Runnable runner = new dumpTierStatsRunner(delay * 1000); + + if (delay <= 0) { + runner.run(); + } else { + System.out.println("dumpTierStats runs in delayed mode..."); + new Thread(runner, "dumpTierStats").start(); + } + } +} Added: vmkit/branches/memory-monitor/osgi/knopflerfish.patch URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/knopflerfish.patch?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/knopflerfish.patch (added) +++ vmkit/branches/memory-monitor/osgi/knopflerfish.patch Thu Oct 9 03:43:38 2014 @@ -0,0 +1,46 @@ +diff -U 4 -H -d -p -r -N -- a/osgi/framework/src/j3/vm/OSGi.java b/osgi/framework/src/j3/vm/OSGi.java +--- a/osgi/framework/src/j3/vm/OSGi.java 1970-01-01 01:00:00.000000000 +0100 ++++ b/osgi/framework/src/j3/vm/OSGi.java 2013-12-09 17:26:46.738542108 +0100 +@@ -0,0 +1,9 @@ ++package j3.vm; ++ ++public class OSGi ++{ ++ public static native void bundleResolved( ++ String bundleName, long bundleID, ClassLoader loaderObject); ++ public static native void bundleUnresolved( ++ String bundleName, long bundleID); ++} +diff -U 4 -H -d -p -r -N -- a/osgi/framework/src/org/knopflerfish/framework/BundleGeneration.java b/osgi/framework/src/org/knopflerfish/framework/BundleGeneration.java +--- a/osgi/framework/src/org/knopflerfish/framework/BundleGeneration.java 2013-12-06 11:47:15.745783303 +0100 ++++ b/osgi/framework/src/org/knopflerfish/framework/BundleGeneration.java 2013-12-09 17:55:39.705198422 +0100 +@@ -212,8 +212,9 @@ public class BundleGeneration implements + timeStamp = System.currentTimeMillis(); + bpkgs = new BundlePackages(this, exportStr); + bundleRevision = new BundleRevisionImpl(this); + classLoader = b.getClassLoader(); ++ j3.vm.OSGi.bundleResolved(symbolicName, bundle.getBundleId(), classLoader); + processCapabilities(capabilityStr); + identity = new BundleCapabilityImpl(this); + } + +@@ -546,8 +547,9 @@ public class BundleGeneration implements + } + } + } + classLoader = bundle.secure.newBundleClassLoader(this); ++ j3.vm.OSGi.bundleResolved(symbolicName, bundle.getBundleId(), classLoader); + + return true; + } + if (isFragmentHost()) { +@@ -920,8 +922,9 @@ public class BundleGeneration implements + final BundleClassLoader tmp = (BundleClassLoader)classLoader; + if (tmp != null) { + classLoader = null; + tmp.close(); ++ j3.vm.OSGi.bundleUnresolved(symbolicName, bundle.getBundleId()); + } + } + + Propchange: vmkit/branches/memory-monitor/osgi/tests/TierConfigParser/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +out +.bundle-pack +.classpath +.git* +.project +.settings Added: vmkit/branches/memory-monitor/osgi/tests/TierConfigParser/src/j3mgr/Main.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/TierConfigParser/src/j3mgr/Main.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/TierConfigParser/src/j3mgr/Main.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/TierConfigParser/src/j3mgr/Main.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,13 @@ + +package j3mgr; + +public class Main { + + public static void main(String[] args) throws Throwable + { + TierConfigParser parser = new TierConfigParser(); + + parser.parse( + "/home/koutheir/PhD/VMKit/vmkit-monitor/tests/tier.description"); + } +} Added: vmkit/branches/memory-monitor/osgi/tests/TierConfigParser/src/j3mgr/TierConfigParser.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/TierConfigParser/src/j3mgr/TierConfigParser.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/TierConfigParser/src/j3mgr/TierConfigParser.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/TierConfigParser/src/j3mgr/TierConfigParser.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,224 @@ +package j3mgr; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + + +public class TierConfigParser +{ + String token_identifier; + int token_integer; + int lastChar; + InputStream source; + + public void parse(String fileName) throws Throwable + { + InputStream is = new FileInputStream(fileName); + parse(is); + } + + public void parse(InputStream is) throws NoSuchElementException, IOException + { + source = is; + lastChar = source.read(); + token_identifier = ""; + + for (;;) { + skipWhiteSpaceAndComments(); + if (lastChar == -1) break; + + if (!parseIdentifier()) { + throw new NoSuchElementException( + "'tier' or 'account' expected."); + } + + if (parseTier()) {} + else if (parseAccount()) {} + else { + if (lastChar == -1) + break; + + throw new NoSuchElementException( + "'tier' or 'account' expected."); + } + } + } + + void skipWhiteSpaceAndComments() throws IOException + { + for (;;) { + // Skip white space + for (; (lastChar != -1) && Character.isWhitespace(lastChar); + lastChar = source.read()); + + if (lastChar != '#') break; + + // Skip a comment line + lastChar = source.read(); + while (lastChar != '\n') + lastChar = source.read(); + lastChar = source.read(); + } + } + + boolean parseIdentifier() throws IOException + { + skipWhiteSpaceAndComments(); + + if (!Character.isLetter(lastChar) && lastChar != '_') return false; + + StringBuilder sb = new StringBuilder(); + sb.appendCodePoint(lastChar); + lastChar = source.read(); + + while (Character.isLetterOrDigit(lastChar) || lastChar == '_') { + sb.appendCodePoint(lastChar); + lastChar = source.read(); + } + + token_identifier = sb.toString(); + return true; + } + + boolean parseInteger() throws IOException + { + skipWhiteSpaceAndComments(); + + StringBuilder sb = new StringBuilder(); + + if (lastChar == '+' || lastChar == '-') { + sb.appendCodePoint(lastChar); + lastChar = source.read(); + + if (!Character.isDigit(lastChar)) + throw new NoSuchElementException("Digit expected."); + } else if (!Character.isDigit(lastChar)) + return false; + + do { + sb.appendCodePoint(lastChar); + lastChar = source.read(); + } while (Character.isDigit(lastChar)); + + token_identifier = sb.toString(); + token_integer = Integer.parseInt(token_identifier); + return true; + } + + boolean parseTier() throws IOException + { + if (token_identifier.compareTo("tier") != 0) return false; + + if (!parseInteger()) + throw new NoSuchElementException("Integer expected."); + + skipWhiteSpaceAndComments(); + if (lastChar != '{') + throw new NoSuchElementException("'{' expected."); + lastChar = source.read(); + + ArrayList bundles = new ArrayList(); + + skipWhiteSpaceAndComments(); + if (lastChar != '}') { + for (;;) { + if (!parseIdentifier()) + throw new NoSuchElementException("bundle name expected."); + + bundles.add(token_identifier); + + skipWhiteSpaceAndComments(); + if (lastChar == '}') break; + + if (lastChar != ',') + throw new NoSuchElementException("',' expected."); + lastChar = source.read(); + } + } + + if (lastChar != '}') + throw new NoSuchElementException("'}' expected."); + lastChar = source.read(); + + return createTier(token_integer, bundles); + } + + boolean parseAccount() throws IOException + { + if (token_identifier.compareTo("account") != 0) return false; + + skipWhiteSpaceAndComments(); + if (lastChar != '{') + throw new NoSuchElementException("'{' expected."); + lastChar = source.read(); + + long callerTierID = -1; + skipWhiteSpaceAndComments(); + if (lastChar != '*') { + if (!parseInteger()) + throw new NoSuchElementException("Integer or '*' expected."); + callerTierID = token_integer; + } else + lastChar = source.read(); + + skipWhiteSpaceAndComments(); + if (lastChar != ',') + throw new NoSuchElementException("',' expected."); + lastChar = source.read(); + + long calleeTierID = -1; + skipWhiteSpaceAndComments(); + if (lastChar != '*') { + if (!parseInteger()) + throw new NoSuchElementException("Integer or '*' expected."); + calleeTierID = token_integer; + } else + lastChar = source.read(); + + skipWhiteSpaceAndComments(); + if (lastChar != ',') + throw new NoSuchElementException("',' expected."); + lastChar = source.read(); + + if (!parseIdentifier()) + throw new NoSuchElementException("'caller' or 'callee' expected."); + + boolean chargeCaller = (token_identifier.compareTo("caller") == 0); + if (!chargeCaller && (token_identifier.compareTo("callee") != 0)) + throw new NoSuchElementException("'caller' or 'callee' expected."); + + skipWhiteSpaceAndComments(); + if (lastChar != '}') + throw new NoSuchElementException("'}' expected."); + lastChar = source.read(); + + return createAccount(callerTierID, calleeTierID, chargeCaller); + } + + boolean createTier(long tierID, List bundleList) + { + System.out.print(tierID + "="); + if (bundleList != null) { + for (String bundleID : bundleList) + System.out.print(bundleID + " "); + } + System.out.println(); + return true; + } + + boolean createAccount( + long callerTierID, long calleeTierID, boolean chargeCaller) + { + System.out.println( + callerTierID + "=>" + calleeTierID + ":" + + (chargeCaller ? "caller" : "callee")); + return true; + } +} Propchange: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +out +.bundle-pack +.classpath +.git* +.project + Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/bundle.manifest URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/bundle.manifest?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/bundle.manifest (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/bundle.manifest Thu Oct 9 03:43:38 2014 @@ -0,0 +1,7 @@ +Manifest-Version: 1.0 +Bundle-Version: 1.0.0 +Bundle-Name: A +Bundle-ManifestVersion: 2 +Bundle-SymbolicName: ijvm.tests.A +Export-Package: ijvm.tests.A + Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/src/ijvm/tests/A/A.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/src/ijvm/tests/A/A.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/src/ijvm/tests/A/A.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/src/ijvm/tests/A/A.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,7 @@ +package ijvm.tests.A; + +public interface A +{ + public void performA(); + public Token getToken(); +} Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/src/ijvm/tests/A/Token.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/src/ijvm/tests/A/Token.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/src/ijvm/tests/A/Token.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.A/src/ijvm/tests/A/Token.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +package ijvm.tests.A; + +public interface Token +{ + public int getValue(); +} Propchange: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +out +.bundle-pack +.classpath +.git* +.project + Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/bundle.manifest URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/bundle.manifest?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/bundle.manifest (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/bundle.manifest Thu Oct 9 03:43:38 2014 @@ -0,0 +1,9 @@ +Manifest-Version: 1.0 +Bundle-Version: 1.0.0 +Bundle-Name: AImpl +Bundle-Activator: ijvm.tests.AImpl.Activator +Bundle-ManifestVersion: 2 +Import-Package: ijvm.tests.A, ijvm.tests.C, org.osgi.util.tracker, org + .osgi.framework +Bundle-SymbolicName: ijvm.tests.AImpl + Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/AImpl.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/AImpl.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/AImpl.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/AImpl.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,28 @@ +package ijvm.tests.AImpl; + +import java.util.ArrayList; + +import ijvm.tests.A.A; +import ijvm.tests.A.Token; +import ijvm.tests.C.C; + +public class AImpl + implements A +{ + public ArrayList c; + + public AImpl() + { + c = new ArrayList(); + } + + public void performA() + { + System.out.println("AImpl.performA"); + } + + public Token getToken() + { + return new TokenImpl((int)(Math.random() * 100.0)); + } +} Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/Activator.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/Activator.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/Activator.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/Activator.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,98 @@ +package ijvm.tests.AImpl; + +import ijvm.tests.A.A; +import ijvm.tests.C.C; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceEvent; +import org.osgi.framework.ServiceListener; +import org.osgi.util.tracker.ServiceTracker; + +public class Activator + implements BundleActivator, ServiceListener +{ + private BundleContext context; + private ServiceTracker cST; + private AImpl a; + private C c; + + public void start(BundleContext bundleContext) throws Exception + { + System.out.println("AImpl provides A"); + context = bundleContext; + + a = new AImpl(); + + cST = new ServiceTracker(context, C.class.getName(), null); + cST.open(); + + C service = (C)cST.getService(); + if (service != null) { + System.out.println("AImpl got C @ startup"); + + a.c.add(service); + this.registerMyself(); + } + + InfiniteResurrecter.class.getName(); + + context.addServiceListener(this, "(objectclass=" + C.class.getName() + ")"); + context.registerService(A.class.getName(), a, null); + } + + public void stop(BundleContext bundleContext) throws Exception + { + System.out.println("AImpl no more provides A"); + + context.removeServiceListener(this); + context = null; + + System.out.println("AImpl lost C but keeps a stale reference to it"); + cST.close(); + cST = null; + + //a = null; + } + + public void serviceChanged(ServiceEvent event) + { + Object service = context.getService(event.getServiceReference()); + + switch(event.getType()) { + case ServiceEvent.REGISTERED: + if (C.class.isInstance(service)) { + System.out.println("AImpl got C"); + a.c.add((C)service); + + this.registerMyself(); + } + break; + + case ServiceEvent.UNREGISTERING: + if (C.class.isInstance(service)) { + System.out.println("AImpl lost C but keeps a stale reference to it"); + } + break; + } + } + + private void registerMyself() + { + C oneC = a.c.get(a.c.size() - 1); + c = oneC; + + oneC.registerObject(this); + } +/* + protected void finalize() + { + try { + System.out.println(getClass().getName() + ".finalize()"); + new InfiniteResurrecter(c, this); + } catch (Throwable e) { + e.printStackTrace(); + } + } +*/ +} Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/InfiniteResurrecter.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/InfiniteResurrecter.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/InfiniteResurrecter.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/InfiniteResurrecter.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,24 @@ +package ijvm.tests.AImpl; + +import ijvm.tests.C.C; + +public class InfiniteResurrecter +{ + C c; + Object target; + + public InfiniteResurrecter(C c, Object o) + { + System.out.println(getClass().getName() + ": resurrecting " + o); + + this.c = c; + this.target = o; + + c.registerObject(this); + } + + protected void finalize() + { + new InfiniteResurrecter(this.c, target); + } +} Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/TokenImpl.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/TokenImpl.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/TokenImpl.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/TokenImpl.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,34 @@ +package ijvm.tests.AImpl; + +import java.util.ArrayList; + +import ijvm.tests.A.Token; + +public class TokenImpl + implements Token +{ + static final int ChunkSize = 2 * 1024; + static final int ChunkCount = 64; + + ArrayList BigData; + + public TokenImpl(int value) + { + BigData = new ArrayList(); + + for (int i=0; i a; + public ArrayList tokens; + + public BImpl() + { + a = new ArrayList(); + tokens = new ArrayList(); + } + + public void performB() + { + System.out.println("BImpl.performB"); + } +} Propchange: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.C/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +out +.bundle-pack +.classpath +.git* +.project + Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.C/bundle.manifest URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.C/bundle.manifest?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.C/bundle.manifest (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.C/bundle.manifest Thu Oct 9 03:43:38 2014 @@ -0,0 +1,7 @@ +Manifest-Version: 1.0 +Bundle-Version: 1.0.0 +Bundle-Name: C +Bundle-ManifestVersion: 2 +Bundle-SymbolicName: ijvm.tests.C +Export-Package: ijvm.tests.C + Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.C/src/ijvm/tests/C/C.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.C/src/ijvm/tests/C/C.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.C/src/ijvm/tests/C/C.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.C/src/ijvm/tests/C/C.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,7 @@ +package ijvm.tests.C; + +public interface C +{ + public void performC(); + public void registerObject(Object o); +} Propchange: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +out +.bundle-pack +.classpath +.git* +.project + Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/bundle.manifest URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/bundle.manifest?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/bundle.manifest (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/bundle.manifest Thu Oct 9 03:43:38 2014 @@ -0,0 +1,9 @@ +Manifest-Version: 1.0 +Bundle-Version: 1.0.0 +Bundle-Name: CImpl +Bundle-ManifestVersion: 2 +Bundle-SymbolicName: ijvm.tests.CImpl +Bundle-Activator: ijvm.tests.CImpl.Activator +Import-Package: ijvm.tests.B, ijvm.tests.C, org.osgi.framework, org.os + gi.util.tracker + Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/Activator.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/Activator.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/Activator.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/Activator.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,75 @@ +package ijvm.tests.CImpl; + +import ijvm.tests.B.B; +import ijvm.tests.C.C; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceEvent; +import org.osgi.framework.ServiceListener; +import org.osgi.util.tracker.ServiceTracker; + +public class Activator + implements BundleActivator, ServiceListener +{ + private BundleContext context; + + private ServiceTracker bST; + private CImpl c; + + public void start(BundleContext bundleContext) throws Exception + { + System.out.println("CImpl exports and provides C"); + context = bundleContext; + + c = new CImpl(); + + bST = new ServiceTracker(context, B.class.getName(), null); + bST.open(); + + B service = (B)bST.getService(); + if (service != null) { + System.out.println("CImpl got B @ startup"); + + c.b.add(service); + } + + context.addServiceListener(this, "(objectclass=" + B.class.getName() + ")"); + context.registerService(C.class.getName(), c, null); + } + + public void stop(BundleContext bundleContext) throws Exception + { + System.out.println("CImpl no more provides C"); + + context.removeServiceListener(this); + context = null; + + System.out.println("CImpl lost B but keeps a stale reference to it"); + bST.close(); + bST = null; + // b = null; + + c = null; + } + + public void serviceChanged(ServiceEvent event) + { + Object service = context.getService(event.getServiceReference()); + + switch(event.getType()) { + case ServiceEvent.REGISTERED: + if (B.class.isInstance(service)) { + System.out.println("CImpl got B"); + c.b.add((B)service); + } + break; + + case ServiceEvent.UNREGISTERING: + if (B.class.isInstance(service)) { + System.out.println("CImpl lost B but keeps a stale reference to it"); + } + break; + } + } +} Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/CImpl.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/CImpl.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/CImpl.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/CImpl.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,36 @@ +package ijvm.tests.CImpl; + +import java.util.ArrayList; + +import ijvm.tests.B.B; +import ijvm.tests.C.C; + +public class CImpl + implements C +{ + ArrayList registeredObjects; + public ArrayList b; + + CImpl() + { + b = new ArrayList(); + registeredObjects = new ArrayList(); + } + + public void performC() + { + System.out.println("CImpl.performC"); + } + + public void registerObject(Object o) + { + System.out.println("CImpl.registerObject"); + + Object obj = new Object(); + synchronized (obj) { + obj.notify(); + } + + registeredObjects.add(o); + } +} Propchange: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +out +.bundle-pack +.classpath +.git* +.project + Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/bundle.manifest URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/bundle.manifest?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/bundle.manifest (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/bundle.manifest Thu Oct 9 03:43:38 2014 @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-Version: 1.0.0 +Bundle-Name: DImpl +Bundle-ManifestVersion: 2 +Bundle-SymbolicName: ijvm.tests.DImpl +Export-Package: ijvm.tests.D +Bundle-Activator: ijvm.tests.DImpl.Activator +Import-Package: ijvm.tests.C, org.osgi.framework, org.osgi.util.tracke + r + Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/D/D.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/D/D.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/D/D.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/D/D.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +package ijvm.tests.D; + +public interface D +{ + public void performD(); +} Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/Activator.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/Activator.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/Activator.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/Activator.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,75 @@ +package ijvm.tests.DImpl; + +import ijvm.tests.C.C; +import ijvm.tests.D.D; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceEvent; +import org.osgi.framework.ServiceListener; +import org.osgi.util.tracker.ServiceTracker; + +public class Activator + implements BundleActivator, ServiceListener +{ + private BundleContext context; + + private ServiceTracker cST; + private DImpl d; + + public void start(BundleContext bundleContext) throws Exception + { + System.out.println("DImpl exports and provides D"); + context = bundleContext; + + d = new DImpl(); + + cST = new ServiceTracker(context, C.class.getName(), null); + cST.open(); + + C service = (C)cST.getService(); + if (service != null) { + System.out.println("DImpl got C @ startup"); + + d.c.add(service); + } + + context.addServiceListener(this, "(objectclass=" + C.class.getName() + ")"); + context.registerService(D.class.getName(), d, null); + } + + public void stop(BundleContext bundleContext) throws Exception + { + System.out.println("DImpl no more provides D"); + + context.removeServiceListener(this); + context = null; + + System.out.println("DImpl lost C but keeps a stale reference to it"); + cST.close(); + cST = null; + // c = null; + + d = null; + } + + public void serviceChanged(ServiceEvent event) + { + Object service = context.getService(event.getServiceReference()); + + switch(event.getType()) { + case ServiceEvent.REGISTERED: + if (C.class.isInstance(service)) { + System.out.println("DImpl got C"); + d.c.add((C)service); + } + break; + + case ServiceEvent.UNREGISTERING: + if (C.class.isInstance(service)) { + System.out.println("DImpl lost C but keeps a stale reference to it"); + } + break; + } + } +} Added: vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/DImpl.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/DImpl.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/DImpl.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/DImpl.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,22 @@ +package ijvm.tests.DImpl; + +import java.util.ArrayList; + +import ijvm.tests.C.C; +import ijvm.tests.D.D; + +public class DImpl + implements D +{ + public ArrayList c; + + public DImpl() + { + c = new ArrayList(); + } + + public void performD() + { + System.out.println("DImpl.performB"); + } +} Propchange: vmkit/branches/memory-monitor/osgi/tests/tests.A/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1,5 @@ +out +.bundle-pack +.classpath +.git* +.project Added: vmkit/branches/memory-monitor/osgi/tests/tests.A/bundle.manifest URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.A/bundle.manifest?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.A/bundle.manifest (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.A/bundle.manifest Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +Bundle-Version: 1.0.0 +Bundle-Name: Tests A +Bundle-ManifestVersion: 2 +Bundle-SymbolicName: tests.A +Export-Package: tests.A Added: vmkit/branches/memory-monitor/osgi/tests/tests.A/src/tests/A/A.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.A/src/tests/A/A.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.A/src/tests/A/A.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.A/src/tests/A/A.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,8 @@ +package tests.A; + +public interface A +{ + public void a(); + public int b(long x, long y); + public long[] c(int n); +} Propchange: vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +out +.bundle-pack +.classpath +.git* +.project + Added: vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/bundle.manifest URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/bundle.manifest?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/bundle.manifest (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/bundle.manifest Thu Oct 9 03:43:38 2014 @@ -0,0 +1,8 @@ +Manifest-Version: 1.0 +Bundle-Version: 1.0.0 +Bundle-Name: Tests A Impl +Bundle-Activator: tests.AImpl.Activator +Bundle-ManifestVersion: 2 +Import-Package: org.osgi.framework, tests.A, tests.B, tests.E +Bundle-SymbolicName: tests.AImpl + Added: vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/AImpl/AImpl.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/AImpl/AImpl.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/AImpl/AImpl.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/AImpl/AImpl.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,66 @@ +package tests.AImpl; + +import java.util.ArrayList; + +import tests.A.A; +import tests.B.BEvent; + +public class AImpl + implements A, BEvent +{ + ArrayList items; + + public AImpl() + { + items = new ArrayList(); + } + + public void a() + { + allocObj(100); + + System.out.println(A.class.getName() + ".a() called."); + + sleep(1); + } + + void allocObj(int count) + { + try {p(count);} catch (Exception e) {} + } + + void p(int count) + { + for (int i=0; i T = new ArrayList(); + for (int i=0; i < 49999; ++i) + T.add(new Double(Math.random())); + + sleep(5); + } + + void sleep(long sec) + { + try { + Thread.sleep(sec * 1000); + } catch (Exception e) {e.printStackTrace();} + } +} Added: vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/AImpl/Activator.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/AImpl/Activator.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/AImpl/Activator.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/AImpl/Activator.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,34 @@ +package tests.AImpl; + +import tests.A.A; +import tests.B.BEvent; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +public class Activator + implements BundleActivator +{ + BundleContext context; + AImpl a; +// EImpl e; + + public void start(BundleContext bundleContext) throws Exception + { + System.out.println(this.getClass().getPackage().getName() + " provides " + A.class.getName()); + context = bundleContext; + + a = new AImpl(); + + String[] classes = {A.class.getName(), BEvent.class.getName()}; + context.registerService(classes, a, null); + + // e = new EImpl(); + // context.registerService(E.class, e, null); + } + + public void stop(BundleContext bundleContext) throws Exception + { + System.out.println(this.getClass().getPackage().getName() + " no more provides " + A.class.getName()); + } +} Added: vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/AImpl/EImpl.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/AImpl/EImpl.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/AImpl/EImpl.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.AImpl/src/tests/AImpl/EImpl.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,21 @@ +package tests.AImpl; + +import tests.E.E; + +public class EImpl + implements E +{ + public void e() + { + try { + someProcessing(); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } + } + + private void someProcessing() throws InterruptedException + { + Thread.sleep(10000); + } +} Propchange: vmkit/branches/memory-monitor/osgi/tests/tests.B/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +out +.bundle-pack +.classpath +.git* +.project + Added: vmkit/branches/memory-monitor/osgi/tests/tests.B/bundle.manifest URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.B/bundle.manifest?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.B/bundle.manifest (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.B/bundle.manifest Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +Bundle-Version: 1.0.0 +Bundle-Name: Tests B +Bundle-ManifestVersion: 2 +Bundle-SymbolicName: tests.B +Export-Package: tests.B Added: vmkit/branches/memory-monitor/osgi/tests/tests.B/src/tests/B/BEvent.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.B/src/tests/B/BEvent.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.B/src/tests/B/BEvent.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.B/src/tests/B/BEvent.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +package tests.B; + +public interface BEvent +{ + public void handler(); +} Propchange: vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +out +.bundle-pack +.classpath +.git* +.project + Added: vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/bundle.manifest URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/bundle.manifest?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/bundle.manifest (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/bundle.manifest Thu Oct 9 03:43:38 2014 @@ -0,0 +1,9 @@ +Manifest-Version: 1.0 +Bundle-Version: 1.0.0 +Bundle-Name: Tests B Impl +Bundle-Activator: tests.BImpl.Activator +Bundle-ManifestVersion: 2 +Import-Package: org.osgi.util.tracker, tests.A, tests.B, org.osgi.fram + ework +Bundle-SymbolicName: tests.BImpl + Added: vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/src/tests/BImpl/Activator.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/src/tests/BImpl/Activator.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/src/tests/BImpl/Activator.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/src/tests/BImpl/Activator.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,103 @@ +package tests.BImpl; + +import tests.A.A; +import tests.B.BEvent; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceEvent; +import org.osgi.framework.ServiceListener; +import org.osgi.util.tracker.ServiceTracker; + +public class Activator + implements BundleActivator, ServiceListener +{ + BundleContext context; + BImpl b; + ServiceTracker serviceTrackerA; + ServiceTracker serviceTrackerBEvent; + + public void start(BundleContext bundleContext) throws Exception + { + System.out.println(this.getClass().getPackage().getName() + + " consumes " + A.class.getName()); + System.out.println(this.getClass().getPackage().getName() + + " consumes " + BEvent.class.getName()); + context = bundleContext; + + b = new BImpl(); + b.start(); + + serviceTrackerA = new ServiceTracker(context, A.class, null); + serviceTrackerA.open(); + + if (serviceTrackerA.getService() != null) { + this.serviceChanged(new ServiceEvent( + ServiceEvent.REGISTERED, + serviceTrackerA.getServiceReference())); + } + + context.addServiceListener( + this, "(objectclass=" + A.class.getName() + ")"); + + serviceTrackerBEvent = + new ServiceTracker(context, BEvent.class, null); + serviceTrackerBEvent.open(); + + if (serviceTrackerBEvent.getService() != null) { + this.serviceChanged(new ServiceEvent( + ServiceEvent.REGISTERED, + serviceTrackerBEvent.getServiceReference())); + } + + context.addServiceListener( + this, "(objectclass=" + BEvent.class.getName() + ")"); + } + + public void stop(BundleContext bundleContext) throws Exception + { + System.out.println(this.getClass().getPackage().getName() + + " no more consumes " + A.class.getName()); + System.out.println(this.getClass().getPackage().getName() + + " no more consumes " + BEvent.class.getName()); + + b.stop(); + + serviceTrackerA.close(); + serviceTrackerBEvent.close(); + } + + public void serviceChanged(ServiceEvent event) + { + Object service = context.getService(event.getServiceReference()); + String[] objClassList = + (String[])event.getServiceReference().getProperty("objectclass"); + + switch(event.getType()) { + case ServiceEvent.REGISTERED: + for (String cl : objClassList) { + if (cl.equals(A.class.getName())) { + b.setA((A)service); + } + + if (cl.equals(BEvent.class.getName())) { + b.setBEvent((BEvent)service); + } + } + + break; + + case ServiceEvent.UNREGISTERING: + for (String cl : objClassList) { + if (cl.equals(A.class.getName())) { + b.setA(null); + } + + if (cl.equals(BEvent.class.getName())) { + b.setBEvent(null); + } + } + break; + } + } +} Added: vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/src/tests/BImpl/BImpl.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/src/tests/BImpl/BImpl.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/src/tests/BImpl/BImpl.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.BImpl/src/tests/BImpl/BImpl.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,137 @@ +package tests.BImpl; + +import tests.A.A; +import tests.B.BEvent; + +public class BImpl + implements Runnable +{ + A a; + BEvent b; + boolean termThread; + Thread th; + + public BImpl() + { + th = new Thread(this, this.getClass().getName()); + } + + public void start() + { + termThread = false; + th.start(); + } + + public void stop() + { + termThread = true; + + try { + th.join(); + } catch (Exception e) {e.printStackTrace();} + } + + public void setA(A a) + { + this.a = a; + + if (a == null) + System.out.println(this.getClass().getPackage().getName() + " no more references " + A.class.getName()); + else + System.out.println(this.getClass().getPackage().getName() + " references " + A.class.getName()); + } + + public void setBEvent(BEvent b) + { + this.b = b; + + if (b == null) + System.out.println(this.getClass().getPackage().getName() + " no more references " + BEvent.class.getName()); + else + System.out.println(this.getClass().getPackage().getName() + " references " + BEvent.class.getName()); + } + + void dummy + ( + long d00, long d01, long d02, long d03, long d04, long d05, long d06, long d07, long d08, long d09, + long d10, long d11, long d12, long d13, long d14, long d15, long d16, long d17, long d18, long d19, + long d20, long d21, long d22, long d23, long d24, long d25, long d26, long d27, long d28, long d29, + long d30, long d31, long d32, long d33, long d34, long d35, long d36, long d37, long d38, long d39, + long d40, long d41, long d42, long d43, long d44, long d45, long d46, long d47, long d48, long d49, + long d50, long d51, long d52, long d53, long d54, long d55, long d56, long d57, long d58, long d59, + long d60, long d61, long d62, long d63, long d64, long d65, long d66, long d67, long d68, long d69, + long d70, long d71, long d72, long d73, long d74, long d75, long d76, long d77, long d78, long d79, + long d80, long d81, long d82, long d83, long d84, long d85, long d86, long d87, long d88, long d89, + long d90, long d91, long d92, long d93, long d94, long d95, long d96, long d97, long d98, long d99) + { + try { + Thread.sleep(1000); + } catch (Exception e) {} + } + + public void run() + { + long v00 = 0, v01 = 0, v02 = 0, v03 = 0, v04 = 0, v05 = 0, v06 = 0, v07 = 0, v08 = 0, v09 = 0; + long v10 = 0, v11 = 0, v12 = 0, v13 = 0, v14 = 0, v15 = 0, v16 = 0, v17 = 0, v18 = 0, v19 = 0; + long v20 = 0, v21 = 0, v22 = 0, v23 = 0, v24 = 0, v25 = 0, v26 = 0, v27 = 0, v28 = 0, v29 = 0; + long v30 = 0, v31 = 0, v32 = 0, v33 = 0, v34 = 0, v35 = 0, v36 = 0, v37 = 0, v38 = 0, v39 = 0; + long v40 = 0, v41 = 0, v42 = 0, v43 = 0, v44 = 0, v45 = 0, v46 = 0, v47 = 0, v48 = 0, v49 = 0; + long v50 = 0, v51 = 0, v52 = 0, v53 = 0, v54 = 0, v55 = 0, v56 = 0, v57 = 0, v58 = 0, v59 = 0; + long v60 = 0, v61 = 0, v62 = 0, v63 = 0, v64 = 0, v65 = 0, v66 = 0, v67 = 0, v68 = 0, v69 = 0; + long v70 = 0, v71 = 0, v72 = 0, v73 = 0, v74 = 0, v75 = 0, v76 = 0, v77 = 0, v78 = 0, v79 = 0; + long v80 = 0, v81 = 0, v82 = 0, v83 = 0, v84 = 0, v85 = 0, v86 = 0, v87 = 0, v88 = 0, v89 = 0; + long v90 = 0, v91 = 0, v92 = 0, v93 = 0, v94 = 0, v95 = 0, v96 = 0, v97 = 0, v98 = 0, v99 = 0; + + dummy(v00, v01, v02, v03, v04, v05, v06, v07, v08, v09, v10, + v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, + v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, + v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, + v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, + v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, + v61, v62, v63, v64, v65, v66, v67, v68, v69, v70, + v71, v72, v73, v74, v75, v76, v77, v78, v79, v80, + v81, v82, v83, v84, v85, v86, v87, v88, v89, v90, + v91, v92, v93, v94, v95, v96, v97, v98, v99); + + System.out.println(this.getClass().getPackage().getName() + " running..."); +/* + Object[] o = new Object[100]; + for (int i=0; i < 100; ++i) + o[i] = new Object(); + + for (int i=0; i < 100; ++i) { + synchronized(o[i]) { + o[i].notify(); + } + } +*/ + do_it(); + + System.out.println(this.getClass().getPackage().getName() + " stopped."); + } + + void do_it() + { +// long v01 = 0, v02 = 0, v03 = 0, v04 = 0, v05 = 0, v06 = 0, v07 = 0, v08 = 0, v09 = 0, v10 = 0, v11 = 0, v12 = 0, v13 = 0, v14 = 0, v15 = 0, v16 = 0, v17 = 0, v18 = 0, v19 = 0, v20 = 0, v21 = 0, v22 = 0, v23 = 0, v24 = 0, v25 = 0, v26 = 0, v27 = 0, v28 = 0, v29 = 0, v30 = 0, v31 = 0, v32 = 0, v33 = 0, v34 = 0, v35 = 0, v36 = 0, v37 = 0, v38 = 0, v39 = 0, v40 = 0, v41 = 0, v42 = 0, v43 = 0, v44 = 0, v45 = 0, v46 = 0, v47 = 0, v48 = 0, v49 = 0, v50 = 0, v51 = 0; +// dummy(v01, v02, v03, v04, v05, v06, v07, v08, v09, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51); + + while (!termThread) { + if (a == null) + sleep(1); + else + a.a(); + + if (b == null) + sleep(1); + else + b.handler(); + } + } + + void sleep(long sec) + { + try { + Thread.sleep(sec * 1000); + } catch (Exception e) {e.printStackTrace();} + } +} Propchange: vmkit/branches/memory-monitor/osgi/tests/tests.E/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +out +.bundle-pack +.classpath +.git* +.project + Added: vmkit/branches/memory-monitor/osgi/tests/tests.E/bundle.manifest URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.E/bundle.manifest?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.E/bundle.manifest (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.E/bundle.manifest Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +Bundle-Version: 1.0.0 +Bundle-Name: Tests E +Bundle-ManifestVersion: 2 +Bundle-SymbolicName: tests.E +Export-Package: tests.E Added: vmkit/branches/memory-monitor/osgi/tests/tests.E/src/tests/E/E.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.E/src/tests/E/E.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.E/src/tests/E/E.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.E/src/tests/E/E.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +package tests.E; + +public interface E +{ + public void e(); +} Propchange: vmkit/branches/memory-monitor/osgi/tests/tests.FImpl/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +out +.bundle-pack +.classpath +.git* +.project + Added: vmkit/branches/memory-monitor/osgi/tests/tests.FImpl/bundle.manifest URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.FImpl/bundle.manifest?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.FImpl/bundle.manifest (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.FImpl/bundle.manifest Thu Oct 9 03:43:38 2014 @@ -0,0 +1,8 @@ +Manifest-Version: 1.0 +Bundle-Version: 1.0.0 +Bundle-Name: Tests F Impl +Bundle-Activator: tests.FImpl.Activator +Bundle-ManifestVersion: 2 +Import-Package: org.osgi.framework, tests.E, org.osgi.util.tracker +Bundle-SymbolicName: tests.FImpl + Added: vmkit/branches/memory-monitor/osgi/tests/tests.FImpl/src/tests/FImpl/Activator.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.FImpl/src/tests/FImpl/Activator.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.FImpl/src/tests/FImpl/Activator.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.FImpl/src/tests/FImpl/Activator.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,47 @@ +package tests.FImpl; + +import java.util.ArrayList; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.util.tracker.ServiceTracker; + +import tests.E.E; + +public class Activator + implements BundleActivator +{ + BundleContext context; + ServiceTracker serviceTrackerE; + + public void start(BundleContext bundleContext) throws Exception + { + context = bundleContext; + + serviceTrackerE = new ServiceTracker(context, E.class, null); + serviceTrackerE.open(); + + heavyInitialization(); + } + + public void stop(BundleContext bundleContext) throws Exception + { + System.out.println(this.getClass().getPackage().getName() + + " consumes " + E.class.getName()); + + serviceTrackerE.close(); + } + + void heavyInitialization() throws Exception + { + E e = serviceTrackerE.getService(); + if (e == null) + throw new Exception("Service not found: " + E.class.getName()); + + ArrayList T = new ArrayList(); + for (int i=0; i < 499; ++i) + T.add(new Double(Math.random())); + + e.e(); + } +} Propchange: vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1,6 @@ +out +.bundle-pack +.classpath +.git* +.project + Added: vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/bundle.manifest URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/bundle.manifest?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/bundle.manifest (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/bundle.manifest Thu Oct 9 03:43:38 2014 @@ -0,0 +1,8 @@ +Manifest-Version: 1.0 +Bundle-Version: 1.0.0 +Bundle-Name: Tests G Impl +Bundle-ManifestVersion: 2 +Bundle-Activator: tests.GImpl.Activator +Bundle-SymbolicName: tests.GImpl +Import-Package: org.osgi.framework, tests.E, tests.B + Added: vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/src/tests/GImpl/Activator.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/src/tests/GImpl/Activator.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/src/tests/GImpl/Activator.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/src/tests/GImpl/Activator.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,30 @@ +package tests.GImpl; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +import tests.E.E; + +public class Activator + implements BundleActivator +{ + BundleContext context; + EImpl e; + + public void start(BundleContext bundleContext) throws Exception + { + context = bundleContext; + + System.out.println(this.getClass().getPackage().getName() + + " provides " + E.class.getName()); + + e = new EImpl(context); + context.registerService(E.class, e, null); + } + + public void stop(BundleContext bundleContext) throws Exception + { + System.out.println(this.getClass().getPackage().getName() + + " no more provides " + E.class.getName()); + } +} Added: vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/src/tests/GImpl/EImpl.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/src/tests/GImpl/EImpl.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/src/tests/GImpl/EImpl.java (added) +++ vmkit/branches/memory-monitor/osgi/tests/tests.GImpl/src/tests/GImpl/EImpl.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,48 @@ +package tests.GImpl; + +import java.util.ArrayList; + +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; + +import tests.E.E; +import tests.B.BEvent; + +public class EImpl + implements E +{ + BundleContext context; + + public EImpl(BundleContext context) + { + this.context = context; + } + + public void e() + { + try { + someProcessing(); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + + private void someProcessing() throws Exception + { + ServiceReference refBEvent = + context.getServiceReference(BEvent.class); + + if (refBEvent == null) + throw new Exception("Service not found: " + BEvent.class.getName()); + + BEvent b = context.getService(refBEvent); + if (b == null) + throw new Exception("Service not found: " + BEvent.class.getName()); + + ArrayList T = new ArrayList(); + for (int i=0; i < 4999; ++i) + T.add(new Double(Math.random())); + + b.handler(); + } +} Propchange: vmkit/branches/memory-monitor/tests/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1 @@ +*.odt Removed: vmkit/branches/memory-monitor/tests/AnnotationClassTest.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/AnnotationClassTest.java?rev=219391&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/AnnotationClassTest.java (original) +++ vmkit/branches/memory-monitor/tests/AnnotationClassTest.java (removed) @@ -1,52 +0,0 @@ -import java.lang.Deprecated; -import java.lang.annotation.Annotation; -import java.lang.reflect.Field; -import java.lang.reflect.Method; - - -public class AnnotationClassTest { - - @MyAnnotation (property = 13, property4 = System.class) - static class Sample { - @Deprecated - @MyAnnotation (property=5, property4=String.class) - public int x; - - @MyAnnotation (property=7, property4=String.class) - public int y() { - return x*x; - } - } - - public static void main(String[] args) throws Exception { - Field f = Sample.class.getField("x"); - Method m = Sample.class.getMethod("y"); - Sample sample = new Sample(); - sample.x = 14; - - Annotation [] fAnno = f.getDeclaredAnnotations(); - Annotation [] mAnno = m.getAnnotations(); - Annotation [] cAnno = Sample.class.getDeclaredAnnotations(); - - MyAnnotation xx = (MyAnnotation)f.getAnnotation(MyAnnotation.class); - MyAnnotation yy = (MyAnnotation)m.getAnnotation(MyAnnotation.class); - - - - check(f.getInt(sample) == 14); - f.setInt(sample, 17); - check(f.getInt(sample) == 17); - check(xx != null); - check(yy != null); - check(mAnno.length == 1); - check(fAnno.length == 2); - check(cAnno != null && cAnno.length == 1 && cAnno[0]!= null); - //int s = yy.property(); - //check(s == 5); - - } - - private static void check(boolean b) throws Exception { - if (!b) throw new Exception("Test failed!!!"); - } -} Removed: vmkit/branches/memory-monitor/tests/MyAnnotation.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/MyAnnotation.java?rev=219391&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/MyAnnotation.java (original) +++ vmkit/branches/memory-monitor/tests/MyAnnotation.java (removed) @@ -1,8 +0,0 @@ -import java.lang.annotation.*; - at Retention(value=RetentionPolicy.RUNTIME) -public @interface MyAnnotation { - int property(); - int[] primes() default {2, 3, 5, 7, 11, 13, 17, 19, 23, 29}; - String property3() default "Default value"; - Class property4(); -} Added: vmkit/branches/memory-monitor/tests/dacapo/2006-10-MR2/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/dacapo/2006-10-MR2/Makefile?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/dacapo/2006-10-MR2/Makefile (added) +++ vmkit/branches/memory-monitor/tests/dacapo/2006-10-MR2/Makefile Thu Oct 9 03:43:38 2014 @@ -0,0 +1,10 @@ + +LEVEL := .. +DACAPO_VERSION := 2006-10-MR2 +DACAPO_ARGS := -s default + +ifndef DECAPO_BENCHMARKS + DECAPO_BENCHMARKS := antlr bloat chart eclipse fop hsqldb jython luindex lusearch pmd xalan +endif + +include ../Makefile.inc Added: vmkit/branches/memory-monitor/tests/dacapo/Makefile.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/dacapo/Makefile.inc?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/dacapo/Makefile.inc (added) +++ vmkit/branches/memory-monitor/tests/dacapo/Makefile.inc Thu Oct 9 03:43:38 2014 @@ -0,0 +1,40 @@ + +ifdef DEBUG + BUILD_MODE := Debug+Asserts +else + BUILD_MODE := Release+Asserts +endif + +ifndef BENCHMARK_REPEATS + BENCHMARK_REPEATS := 12 +endif + +ifndef VERBOSE + QUIET := @ +endif + +DACAPO_JAR := $(abspath $(PWD)/$(LEVEL)/jars/dacapo-$(DACAPO_VERSION).jar) +JVM_PATH := $(abspath $(PWD)/$(LEVEL)/../../$(BUILD_MODE)/bin/j3) +WORK_DIR := $(HOME)/dacapo_benchmarks +TMP_DIR := $(shell mkdir -p $(WORK_DIR) 2>/dev/null ; mktemp -d --suffix=.$(DACAPO_VERSION) --tmpdir=$(WORK_DIR)) +DEPS := $(shell for i in $(DECAPO_BENCHMARKS); do seq -f "dacapoBenchmark_%g_$$i" $(BENCHMARK_REPEATS); done) + +all: _PRINT_TMP_DIR $(DEPS) + +_PRINT_TMP_DIR: + $(QUIET) echo "Target dir: " $(TMP_DIR) + +$(DEPS):: $(DACAPO_JAR) + +$(DACAPO_JAR): + $(QUIET) wget "http://sourceforge.net/projects/dacapobench/files/archive/2006-10-MR2/dacapo-2006-10-MR2.jar/download" -O "$(DACAPO_JAR)" + +dacapoBenchmark_%: + $(eval BENCH_COUNT_$@ := $$(shell echo $@ | cut -d '_' -f 2)) + $(eval BENCH_NAME_$@ := $$(shell echo $@ | cut -d '_' -f 3-)) + $(eval TEMP_DIR_$@ := $(TMP_DIR)/$(BENCH_NAME_$@)/$(BENCH_COUNT_$@)) + $(QUIET) mkdir -p "$(TEMP_DIR_$@)" 2>/dev/null + $(QUIET) cd "$(TEMP_DIR_$@)" && "$(JVM_PATH)" -jar "$(DACAPO_JAR)" $(DACAPO_ARGS) "$(BENCH_NAME_$@)" > "$(TMP_DIR)/$(BENCH_NAME_$@).$(BENCH_COUNT_$@).log" 2>&1 + +clean: + $(QUIET) -rm -rf $(WORK_DIR)/tmp.* $(WORK_DIR)/*.log 2>/dev/null Added: vmkit/branches/memory-monitor/tests/dacapo/compare-dacapo-synthesized-logs.plot URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/dacapo/compare-dacapo-synthesized-logs.plot?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/dacapo/compare-dacapo-synthesized-logs.plot (added) +++ vmkit/branches/memory-monitor/tests/dacapo/compare-dacapo-synthesized-logs.plot Thu Oct 9 03:43:38 2014 @@ -0,0 +1,40 @@ +#!/usr/bin/gnuplot -p + +set datafile separator "," +set datafile missing '_' +set datafile commentschars "#" + +set ylabel "Average relative overhead (lower is better)" +set ytics border nomirror +set grid ytics +set format y "%.0f %%" + +set style data histogram +set style histogram clustered gap 1 +set bars fullwidth +set style fill solid border 0 +set boxwidth 1 + +# set title "Monitoring overhead in Dacapo benchmarks" + +set xtics axis nomirror +set border 3 + +set term png size 900, 600 +set output "overhead.png" +plot \ + '/home/koutheir/dacapo_benchmarks/overhead-0-1.csv' using 3:xtic(1) linecolor rgb "#e5e5e5" title "0 vs 1", \ + '/home/koutheir/dacapo_benchmarks/overhead-0-6.csv' using 3:xtic(1) linecolor rgb "#b2b2b2" title "0 vs 6", \ + '/home/koutheir/dacapo_benchmarks/overhead-0-7.csv' using 3:xtic(1) linecolor rgb "#7f7f7f" title "0 vs 7" + +set output "overhead-0-1.png" +plot \ + '/home/koutheir/dacapo_benchmarks/overhead-0-1.csv' using 3:xtic(1) linecolor rgb "#808080" title "0 vs 1" + +set output "overhead-0-6.png" +plot \ + '/home/koutheir/dacapo_benchmarks/overhead-0-6.csv' using 3:xtic(1) linecolor rgb "#808080" title "0 vs 6" + +set output "overhead-0-7.png" +plot \ + '/home/koutheir/dacapo_benchmarks/overhead-0-7.csv' using 3:xtic(1) linecolor rgb "#808080" title "0 vs 7" Added: vmkit/branches/memory-monitor/tests/dacapo/compare-dacapo-synthesized-logs.sh URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/dacapo/compare-dacapo-synthesized-logs.sh?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/dacapo/compare-dacapo-synthesized-logs.sh (added) +++ vmkit/branches/memory-monitor/tests/dacapo/compare-dacapo-synthesized-logs.sh Thu Oct 9 03:43:38 2014 @@ -0,0 +1,33 @@ +#!/bin/bash + +synth_file_1=$1 +synth_file_2=$2 + +if [ \( -z "$synth_file_1" \) -o \( -z "$synth_file_2" \) ]; then + exit 1 +fi + +echo '#benchmark,min_duration_overhead,average_duration_overhead,max_duration_overhead,std_dev_duration_overhead' + +while read -r line ; do + if ! echo $line | grep '^#' >/dev/null 2>&1; then + cur_bench=$(echo $line | cut -d ',' -f 1) + min_duration_1=$(echo $line | cut -d ',' -f 2) + average_duration_1=$(echo $line | cut -d ',' -f 3) + max_duration_1=$(echo $line | cut -d ',' -f 4) + std_dev_duration_1=$(echo $line | cut -d ',' -f 5) + + line_2=$(grep "^$cur_bench," "$synth_file_2") + min_duration_2=$(echo $line_2 | cut -d ',' -f 2) + average_duration_2=$(echo $line_2 | cut -d ',' -f 3) + max_duration_2=$(echo $line_2 | cut -d ',' -f 4) + std_dev_duration_2=$(echo $line_2 | cut -d ',' -f 5) + + min_duration_overhead=$(echo "scale=4; 100.0 * (($min_duration_2 / $min_duration_1) - 1.0)" | bc -q 2>/dev/null) + average_duration_overhead=$(echo "scale=4; 100.0 * (($average_duration_2 / $average_duration_1) - 1.0)" | bc -q 2>/dev/null) + max_duration_overhead=$(echo "scale=4; 100.0 * (($max_duration_2 / $max_duration_1) - 1.0)" | bc -q 2>/dev/null) + std_dev_duration_overhead=$(echo "scale=4; 100.0 * (($std_dev_duration_2 / $std_dev_duration_1) - 1.0)" | bc -q 2>/dev/null) + + printf "%s,%.2f,%.2f,%.2f,%.2f\n" "$cur_bench" "$min_duration_overhead" "$average_duration_overhead" "$max_duration_overhead" "$std_dev_duration_overhead" + fi +done < "$synth_file_1" Propchange: vmkit/branches/memory-monitor/tests/dacapo/jars/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1,2 @@ +*.jar + Added: vmkit/branches/memory-monitor/tests/dacapo/jars/download.sh URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/dacapo/jars/download.sh?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/dacapo/jars/download.sh (added) +++ vmkit/branches/memory-monitor/tests/dacapo/jars/download.sh Thu Oct 9 03:43:38 2014 @@ -0,0 +1,5 @@ +#!/bin/sh + +wget http://sourceforge.net/projects/dacapobench/files/archive/2006-10-MR2/dacapo-2006-10-MR2.jar/download -O dacapo-2006-10-MR2.jar +#wget http://sourceforge.net/projects/dacapobench/files/archive/2006-10/dacapo-2006-10.jar/download -O dacapo-2006-10.jar +#wget http://sourceforge.net/projects/dacapobench/files/9.12-bach/dacapo-9.12-bach.jar/download -O dacapo-9.12-bach.jar Added: vmkit/branches/memory-monitor/tests/dacapo/synth-dacapo-logs.plot URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/dacapo/synth-dacapo-logs.plot?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/dacapo/synth-dacapo-logs.plot (added) +++ vmkit/branches/memory-monitor/tests/dacapo/synth-dacapo-logs.plot Thu Oct 9 03:43:38 2014 @@ -0,0 +1,32 @@ +#!/usr/bin/gnuplot -p + +set datafile separator "," +set datafile missing '_' +set datafile commentschars "#" + +set ylabel "Duration (lower is better)" +set ytics border nomirror +set grid ytics +set yrange [0:*] +set ydata time +set timefmt "%S" +set format y "%M:%S" + +set xtics axis nomirror +set border 3 + +set style data histogram +set style histogram errorbars gap 1 lw 1 +set bars fullwidth +set style fill solid border 0 +set boxwidth 1 + +# set title "Monitoring overhead in Dacapo benchmarks" + +set term png size 900, 600 +set output "dacapo.png" +plot \ + '/home/koutheir/dacapo_benchmarks/0.csv' using (column(3)/1000.0):(column(5)/1000.0):xtic(1) linecolor rgb "#e5e5e5" title "0", \ + '/home/koutheir/dacapo_benchmarks/1.csv' using (column(3)/1000.0):(column(5)/1000.0):xtic(1) linecolor rgb "#b2b2b2" title "1", \ + '/home/koutheir/dacapo_benchmarks/6.csv' using (column(3)/1000.0):(column(5)/1000.0):xtic(1) linecolor rgb "#7f7f7f" title "6", \ + '/home/koutheir/dacapo_benchmarks/7.csv' using (column(3)/1000.0):(column(5)/1000.0):xtic(1) linecolor rgb "#4c4c4c" title "7" Added: vmkit/branches/memory-monitor/tests/dacapo/synth-dacapo-logs.sh URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/dacapo/synth-dacapo-logs.sh?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/dacapo/synth-dacapo-logs.sh (added) +++ vmkit/branches/memory-monitor/tests/dacapo/synth-dacapo-logs.sh Thu Oct 9 03:43:38 2014 @@ -0,0 +1,83 @@ +#!/bin/bash + +log_dir=$1 + +if [ -z "$log_dir" ]; then + exit 1 +fi + +stage1_file=/tmp/$0.$$.stage1 +stage2_file=/tmp/$0.$$.stage2 +stage3_file=/tmp/$0.$$.stage3 + +rm -f "$stage1_file" "$stage2_file" "$stage3_file" + +# Filter successful results and print them in the format: benchmark,duration +grep '^===== DaCapo [A-Za-z]\+ PASSED' $log_dir/*.log | sed "s/^.*:===== DaCapo //g ; s/ msec =====//g ; s/ PASSED in /,/g" | sort > $stage1_file + +# Calculate minimum, maximum and average durations + +count=0 +while read -r line ; do + cur_bench=$(echo $line | cut -d ',' -f 1) + cur_duration=$(echo $line | cut -d ',' -f 2) + + if [ -z "$last_bench" ]; then + last_bench=$cur_bench + count=1 + average_duration=$cur_duration + min_duration=$cur_duration + max_duration=$cur_duration + else + if [ "$last_bench" == "$cur_bench" ]; then + count=$(($count + 1)) + average_duration=$(($average_duration + $cur_duration)) + if [ "$cur_duration" -lt "$min_duration" ]; then + min_duration=$cur_duration + fi + if [ "$cur_duration" -gt "$max_duration" ]; then + max_duration=$cur_duration + fi + else + average_duration=$(($average_duration / $count)) + echo "$last_bench,$min_duration,$average_duration,$max_duration" >> $stage2_file + + last_bench=$cur_bench + count=1 + average_duration=$cur_duration + min_duration=$cur_duration + max_duration=$cur_duration + fi + fi +done < $stage1_file + +if [ "$count" -gt 0 ]; then + average_duration=$(($average_duration / $count)) + echo "$last_bench,$min_duration,$average_duration,$max_duration" >> $stage2_file +fi + +echo '#benchmark,min_duration_ms,average_duration_ms,max_duration_ms,std_dev_duration_ms' + +# Calculate the standard deviation +while read -r line ; do + cur_bench=$(echo $line | cut -d ',' -f 1) + cur_average=$(echo $line | cut -d ',' -f 3) + + grep "^$cur_bench," "$stage1_file" > "$stage3_file" + + count=0 + std_dev='sqrt((0' + + while read -r line2 ; do + cur_duration=$(echo $line2 | cut -d ',' -f 2) + + std_dev+="+(($cur_duration - $cur_average)^2)" + count=$(($count+1)) + done < "$stage3_file" + + std_dev+=")/$count)" + std_dev=$(echo "scale=0; $std_dev" | bc -q 2>/dev/null) + echo "$line,$std_dev" +done < $stage2_file + +rm -f "$stage1_file" "$stage2_file" "$stage3_file" Added: vmkit/branches/memory-monitor/tests/debug.txt URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/debug.txt?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/debug.txt (added) +++ vmkit/branches/memory-monitor/tests/debug.txt Thu Oct 9 03:43:38 2014 @@ -0,0 +1,70 @@ +-X:gc:verbose=0 -jar framework.jar -xargs /home/koutheir/PhD/VMKit/incinerator/incinerator/tests/minimal.bug.xargs +framework call j3.J3Mgr setBundleStaleReferenceCorrected ijvm.tests.AImpl yes +framework call j3.J3Mgr setBundleStaleReferenceCorrected ijvm.tests.BImpl yes +framework call j3.J3Mgr setBundleStaleReferenceCorrected ijvm.tests.CImpl yes +stop 12 +stop 13 +stop 14 + +start 12 13 14 +stop 12 + +framework call j3.J3Mgr isBundleStaleReferenceCorrected 39 +framework call j3.J3Mgr setBundleStaleReferenceCorrected 8 yes + +enter framework +call j3.J3Mgr isBundleStaleReferenceCorrected 14 +call j3.J3Mgr setBundleStaleReferenceCorrected 14 yes +update 14 + +framework call j3.J3Mgr dumpClassLoaderBundles + +stop 8 +uninstall 8 +refresh +meminfo -gc +call j3.J3Mgr setBundleStaleReferenceCorrected 14 yes +call j3.J3Mgr dumpReferencesToObject 0x51934ab4 + +refresh +meminfo -gc + + +enter framework +call j3.J3Mgr setBundleStaleReferenceCorrected 11 no +meminfo -gc +update 11 +refresh +meminfo -gc + +STALE = {http/http_all-3.1.2.jar, useradmin/useradmin_all-3.0.3.jar, device/device_all-3.0.0.jar, kxml/kxml-2.3.0.kf3.jar} + +call j3.J3Mgr forceStaleReferenceScanning + +fromupdate 15 file:/media/Data/Documents/PhD/VMKit/incinerator/incinerator/tests/ijvm.tests.Alarm_v2.0/out/ijvm.tests.Alarm_v2.0-2.0.0.jar + +enter framework +call j3.J3Mgr loadTierConfigFile /home/koutheir/PhD/VMKit/vmkit-monitor/tests/tier.description +install ijvm.tests.A/out/ijvm.tests.A-1.0.0.jar +install ijvm.tests.C/out/ijvm.tests.C-1.0.0.jar +install ijvm.tests.AImpl/out/ijvm.tests.AImpl-1.0.0.jar +install ijvm.tests.BImpl/out/ijvm.tests.BImpl-1.0.0.jar +install ijvm.tests.CImpl/out/ijvm.tests.CImpl-1.0.0.jar +install ijvm.tests.DImpl/out/ijvm.tests.DImpl-1.0.0.jar +resolve 11 12 13 14 15 16 + +enter framework +call j3.J3Mgr dumpTierStats + +enter framework +resolve 14 15 +start 15 +call j3.J3Mgr dumpTierStats +start 14 +call j3.J3Mgr dumpTierStats + +enter framework +start 14 17 +resolve 16 +call j3.J3Mgr dumpTierStats 2 +start 16 Added: vmkit/branches/memory-monitor/tests/full.xargs URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/full.xargs?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/full.xargs (added) +++ vmkit/branches/memory-monitor/tests/full.xargs Thu Oct 9 03:43:38 2014 @@ -0,0 +1,88 @@ +-Dorg.osgi.framework.dir=/tmp/fwdir +#-Dorg.knopflerfish.framework.bundlestorage=memory +-Dorg.knopflerfish.framework.system.export.all_13=false +-Dorg.knopflerfish.framework.verbosity=0 + +-Forg.knopflerfish.framework.debug.errors=true +-Forg.knopflerfish.framework.debug.packages=false +-Forg.knopflerfish.framework.debug.classloader=false +#-Forg.knopflerfish.framework.debug.permissions=false + +#-Forg.osgi.framework.system.packages.extra= + +-Forg.knopflerfish.http.dnslookup=true +-Forg.osgi.service.http.port=8080 + +#-Dhttp.proxyHost=proxy +#-Dhttp.proxyPort=3128 + +#-Forg.knopflerfish.framework.all_signed=false + +-Dorg.knopflerfish.gosg.jars=file:///home/koutheir/PhD/VMKit/knopflerfish/osgi/jars/;file:///home/koutheir/PhD/VMKit/incinerator/incinerator/tests/plugins/ + +-Forg.knopflerfish.startlevel.use=true + +-init + +-install log/log_all-3.1.3.jar +-install cm/cm_all-3.0.4.jar +-install util/util-2.0.1.jar +-istart console/console_all-3.0.4.jar +-istart frameworkcommands/frameworkcommands-3.2.0.jar +-istart logcommands/logcommands-3.1.1.jar +-istart cm_cmd/cm_cmd-3.0.2.jar +-istart consoletty/consoletty-3.0.1.jar +-istart useradmin/useradmin_api-3.0.3.jar +-istart util/util-2.0.1.jar + +-launch + +-istart j3mgr-1.0.0.jar + +#-istart ijvm.tests.A-1.0.0.jar +#-istart ijvm.tests.C-1.0.0.jar +#-istart ijvm.tests.AImpl-1.0.0.jar +#-istart ijvm.tests.BImpl-1.0.0.jar +#-istart ijvm.tests.CImpl-1.0.0.jar +#-istart ijvm.tests.DImpl-1.0.0.jar +#-install ijvm.tests.Runner-1.0.0.jar +-install BundleReloader-1.0.0.jar + +-install desktop/desktop_all-3.2.5.jar +-install comm-linux/comm-linux_all-2.0.0.jar +-install command/command_all-0.1.jar +-install jsdk/jsdk_api-2.5.0.kf3-2.jar + +-istart kxml/kxml-2.3.0.kf3.jar +-istart metatype/metatype-3.0.0.jar +-istart kf_metatype/kf_metatype_all-3.0.2.jar +-istart component/component_all-3.1.14.jar +-istart event/event_all-3.0.8.jar +-istart cm_desktop/cm_desktop_all-3.0.0.jar +-istart threadio/threadio_all-0.1.0.jar +-istart consoletcp/consoletcp_all-2.0.0.jar +-istart soapobject/soapobject_all-0.0.2.jar +-istart crimson/crimson-2.1.0.kf3.jar +-istart measurement/measurement-3.0.1.jar +-istart position/position-3.0.1.jar +-istart sslj2sp/sslj2sp-2.0.0.jar +-istart xerces/xerces-2.10.1.kf3.jar +-istart xml/xml-3.0.1.jar +-istart cm/cm_all-3.0.4.jar +-istart commons-logging/commons-logging_all-2.0.0.kf3.jar +-istart console/console_all-3.0.4.jar +-istart prefs/prefs_all-3.0.1.jar +-istart io/io_all-3.0.1.jar +-istart device/device_all-3.0.0.jar +-istart xalan/xalan-2.7.1.kf3_01.jar +-istart basicdriverlocator/basicdriverlocator_all-3.0.0.jar +-istart connectors/connectors_all-2.0.1.jar +#-istart http/http_all-3.1.2.jar +#-istart httpconsole/httpconsole_all-3.0.2.jar +#-istart httproot/httproot-3.0.1.jar +-istart useradmin/useradmin_all-3.0.3.jar +-istart scrcommands/scrcommands-1.1.0.jar +-istart serialportdevice/serialportdevice_all-2.0.1.jar +-istart bundlerepository/bundlerepository_all-3.1.2.jar +-istart commandtty/commandtty-2.0.0.jar +-istart console2command/console2command-1.0.0.jar Added: vmkit/branches/memory-monitor/tests/java-grant-all.policy URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/java-grant-all.policy?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/java-grant-all.policy (added) +++ vmkit/branches/memory-monitor/tests/java-grant-all.policy Thu Oct 9 03:43:38 2014 @@ -0,0 +1 @@ +grant { permission java.security.AllPermission; }; Added: vmkit/branches/memory-monitor/tests/min.xargs URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/min.xargs?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/min.xargs (added) +++ vmkit/branches/memory-monitor/tests/min.xargs Thu Oct 9 03:43:38 2014 @@ -0,0 +1,47 @@ +-Dorg.osgi.framework.dir=/tmp/fwdir +-Dorg.knopflerfish.framework.system.export.all_13=false +-Dorg.knopflerfish.framework.verbosity=0 + +-Forg.knopflerfish.framework.debug.errors=true +-Forg.knopflerfish.framework.debug.packages=false +-Forg.knopflerfish.framework.debug.classloader=false +#-Forg.knopflerfish.framework.debug.permissions=false + +#-Forg.osgi.framework.system.packages.extra= + +-Forg.knopflerfish.http.dnslookup=true +-Forg.osgi.service.http.port=8080 + +-Dhttp.proxyHost=proxy +-Dhttp.proxyPort=3128 + +#-Forg.knopflerfish.framework.all_signed=false + +-Dorg.knopflerfish.gosg.jars=file:///home/koutheir/PhD/VMKit/knopflerfish.vmkit/osgi/jars/;file:///home/koutheir/PhD/VMKit/vmkit-monitor/osgi/j3mgr/out/;file:///home/koutheir/PhD/VMKit/vmkit-monitor/osgi/tests/ + +-Forg.knopflerfish.startlevel.use=true + +-init + +-istart j3mgr-1.0.0.jar + +-istart log/log_all-5.0.0.jar +-istart cm/cm_all-5.0.0.jar +-istart util/util-4.1.0.jar +-istart console/console_all-4.0.1.jar +-istart frameworkcommands/frameworkcommands-4.0.1.jar +-istart logcommands/logcommands-5.0.0.jar +-istart cm_cmd/cm_cmd-5.0.1.jar +-istart consoletty/consoletty-4.0.1.jar +-istart useradmin/useradmin_api-4.0.0.jar +-istart util/util-4.1.0.jar + +-launch + +-install ijvm.tests.A/out/ijvm.tests.A-1.0.0.jar +-install ijvm.tests.C/out/ijvm.tests.C-1.0.0.jar + +-install ijvm.tests.AImpl/out/ijvm.tests.AImpl-1.0.0.jar +-install ijvm.tests.BImpl/out/ijvm.tests.BImpl-1.0.0.jar +-install ijvm.tests.CImpl/out/ijvm.tests.CImpl-1.0.0.jar +#-install ijvm.tests.DImpl/out/ijvm.tests.DImpl-1.0.0.jar Propchange: vmkit/branches/memory-monitor/tests/monitor-bench/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Thu Oct 9 03:43:38 2014 @@ -0,0 +1,8 @@ +bin +out +.bundle-pack +.classpath +.git* +.project +.settings + Added: vmkit/branches/memory-monitor/tests/monitor-bench/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/monitor-bench/Makefile?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/monitor-bench/Makefile (added) +++ vmkit/branches/memory-monitor/tests/monitor-bench/Makefile Thu Oct 9 03:43:38 2014 @@ -0,0 +1,44 @@ +ifndef J3_ROOT_PATH + J3_ROOT_PATH := /home/koutheir/phd/vmkit/vmkit-monitor +endif + +ifndef BENCHMARK_NAMES + BENCHMARK_NAMES := MethodCallBenchmark SmallObjectsBenchmark +endif + +ifdef DEBUG + BUILD_MODE := Debug+Asserts +else + BUILD_MODE := Release+Asserts +endif + +ifndef BENCHMARK_REPEATS + BENCHMARK_REPEATS := 4 +endif + +ifndef VERBOSE + QUIET := @ +endif + +BENCHMARK_CLASSPATH := $(abspath $(PWD)/bin) +J3_PATH := $(abspath $(J3_ROOT_PATH)/$(BUILD_MODE)/bin/j3) +WORK_DIR := $(HOME)/vmkit_monitor_benchmarks +TMP_DIR := $(shell mkdir -p $(WORK_DIR) 2>/dev/null ; mktemp -d --suffix=.monitor-bench --tmpdir=$(WORK_DIR)) +DEPS := $(shell for i in $(BENCHMARK_NAMES); do seq -f "instancesOfBenchmark_%g_$$i" $(BENCHMARK_REPEATS); done) + +all: _PRINT_TMP_DIR $(DEPS) + +_PRINT_TMP_DIR: + $(QUIET) echo "Target dir: " $(TMP_DIR) + +$(DEPS):: $(BENCHMARK_CLASSPATH)/MonitorBench/Main.class + +instancesOfBenchmark_%: + $(eval BENCH_COUNT_$@ := $$(shell echo $@ | cut -d '_' -f 2)) + $(eval BENCH_NAME_$@ := $$(shell echo $@ | cut -d '_' -f 3-)) + $(eval TEMP_DIR_$@ := $(TMP_DIR)/$(BENCH_NAME_$@)/$(BENCH_COUNT_$@)) + $(QUIET) mkdir -p "$(TEMP_DIR_$@)" 2>/dev/null + $(QUIET) cd "$(TEMP_DIR_$@)" && "$(J3_PATH)" -cp "$(BENCHMARK_CLASSPATH)" "MonitorBench.Main" "$(BENCH_NAME_$@)" > "$(TMP_DIR)/$(BENCH_NAME_$@).$(BENCH_COUNT_$@).log" 2>&1 + +clean: + $(QUIET) -rm -rf $(WORK_DIR)/tmp.* $(WORK_DIR)/*.log 2>/dev/null Added: vmkit/branches/memory-monitor/tests/monitor-bench/micro-benchmarks-MethodCallBenchmark.png URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/monitor-bench/micro-benchmarks-MethodCallBenchmark.png?rev=219392&view=auto ============================================================================== Binary file - no diff available. Propchange: vmkit/branches/memory-monitor/tests/monitor-bench/micro-benchmarks-MethodCallBenchmark.png ------------------------------------------------------------------------------ svn:mime-type = image/png Added: vmkit/branches/memory-monitor/tests/monitor-bench/micro-benchmarks-SmallObjectsBenchmark.png URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/monitor-bench/micro-benchmarks-SmallObjectsBenchmark.png?rev=219392&view=auto ============================================================================== Binary file - no diff available. Propchange: vmkit/branches/memory-monitor/tests/monitor-bench/micro-benchmarks-SmallObjectsBenchmark.png ------------------------------------------------------------------------------ svn:mime-type = image/png Added: vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/Benchmark.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/Benchmark.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/Benchmark.java (added) +++ vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/Benchmark.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,49 @@ +package MonitorBench; + +public abstract class Benchmark + implements Runnable +{ + String name; + int result; + + protected Benchmark(String name_) + { + name = name_; + } + + public String toString() {return name;} + + public int getResult() {return result;} + protected int setResult(int r) {result = r; return result;} + + public static String[] listBenchmarkNames() + { + int count = 2, i = 0; + + String[] r = new String[count]; + r[i++] = MethodCallBenchmark.class.getSimpleName(); + r[i++] = SmallObjectsBenchmark.class.getSimpleName(); + + return r; + } + + public static boolean isValidBenchmarkName(String name) + { + String[] list = listBenchmarkNames(); + for (int i=0; i < list.length; ++i) + if (name.equalsIgnoreCase(list[i])) + return true; + + return false; + } + + public static Benchmark create(String name) + { + if (MethodCallBenchmark.class.getSimpleName().equalsIgnoreCase(name)) + return new MethodCallBenchmark(); + else if (SmallObjectsBenchmark.class.getSimpleName().equalsIgnoreCase(name)) + return new SmallObjectsBenchmark(); + else + return null; + } +} Added: vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/BenchmarkRunner.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/BenchmarkRunner.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/BenchmarkRunner.java (added) +++ vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/BenchmarkRunner.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,73 @@ +package MonitorBench; + +public class BenchmarkRunner + implements Runnable +{ + volatile Benchmark bench; + volatile long durationMS; + volatile int result; + volatile boolean running; + volatile Object runningEvent; + + public BenchmarkRunner() + { + runningEvent = new Object(); + } + + public boolean setBenchmark(Benchmark b) + { + if (running) return false; + + bench = b; + return true; + } + + public boolean waitBenchmark() throws InterruptedException + { + if (!running) return false; + + synchronized(runningEvent) { + while (running) + runningEvent.wait(); + } + + return true; + } + + public void run() + { + running = true; + + long startTime; + durationMS = 0; + result = 0; + + System.out.println("BENCHMARK STARTED: " + bench.toString()); + + startTime = System.nanoTime(); + bench.run(); + durationMS = System.nanoTime(); + + durationMS -= startTime; + durationMS /= 1000000; // ns ==> ms + + result = bench.getResult(); + + if (result == 0) + System.out.println("BENCHMARK SUCCEEDED [" + durationMS + " ms]: " + bench.toString()); + else + System.out.println("BENCHMARK FAILED [" + result + "]: " + bench.toString()); + + running = false; + + synchronized (runningEvent) { + runningEvent.notify(); + } + } + + public boolean benchmarkRunning() {return running;} + + public long getDuration() {return durationMS;} + + public long getBenchmarkResult() {return result;} +} Added: vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/Main.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/Main.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/Main.java (added) +++ vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/Main.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,47 @@ +package MonitorBench; + +import java.security.InvalidParameterException; + +import javax.naming.InvalidNameException; + +public class Main +{ + static String benchmarkName; + + public static void main(String[] args) throws Exception + { + if (!parseCommandLine(args)) return; + + BenchmarkRunner br = new BenchmarkRunner(); + Benchmark bench = Benchmark.create(benchmarkName); + + br.setBenchmark(bench); + br.run(); + } + + static boolean parseCommandLine(String[] args) throws Exception + { + if (args.length != 1) + throw new InvalidParameterException("Usage: monitor-bench {-h | --help | -l | --list | benchmark_name}"); + + if (args[0].startsWith("-")) { + if (args[0].equals("-h") || args[0].equals("--help")) { + System.out.println("Usage: monitor-bench {-h | --help | -l | --list | benchmark_name}"); + return false; + } else if (args[0].equals("-l") || args[0].equals("--list")) { + String[] list = Benchmark.listBenchmarkNames(); + for (int i = 0; i < list.length; ++i) + System.out.println(list[i]); + return false; + } else { + throw new InvalidParameterException("Unrecognized parameter: " + args[0]); + } + } else { + if (!Benchmark.isValidBenchmarkName(args[0])) + throw new InvalidNameException("Unrecognized benchmark name: " + args[0]); + benchmarkName = args[0]; + } + + return true; // Proceed + } +} Added: vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/MethodCallBenchmark.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/MethodCallBenchmark.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/MethodCallBenchmark.java (added) +++ vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/MethodCallBenchmark.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,51 @@ +package MonitorBench; + +public class MethodCallBenchmark + extends Benchmark +{ + private interface DummyInterface + { + public void dummy(); + } + + private class DummyClass implements DummyInterface + { + public void dummy() + { + try { + System.nanoTime(); + } catch (Exception e) { + e.toString(); + } + } + } + + private class DummyClass2 implements DummyInterface + { + public void dummy() + { + System.out.println("Avoid some heuristics"); + } + } + + DummyInterface dummy_int; + + public MethodCallBenchmark() + { + super("Method Call Benchmark"); + + if (System.nanoTime() % 2 == 3) + dummy_int = new DummyClass2(); // Unreachable (see condition above) + else + dummy_int = new DummyClass(); + } + + public void run() + { + for (int count = 100000000; count != 0; --count) { + dummy_int.dummy(); + } + + setResult(0); + } +} Added: vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/SmallObjectsBenchmark.java URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/SmallObjectsBenchmark.java?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/SmallObjectsBenchmark.java (added) +++ vmkit/branches/memory-monitor/tests/monitor-bench/src/MonitorBench/SmallObjectsBenchmark.java Thu Oct 9 03:43:38 2014 @@ -0,0 +1,24 @@ +package MonitorBench; + +public class SmallObjectsBenchmark + extends Benchmark +{ + int count = 3000000; + Object[] objects; + + public SmallObjectsBenchmark() + { + super("Small Objects Benchmark"); + + objects = new Object[count]; + } + + public void run() + { + for (int i=0; i < count; ++i) { + objects[i] = new String(); + } + + setResult(0); + } +} Added: vmkit/branches/memory-monitor/tests/monitor-bench/synth.plot URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/monitor-bench/synth.plot?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/monitor-bench/synth.plot (added) +++ vmkit/branches/memory-monitor/tests/monitor-bench/synth.plot Thu Oct 9 03:43:38 2014 @@ -0,0 +1,35 @@ +#!/usr/bin/gnuplot -p + +set datafile separator "," +set datafile missing '_' +set datafile commentschars "#" + +set ylabel "Duration in microseconds (lower is better)" +set ytics border nomirror +set grid ytics +set yrange [0:*] +# set ydata time +# set timefmt "%S" +# set format y "%M:%S" + +set xtics axis nomirror +set border 3 + +set style data histogram +set style histogram errorbars gap 1 lw 1 +set bars fullwidth +set style fill solid border 0 +set boxwidth 1 + +# set title "Monitoring overhead in micro-benchmarks" + +# set term wxt 0 +set term png size 800, 600 + +set output "micro-benchmarks-MethodCallBenchmark.png" +plot \ + '/home/koutheir/vmkit_monitor_benchmarks/MethodCallBenchmark.csv' using (column(3)):(column(5)):xtic(1) linecolor rgb "orange" title "MethodCallBenchmark" + +set output "micro-benchmarks-SmallObjectsBenchmark.png" +plot \ + '/home/koutheir/vmkit_monitor_benchmarks/SmallObjectsBenchmark.csv' using (column(3)):(column(5)):xtic(1) linecolor rgb "blue" title "SmallObjectsBenchmark" Added: vmkit/branches/memory-monitor/tests/monitor-bench/synth.sh URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/monitor-bench/synth.sh?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/monitor-bench/synth.sh (added) +++ vmkit/branches/memory-monitor/tests/monitor-bench/synth.sh Thu Oct 9 03:43:38 2014 @@ -0,0 +1,83 @@ +#!/bin/bash + +log_dir=$1 + +if [ -z "$log_dir" ]; then + exit 1 +fi + +stage1_file=/tmp/$0.$$.stage1 +stage2_file=/tmp/$0.$$.stage2 +stage3_file=/tmp/$0.$$.stage3 + +rm -f "$stage1_file" "$stage2_file" "$stage3_file" + +# Filter successful results and print them in the format: benchmark,duration +cd $log_dir && grep '^BENCHMARK SUCCEEDED' *.log | sed 's/\.[0-9]\+.log:BENCHMARK SUCCEEDED \[/,/g ; s/ ms\]:.*$//g' | sort > $stage1_file + +# Calculate minimum, maximum and average durations + +count=0 +while read -r line ; do + cur_bench=$(echo $line | cut -d ',' -f 1) + cur_duration=$(echo $line | cut -d ',' -f 2) + + if [ -z "$last_bench" ]; then + last_bench=$cur_bench + count=1 + average_duration=$cur_duration + min_duration=$cur_duration + max_duration=$cur_duration + else + if [ "$last_bench" == "$cur_bench" ]; then + count=$(($count + 1)) + average_duration=$(($average_duration + $cur_duration)) + if [ "$cur_duration" -lt "$min_duration" ]; then + min_duration=$cur_duration + fi + if [ "$cur_duration" -gt "$max_duration" ]; then + max_duration=$cur_duration + fi + else + average_duration=$(($average_duration / $count)) + echo "$last_bench,$min_duration,$average_duration,$max_duration" >> $stage2_file + + last_bench=$cur_bench + count=1 + average_duration=$cur_duration + min_duration=$cur_duration + max_duration=$cur_duration + fi + fi +done < $stage1_file + +if [ "$count" -gt 0 ]; then + average_duration=$(($average_duration / $count)) + echo "$last_bench,$min_duration,$average_duration,$max_duration" >> $stage2_file +fi + +echo '#benchmark,min_duration_ms,average_duration_ms,max_duration_ms,std_dev_duration_ms' + +# Calculate the standard deviation +while read -r line ; do + cur_bench=$(echo $line | cut -d ',' -f 1) + cur_average=$(echo $line | cut -d ',' -f 3) + + grep "^$cur_bench," "$stage1_file" > "$stage3_file" + + count=0 + std_dev='sqrt((0' + + while read -r line2 ; do + cur_duration=$(echo $line2 | cut -d ',' -f 2) + + std_dev+="+(($cur_duration - $cur_average)^2)" + count=$(($count+1)) + done < "$stage3_file" + + std_dev+=")/$count)" + std_dev=$(echo "scale=0; $std_dev" | bc -q 2>/dev/null) + echo "$line,$std_dev" +done < $stage2_file + +rm -f "$stage1_file" "$stage2_file" "$stage3_file" Added: vmkit/branches/memory-monitor/tests/monitor.xargs URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/monitor.xargs?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/monitor.xargs (added) +++ vmkit/branches/memory-monitor/tests/monitor.xargs Thu Oct 9 03:43:38 2014 @@ -0,0 +1,47 @@ +-Dorg.osgi.framework.storage=/tmp/fwdir +-Dorg.knopflerfish.framework.system.export.all_13=false +-Dorg.knopflerfish.framework.verbosity=0 + +-Forg.knopflerfish.framework.debug.errors=true +-Forg.knopflerfish.framework.debug.packages=false +-Forg.knopflerfish.framework.debug.classloader=false +#-Forg.knopflerfish.framework.debug.permissions=false + +#-Forg.osgi.framework.system.packages.extra= + +-Forg.knopflerfish.http.dnslookup=true +-Forg.osgi.service.http.port=8080 + +-Dhttp.proxyHost=proxy +-Dhttp.proxyPort=3128 + +#-Forg.knopflerfish.framework.all_signed=false + +-Dorg.knopflerfish.gosg.jars=file:///home/koutheir/phd/vmkit/knopflerfish.vmkit/osgi/jars/;file:///home/koutheir/phd/vmkit/vmkit-monitor/osgi/j3mgr/out/;file:///home/koutheir/phd/vmkit/vmkit-monitor/osgi/tests/ + +-Forg.knopflerfish.startlevel.use=true + +-init + +-istart j3mgr-1.0.0.jar + +-istart log/log_all-5.0.0.jar +-istart cm/cm_all-5.0.0.jar +-istart util/util-4.1.0.jar +-istart console/console_all-4.0.1.jar +-istart frameworkcommands/frameworkcommands-4.0.1.jar +-istart logcommands/logcommands-5.0.0.jar +-istart cm_cmd/cm_cmd-5.0.1.jar +-istart consoletty/consoletty-4.0.1.jar +-istart useradmin/useradmin_api-4.0.0.jar +-istart util/util-4.1.0.jar + +-launch + +-install tests.A/out/tests.A-1.0.0.jar +-install tests.B/out/tests.B-1.0.0.jar +-install tests.E/out/tests.E-1.0.0.jar +-install tests.AImpl/out/tests.AImpl-1.0.0.jar +-install tests.BImpl/out/tests.BImpl-1.0.0.jar +-install tests.FImpl/out/tests.FImpl-1.0.0.jar +-install tests.GImpl/out/tests.GImpl-1.0.0.jar Added: vmkit/branches/memory-monitor/tests/monitoring.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/monitoring.rules?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/monitoring.rules (added) +++ vmkit/branches/memory-monitor/tests/monitoring.rules Thu Oct 9 03:43:38 2014 @@ -0,0 +1,39 @@ +tier 1 { org.knopflerfish.framework } + +tier 11 { + org.knopflerfish.bundle.cm, + org.knopflerfish.bundle.util-LIB, + org.knopflerfish.bundle.console, + org.knopflerfish.bundle.frameworkcommands-IMPL, + org.knopflerfish.bundle.logcommands-IMPL, + org.knopflerfish.bundle.cm_cmd-IMPL, + org.knopflerfish.bundle.consoletty-IMPL, + org.knopflerfish.bundle.useradmin-API +} +tier 12 { org.knopflerfish.log } + +tier 20 { tests.A } +tier 30 { tests.B } +tier 40 { tests.E } +tier 50 { tests.AImpl } +tier 60 { tests.BImpl } +tier 70 { tests.FImpl } +tier 80 { tests.GImpl } + +tier 200 { j3mgr } + +account { 0, 1, called } +account { 1, 0, caller } +account { *, 1, caller } +account { 1, *, called } + +account { *, */_/org.osgi.framework.BundleActivator, called } + +account { 0, 0/_/java.lang.Runnable/run, called } +account { 0, 0/_/java.lang.Thread/run, called } +account { 0, 0/_/java.lang.VMThread/run, called } + +account { *, 200/j3mgr/j3.J3Mgr, caller } + +account { *, 20/tests.A/tests.A.A, caller } +# account { *, */_/tests.B.BEvent, called } Added: vmkit/branches/memory-monitor/tests/tier.description URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tests/tier.description?rev=219392&view=auto ============================================================================== --- vmkit/branches/memory-monitor/tests/tier.description (added) +++ vmkit/branches/memory-monitor/tests/tier.description Thu Oct 9 03:43:38 2014 @@ -0,0 +1,15 @@ +tier 1 { ijvm.tests.BImpl, ijvm.tests.DImpl } +tier 2 { ijvm.tests.A, ijvm.tests.AImpl } +tier 3 { ijvm.tests.C, ijvm.tests.CImpl } + +account { 0, *, callee } +account { *, 0, caller } + +account { 1, 2, caller } +account { 1, 3, caller } + +account { 2, 1, callee } +account { 2, 3, callee } + +account { 3, 1, caller } +account { 3, 2, caller } Modified: vmkit/branches/memory-monitor/tools/j3/Main.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/tools/j3/Main.cpp?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/tools/j3/Main.cpp (original) +++ vmkit/branches/memory-monitor/tools/j3/Main.cpp Thu Oct 9 03:43:38 2014 @@ -40,6 +40,7 @@ int main(int argc, char **argv, char **e // Run the application. vm->runApplication(argc, argv); vm->waitForExit(); + System::Exit(0); // Destroy everyone. Modified: vmkit/branches/memory-monitor/www/get_started.html URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/www/get_started.html?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/www/get_started.html (original) +++ vmkit/branches/memory-monitor/www/get_started.html Thu Oct 9 03:43:38 2014 @@ -13,19 +13,6 @@
- -

The VMKit project is retired

- - - -

You can still play with the last VMKit release, but the project is not more maintained. - Moreover, the information on these pages may be out of date.

- -

If you are interested in restarting the project, - please contact Gaël Thomas

-
- -

Getting Started: Building and Running VMKit

@@ -39,9 +26,9 @@ involved with the vmkit community.If you would like to check out and build the project, the current scheme is:

- - - +

Prerequisites
+You will have to install a C++ compiler and Java 1.5 or more in order to +compile vmkit2

  1. Download @@ -52,53 +39,51 @@ is:

    • tar zxvf llvm-3.3.src.tar.gz
    • -
    • cd llvm-3.3.src/tools
    • +
    • cd llvm-3.2.src/tools
    • tar zxvf ../../cfe-3.3.src.tar.gz
    • mv cfe-3.3.src clang
    • cd ..
    • ./configure --enable-optimized; make

    Note: To compile LLVM and VMKit with RTTI enabled, one can pass the parameter -REQUIRES_RTTI=1 to llvm make. Passing this argument removes the flag -fno-rtti from +REQUIRES_RTTI=1 to make. Passing this argument removes the flag -fno-rtti from the compiler options. Ex: $ make REQUIRES_RTTI=1 - -

    -

  2. Download, compile and install Openjdk version 6u23 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +

    Skip the Classpath steps if you plan to use OpenJDK.
    +

  3. Download + GNU Classpath 0.99:
  4. + +
      +
    • tar zxvf classpath-0.99.tar.gz
    • +
    • cd classpath-0.99
    • +
    • ./configure --disable-plugin --disable-examples --disable-Werror; + make
    • +
    • cd lib
    • +
    • If you are running on Linux:
    • +
        +
      • ln -s ../native/jni/gtk-peer/.libs/libgtkpeer.so;
      • +
      • ln -s ../native/jni/gconf-peer/.libs/libgconfpeer.so;
      • +
      • ln -s ../native/jni/java-io/.libs/libjavaio.so;
      • +
      • ln -s ../native/jni/java-lang/.libs/libjavalangreflect.so;
      • + +
      • ln -s ../native/jni/java-lang/.libs/libjavalang.so;
      • +
      • ln -s ../native/jni/java-net/.libs/libjavanet.so;
      • +
      • ln -s ../native/jni/java-nio/.libs/libjavanio.so;
      • +
      • ln -s ../native/jni/java-util/.libs/libjavautil.so;
      • +
      +
    • If you are running on MacOS:
    • +
        +
      • ln -s ../native/jni/gtk-peer/.libs/libgtkpeer.dylib;
      • +
      • ln -s ../native/jni/gconf-peer/.libs/libgconfpeer.dylib;
      • +
      • ln -s ../native/jni/java-io/.libs/libjavaio.dylib;
      • +
      • ln -s ../native/jni/java-lang/.libs/libjavalangreflect.dylib; +
      • +
      • ln -s ../native/jni/java-lang/.libs/libjavalang.dylib;
      • +
      • ln -s ../native/jni/java-net/.libs/libjavanet.dylib;
      • +
      • ln -s ../native/jni/java-nio/.libs/libjavanio.dylib;
      • +
      • ln -s ../native/jni/java-util/.libs/libjavautil.dylib;
      • +
      +
  5. Checkout vmkit:
    • @@ -123,15 +108,32 @@ the compiler options. Ex: $ make REQUIRE
    • org.mmtk.plan.generational.immix.GenImmix
    -
    - --with-classpath-impl=openjdk -
    -
    Tell vmkit to use OpenJDK classpath implementation.
    -
    -
    - --with-openjdk-path=<directory> -
    -
    Tell vmkit where OpenJDK is located.
    +
      +
    • +

      you can use GNU Classpath by configuring the following :

      +
      + --with-gnu-classpath-glibj=<path/to/file/glibj.zip> +
      +
      Tell vmkit where GNU Classpath glibj.zip is located.
      +
      +
      + --with-gnu-classpath-libs=<path/to/libs/directory> +
      +
      Tell vmkit where GNU Classpath libs are located.
      +
    • +
    • +

      or OpenJDK by configuring :

      +
      + --with-classpath-impl=openjdk +
      +
      Tell vmkit to use OpenJDK classpath implementation.
      +
      +
      + --with-openjdk-path=<directory> +
      +
      Tell vmkit where OpenJDK is located.
      +
    • +
    Modified: vmkit/branches/memory-monitor/www/index.html URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/www/index.html?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/www/index.html (original) +++ vmkit/branches/memory-monitor/www/index.html Thu Oct 9 03:43:38 2014 @@ -12,18 +12,6 @@
    -

    The VMKit project is retired

    - - - -

    You can still play with the last VMKit release, but the project is not more maintained. - Moreover, the information on these pages may be out of date.

    - -

    If you are interested in restarting the project, - please contact Gaël Thomas

    -
    - -

    VMKit: a substrate for virtual machines

    Modified: vmkit/branches/memory-monitor/www/menu.html.incl URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/www/menu.html.incl?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== --- vmkit/branches/memory-monitor/www/menu.html.incl (original) +++ vmkit/branches/memory-monitor/www/menu.html.incl Thu Oct 9 03:43:38 2014 @@ -16,7 +16,7 @@ llvm-dev vmkit-commits - + Bug Reports Browse Source
Modified: vmkit/branches/memory-monitor/www/tuto/toy-vm-base.tar.gz URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/memory-monitor/www/tuto/toy-vm-base.tar.gz?rev=219392&r1=219391&r2=219392&view=diff ============================================================================== Binary files vmkit/branches/memory-monitor/www/tuto/toy-vm-base.tar.gz (original) and vmkit/branches/memory-monitor/www/tuto/toy-vm-base.tar.gz Thu Oct 9 03:43:38 2014 differ