From: <dgr...@us...> - 2008-07-17 00:38:54
|
Revision: 14733 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14733&view=rev Author: dgrove-oss Date: 2008-07-17 00:38:51 +0000 (Thu, 17 Jul 2008) Log Message: ----------- RVM-590 : Fix alignment problem on 64bit platforms introduced in r14714. Modified Paths: -------------- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/gcspy/Util.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ExpandRuntimeServices.java rvmroot/trunk/rvm/src/org/jikesrvm/memorymanagers/mminterface/MM_Interface.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java rvmroot/trunk/tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImageWriter.java Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/gcspy/Util.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/gcspy/Util.java 2008-07-16 11:06:12 UTC (rev 14732) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/gcspy/Util.java 2008-07-17 00:38:51 UTC (rev 14733) @@ -199,7 +199,7 @@ array.getTypeInformationBlock(), Plan.ALLOC_GCSPY, ObjectModel.getAlignment(array), - ObjectModel.getOffsetForAlignment(array), + ObjectModel.getOffsetForAlignment(array, false), 0); } else { return null; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java 2008-07-16 11:06:12 UTC (rev 14732) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java 2008-07-17 00:38:51 UTC (rev 14733) @@ -2932,8 +2932,8 @@ int instanceSize = typeRef.getInstanceSize(); Offset tibOffset = typeRef.getTibOffset(); int whichAllocator = MM_Interface.pickAllocator(typeRef, method); - int align = ObjectModel.getAlignment(typeRef); - int offset = ObjectModel.getOffsetForAlignment(typeRef); + int align = ObjectModel.getAlignment(typeRef, false); + int offset = ObjectModel.getOffsetForAlignment(typeRef, false); int site = MM_Interface.getAllocationSite(true); asm.emitPUSH_Imm(instanceSize); asm.emitPUSH_Abs(Magic.getTocPointer().plus(tibOffset)); // put tib on stack @@ -2973,7 +2973,7 @@ int whichAllocator = MM_Interface.pickAllocator(array, method); int site = MM_Interface.getAllocationSite(true); int align = ObjectModel.getAlignment(array); - int offset = ObjectModel.getOffsetForAlignment(array); + int offset = ObjectModel.getOffsetForAlignment(array, false); // count is already on stack- nothing required asm.emitPUSH_Imm(width); // logElementSize asm.emitPUSH_Imm(headerSize); // headerSize Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java 2008-07-16 11:06:12 UTC (rev 14732) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java 2008-07-17 00:38:51 UTC (rev 14733) @@ -2970,7 +2970,7 @@ Offset tibOffset = typeRef.getTibOffset(); int whichAllocator = MM_Interface.pickAllocator(typeRef, method); int align = ObjectModel.getAlignment(typeRef); - int offset = ObjectModel.getOffsetForAlignment(typeRef); + int offset = ObjectModel.getOffsetForAlignment(typeRef, false); int site = MM_Interface.getAllocationSite(true); asm.emitLAddrToc(T0, Entrypoints.resolvedNewScalarMethod.getOffset()); asm.emitMTCTR(T0); @@ -3010,7 +3010,7 @@ int whichAllocator = MM_Interface.pickAllocator(array, method); int site = MM_Interface.getAllocationSite(true); int align = ObjectModel.getAlignment(array); - int offset = ObjectModel.getOffsetForAlignment(array); + int offset = ObjectModel.getOffsetForAlignment(array, false); asm.emitLAddrToc(T0, Entrypoints.resolvedNewArrayMethod.getOffset()); asm.emitMTCTR(T0); peekInt(T0, 0); // T0 := number of elements Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ExpandRuntimeServices.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ExpandRuntimeServices.java 2008-07-16 11:06:12 UTC (rev 14732) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ExpandRuntimeServices.java 2008-07-17 00:38:51 UTC (rev 14733) @@ -140,7 +140,7 @@ RVMMethod callSite = inst.position.getMethod(); IntConstantOperand allocator = IRTools.IC(MM_Interface.pickAllocator(cls, callSite)); IntConstantOperand align = IRTools.IC(ObjectModel.getAlignment(cls)); - IntConstantOperand offset = IRTools.IC(ObjectModel.getOffsetForAlignment(cls)); + IntConstantOperand offset = IRTools.IC(ObjectModel.getOffsetForAlignment(cls, false)); Operand tib = ConvertToLowLevelIR.getTIB(inst, ir, Type); if (VM.BuildForIA32 && VM.runningVM) { // shield BC2IR from address constants @@ -197,7 +197,7 @@ RVMMethod callSite = inst.position.getMethod(); IntConstantOperand allocator = IRTools.IC(MM_Interface.pickAllocator(array, callSite)); IntConstantOperand align = IRTools.IC(ObjectModel.getAlignment(array)); - IntConstantOperand offset = IRTools.IC(ObjectModel.getOffsetForAlignment(array)); + IntConstantOperand offset = IRTools.IC(ObjectModel.getOffsetForAlignment(array, false)); Operand tib = ConvertToLowLevelIR.getTIB(inst, ir, Array); if (VM.BuildForIA32 && VM.runningVM) { // shield BC2IR from address constants Modified: rvmroot/trunk/rvm/src/org/jikesrvm/memorymanagers/mminterface/MM_Interface.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/memorymanagers/mminterface/MM_Interface.java 2008-07-16 11:06:12 UTC (rev 14732) +++ rvmroot/trunk/rvm/src/org/jikesrvm/memorymanagers/mminterface/MM_Interface.java 2008-07-17 00:38:51 UTC (rev 14733) @@ -795,7 +795,7 @@ RVMArray type = RVMType.CodeArrayType; int headerSize = ObjectModel.computeArrayHeaderSize(type); int align = ObjectModel.getAlignment(type); - int offset = ObjectModel.getOffsetForAlignment(type); + int offset = ObjectModel.getOffsetForAlignment(type, false); int width = type.getLogElementSize(); TIB tib = type.getTypeInformationBlock(); int allocator = isHot ? Plan.ALLOC_HOT_CODE : Plan.ALLOC_COLD_CODE; @@ -818,7 +818,7 @@ RVMArray stackType = RVMArray.ByteArray; int headerSize = ObjectModel.computeArrayHeaderSize(stackType); int align = ObjectModel.getAlignment(stackType); - int offset = ObjectModel.getOffsetForAlignment(stackType); + int offset = ObjectModel.getOffsetForAlignment(stackType, false); int width = stackType.getLogElementSize(); TIB stackTib = stackType.getTypeInformationBlock(); @@ -848,7 +848,7 @@ RVMArray arrayType = RVMType.WordArrayType; int headerSize = ObjectModel.computeArrayHeaderSize(arrayType); int align = ObjectModel.getAlignment(arrayType); - int offset = ObjectModel.getOffsetForAlignment(arrayType); + int offset = ObjectModel.getOffsetForAlignment(arrayType, false); int width = arrayType.getLogElementSize(); TIB arrayTib = arrayType.getTypeInformationBlock(); @@ -878,7 +878,7 @@ RVMArray arrayType = RVMArray.DoubleArray; int headerSize = ObjectModel.computeArrayHeaderSize(arrayType); int align = ObjectModel.getAlignment(arrayType); - int offset = ObjectModel.getOffsetForAlignment(arrayType); + int offset = ObjectModel.getOffsetForAlignment(arrayType, false); int width = arrayType.getLogElementSize(); TIB arrayTib = arrayType.getTypeInformationBlock(); @@ -908,7 +908,7 @@ RVMArray arrayType = RVMArray.IntArray; int headerSize = ObjectModel.computeArrayHeaderSize(arrayType); int align = ObjectModel.getAlignment(arrayType); - int offset = ObjectModel.getOffsetForAlignment(arrayType); + int offset = ObjectModel.getOffsetForAlignment(arrayType, false); int width = arrayType.getLogElementSize(); TIB arrayTib = arrayType.getTypeInformationBlock(); @@ -938,7 +938,7 @@ RVMArray arrayType = RVMArray.ShortArray; int headerSize = ObjectModel.computeArrayHeaderSize(arrayType); int align = ObjectModel.getAlignment(arrayType); - int offset = ObjectModel.getOffsetForAlignment(arrayType); + int offset = ObjectModel.getOffsetForAlignment(arrayType, false); int width = arrayType.getLogElementSize(); TIB arrayTib = arrayType.getTypeInformationBlock(); @@ -1050,7 +1050,7 @@ TIB fakeTib = fakeType.getTypeInformationBlock(); int headerSize = ObjectModel.computeArrayHeaderSize(fakeType); int align = ObjectModel.getAlignment(fakeType); - int offset = ObjectModel.getOffsetForAlignment(fakeType); + int offset = ObjectModel.getOffsetForAlignment(fakeType, false); int width = fakeType.getLogElementSize(); /* Allocate a word array */ Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java 2008-07-16 11:06:12 UTC (rev 14732) +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java 2008-07-17 00:38:51 UTC (rev 14733) @@ -764,9 +764,12 @@ * that must be aligned. * @param t RVMClass instance being created */ - public static int getOffsetForAlignment(RVMClass t) { + public static int getOffsetForAlignment(RVMClass t, boolean needsIdentityHash) { /* Align the first field - note that this is one word off from the reference. */ + if (ADDRESS_BASED_HASHING && !DYNAMIC_HASH_OFFSET && needsIdentityHash) { + return SCALAR_HEADER_SIZE + HASHCODE_BYTES; + } return SCALAR_HEADER_SIZE; } @@ -791,9 +794,12 @@ * be aligned. * @param t RVMArray instance being created */ - public static int getOffsetForAlignment(RVMArray t) { + public static int getOffsetForAlignment(RVMArray t, boolean needsIdentityHash) { /* although array_header_size == object_ref_offset we say this because the whole point is to align the object ref */ + if (ADDRESS_BASED_HASHING && !DYNAMIC_HASH_OFFSET && needsIdentityHash) { + return OBJECT_REF_OFFSET + HASHCODE_BYTES; + } return OBJECT_REF_OFFSET; } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java 2008-07-16 11:06:12 UTC (rev 14732) +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java 2008-07-17 00:38:51 UTC (rev 14733) @@ -678,8 +678,8 @@ * that must be aligned. * @param t RVMClass instance being created */ - public static int getOffsetForAlignment(RVMClass t) { - return JavaHeader.getOffsetForAlignment(t); + public static int getOffsetForAlignment(RVMClass t, boolean needsIdentityHash) { + return JavaHeader.getOffsetForAlignment(t, needsIdentityHash); } /** @@ -697,8 +697,8 @@ * be aligned. * @param t RVMArray instance being created */ - public static int getOffsetForAlignment(RVMArray t) { - return JavaHeader.getOffsetForAlignment(t); + public static int getOffsetForAlignment(RVMArray t, boolean needsIdentityHash) { + return JavaHeader.getOffsetForAlignment(t, needsIdentityHash); } /** @@ -752,7 +752,7 @@ } } int align = getAlignment(klass); - int offset = getOffsetForAlignment(klass); + int offset = getOffsetForAlignment(klass, needsIdentityHash); Address ptr = bootImage.allocateDataStorage(size, align, offset); Address ref = JavaHeader.initializeScalarHeader(bootImage, ptr, tib, size, needsIdentityHash, identityHashValue); MM_Interface.initializeHeader(bootImage, ref, tib, size, true); @@ -817,7 +817,7 @@ } } int align = getAlignment(array); - int offset = getOffsetForAlignment(array); + int offset = getOffsetForAlignment(array, needsIdentityHash); Address ptr = bootImage.allocateDataStorage(size, align, offset); Address ref = JavaHeader.initializeArrayHeader(bootImage, ptr, tib, size, numElements, needsIdentityHash, identityHashValue); bootImage.setFullWord(ref.plus(getArrayLengthOffset()), numElements); @@ -841,7 +841,7 @@ TIB tib = array.getTypeInformationBlock(); int size = array.getInstanceSize(numElements); int align = getAlignment(array); - int offset = getOffsetForAlignment(array); + int offset = getOffsetForAlignment(array, false); Address ptr = bootImage.allocateCodeStorage(size, align, offset); Address ref = JavaHeader.initializeArrayHeader(bootImage, ptr, tib, size, numElements, false, 0); bootImage.setFullWord(ref.plus(getArrayLengthOffset()), numElements); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java 2008-07-16 11:06:12 UTC (rev 14732) +++ rvmroot/trunk/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java 2008-07-17 00:38:51 UTC (rev 14733) @@ -238,7 +238,7 @@ int allocator = MM_Interface.pickAllocator(cls); int align = ObjectModel.getAlignment(cls); - int offset = ObjectModel.getOffsetForAlignment(cls); + int offset = ObjectModel.getOffsetForAlignment(cls, false); return resolvedNewScalar(cls.getInstanceSize(), cls.getTypeInformationBlock(), cls.hasFinalizer(), @@ -260,7 +260,7 @@ int allocator = MM_Interface.pickAllocator(cls); int site = MM_Interface.getAllocationSite(false); int align = ObjectModel.getAlignment(cls); - int offset = ObjectModel.getOffsetForAlignment(cls); + int offset = ObjectModel.getOffsetForAlignment(cls, false); return resolvedNewScalar(cls.getInstanceSize(), cls.getTypeInformationBlock(), cls.hasFinalizer(), @@ -345,7 +345,7 @@ array.getTypeInformationBlock(), MM_Interface.pickAllocator(array), ObjectModel.getAlignment(array), - ObjectModel.getOffsetForAlignment(array), + ObjectModel.getOffsetForAlignment(array, false), site); } Modified: rvmroot/trunk/tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImageWriter.java =================================================================== --- rvmroot/trunk/tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImageWriter.java 2008-07-16 11:06:12 UTC (rev 14732) +++ rvmroot/trunk/tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImageWriter.java 2008-07-17 00:38:51 UTC (rev 14733) @@ -1121,11 +1121,11 @@ // allocate storage for boot record bootImage.allocateDataStorage(rvmBRType.getInstanceSize(), ObjectModel.getAlignment(rvmBRType), - ObjectModel.getOffsetForAlignment(rvmBRType)); + ObjectModel.getOffsetForAlignment(rvmBRType, false)); // allocate storeage for JTOC Address jtocAddress = bootImage.allocateDataStorage(intArrayType.getInstanceSize(0), ObjectModel.getAlignment(intArrayType), - ObjectModel.getOffsetForAlignment(intArrayType)); + ObjectModel.getOffsetForAlignment(intArrayType, false)); bootImage.resetAllocator(); bootRecord.tocRegister = jtocAddress.plus(intArrayType.getInstanceSize(Statics.middleOfTable)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cap...@us...> - 2008-07-17 08:14:16
|
Revision: 14737 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14737&view=rev Author: captain5050 Date: 2008-07-17 08:14:10 +0000 (Thu, 17 Jul 2008) Log Message: ----------- RVM-332 and RVM-105: changes to select hijacking and implementation. For RVM-332 it is crucial we don't allow a select when in a JNI critical section. For RVM-105 avoid unnecessary call through to hijacked select function. Modified Paths: -------------- rvmroot/trunk/build.xml rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/Wait.java rvmroot/trunk/tools/bootImageRunner/sys.C rvmroot/trunk/tools/bootImageRunner/syswrap.C Modified: rvmroot/trunk/build.xml =================================================================== --- rvmroot/trunk/build.xml 2008-07-17 08:11:16 UTC (rev 14736) +++ rvmroot/trunk/build.xml 2008-07-17 08:14:10 UTC (rev 14737) @@ -1632,6 +1632,7 @@ <arg value="-L${build.base}"/> <arg value="-ldl"/> <arg value="-lrvm"/> + <arg value="-lsyswrap"/> </exec> </sequential> </if> @@ -1648,6 +1649,7 @@ <arg value="-L${harmony.lib.dir}"/> <arg value="-ldl"/> <arg value="-lrvm"/> + <arg value="-lsyswrap"/> <arg value="-lvmi"/> <arg value="-lhyarchive"/> <arg value="-lhyprt"/> Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/Wait.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/Wait.java 2008-07-17 08:11:16 UTC (rev 14736) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/Wait.java 2008-07-17 08:14:10 UTC (rev 14737) @@ -13,6 +13,8 @@ package org.jikesrvm.scheduler.greenthreads; import org.jikesrvm.runtime.Time; +import org.jikesrvm.scheduler.Processor; +import org.jikesrvm.scheduler.Scheduler; /** * A collection of static methods for waiting on some type of event. @@ -130,10 +132,17 @@ * negative, wait indefinitely * @param fromNative true if this select is being called * from native code + * @return 0 no error, -1 failure due to threading/GC disabled */ - public static void ioWaitSelect(int[] readFds, int[] writeFds, int[] exceptFds, double totalWaitTime, + public static int ioWaitSelect(int[] readFds, int[] writeFds, int[] exceptFds, double totalWaitTime, boolean fromNative) { - + // Check if we're entering from native we can sensibly wait + if (fromNative) { + if(!Processor.getCurrentProcessor().threadSwitchingEnabled() || + Scheduler.getCurrentThread().getDisallowAllocationsByThisThread()) { + return -1; + } + } // Create wait data to represent the event that the thread is // waiting for long maxWaitNano = getMaxWaitNano(totalWaitTime); @@ -152,6 +161,7 @@ } else { GreenThread.ioWaitImpl(waitData); } + return 0; } /** Modified: rvmroot/trunk/tools/bootImageRunner/sys.C =================================================================== --- rvmroot/trunk/tools/bootImageRunner/sys.C 2008-07-17 08:11:16 UTC (rev 14736) +++ rvmroot/trunk/tools/bootImageRunner/sys.C 2008-07-17 08:14:10 UTC (rev 14737) @@ -2539,8 +2539,7 @@ // Ensure that select() call below // calls the real C library version, not our hijacked version -#define realSelect(n, read, write, except, timeout) \ - select(n, read, write, except, timeout) + SelectFunc_t realSelect = getLibcSelect(); // interrogate // Modified: rvmroot/trunk/tools/bootImageRunner/syswrap.C =================================================================== --- rvmroot/trunk/tools/bootImageRunner/syswrap.C 2008-07-17 08:11:16 UTC (rev 14736) +++ rvmroot/trunk/tools/bootImageRunner/syswrap.C 2008-07-17 08:14:10 UTC (rev 14737) @@ -52,8 +52,8 @@ #define C_LIBRARY_NAME "libc.so.6" // Pointers to actual syscall functions from C library. -static SelectFunc_t libcSelect; -static PollFunc_t libcPoll; +static SelectFunc_t libcSelect = NULL; +static PollFunc_t libcPoll = NULL; // Get a pointer to a symbol from the C library. // @@ -67,7 +67,7 @@ static void *libcHandle; // FIXME: should handle errors - if (*pPtr == 0) { + if (*pPtr == NULL) { if (libcHandle == 0) libcHandle = dlopen(C_LIBRARY_NAME, RTLD_LAZY); *pPtr = dlsym(libcHandle, symbolName); @@ -222,12 +222,14 @@ // Call RVMThread.ioWaitSelect() jclass vmWaitClass = env->FindClass("org/jikesrvm/scheduler/greenthreads/Wait"); jmethodID ioWaitSelectMethod = env->GetStaticMethodID(vmWaitClass, - "ioWaitSelect", "([I[I[IDZ)V"); - env->CallStaticVoidMethod(vmWaitClass, ioWaitSelectMethod, + "ioWaitSelect", "([I[I[IDZ)I"); + jint result = env->CallStaticIntMethod(vmWaitClass, ioWaitSelectMethod, readArr, writeArr, exceptArr, totalWaitTime, (jboolean) 1); + if (result == -1) { + // Error caused by VM having GC/threading disabled, fall back on libc select + return libcSelect(maxFd, readFdSet, writeFdSet, exceptFdSet, timeout); + } - // TODO: should have return value from ioWaitSelect(), for returning errors - // For each file descriptor set in the Java arrays, // mark the corresponding entry in the fd_sets (as appropriate). int readyCount = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dfr...@us...> - 2008-07-18 07:42:47
|
Revision: 14740 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14740&view=rev Author: dframpton-oss Date: 2008-07-18 07:42:43 +0000 (Fri, 18 Jul 2008) Log Message: ----------- Fix mistaken removal of a VM_ prefix Modified Paths: -------------- rvmroot/trunk/MMTk/src/org/mmtk/plan/Plan.java rvmroot/trunk/MMTk/src/org/mmtk/plan/TraceLocal.java rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/RCBase.java rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/fullheap/RCMutator.java rvmroot/trunk/MMTk/src/org/mmtk/utility/sanitychecker/SanityCheckerLocal.java rvmroot/trunk/rvm/src/org/jikesrvm/memorymanagers/mminterface/MM_Interface.java Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/Plan.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/Plan.java 2008-07-18 01:32:27 UTC (rev 14739) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/Plan.java 2008-07-18 07:42:43 UTC (rev 14740) @@ -143,7 +143,7 @@ /* Space descriptors */ public static final int IMMORTAL = immortalSpace.getDescriptor(); - public static final int SPACE = vmSpace.getDescriptor(); + public static final int VM_SPACE = vmSpace.getDescriptor(); public static final int META = metaDataSpace.getDescriptor(); public static final int LOS = loSpace.getDescriptor(); public static final int PLOS = ploSpace.getDescriptor(); @@ -972,7 +972,7 @@ return true; if (Space.isInSpace(IMMORTAL, object)) return true; - if (Space.isInSpace(SPACE, object)) + if (Space.isInSpace(VM_SPACE, object)) return true; if (Space.isInSpace(NON_MOVING, object)) return true; Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/TraceLocal.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/TraceLocal.java 2008-07-18 01:32:27 UTC (rev 14739) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/TraceLocal.java 2008-07-18 07:42:43 UTC (rev 14740) @@ -256,7 +256,7 @@ */ @Inline public ObjectReference traceObject(ObjectReference object) { - if (Space.isInSpace(Plan.SPACE, object)) + if (Space.isInSpace(Plan.VM_SPACE, object)) return (Plan.SCAN_BOOT_IMAGE) ? object : Plan.vmSpace.traceObject(this, object); if (Space.isInSpace(Plan.IMMORTAL, object)) return Plan.immortalSpace.traceObject(this, object); @@ -320,7 +320,7 @@ return true; if (Space.isInSpace(Plan.IMMORTAL, object)) return true; - if (Space.isInSpace(Plan.SPACE, object)) + if (Space.isInSpace(Plan.VM_SPACE, object)) return true; if (Space.isInSpace(Plan.NON_MOVING, object)) return true; Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/RCBase.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/RCBase.java 2008-07-18 01:32:27 UTC (rev 14739) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/RCBase.java 2008-07-18 07:42:43 UTC (rev 14740) @@ -244,7 +244,7 @@ * @return True if the object is in a reference counted space. */ public static boolean isRCObject(ObjectReference object) { - return !object.isNull() && !Space.isInSpace(SPACE, object); + return !object.isNull() && !Space.isInSpace(VM_SPACE, object); } /** Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/fullheap/RCMutator.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/fullheap/RCMutator.java 2008-07-18 01:32:27 UTC (rev 14739) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/fullheap/RCMutator.java 2008-07-18 07:42:43 UTC (rev 14740) @@ -183,7 +183,7 @@ } else { boolean result = VM.barriers.tryCompareAndSwapWriteInBarrier(src,slot,old,tgt,metaDataA,metaDataB,mode); - if (result && !Space.isInSpace(RCBase.SPACE, src)) { + if (result && !Space.isInSpace(RCBase.VM_SPACE, src)) { if (RC.isRCObject(old)) decBuffer.pushOOL(old); if (RC.isRCObject(tgt)) RCHeader.incRCOOL(tgt); } @@ -237,7 +237,7 @@ } else { ObjectReference old = VM.barriers.performWriteInBarrierAtomic(src,slot,tgt,metaDataA,metaDataB,mode); - if (Space.isInSpace(RCBase.SPACE, src)) return; + if (Space.isInSpace(RCBase.VM_SPACE, src)) return; if (RC.isRCObject(old)) decBuffer.pushOOL(old); if (RC.isRCObject(tgt)) RCHeader.incRCOOL(tgt); } @@ -269,7 +269,7 @@ } else { ObjectReference old = VM.barriers.performWriteInBarrierAtomic(src,slot,tgt,metaDataA,metaDataB,mode); - if (Space.isInSpace(RCBase.SPACE, src)) return; + if (Space.isInSpace(RCBase.VM_SPACE, src)) return; if (RC.isRCObject(old)) decBuffer.push(old); if (RC.isRCObject(tgt)) RCHeader.incRC(tgt); } @@ -310,7 +310,7 @@ coalescingWriteBarrierSlow(dst); return false; } else { - if (Space.isInSpace(RCBase.SPACE, dst)) return false; + if (Space.isInSpace(RCBase.VM_SPACE, dst)) return false; Address s = src.toAddress().plus(srcOffset); Address d = dst.toAddress().plus(dstOffset); while (bytes > 0) { Modified: rvmroot/trunk/MMTk/src/org/mmtk/utility/sanitychecker/SanityCheckerLocal.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/utility/sanitychecker/SanityCheckerLocal.java 2008-07-18 01:32:27 UTC (rev 14739) +++ rvmroot/trunk/MMTk/src/org/mmtk/utility/sanitychecker/SanityCheckerLocal.java 2008-07-18 07:42:43 UTC (rev 14740) @@ -142,7 +142,7 @@ return; } - if (Plan.SCAN_BOOT_IMAGE && Space.isInSpace(Plan.SPACE, object)) { + if (Plan.SCAN_BOOT_IMAGE && Space.isInSpace(Plan.VM_SPACE, object)) { return; } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/memorymanagers/mminterface/MM_Interface.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/memorymanagers/mminterface/MM_Interface.java 2008-07-18 01:32:27 UTC (rev 14739) +++ rvmroot/trunk/rvm/src/org/jikesrvm/memorymanagers/mminterface/MM_Interface.java 2008-07-18 07:42:43 UTC (rev 14740) @@ -490,7 +490,7 @@ public static boolean mightBeFP(Address address) { return Space.isInSpace(Plan.LOS, address) || Space.isInSpace(Plan.IMMORTAL, address) || - Space.isInSpace(Plan.SPACE, address); + Space.isInSpace(Plan.VM_SPACE, address); } /*********************************************************************** * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dfr...@us...> - 2008-07-19 02:47:05
|
Revision: 14744 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14744&view=rev Author: dframpton-oss Date: 2008-07-19 02:47:02 +0000 (Sat, 19 Jul 2008) Log Message: ----------- Fix for RVM-458. JNI global refs need to be explicitly traced as they are read without a read barrier. Modified Paths: -------------- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIGlobalRefTable.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Entrypoints.java Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java 2008-07-18 22:57:37 UTC (rev 14743) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java 2008-07-19 02:47:02 UTC (rev 14744) @@ -17,6 +17,7 @@ import org.mmtk.utility.Constants; import org.jikesrvm.jni.JNIEnvironment; +import org.jikesrvm.jni.JNIGlobalRefTable; import org.jikesrvm.memorymanagers.mminterface.MM_Constants; import org.jikesrvm.memorymanagers.mminterface.Selected; import org.jikesrvm.memorymanagers.mminterface.CollectorThread; @@ -260,6 +261,17 @@ for(int i=start; i < end; i++) { trace.processRootEdge(jniFunctions.plus(i << LOG_BYTES_IN_ADDRESS), true); } + + /* scan jni global refs */ + Address jniGlobalRefs = Magic.objectAsAddress(JNIGlobalRefTable.JNIGlobalRefs); + size = JNIGlobalRefTable.JNIGlobalRefs.length(); + chunkSize = size / threads; + start = (ct.getGCOrdinal() - 1) * chunkSize; + end = (ct.getGCOrdinal() == threads) ? size : ct.getGCOrdinal() * chunkSize; + + for(int i=start; i < end; i++) { + trace.processRootEdge(jniGlobalRefs.plus(i << LOG_BYTES_IN_ADDRESS), true); + } } /** Modified: rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIGlobalRefTable.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIGlobalRefTable.java 2008-07-18 22:57:37 UTC (rev 14743) +++ rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIGlobalRefTable.java 2008-07-19 02:47:02 UTC (rev 14744) @@ -14,9 +14,13 @@ import java.lang.ref.WeakReference; import org.jikesrvm.VM; +import org.jikesrvm.runtime.Magic; import org.jikesrvm.memorymanagers.mminterface.MM_Interface; import org.vmmagic.pragma.Entrypoint; +import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.unboxed.ObjectReference; +import org.vmmagic.unboxed.AddressArray; +import org.vmmagic.unboxed.Address; /** * Weak Global References are global references (negative numbers), with the @@ -25,22 +29,29 @@ public class JNIGlobalRefTable { @Entrypoint - private static Object[] refs = new Object[100]; + public static AddressArray JNIGlobalRefs = AddressArray.create(100); private static int free = 1; static int newGlobalRef(Object referent) { if (VM.VerifyAssertions) VM._assert(MM_Interface.validRef(ObjectReference.fromObject(referent))); - if (free >= refs.length) { - Object[] newrefs = new Object[refs.length * 2]; - org.jikesrvm.classloader.RVMArray.arraycopy(refs, 0, newrefs, 0, refs.length); - refs = newrefs; + if (free >= JNIGlobalRefs.length()) { + AddressArray newGlobalRefs = AddressArray.create(JNIGlobalRefs.length() * 2); + copyAndReplaceGlobalRefs(newGlobalRefs); } - refs[free] = referent; + JNIGlobalRefs.set(free, Magic.objectAsAddress(referent)); return -free++; } + @Uninterruptible + private static void copyAndReplaceGlobalRefs(AddressArray newGlobalRefs) { + for(int i=0; i < JNIGlobalRefs.length(); i++) { + newGlobalRefs.set(i, JNIGlobalRefs.get(i)); + } + JNIGlobalRefs = newGlobalRefs; + } + /* Weak references are returned with the STRONG_REF_BIT bit UNset. */ public static final int STRONG_REF_BIT = 1 << 30; @@ -51,7 +62,7 @@ static void deleteGlobalRef(int index) { if (VM.VerifyAssertions) VM._assert(!isWeakRef(index)); - refs[-index] = null; + JNIGlobalRefs.set(-index, Address.zero()); } static void deleteWeakRef(int index) { @@ -63,13 +74,13 @@ static Object globalRef(int index) { if (VM.VerifyAssertions) VM._assert(!isWeakRef(index)); - return refs[-index]; + return Magic.addressAsObject(JNIGlobalRefs.get(-index)); } static Object weakRef(int index) { if (VM.VerifyAssertions) VM._assert(isWeakRef(index)); @SuppressWarnings("unchecked") // yes, we're being bad. - WeakReference<Object> ref = (WeakReference<Object>) refs[-(index | STRONG_REF_BIT)]; + WeakReference<Object> ref = (WeakReference<Object>) globalRef(index | STRONG_REF_BIT); return ref.get(); } @@ -84,5 +95,4 @@ static boolean isWeakRef(int index) { return (index & STRONG_REF_BIT) == 0; } - } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Entrypoints.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Entrypoints.java 2008-07-18 22:57:37 UTC (rev 14743) +++ rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Entrypoints.java 2008-07-19 02:47:02 UTC (rev 14744) @@ -299,7 +299,7 @@ public static final RVMField JNIEnvSavedPRField = getField(org.jikesrvm.jni.JNIEnvironment.class, "savedPRreg", org.jikesrvm.scheduler.Processor.class); public static final RVMField JNIGlobalRefsField = - getField(org.jikesrvm.jni.JNIGlobalRefTable.class, "refs", java.lang.Object[].class); + getField(org.jikesrvm.jni.JNIGlobalRefTable.class, "JNIGlobalRefs", org.vmmagic.unboxed.AddressArray.class); public static final RVMField JNIRefsField = getField(org.jikesrvm.jni.JNIEnvironment.class, "JNIRefs", org.vmmagic.unboxed.AddressArray.class); public static final RVMField JNIRefsTopField = getField(org.jikesrvm.jni.JNIEnvironment.class, "JNIRefsTop", int.class); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cap...@us...> - 2008-07-20 10:58:06
|
Revision: 14751 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14751&view=rev Author: captain5050 Date: 2008-07-20 10:57:49 +0000 (Sun, 20 Jul 2008) Log Message: ----------- Fixes to PPC build Modified Paths: -------------- rvmroot/trunk/build.xml rvmroot/trunk/tools/bootImageRunner/sys.C Modified: rvmroot/trunk/build.xml =================================================================== --- rvmroot/trunk/build.xml 2008-07-20 04:13:20 UTC (rev 14750) +++ rvmroot/trunk/build.xml 2008-07-20 10:57:49 UTC (rev 14751) @@ -1620,6 +1620,10 @@ <equals arg1="${config.include.perfctr}" arg2="true"/> </condition> + <condition property="syswrap.lib" value="-lsyswrap" else=""> + <equals arg1="${include.syswrap}" arg2="true"/> + </condition> + <if> <conditions> <equals arg1="${classlib.provider}" arg2="GNU Classpath"/> @@ -1631,8 +1635,7 @@ <arg value="${build.base}/JikesRVM"/> <arg value="-L${build.base}"/> <arg value="-ldl"/> - <arg value="-lrvm"/> - <arg value="-lsyswrap"/> + <arg line="-lrvm ${syswrap.lib}"/> </exec> </sequential> </if> @@ -1648,8 +1651,7 @@ <arg value="-L${build.base}"/> <arg value="-L${harmony.lib.dir}"/> <arg value="-ldl"/> - <arg value="-lrvm"/> - <arg value="-lsyswrap"/> + <arg line="-lrvm ${syswrap.lib}"/> <arg value="-lvmi"/> <arg value="-lhyarchive"/> <arg value="-lhyprt"/> Modified: rvmroot/trunk/tools/bootImageRunner/sys.C =================================================================== --- rvmroot/trunk/tools/bootImageRunner/sys.C 2008-07-20 04:13:20 UTC (rev 14750) +++ rvmroot/trunk/tools/bootImageRunner/sys.C 2008-07-20 10:57:49 UTC (rev 14751) @@ -109,7 +109,10 @@ #include "bootImageRunner.h" // In tools/bootImageRunner. #include <pthread.h> -#include "syswrap.h" +#if (defined RVM_FOR_LINUX) || (defined RVM_FOR_SOLARIS) +# define HAVE_SYSWRAP 1 +# include "syswrap.h" +#endif // #define DEBUG_SYS #define VERBOSE_PTHREAD lib_verbose @@ -2537,8 +2540,12 @@ // Ensure that select() call below // calls the real C library version, not our hijacked version +#ifdef HAVE_SYSWRAP SelectFunc_t realSelect = getLibcSelect(); - +#else + #define realSelect(n, read, write, except, timeout) \ + select(n, read, write, except, timeout) +#endif // interrogate // // timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = SelectDelay * 1000; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cap...@us...> - 2008-07-22 15:17:44
|
Revision: 14760 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14760&view=rev Author: captain5050 Date: 2008-07-22 15:17:36 +0000 (Tue, 22 Jul 2008) Log Message: ----------- Introduce generic RuntimeTable interface as a super class of all runtime tables. Simplify logic to write runtime tables in boot image writer. Modified Paths: -------------- rvmroot/trunk/rvm/src/org/jikesrvm/jni/FunctionTable.java rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIFunctions.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/IMT.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ITable.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ITableArray.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/TIB.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ProcessorTable.java rvmroot/trunk/tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImageWriter.java rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/AddressArray.java rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/ExtentArray.java rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/ObjectReferenceArray.java rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/OffsetArray.java rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/WordArray.java Added Paths: ----------- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/RuntimeTable.java Modified: rvmroot/trunk/rvm/src/org/jikesrvm/jni/FunctionTable.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/jni/FunctionTable.java 2008-07-22 15:12:31 UTC (rev 14759) +++ rvmroot/trunk/rvm/src/org/jikesrvm/jni/FunctionTable.java 2008-07-22 15:17:36 UTC (rev 14760) @@ -14,16 +14,18 @@ import org.jikesrvm.VM; import org.jikesrvm.ArchitectureSpecific.CodeArray; +import org.jikesrvm.objectmodel.RuntimeTable; import org.vmmagic.Intrinsic; import org.vmmagic.pragma.NonMoving; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.pragma.UninterruptibleNoWarn; /** - * This class holds a JNI function table + * This class holds a JNI function table, at runtime it is an array with + * CodeArray elements */ @NonMoving -public final class FunctionTable { +public final class FunctionTable implements RuntimeTable<CodeArray> { /** * The backing data used during boot image writing. @@ -51,7 +53,7 @@ /** * Return the backing array (for boot image writing) */ - public Object[] getBacking() { + public CodeArray[] getBacking() { if (VM.VerifyAssertions) VM._assert(!VM.runningVM); return data; } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIFunctions.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIFunctions.java 2008-07-22 15:12:31 UTC (rev 14759) +++ rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIFunctions.java 2008-07-22 15:17:36 UTC (rev 14760) @@ -101,7 +101,7 @@ * </ol> */ @SuppressWarnings({"unused", "UnusedDeclaration"}) -// called from native code +// methods are called from native code @NativeBridge public class JNIFunctions implements SizeConstants { // one message for each JNI function called from native Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/IMT.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/IMT.java 2008-07-22 15:12:31 UTC (rev 14759) +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/IMT.java 2008-07-22 15:17:36 UTC (rev 14760) @@ -20,10 +20,11 @@ import org.vmmagic.pragma.UninterruptibleNoWarn; /** - * This class represents an instance of an interface method table. + * This class represents an instance of an interface method table, at runtime it + * is an array with CodeArray elements. */ @NonMoving -public final class IMT { +public final class IMT implements RuntimeTable<CodeArray> { /** * The backing data used during boot image writing. @@ -40,7 +41,7 @@ /** * Return the backing array (for boot image writing) */ - public Object[] getBacking() { + public CodeArray[] getBacking() { if (VM.VerifyAssertions) VM._assert(!VM.runningVM); return data; } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ITable.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ITable.java 2008-07-22 15:12:31 UTC (rev 14759) +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ITable.java 2008-07-22 15:17:36 UTC (rev 14760) @@ -27,7 +27,7 @@ * This class represents an instance of an interface table. */ @NonMoving -public final class ITable { +public final class ITable implements RuntimeTable<Object> { /** * The backing data used during boot image writing. @@ -68,7 +68,7 @@ */ @Intrinsic @Uninterruptible - protected Object get(int index) { + public Object get(int index) { if (VM.VerifyAssertions && VM.runningVM) VM._assert(VM.NOT_REACHED); return data[index]; } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ITableArray.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ITableArray.java 2008-07-22 15:12:31 UTC (rev 14759) +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ITableArray.java 2008-07-22 15:17:36 UTC (rev 14760) @@ -22,7 +22,7 @@ * This class represents an instance of an array of interface tables. */ @NonMoving -public final class ITableArray { +public final class ITableArray implements RuntimeTable<ITable> { /** * The backing data used during boot image writing. @@ -39,7 +39,7 @@ /** * Return the backing array (for boot image writing) */ - public Object[] getBacking() { + public ITable[] getBacking() { if (VM.VerifyAssertions) VM._assert(!VM.runningVM); return backingData; } Added: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/RuntimeTable.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/RuntimeTable.java (rev 0) +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/RuntimeTable.java 2008-07-22 15:17:36 UTC (rev 14760) @@ -0,0 +1,60 @@ +/* + * This file is part of the Jikes RVM project (http://jikesrvm.org). + * + * This file is licensed to You under the Common Public License (CPL); + * You may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.opensource.org/licenses/cpl1.0.php + * + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. + */ +package org.jikesrvm.objectmodel; + +import org.vmmagic.Intrinsic; + +/** + * This interface is used to indicate a type will behave as a runtime table. + * Runtime tables are used to implement arrays whose elements can only be + * manipulated by the the get and set methods of the table. Every runtime table + * will have a static allocate method and implement the methods below. + * + * @see org.jikesrvm.classloader.TypeReference#isRuntimeTable() + */ +public interface RuntimeTable<T> { + /** + * Get a value from the table. This method is hijacked by the compiler but the + * implementation is used during boot image writing. + * + * @param index location to read + * @return value from table + */ + @Intrinsic + T get(int index); + /** + * Set a value to the table. This method is hijacked by the compiler but the + * implementation is used during boot image writing. + * + * @param index location to write + * @param value to write + */ + @Intrinsic + void set(int index, T value); + /** + * Get the table length. This method is hijacked by the compiler but the + * implementation is used during boot image writing. + * + * @return length of table + */ + @Intrinsic + int length(); + /** + * Only called at boot image write time. This returns the backing array to the + * boot image writer. + * + * @return backing array of elements + */ + @Intrinsic + T[] getBacking(); +} Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/TIB.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/TIB.java 2008-07-22 15:12:31 UTC (rev 14759) +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/TIB.java 2008-07-22 15:17:36 UTC (rev 14760) @@ -31,13 +31,13 @@ import org.vmmagic.unboxed.Word; /** - * This class represents an instance of a type information block. - * - * #see {@link TIBLayoutConstants} + * This class represents an instance of a type information block, at runtime it + * is an array with Object elements. + * @see TIBLayoutConstants */ @Uninterruptible @NonMoving -public final class TIB implements TIBLayoutConstants, SizeConstants { +public final class TIB implements RuntimeTable<Object>, TIBLayoutConstants, SizeConstants { /** * @return the number of words required to hold the lazy method invoker trampoline. */ @@ -140,7 +140,7 @@ */ @Intrinsic @UninterruptibleNoWarn // hijacked at runtime - protected void set(int index, Object value) { + public void set(int index, Object value) { if (VM.VerifyAssertions && VM.runningVM) VM._assert(VM.NOT_REACHED); data[index] = value; } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ProcessorTable.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ProcessorTable.java 2008-07-22 15:12:31 UTC (rev 14759) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ProcessorTable.java 2008-07-22 15:17:36 UTC (rev 14760) @@ -13,6 +13,7 @@ package org.jikesrvm.scheduler; import org.jikesrvm.VM; +import org.jikesrvm.objectmodel.RuntimeTable; import org.vmmagic.Intrinsic; import org.vmmagic.pragma.NonMoving; import org.vmmagic.pragma.Uninterruptible; @@ -22,7 +23,7 @@ * This class represents an instance of a table of processors */ @NonMoving -public final class ProcessorTable { +public final class ProcessorTable implements RuntimeTable<Processor> { /** * The backing data used during boot image writing. @@ -50,7 +51,7 @@ /** * Return the backing array (for boot image writing) */ - public Object[] getBacking() { + public Processor[] getBacking() { if (VM.VerifyAssertions) VM._assert(!VM.runningVM); return data; } Modified: rvmroot/trunk/tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImageWriter.java =================================================================== --- rvmroot/trunk/tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImageWriter.java 2008-07-22 15:12:31 UTC (rev 14759) +++ rvmroot/trunk/tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImageWriter.java 2008-07-22 15:17:36 UTC (rev 14760) @@ -38,15 +38,12 @@ import org.jikesrvm.compilers.common.CompiledMethods; import org.jikesrvm.objectmodel.ObjectModel; import org.jikesrvm.objectmodel.MiscHeader; +import org.jikesrvm.objectmodel.RuntimeTable; import org.jikesrvm.objectmodel.TIB; -import org.jikesrvm.objectmodel.ITableArray; -import org.jikesrvm.objectmodel.ITable; -import org.jikesrvm.objectmodel.IMT; import org.jikesrvm.runtime.Statics; import org.jikesrvm.runtime.BootRecord; import org.jikesrvm.runtime.Magic; import org.jikesrvm.runtime.Entrypoints; -import org.jikesrvm.scheduler.ProcessorTable; import org.jikesrvm.scheduler.RVMThread; import org.jikesrvm.scheduler.Scheduler; import org.jikesrvm.ArchitectureSpecific.CodeArray; @@ -235,17 +232,17 @@ public static Address bootImageRMapAddress = Address.zero(); public static Address getBootImageDataAddress() { - if (bootImageDataAddress.isZero()) VM.sysFail("BootImageWrite.getBootImageAddress called before boot image established"); + if (bootImageDataAddress.isZero()) fail("BootImageWrite.getBootImageAddress called before boot image established"); return bootImageDataAddress; } public static Address getBootImageCodeAddress() { - if (bootImageCodeAddress.isZero()) VM.sysFail("BootImageWrite.getBootImageAddress called before boot image established"); + if (bootImageCodeAddress.isZero()) fail("BootImageWrite.getBootImageAddress called before boot image established"); return bootImageCodeAddress; } public static Address getBootImageRMapAddress() { - if (bootImageRMapAddress.isZero()) VM.sysFail("BootImageWrite.getBootImageAddress called before boot image established"); + if (bootImageRMapAddress.isZero()) fail("BootImageWrite.getBootImageAddress called before boot image established"); return bootImageRMapAddress; } @@ -1491,9 +1488,9 @@ } else if (addr instanceof Offset) { value = ((Offset)addr).toWord(); } else { - VM.sysWriteln("Unhandled supposed address value: " + addr); - VM.sysWriteln(msg); - VM.sysFail("incomplete boot image support"); + say("Unhandled supposed address value: " + addr); + say(msg); + fail("incomplete boot image support"); } if (warn) check(value, msg); return value; @@ -1654,27 +1651,18 @@ } } } else { + // Handle the code array that is represented as either byte or int arrays + if (rvmType == RVMType.CodeArrayType) { + if (verbose >= 2) depth--; + CodeArray codeArray = (CodeArray) jdkObject; + Object backing = codeArray.getBacking(); + return copyMagicArrayToBootImage(backing, rvmType.asArray(), allocOnly, overwriteAddress, parentObject); + } + + // Handle tables of objects if (rvmType == RVMType.ObjectReferenceArrayType || rvmType.getTypeRef().isRuntimeTable()) { if (verbose >= 2) depth--; - Object backing; - if (rvmType == RVMType.ObjectReferenceArrayType) { - backing = ((ObjectReferenceArray)jdkObject).getBacking(); - } else if (rvmType == RVMType.TIBType) { - backing = ((TIB)jdkObject).getBacking(); - } else if (rvmType == RVMType.IMTType) { - backing = ((IMT)jdkObject).getBacking(); - } else if (rvmType == RVMType.ITableType) { - backing = ((ITable)jdkObject).getBacking(); - } else if (rvmType == RVMType.ITableArrayType) { - backing = ((ITableArray)jdkObject).getBacking(); - } else if (rvmType == RVMType.ProcessorTableType) { - backing = ((ProcessorTable)jdkObject).getBacking(); - } else if (rvmType == RVMType.FunctionTableType) { - backing = ((FunctionTable)jdkObject).getBacking(); - } else { - fail("unexpected runtime table type: " + rvmType); - backing = null; - } + Object backing = ((RuntimeTable)jdkObject).getBacking(); /* Copy the backing array, and then replace its TIB */ mapEntry.imageAddress = copyToBootImage(backing, allocOnly, overwriteAddress, jdkObject, rvmType.getTypeRef().isRuntimeTable()); @@ -1692,45 +1680,17 @@ return mapEntry.imageAddress; } - if (rvmType == RVMType.AddressArrayType) { + // Handle tables of unboxed types that in the boot image writer are modelled using objects + if (jdkObject instanceof RuntimeTable) { if (verbose >= 2) depth--; - AddressArray addrArray = (AddressArray) jdkObject; - Object backing = addrArray.getBacking(); + Object backing = ((RuntimeTable)jdkObject).getBacking(); return copyMagicArrayToBootImage(backing, rvmType.asArray(), allocOnly, overwriteAddress, parentObject); } - if (rvmType == RVMType.OffsetArrayType) { - if (verbose >= 2) depth--; - OffsetArray addrArray = (OffsetArray) jdkObject; - Object backing = addrArray.getBacking(); - return copyMagicArrayToBootImage(backing, rvmType.asArray(), allocOnly, overwriteAddress, parentObject); - } - - if (rvmType == RVMType.WordArrayType) { - if (verbose >= 2) depth--; - WordArray addrArray = (WordArray) jdkObject; - Object backing = addrArray.getBacking(); - return copyMagicArrayToBootImage(backing, rvmType.asArray(), allocOnly, overwriteAddress, parentObject); - } - - if (rvmType == RVMType.ExtentArrayType) { - if (verbose >= 2) depth--; - ExtentArray addrArray = (ExtentArray) jdkObject; - Object backing = addrArray.getBacking(); - return copyMagicArrayToBootImage(backing, rvmType.asArray(), allocOnly, overwriteAddress, parentObject); - } - - if (rvmType == RVMType.CodeArrayType) { - if (verbose >= 2) depth--; - CodeArray codeArray = (CodeArray) jdkObject; - Object backing = codeArray.getBacking(); - return copyMagicArrayToBootImage(backing, rvmType.asArray(), allocOnly, overwriteAddress, parentObject); - } - - if (rvmType.getTypeRef().isMagicType()) { - VM.sysWriteln("Unhandled copying of magic type: " + rvmType.getDescriptor().toString() + + if (rvmType.getTypeRef().isMagicType() || rvmType instanceof RVMArray) { + say("Unhandled copying of magic type: " + rvmType.getDescriptor().toString() + " in object of type " + parentObject.getClass().toString()); - VM.sysFail("incomplete boot image support"); + fail("incomplete boot image support"); } // Modified: rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/AddressArray.java =================================================================== --- rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/AddressArray.java 2008-07-22 15:12:31 UTC (rev 14759) +++ rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/AddressArray.java 2008-07-22 15:17:36 UTC (rev 14760) @@ -14,17 +14,17 @@ import org.vmmagic.pragma.*; import org.jikesrvm.VM; +import org.jikesrvm.objectmodel.RuntimeTable; /** * The VM front end is not capable of correct handling an array of Address, Word, .... - * For now, we provide special types to handle these situations. - * + * In the boot image writer we provide special types to handle these situations. */ +@Uninterruptible +public final class AddressArray implements RuntimeTable<Address> { -@Uninterruptible public final class AddressArray { + private final Address[] data; - private Address[] data; - @Interruptible public static AddressArray create(int size) { if (VM.runningVM) VM._assert(false); // should be hijacked @@ -58,7 +58,7 @@ } @Inline - public Object getBacking() { + public Address[] getBacking() { if (!VM.writingImage) VM.sysFail("AddressArray.getBacking called when not writing boot image"); return data; Modified: rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/ExtentArray.java =================================================================== --- rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/ExtentArray.java 2008-07-22 15:12:31 UTC (rev 14759) +++ rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/ExtentArray.java 2008-07-22 15:17:36 UTC (rev 14760) @@ -14,12 +14,13 @@ import org.vmmagic.pragma.*; import org.jikesrvm.VM; +import org.jikesrvm.objectmodel.RuntimeTable; /** * The VM front end is not capable of correct handling an array of Address, Word, .... - * For now, we provide special types to handle these situations. + * In the boot image writer we provide special types to handle these situations. */ -@Uninterruptible public final class ExtentArray { +@Uninterruptible public final class ExtentArray implements RuntimeTable<Extent> { private Extent[] data; @@ -56,7 +57,7 @@ } @Inline - public Object getBacking() { + public Extent[] getBacking() { if (!VM.writingImage) VM.sysFail("ExtentArray.getBacking called when not writing boot image"); return data; Modified: rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/ObjectReferenceArray.java =================================================================== --- rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/ObjectReferenceArray.java 2008-07-22 15:12:31 UTC (rev 14759) +++ rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/ObjectReferenceArray.java 2008-07-22 15:17:36 UTC (rev 14760) @@ -14,14 +14,16 @@ import org.vmmagic.pragma.*; import org.jikesrvm.VM; +import org.jikesrvm.objectmodel.RuntimeTable; /** * The VM front end is not capable of correct handling an array * of ObjectReferences ... */ -@Uninterruptible public final class ObjectReferenceArray { +@Uninterruptible +public final class ObjectReferenceArray implements RuntimeTable<ObjectReference> { - private ObjectReference[] data; + private final ObjectReference[] data; @Interruptible public static ObjectReferenceArray create(int size) { @@ -55,7 +57,7 @@ } @Inline - public Object getBacking() { + public ObjectReference[] getBacking() { if (!VM.writingImage) VM.sysFail("ObjectReferenceArray.getBacking called when not writing boot image"); return data; Modified: rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/OffsetArray.java =================================================================== --- rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/OffsetArray.java 2008-07-22 15:12:31 UTC (rev 14759) +++ rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/OffsetArray.java 2008-07-22 15:17:36 UTC (rev 14760) @@ -14,14 +14,16 @@ import org.vmmagic.pragma.*; import org.jikesrvm.VM; +import org.jikesrvm.objectmodel.RuntimeTable; /** * The VM front end is not capable of correct handling an array of Address, Word, .... - * For now, we provide special types to handle these situations. + * In the boot image writer we provide special types to handle these situations. */ -@Uninterruptible public final class OffsetArray { +@Uninterruptible +public final class OffsetArray implements RuntimeTable<Offset> { - private Offset[] data; + private final Offset[] data; @Interruptible public static OffsetArray create(int size) { @@ -56,7 +58,7 @@ } @Inline - public Object getBacking() { + public Offset[] getBacking() { if (!VM.writingImage) VM.sysFail("OffsetArray.getBacking called when not writing boot image"); return data; Modified: rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/WordArray.java =================================================================== --- rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/WordArray.java 2008-07-22 15:12:31 UTC (rev 14759) +++ rvmroot/trunk/tools/bootImageWriter/vmmagic/src/org/vmmagic/unboxed/WordArray.java 2008-07-22 15:17:36 UTC (rev 14760) @@ -14,14 +14,16 @@ import org.vmmagic.pragma.*; import org.jikesrvm.VM; +import org.jikesrvm.objectmodel.RuntimeTable; /** * The VM front end is not capable of correct handling an array of Address, Word, .... - * For now, we provide special types to handle these situations. + * In the boot image writer we provide special types to handle these situations. */ -@Uninterruptible public final class WordArray { +@Uninterruptible +public final class WordArray implements RuntimeTable<Word> { - private Word[] data; + private final Word[] data; @Interruptible public static WordArray create(int size) { @@ -74,7 +76,7 @@ } @Inline - public Object getBacking() { + public Word[] getBacking() { if (!VM.writingImage) VM.sysFail("WordArray.getBacking called when not writing boot image"); return data; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dgr...@us...> - 2008-07-23 18:23:19
|
Revision: 14775 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14775&view=rev Author: dgrove-oss Date: 2008-07-23 18:23:00 +0000 (Wed, 23 Jul 2008) Log Message: ----------- RVM-594 : WIP : rename org.jikesrvm.memorymanagers.mminterface to org.jikesrvm.mm.mminterface Modified Paths: -------------- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ActivePlan.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/BuildTimeConfig.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ObjectModel.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ReferenceProcessor.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanBootImage.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanStatics.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Statistics.java rvmroot/trunk/build/primordials/RVM.txt rvmroot/trunk/build.xml rvmroot/trunk/libraryInterface/Common/src/java/lang/VMCommonLibrarySupport.java rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/PhantomReference.java rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/Reference.java rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/SoftReference.java rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/WeakReference.java rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/VMRuntime.java rvmroot/trunk/libraryInterface/GNUClasspath/LGPL/src/gnu/java/nio/VMChannel.java rvmroot/trunk/libraryInterface/Harmony/ASF/src/java/lang/Runtime.java rvmroot/trunk/libraryInterface/Harmony/CPL/src/java/lang/JikesRVMSupport.java rvmroot/trunk/libraryInterface/Harmony/CPL/src/java/nio/JikesRVMSupport.java rvmroot/trunk/rvm/src/Dummy.java rvmroot/trunk/rvm/src/org/jikesrvm/CommandLineArgs.java rvmroot/trunk/rvm/src/org/jikesrvm/Services.java rvmroot/trunk/rvm/src/org/jikesrvm/VM.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/DynamicTypeCheck.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/InterfaceInvocation.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMArray.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMField.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMType.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/SpecializedMethodManager.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TableBasedDynamicLinker.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TypeReference.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineGCMapIterator.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineMagic.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineGCMapIterator.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/HardwareTrapGCMapIterator.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ConvertToLowLevelIR.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ExpandRuntimeServices.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/ir/operand/ObjectConstantOperand.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptGenericGCMapIterator.java rvmroot/trunk/rvm/src/org/jikesrvm/ia32/CodeArray.java rvmroot/trunk/rvm/src/org/jikesrvm/ia32/Registers.java rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIEnvironment.java rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIFunctions.java rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIGlobalRefTable.java rvmroot/trunk/rvm/src/org/jikesrvm/jni/ia32/JNIGCMapIterator.java rvmroot/trunk/rvm/src/org/jikesrvm/jni/ppc/JNIGCMapIterator.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeaderConstants.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/MiscHeader.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/MiscHeaderConstants.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java rvmroot/trunk/rvm/src/org/jikesrvm/osr/ObjectHolder.java rvmroot/trunk/rvm/src/org/jikesrvm/ppc/CodeArray.java rvmroot/trunk/rvm/src/org/jikesrvm/ppc/Registers.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/BootRecord.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Entrypoints.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Magic.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/StackTrace.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Statics.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/FinalizerThread.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Processor.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Scheduler.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenProcessor.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenScheduler.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenThread.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/nativethreads/NativeThread.java rvmroot/trunk/rvm/src/org/jikesrvm/tools/header_gen/GenerateInterfaceDeclarations.java rvmroot/trunk/rvm/src/org/jikesrvm/util/AbstractHashMapRVM.java rvmroot/trunk/rvm/src/org/jikesrvm/util/AbstractHashSetRVM.java rvmroot/trunk/rvm/src-generated/vm-configuration/Selected.template rvmroot/trunk/testing/tests/basic/src/test/org/jikesrvm/basic/core/annotation/TestAnnotations.java rvmroot/trunk/testing/tests/gctest/src/Exhaust.java rvmroot/trunk/tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImage.java Added Paths: ----------- rvmroot/trunk/rvm/src/org/jikesrvm/mm/ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Barrier.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/CollectorThread.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/ConcurrentCollectorThread.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/DebugUtil.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/GCMapIterator.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/GCMapIteratorGroup.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Handshake.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_Constants.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_Interface.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_ProcessorContext.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Monitor.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/SpecializedScanMethod.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/SynchronizationBarrier.java Removed Paths: ------------- rvmroot/trunk/rvm/src/org/jikesrvm/memorymanagers/ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Barrier.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/CollectorThread.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/ConcurrentCollectorThread.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/DebugUtil.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/GCMapIterator.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/GCMapIteratorGroup.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Handshake.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_Constants.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_Interface.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_ProcessorContext.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Monitor.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/SpecializedScanMethod.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/SynchronizationBarrier.java Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ActivePlan.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ActivePlan.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ActivePlan.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -18,7 +18,7 @@ import org.mmtk.plan.PlanConstraints; import org.mmtk.utility.Log; -import org.jikesrvm.memorymanagers.mminterface.Selected; +import org.jikesrvm.mm.mminterface.Selected; import org.vmmagic.pragma.*; Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/BuildTimeConfig.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/BuildTimeConfig.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/BuildTimeConfig.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -20,7 +20,7 @@ import java.util.Properties; import org.jikesrvm.VM; -import org.jikesrvm.memorymanagers.mminterface.Selected; +import org.jikesrvm.mm.mminterface.Selected; /** * Read build-time configuration information for MMTk from a Java properties Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -28,8 +28,8 @@ import org.jikesrvm.ArchitectureSpecific; import org.jikesrvm.classloader.Atom; import org.jikesrvm.classloader.RVMMethod; -import org.jikesrvm.memorymanagers.mminterface.CollectorThread; -import org.jikesrvm.memorymanagers.mminterface.Selected; +import org.jikesrvm.mm.mminterface.Selected; +import org.jikesrvm.mm.mminterface.CollectorThread; import org.vmmagic.unboxed.*; import org.vmmagic.pragma.*; @@ -63,7 +63,7 @@ */ @Interruptible public static void init() { - collectorThreadAtom = Atom.findOrCreateAsciiAtom("Lorg/jikesrvm/memorymanagers/mminterface/CollectorThread;"); + collectorThreadAtom = Atom.findOrCreateAsciiAtom("Lorg/jikesrvm/mm/mminterface/CollectorThread;"); runAtom = Atom.findOrCreateAsciiAtom("run"); } Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ObjectModel.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ObjectModel.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ObjectModel.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -21,9 +21,9 @@ import org.jikesrvm.classloader.RVMArray; import org.jikesrvm.classloader.RVMClass; import org.jikesrvm.classloader.RVMType; -import org.jikesrvm.memorymanagers.mminterface.DebugUtil; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; -import org.jikesrvm.memorymanagers.mminterface.Selected; +import org.jikesrvm.mm.mminterface.Selected; +import org.jikesrvm.mm.mminterface.DebugUtil; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.vmmagic.unboxed.*; import org.vmmagic.pragma.*; Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ReferenceProcessor.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ReferenceProcessor.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ReferenceProcessor.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -20,7 +20,7 @@ import org.vmmagic.unboxed.*; import org.jikesrvm.VM; -import org.jikesrvm.memorymanagers.mminterface.DebugUtil; +import org.jikesrvm.mm.mminterface.DebugUtil; import org.jikesrvm.runtime.Entrypoints; import org.jikesrvm.scheduler.Scheduler; Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanBootImage.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanBootImage.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanBootImage.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -19,7 +19,7 @@ import org.jikesrvm.runtime.BootRecord; import org.jikesrvm.runtime.Magic; import org.jikesrvm.scheduler.Scheduler; -import org.jikesrvm.memorymanagers.mminterface.CollectorThread; +import org.jikesrvm.mm.mminterface.CollectorThread; import org.vmmagic.unboxed.*; import org.vmmagic.pragma.*; Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanStatics.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanStatics.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanStatics.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -17,7 +17,7 @@ import org.jikesrvm.runtime.Statics; import org.jikesrvm.runtime.Magic; import org.jikesrvm.scheduler.Scheduler; -import org.jikesrvm.memorymanagers.mminterface.CollectorThread; +import org.jikesrvm.mm.mminterface.CollectorThread; import org.vmmagic.unboxed.*; import org.vmmagic.pragma.*; Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -18,11 +18,11 @@ import org.jikesrvm.classloader.RVMMethod; import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.compilers.common.CompiledMethods; -import org.jikesrvm.memorymanagers.mminterface.DebugUtil; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; -import org.jikesrvm.memorymanagers.mminterface.Selected; -import org.jikesrvm.memorymanagers.mminterface.GCMapIterator; -import org.jikesrvm.memorymanagers.mminterface.GCMapIteratorGroup; +import org.jikesrvm.mm.mminterface.Selected; +import org.jikesrvm.mm.mminterface.DebugUtil; +import org.jikesrvm.mm.mminterface.GCMapIterator; +import org.jikesrvm.mm.mminterface.GCMapIteratorGroup; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.runtime.Entrypoints; import org.jikesrvm.runtime.Magic; import org.jikesrvm.runtime.RuntimeEntrypoints; Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -18,10 +18,10 @@ import org.jikesrvm.jni.JNIEnvironment; import org.jikesrvm.jni.JNIGlobalRefTable; -import org.jikesrvm.memorymanagers.mminterface.MM_Constants; -import org.jikesrvm.memorymanagers.mminterface.Selected; -import org.jikesrvm.memorymanagers.mminterface.CollectorThread; -import org.jikesrvm.memorymanagers.mminterface.SpecializedScanMethod; +import org.jikesrvm.mm.mminterface.Selected; +import org.jikesrvm.mm.mminterface.CollectorThread; +import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.SpecializedScanMethod; import org.jikesrvm.VM; import org.jikesrvm.classloader.RVMClass; import org.jikesrvm.classloader.RVMType; Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Statistics.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Statistics.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Statistics.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -15,8 +15,9 @@ import org.mmtk.utility.Constants; import org.jikesrvm.runtime.Time; import static org.jikesrvm.runtime.SysCall.sysCall; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; + import org.vmmagic.pragma.*; @Uninterruptible public final class Statistics extends org.mmtk.vm.Statistics implements Constants { Modified: rvmroot/trunk/build/primordials/RVM.txt =================================================================== --- rvmroot/trunk/build/primordials/RVM.txt 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/build/primordials/RVM.txt 2008-07-23 18:23:00 UTC (rev 14775) @@ -60,10 +60,10 @@ [Lorg/jikesrvm/util/AbstractHashMapRVM$AbstractBucket; [Lorg/jikesrvm/util/AbstractHashSetRVM$AbstractBucket; -[Lorg/jikesrvm/memorymanagers/mminterface/CollectorThread; -[Lorg/jikesrvm/memorymanagers/mminterface/ConcurrentCollectorThread; -[Lorg/jikesrvm/memorymanagers/mminterface/Selected$Collector; -[Lorg/jikesrvm/memorymanagers/mminterface/Selected$Mutator; +[Lorg/jikesrvm/mm/mminterface/CollectorThread; +[Lorg/jikesrvm/mm/mminterface/ConcurrentCollectorThread; +[Lorg/jikesrvm/mm/mminterface/Selected$Collector; +[Lorg/jikesrvm/mm/mminterface/Selected$Mutator; [Lorg/jikesrvm/mm/mmtk/SynchronizedCounter; [Lorg/mmtk/utility/heap/FreeListPageResource; Modified: rvmroot/trunk/build.xml =================================================================== --- rvmroot/trunk/build.xml 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/build.xml 2008-07-23 18:23:00 UTC (rev 14775) @@ -825,7 +825,7 @@ <target name="gen-config-source" depends="check-properties,get-svn-version"> - <mkdir dir="${generated.config.java}/org/jikesrvm/memorymanagers/mminterface"/> + <mkdir dir="${generated.config.java}/org/jikesrvm/mm/mminterface"/> <condition property="pp_RVM_ARCH_HELPER" value="org.jikesrvm.ppc.MachineSpecificPowerPC.PPC${target.address.size}"> @@ -915,7 +915,7 @@ </copy> <copy file="${basedir}/rvm/src-generated/vm-configuration/Selected.template" - tofile="${generated.config.java}/org/jikesrvm/memorymanagers/mminterface/Selected.java"> + tofile="${generated.config.java}/org/jikesrvm/mm/mminterface/Selected.java"> <filterset> <filter token="_PLAN_" value="${config.mmtk.plan}"/> </filterset> Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/VMCommonLibrarySupport.java =================================================================== --- rvmroot/trunk/libraryInterface/Common/src/java/lang/VMCommonLibrarySupport.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/VMCommonLibrarySupport.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -20,7 +20,7 @@ import org.jikesrvm.classloader.RVMClass; import org.jikesrvm.classloader.RVMField; import org.jikesrvm.classloader.RVMMember; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.runtime.RuntimeEntrypoints; import org.jikesrvm.runtime.Entrypoints; import org.jikesrvm.scheduler.Synchronization; Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/PhantomReference.java =================================================================== --- rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/PhantomReference.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/PhantomReference.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -12,7 +12,7 @@ */ package java.lang.ref; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; /** * Implementation of java.lang.ref.PhantomReference for JikesRVM. Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/Reference.java =================================================================== --- rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/Reference.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/Reference.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -12,8 +12,8 @@ */ package java.lang.ref; -import org.jikesrvm.memorymanagers.mminterface.MM_Constants; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.runtime.Magic; import org.vmmagic.pragma.Inline; import org.vmmagic.pragma.LogicallyUninterruptible; Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/SoftReference.java =================================================================== --- rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/SoftReference.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/SoftReference.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -12,7 +12,7 @@ */ package java.lang.ref; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; /** * Implementation of java.lang.ref.SoftReference for JikesRVM. Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/WeakReference.java =================================================================== --- rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/WeakReference.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/WeakReference.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -12,7 +12,7 @@ */ package java.lang.ref; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; /** * Implementation of java.lang.ref.WeakReference for JikesRVM. Modified: rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/VMRuntime.java =================================================================== --- rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/VMRuntime.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/VMRuntime.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -18,7 +18,7 @@ import org.jikesrvm.runtime.DynamicLibrary; import org.jikesrvm.scheduler.greenthreads.VMProcess; import org.jikesrvm.scheduler.Scheduler; -import org.jikesrvm.memorymanagers.mminterface.*; +import org.jikesrvm.mm.mminterface.*; /** * Jikes RVM implementation of GNU Classpath's java.lang.VMRuntime. Modified: rvmroot/trunk/libraryInterface/GNUClasspath/LGPL/src/gnu/java/nio/VMChannel.java =================================================================== --- rvmroot/trunk/libraryInterface/GNUClasspath/LGPL/src/gnu/java/nio/VMChannel.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/libraryInterface/GNUClasspath/LGPL/src/gnu/java/nio/VMChannel.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -49,7 +49,7 @@ import java.nio.MappedByteBuffer; import org.jikesrvm.VM; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.scheduler.greenthreads.FileSystem; /** Modified: rvmroot/trunk/libraryInterface/Harmony/ASF/src/java/lang/Runtime.java =================================================================== --- rvmroot/trunk/libraryInterface/Harmony/ASF/src/java/lang/Runtime.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/libraryInterface/Harmony/ASF/src/java/lang/Runtime.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -29,7 +29,7 @@ import org.apache.harmony.kernel.vm.VM; import org.jikesrvm.classloader.RVMClass; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.runtime.DynamicLibrary; import org.jikesrvm.scheduler.Scheduler; import org.jikesrvm.scheduler.greenthreads.VMProcess; Modified: rvmroot/trunk/libraryInterface/Harmony/CPL/src/java/lang/JikesRVMSupport.java =================================================================== --- rvmroot/trunk/libraryInterface/Harmony/CPL/src/java/lang/JikesRVMSupport.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/libraryInterface/Harmony/CPL/src/java/lang/JikesRVMSupport.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -20,7 +20,6 @@ import org.vmmagic.pragma.*; -import org.jikesrvm.VM; // for VerifyAssertions and _assert() import org.jikesrvm.scheduler.RVMThread; /** Modified: rvmroot/trunk/libraryInterface/Harmony/CPL/src/java/nio/JikesRVMSupport.java =================================================================== --- rvmroot/trunk/libraryInterface/Harmony/CPL/src/java/nio/JikesRVMSupport.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/libraryInterface/Harmony/CPL/src/java/nio/JikesRVMSupport.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -27,9 +27,9 @@ throw new Error("TODO"); /* if (buffer instanceof DirectBuffer) { - return Address.fromLong(((DirectBuffer)buffer).getBaseAddress().toLong()); + return Address.fromLong(((DirectBuffer)buffer).getBaseAddress().toLong()); } else { - return Address.fromIntSignExtend(-1); + return Address.fromIntSignExtend(-1); } */ } Modified: rvmroot/trunk/rvm/src/Dummy.java =================================================================== --- rvmroot/trunk/rvm/src/Dummy.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/Dummy.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -31,7 +31,7 @@ static Reflection e; static VMProcess f; static org.vmmagic.pragma.SaveVolatile i; - static org.jikesrvm.memorymanagers.mminterface.MM_Interface l; + static org.jikesrvm.mm.mminterface.MM_Interface l; static RecompilationManager o; static org.jikesrvm.ArchitectureSpecific.MultianewarrayHelper r; static org.vmmagic.unboxed.Address s; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/CommandLineArgs.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/CommandLineArgs.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/CommandLineArgs.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -19,7 +19,8 @@ import org.jikesrvm.compilers.baseline.BaselineCompiler; import org.jikesrvm.compilers.baseline.BaselineOptions; import org.jikesrvm.compilers.common.RuntimeCompiler; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; + import static org.jikesrvm.runtime.SysCall.sysCall; import org.jikesrvm.scheduler.Scheduler; import org.jikesrvm.scheduler.greenthreads.GreenScheduler; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/Services.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/Services.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/Services.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -12,8 +12,8 @@ */ package org.jikesrvm; -import org.jikesrvm.memorymanagers.mminterface.MM_Constants; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.runtime.Entrypoints; import org.jikesrvm.runtime.Magic; import org.jikesrvm.scheduler.Synchronization; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/VM.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/VM.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/VM.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -28,7 +28,7 @@ import org.jikesrvm.compilers.baseline.EdgeCounts; import org.jikesrvm.compilers.common.BootImageCompiler; import org.jikesrvm.compilers.common.RuntimeCompiler; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.runtime.BootRecord; import org.jikesrvm.runtime.DynamicLibrary; import org.jikesrvm.runtime.Entrypoints; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/DynamicTypeCheck.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/DynamicTypeCheck.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/DynamicTypeCheck.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -13,7 +13,7 @@ package org.jikesrvm.classloader; import org.jikesrvm.VM; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.objectmodel.TIB; import org.jikesrvm.objectmodel.TIBLayoutConstants; import org.jikesrvm.runtime.Magic; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/InterfaceInvocation.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/InterfaceInvocation.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/InterfaceInvocation.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -16,7 +16,7 @@ import org.jikesrvm.ArchitectureSpecific.InterfaceMethodConflictResolver; import org.jikesrvm.VM; import org.jikesrvm.SizeConstants; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.objectmodel.IMT; import org.jikesrvm.objectmodel.ITable; import org.jikesrvm.objectmodel.ITableArray; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMArray.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMArray.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMArray.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -15,8 +15,8 @@ import org.jikesrvm.ArchitectureSpecific; import org.jikesrvm.VM; import org.jikesrvm.Constants; -import org.jikesrvm.memorymanagers.mminterface.MM_Constants; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.objectmodel.ObjectModel; import org.jikesrvm.objectmodel.TIB; import org.jikesrvm.runtime.Magic; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -21,7 +21,7 @@ import org.jikesrvm.Constants; import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.compilers.opt.inlining.ClassLoadingDependencyManager; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.objectmodel.FieldLayoutContext; import org.jikesrvm.objectmodel.IMT; import org.jikesrvm.objectmodel.ObjectModel; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMField.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMField.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMField.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -15,8 +15,8 @@ import java.io.DataInputStream; import java.io.IOException; import org.jikesrvm.VM; -import org.jikesrvm.memorymanagers.mminterface.MM_Constants; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.runtime.Magic; import org.jikesrvm.runtime.Statics; import org.vmmagic.pragma.Uninterruptible; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMType.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMType.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMType.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -16,7 +16,7 @@ import org.jikesrvm.Constants; import org.jikesrvm.SizeConstants; import org.jikesrvm.ArchitectureSpecific.CodeArray; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.objectmodel.TIB; import org.jikesrvm.runtime.Statics; import org.vmmagic.pragma.Entrypoint; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/SpecializedMethodManager.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/SpecializedMethodManager.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/SpecializedMethodManager.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -12,7 +12,7 @@ */ package org.jikesrvm.classloader; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.VM; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TableBasedDynamicLinker.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TableBasedDynamicLinker.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TableBasedDynamicLinker.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -14,7 +14,7 @@ import org.jikesrvm.VM; import org.jikesrvm.Constants; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.runtime.Magic; import org.jikesrvm.runtime.RuntimeEntrypoints; import org.vmmagic.pragma.Entrypoint; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TypeReference.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TypeReference.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TypeReference.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -172,7 +172,7 @@ public static final TypeReference JNIFunctions = findOrCreate(org.jikesrvm.jni.JNIFunctions.class); public static final TypeReference CollectorThread = - findOrCreate(org.jikesrvm.memorymanagers.mminterface.CollectorThread.class); + findOrCreate(org.jikesrvm.mm.mminterface.CollectorThread.class); public static final TypeReference RVMArray = findOrCreate(org.jikesrvm.classloader.RVMArray.class); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -39,8 +39,8 @@ import org.jikesrvm.ia32.BaselineConstants; import org.jikesrvm.ia32.ProcessorLocalState; import org.jikesrvm.jni.ia32.JNICompiler; -import org.jikesrvm.memorymanagers.mminterface.MM_Constants; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.objectmodel.ObjectModel; import org.jikesrvm.runtime.ArchEntrypoints; import org.jikesrvm.runtime.Entrypoints; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineGCMapIterator.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineGCMapIterator.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineGCMapIterator.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -21,7 +21,7 @@ import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.compilers.common.CompiledMethods; import org.jikesrvm.ia32.BaselineConstants; -import org.jikesrvm.memorymanagers.mminterface.GCMapIterator; +import org.jikesrvm.mm.mminterface.GCMapIterator; import org.jikesrvm.runtime.DynamicLink; import org.jikesrvm.runtime.Magic; import org.vmmagic.pragma.Uninterruptible; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineMagic.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineMagic.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineMagic.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -25,8 +25,8 @@ import org.jikesrvm.compilers.common.assembler.ForwardReference; import org.jikesrvm.ia32.RegisterConstants.GPR; import org.jikesrvm.jni.FunctionTable; -import org.jikesrvm.memorymanagers.mminterface.CollectorThread; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.CollectorThread; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.objectmodel.IMT; import org.jikesrvm.objectmodel.JavaHeader; import org.jikesrvm.objectmodel.ObjectModel; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -39,8 +39,8 @@ import org.jikesrvm.compilers.common.assembler.ppc.AssemblerConstants; import org.jikesrvm.jni.ppc.JNICompiler; import org.jikesrvm.jni.ppc.JNIStackframeLayoutConstants; -import org.jikesrvm.memorymanagers.mminterface.MM_Constants; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.objectmodel.ObjectModel; import org.jikesrvm.ppc.BaselineConstants; import org.jikesrvm.ppc.TrapConstants; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineGCMapIterator.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineGCMapIterator.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineGCMapIterator.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -20,7 +20,7 @@ import org.jikesrvm.compilers.baseline.ReferenceMaps; import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.compilers.common.CompiledMethods; -import org.jikesrvm.memorymanagers.mminterface.GCMapIterator; +import org.jikesrvm.mm.mminterface.GCMapIterator; import org.jikesrvm.ppc.BaselineConstants; import org.jikesrvm.runtime.DynamicLink; import org.jikesrvm.runtime.Magic; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/HardwareTrapGCMapIterator.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/HardwareTrapGCMapIterator.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/HardwareTrapGCMapIterator.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -14,7 +14,7 @@ import org.jikesrvm.ArchitectureSpecific; import org.jikesrvm.SizeConstants; -import org.jikesrvm.memorymanagers.mminterface.GCMapIterator; +import org.jikesrvm.mm.mminterface.GCMapIterator; import org.jikesrvm.runtime.Magic; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.unboxed.Address; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ConvertToLowLevelIR.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ConvertToLowLevelIR.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ConvertToLowLevelIR.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -141,7 +141,7 @@ import org.jikesrvm.compilers.opt.ir.operand.TrapCodeOperand; import org.jikesrvm.compilers.opt.ir.operand.TypeOperand; import org.jikesrvm.compilers.opt.specialization.SpecializedMethod; -import org.jikesrvm.memorymanagers.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MM_Constants; import org.jikesrvm.runtime.Entrypoints; import org.jikesrvm.runtime.Magic; import org.vmmagic.unboxed.Address; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ExpandRuntimeServices.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ExpandRuntimeServices.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ExpandRuntimeServices.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -70,8 +70,8 @@ import org.jikesrvm.compilers.opt.ir.operand.Operand; import org.jikesrvm.compilers.opt.ir.operand.RegisterOperand; import org.jikesrvm.compilers.opt.ir.operand.TypeOperand; -import org.jikesrvm.memorymanagers.mminterface.MM_Constants; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.objectmodel.ObjectModel; import org.jikesrvm.runtime.Entrypoints; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/ir/operand/ObjectConstantOperand.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/ir/operand/ObjectConstantOperand.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/ir/operand/ObjectConstantOperand.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -17,7 +17,7 @@ import org.jikesrvm.classloader.BootstrapClassLoader; import org.jikesrvm.classloader.TypeReference; import org.vmmagic.unboxed.Offset; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; /** * Represents a constant object operand (for example, from an Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptGenericGCMapIterator.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptGenericGCMapIterator.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptGenericGCMapIterator.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -18,8 +18,8 @@ import org.jikesrvm.ArchitectureSpecificOpt.OptGCMapIteratorConstants; import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.compilers.common.CompiledMethods; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; -import org.jikesrvm.memorymanagers.mminterface.GCMapIterator; +import org.jikesrvm.mm.mminterface.GCMapIterator; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.runtime.Magic; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.unboxed.Address; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/ia32/CodeArray.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/ia32/CodeArray.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/ia32/CodeArray.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -14,7 +14,7 @@ import org.jikesrvm.ArchitectureSpecific; import org.jikesrvm.VM; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.vmmagic.pragma.Uninterruptible; /** Modified: rvmroot/trunk/rvm/src/org/jikesrvm/ia32/Registers.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/ia32/Registers.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/ia32/Registers.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -14,7 +14,7 @@ import org.jikesrvm.runtime.ArchEntrypoints; import org.jikesrvm.runtime.Magic; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.vmmagic.pragma.NonMoving; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.pragma.Untraced; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIEnvironment.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIEnvironment.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIEnvironment.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -14,7 +14,7 @@ import org.jikesrvm.VM; import org.jikesrvm.SizeConstants; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.runtime.Magic; import org.jikesrvm.scheduler.Processor; import org.vmmagic.pragma.Entrypoint; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIFunctions.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIFunctions.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIFunctions.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -31,7 +31,7 @@ import org.jikesrvm.classloader.RVMType; import org.jikesrvm.classloader.TypeReference; import org.jikesrvm.classloader.UTF8Convert; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.jikesrvm.objectmodel.ObjectModel; import org.jikesrvm.runtime.BootRecord; import org.jikesrvm.runtime.Magic; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIGlobalRefTable.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIGlobalRefTable.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIGlobalRefTable.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -15,7 +15,7 @@ import java.lang.ref.WeakReference; import org.jikesrvm.VM; import org.jikesrvm.runtime.Magic; -import org.jikesrvm.memorymanagers.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MM_Interface; import org.vmmagic.pragma.Entrypoint; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.unboxed.ObjectReference; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/jni/ia32/JNIGCMapIterator.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/jni/ia32/JNIGCMapIterator.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/jni/ia32/JNIGCMapIterator.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -15,7 +15,7 @@ import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.ia32.BaselineConstants; import org.jikesrvm.jni.JNIEnvironment; -import org.jikesrvm.memorymanagers.mminterface.GCMapIterator; +import org.jikesrvm.mm.mminterface.GCMapIterator; import org.jikesrvm.runtime.Magic; import org.jikesrvm.scheduler.RVMThread; import org.vmmagic.pragma.Uninterruptible; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/jni/ppc/JNIGCMapIterator.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/jni/ppc/JNIGCMapIterator.java 2008-07-23 17:34:20 UTC (rev 14774) +++ rvmroot/trunk/rvm/src/org/jikesrvm/jni/ppc/JNIGCMapIterator.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -15,7 +15,7 @@ import org.jikesrvm.VM; import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.jni.JNIEnvironment; -import org.jikesrvm.memorymanagers.mminterface.GCMapIterator; +import org.jikesrvm.mm.mminterface.GCMapIterator; import org.jikesrvm.ppc.BaselineConstants; import org.jikesrvm.runtime.Magic; import org.jikesrvm.scheduler.RVMThread; Deleted: rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Barrier.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/memorymanagers/mminterface/Barrier.java 2008-07-23 13:09:33 UTC (rev 14770) +++ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Barrier.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -1,134 +0,0 @@ -/* - * This file is part of the Jikes RVM project (http://jikesrvm.org). - * - * This file is licensed to You under the Common Public License (CPL); - * You may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.opensource.org/licenses/cpl1.0.php - * - * See the COPYRIGHT.txt file distributed with this work for information - * regarding copyright ownership. - */ -package org.jikesrvm.memorymanagers.mminterface; - -import org.jikesrvm.VM; -import org.jikesrvm.mm.mmtk.SynchronizedCounter; -import org.jikesrvm.runtime.Magic; -import org.jikesrvm.runtime.Time; -import org.vmmagic.pragma.Uninterruptible; - -/** - * This class implements barrier synchronization. - * The mechanism handles proper resetting by usnig 3 underlying counters - * and supports unconditional blocking until the number of participants - * can be determined. - */ -@Uninterruptible -final class Barrier { - - public static final int VERBOSE = 0; - - // The value of target is one more than the number of threads we expect to arrive. - // It is one greater to allow safely updating the currentCounter value. - // If target is -1, no thread can proceed past the barrier. - // 3 counters are needed to support proper resetting without race conditions. - // - private volatile int target = -1; - private static final int NUM_COUNTERS = 3; - final SynchronizedCounter[] counters; - SynchronizedCounter currentCounter; - - // Debugging constants - private static final long WARN_PERIOD = Time.secsToNanos(20); // Print msg every WARN_PERIOD seconds - private static final long TIME_OUT = 3 * WARN_PERIOD; // Die after TIME_OUT seconds; - - public Barrier() { - counters = new SynchronizedCounter[NUM_COUNTERS]; - for (int i = 0; i < NUM_COUNTERS; i++) { - counters[i] = new SynchronizedCounter(); - } - currentCounter = new SynchronizedCounter(); - } - - // Set target to appropriate value - // - public void setTarget(int t) { - Magic.isync(); - if (VM.VerifyAssertions) VM._assert(t >= 0); - target = t + 1; - Magic.sync(); - } - - public void clearTarget() { - Magic.isync(); - target = -1; - Magic.sync(); - } - - // Returns whether caller was first to arrive. - // The coding to ensure resetting is delicate. - // - public int arrive(int where) { - Magic.isync(); - int cur = currentCounter.peek(); - SynchronizedCounter c = counters[cur]; - int myValue = c.increment(); - // Do NOT use the currentCounter variables unless designated thread - if (VERBOSE >= 1) { - VM.sysWriteln(where,": myValue = ",myValue); - } - if (VM.VerifyAssertions) VM._assert(myValue >= 0 && (target == -1 || myValue <= target)); - if (myValue + 2 == target) { - // last one to show up - int next = (cur + 1) % NUM_COUNTERS; - int prev = (cur - 1 + NUM_COUNTERS) % NUM_COUNTERS; - counters[prev].reset(); // everyone has seen the value so safe to reset now - if (next == 0) { - currentCounter.reset(); // everyone has arrived but still waiting - } else { - currentCounter.increment(); - } - c.increment(); // now safe to let others past barrier - Magic.sync(); - return myValue; - } else { - // everyone else - long startNano = 0; - long lastElapsedNano = 0; - while (true) { - long startCycles = Time.cycles(); - long endCycles = startCycles + ((long) 1e9); // a few hundred milliseconds more or less. - long nowCycles; - do { - if (target != -1 && c.peek() == target) { - Magic.sync(); - return myValue; - } - nowCycles = Time.cycles(); - } while (startCycles < nowCycles && nowCycles < endCycles); /* check against both ends to guard against CPU migration */ - - /* - * According to the cycle counter, we've been spinning for a while. - * Time to check nanoTime and see if we should print a warning and/or sysFail. - */ - if (startNano == 0) { - startNano = Time.nanoTime(); - } else { - long nowNano = Time.nanoTime(); - long elapsedNano = nowNano - startNano; - if (elapsedNano - lastElapsedNano > WARN_PERIOD) { - VM.sysWrite("GC Warning: Barrier wait has reached ",Time.nanosToSecs(elapsedNano), - " seconds. Called from "); - VM.sysWrite(where,". myOrder = ",myValue," count is "); - VM.sysWriteln(c.peek()," waiting for ",target - 1); - lastElapsedNano = elapsedNano; - } - if (elapsedNano > TIME_OUT) { - VM.sysFail("GC Error: Barrier Timeout"); - } - } - } - } - } -} Copied: rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Barrier.java (from rev 14773, rvmroot/trunk/rvm/src/org/jikesrvm/memorymanagers/mminterface/Barrier.java) =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Barrier.java (rev 0) +++ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Barrier.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -0,0 +1,134 @@ +/* + * This file is part of the Jikes RVM project (http://jikesrvm.org). + * + * This file is licensed to You under the Common Public License (CPL); + * You may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.opensource.org/licenses/cpl1.0.php + * + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. + */ +package org.jikesrvm.mm.mminterface; + +import org.jikesrvm.VM; +import org.jikesrvm.mm.mmtk.SynchronizedCounter; +import org.jikesrvm.runtime.Magic; +import org.jikesrvm.runtime.Time; +import org.vmmagic.pragma.Uninterruptible; + +/** + * This class implements barrier synchronization. + * The mechanism handles proper resetting by usnig 3 underlying counters + * and supports unconditional blocking until the number of participants + * can be determined. + */ +@Uninterruptible +final class Barrier { + + public static final int VERBOSE = 0; + + // The value of target is one more than the number of threads we expect to arrive. + // It is one greater to allow safely updating the currentCounter value. + // If target is -1, no thread can proceed past the barrier. + // 3 counters are needed to support proper resetting without race conditions. + // + private volatile int target = -1; + private static final int NUM_COUNTERS = 3; + final SynchronizedCounter[] counters; + SynchronizedCounter currentCounter; + + // Debugging constants + private static final long WARN_PERIOD = Time.secsToNanos(20); // Print msg every WARN_PERIOD seconds + private static final long TIME_OUT = 3 * WARN_PERIOD; // Die after TIME_OUT seconds; + + public Barrier() { + counters = new SynchronizedCounter[NUM_COUNTERS]; + for (int i = 0; i < NUM_COUNTERS; i++) { + counters[i] = new SynchronizedCounter(); + } + currentCounter = new SynchronizedCounter(); + } + + // Set target to appropriate value + // + public void setTarget(int t) { + Magic.isync(); + if (VM.VerifyAssertions) VM._assert(t >= 0); + target = t + 1; + Magic.sync(); + } + + public void clearTarget() { + Magic.isync(); + target = -1; + Magic.sync(); + } + + // Returns whether caller was first to arrive. + // The coding to ensure resetting is delicate. + // + public int arrive(int where) { + Magic.isync(); + int cur = currentCounter.peek(); + SynchronizedCounter c = counters[cur]; + int myValue = c.increment(); + // Do NOT use the currentCounter variables unless designated thread + if (VERBOSE >= 1) { + VM.sysWriteln(where,": myValue = ",myValue); + } + if (VM.VerifyAssertions) VM._assert(myValue >= 0 && (target == -1 || myValue <= target)); + if (myValue + 2 == target) { + // last one to show up + int next = (cur + 1) % NUM_COUNTERS; + int prev = (cur - 1 + NUM_COUNTERS) % NUM_COUNTERS; + counters[prev].reset(); // everyone has seen the value so safe to reset now + if (next == 0) { + currentCounter.reset(); // everyone has arrived but still waiting + } else { + currentCounter.increment(); + } + c.increment(); // now safe to let others past barrier + Magic.sync(); + return myValue; + } else { + // everyone else + long startNano = 0; + long lastElapsedNano = 0; + while (true) { + long startCycles = Time.cycles(); + long endCycles = startCycles + ((long) 1e9); // a few hundred milliseconds more or less. + long nowCycles; + do { + if (target != -1 && c.peek() == target) { + Magic.sync(); + return myValue; + } + nowCycles = Time.cycles(); + } while (startCycles < nowCycles && nowCycles < endCycles); /* check against both ends to guard against CPU migration */ + + /* + * According to the cycle counter, we've been spinning for a while. + * Time to check nanoTime and see if we should print a warning and/or sysFail. + */ + if (startNano == 0) { + startNano = Time.nanoTime(); + } else { + long nowNano = Time.nanoTime(); + long elapsedNano = nowNano - startNano; + if (elapsedNano - lastElapsedNano > WARN_PERIOD) { + VM.sysWrite("GC Warning: Barrier wait has reached ",Time.nanosToSecs(elapsedNano), + " seconds. Called from "); + VM.sysWrite(where,". myOrder = ",myValue," count is "); + VM.sysWriteln(c.peek()," waiting for ",target - 1); + lastElapsedNano = elapsedNano; + } + if (elapsedNano > TIME_OUT) { + VM.sysFail("GC Error: Barrier Timeout"); + } + } + } + } + } +} Deleted: rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/CollectorThread.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java 2008-07-23 13:09:33 UTC (rev 14770) +++ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/CollectorThread.java 2008-07-23 18:23:00 UTC (rev 14775) @@ -1,554 +0,0 @@ -/* - * This file is part of the Jikes RVM project (http://jikesrvm.org). - * - * This file is licensed to You under the Common Public License (CPL); - * You may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.opensource.org/licenses/cpl1.0.php - * - * See the COPYRIGHT.txt file distributed with this work for information - * regarding copyright ownership. - */ -package org.jikesrvm.memorymanagers.mminterface; - -import org.jikesrvm.ArchitectureSpecific; -import org.jikesrvm.VM; -import org.jikesrvm.compilers.common.CompiledMethods; -import org.jikesrvm.mm.mmtk.Collection; -import org.jikesrvm.mm.mmtk.ScanThread; -import org.jikesrvm.mm.mmtk.Scanning; -import org.jikesrvm.runtime.Magic; -import org.jikesrvm.runtime.Time; -import org.jikesrvm.scheduler.Scheduler; -import org.jikesrvm.scheduler.Synchronization; -import org.jikesrvm.scheduler.RVMThread; -import org.jikesrvm.scheduler.greenthreads.GreenProcessor; -import org.jikesrvm.scheduler.greenthreads.GreenScheduler; -import org.jikesrvm.scheduler.greenthreads.GreenThread; -import org.mmtk.plan.Plan; -import org.mmtk.utility.heap.HeapGrowthManager; -import org.mmtk.utility.options.Options; -import org.vmmagic.pragma.BaselineNoRegister... [truncated message content] |
From: <dgr...@us...> - 2008-07-23 19:14:51
|
Revision: 14777 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14777&view=rev Author: dgrove-oss Date: 2008-07-23 19:14:40 +0000 (Wed, 23 Jul 2008) Log Message: ----------- RVM-594 : WIP : rename org.jikesrvm.mm.mminterface.MM_Interface to MemoryManager Modified Paths: -------------- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ObjectModel.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Statistics.java rvmroot/trunk/libraryInterface/Common/src/java/lang/VMCommonLibrarySupport.java rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/PhantomReference.java rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/Reference.java rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/SoftReference.java rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/WeakReference.java rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/VMRuntime.java rvmroot/trunk/libraryInterface/GNUClasspath/LGPL/src/gnu/java/nio/VMChannel.java rvmroot/trunk/libraryInterface/Harmony/ASF/src/java/lang/Runtime.java rvmroot/trunk/rvm/src/Dummy.java rvmroot/trunk/rvm/src/org/jikesrvm/CommandLineArgs.java rvmroot/trunk/rvm/src/org/jikesrvm/Services.java rvmroot/trunk/rvm/src/org/jikesrvm/VM.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/DynamicTypeCheck.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/InterfaceInvocation.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMArray.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMField.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMType.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/SpecializedMethodManager.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TableBasedDynamicLinker.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineMagic.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/Barriers.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ExpandRuntimeServices.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/ir/operand/ObjectConstantOperand.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptGenericGCMapIterator.java rvmroot/trunk/rvm/src/org/jikesrvm/ia32/CodeArray.java rvmroot/trunk/rvm/src/org/jikesrvm/ia32/Registers.java rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIEnvironment.java rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIFunctions.java rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIGlobalRefTable.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/CollectorThread.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/ConcurrentCollectorThread.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/DebugUtil.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_Constants.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java rvmroot/trunk/rvm/src/org/jikesrvm/osr/ObjectHolder.java rvmroot/trunk/rvm/src/org/jikesrvm/ppc/CodeArray.java rvmroot/trunk/rvm/src/org/jikesrvm/ppc/MachineCode.java rvmroot/trunk/rvm/src/org/jikesrvm/ppc/Registers.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/BootRecord.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Entrypoints.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/StackTrace.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Statics.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/FinalizerThread.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Scheduler.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenProcessor.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenScheduler.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenThread.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/nativethreads/NativeThread.java rvmroot/trunk/rvm/src/org/jikesrvm/tools/header_gen/GenerateInterfaceDeclarations.java rvmroot/trunk/rvm/src/org/jikesrvm/util/AbstractHashMapRVM.java rvmroot/trunk/rvm/src/org/jikesrvm/util/AbstractHashSetRVM.java rvmroot/trunk/testing/tests/gctest/src/Exhaust.java rvmroot/trunk/tools/bootImageRunner/ia32/libvm.c rvmroot/trunk/tools/bootImageRunner/ppc/libvm.c rvmroot/trunk/tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImage.java Added Paths: ----------- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MemoryManager.java Removed Paths: ------------- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_Interface.java Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -59,7 +59,7 @@ * the boot image. Any objects referenced by those statics will be * transitively included in the boot image. * - * This is called from MM_Interface. + * This is called from MemoryManager. */ @Interruptible public static void init() { Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ObjectModel.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ObjectModel.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ObjectModel.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -23,7 +23,7 @@ import org.jikesrvm.classloader.RVMType; import org.jikesrvm.mm.mminterface.Selected; import org.jikesrvm.mm.mminterface.DebugUtil; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.vmmagic.unboxed.*; import org.vmmagic.pragma.*; @@ -62,7 +62,7 @@ int offset = org.jikesrvm.objectmodel.ObjectModel.getOffsetForAlignment(type, from); Selected.Collector plan = Selected.Collector.get(); allocator = plan.copyCheckAllocator(from, bytes, align, allocator); - Address region = MM_Interface.allocateSpace(plan, bytes, align, offset, + Address region = MemoryManager.allocateSpace(plan, bytes, align, offset, allocator, from); Object toObj = org.jikesrvm.objectmodel.ObjectModel.moveObject(region, from.toObject(), bytes, false, type); ObjectReference to = ObjectReference.fromObject(toObj); @@ -78,7 +78,7 @@ int offset = org.jikesrvm.objectmodel.ObjectModel.getOffsetForAlignment(type, from); Selected.Collector plan = Selected.Collector.get(); allocator = plan.copyCheckAllocator(from, bytes, align, allocator); - Address region = MM_Interface.allocateSpace(plan, bytes, align, offset, + Address region = MemoryManager.allocateSpace(plan, bytes, align, offset, allocator, from); Object toObj = org.jikesrvm.objectmodel.ObjectModel.moveObject(region, from.toObject(), bytes, false, type); ObjectReference to = ObjectReference.fromObject(toObj); Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -22,7 +22,7 @@ import org.jikesrvm.mm.mminterface.DebugUtil; import org.jikesrvm.mm.mminterface.GCMapIterator; import org.jikesrvm.mm.mminterface.GCMapIteratorGroup; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.Entrypoints; import org.jikesrvm.runtime.Magic; import org.jikesrvm.runtime.RuntimeEntrypoints; @@ -608,7 +608,7 @@ ObjectReference ref = refaddr.loadObjectReference(); VM.sysWrite(refaddr); if (verbosity >= 4) { - VM.sysWrite(":"); MM_Interface.dumpRef(ref); + VM.sysWrite(":"); MemoryManager.dumpRef(ref); } else VM.sysWriteln(); } @@ -623,11 +623,11 @@ */ private void checkReference(Address refaddr, int verbosity) { ObjectReference ref = refaddr.loadObjectReference(); - if (!MM_Interface.validRef(ref)) { + if (!MemoryManager.validRef(ref)) { Log.writeln(); Log.writeln("Invalid ref reported while scanning stack"); printMethodHeader(); - Log.write(refaddr); Log.write(":"); Log.flush(); MM_Interface.dumpRef(ref); + Log.write(refaddr); Log.write(":"); Log.flush(); MemoryManager.dumpRef(ref); dumpStackFrame(verbosity); Log.writeln(); Log.writeln("Dumping stack starting at frame with bad ref:"); @@ -650,10 +650,10 @@ */ static void checkReference(Address refaddr) { ObjectReference ref = refaddr.loadObjectReference(); - if (!MM_Interface.validRef(ref)) { + if (!MemoryManager.validRef(ref)) { Log.writeln(); Log.writeln("Invalid ref reported while scanning stack"); - Log.write(refaddr); Log.write(":"); Log.flush(); MM_Interface.dumpRef(ref); + Log.write(refaddr); Log.write(":"); Log.flush(); MemoryManager.dumpRef(ref); Log.writeln(); Log.writeln("Dumping stack:"); Scheduler.dumpStack(); @@ -733,8 +733,8 @@ Log.write(value); Log.write(" "); Log.flush(); - if (verbosity >= 3 && MM_Interface.objectInVM(value) && loc.NE(start) && loc.NE(end)) - MM_Interface.dumpRef(value); + if (verbosity >= 3 && MemoryManager.objectInVM(value) && loc.NE(start) && loc.NE(end)) + MemoryManager.dumpRef(value); else Log.writeln(); } Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Statistics.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Statistics.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Statistics.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -16,7 +16,7 @@ import org.jikesrvm.runtime.Time; import static org.jikesrvm.runtime.SysCall.sysCall; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.vmmagic.pragma.*; @@ -28,7 +28,7 @@ */ @Uninterruptible public int getCollectionCount() { - return MM_Interface.getCollectionCount(); + return MemoryManager.getCollectionCount(); } /** Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/VMCommonLibrarySupport.java =================================================================== --- rvmroot/trunk/libraryInterface/Common/src/java/lang/VMCommonLibrarySupport.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/VMCommonLibrarySupport.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -20,7 +20,7 @@ import org.jikesrvm.classloader.RVMClass; import org.jikesrvm.classloader.RVMField; import org.jikesrvm.classloader.RVMMember; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.RuntimeEntrypoints; import org.jikesrvm.runtime.Entrypoints; import org.jikesrvm.scheduler.Synchronization; @@ -79,7 +79,7 @@ GCLock() {} void gc() { if (Synchronization.testAndSet(this, gcLockOffset, 1)) { - MM_Interface.gc(); + MemoryManager.gc(); Synchronization.fetchAndStore(this, gcLockOffset, 0); } } Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/PhantomReference.java =================================================================== --- rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/PhantomReference.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/PhantomReference.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -12,7 +12,7 @@ */ package java.lang.ref; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; /** * Implementation of java.lang.ref.PhantomReference for JikesRVM. @@ -21,7 +21,7 @@ public PhantomReference(T referent, ReferenceQueue<T> q) { super(referent, q); - MM_Interface.addPhantomReference(this,referent); + MemoryManager.addPhantomReference(this,referent); } /** Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/Reference.java =================================================================== --- rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/Reference.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/Reference.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -13,7 +13,7 @@ package java.lang.ref; import org.jikesrvm.mm.mminterface.MM_Constants; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.Magic; import org.vmmagic.pragma.Inline; import org.vmmagic.pragma.LogicallyUninterruptible; @@ -89,7 +89,7 @@ Object ref = Magic.addressAsObject(tmp); if (MM_Constants.NEEDS_REFTYPE_READ_BARRIER) { - ref = MM_Interface.referenceTypeReadBarrier(ref); + ref = MemoryManager.referenceTypeReadBarrier(ref); } return ref; Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/SoftReference.java =================================================================== --- rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/SoftReference.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/SoftReference.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -12,7 +12,7 @@ */ package java.lang.ref; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; /** * Implementation of java.lang.ref.SoftReference for JikesRVM. @@ -21,11 +21,11 @@ public SoftReference(T referent) { super(referent); - MM_Interface.addSoftReference(this,referent); + MemoryManager.addSoftReference(this,referent); } public SoftReference(T referent, ReferenceQueue<T> q) { super(referent, q); - MM_Interface.addSoftReference(this, referent); + MemoryManager.addSoftReference(this, referent); } } Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/WeakReference.java =================================================================== --- rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/WeakReference.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/WeakReference.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -12,7 +12,7 @@ */ package java.lang.ref; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; /** * Implementation of java.lang.ref.WeakReference for JikesRVM. @@ -23,11 +23,11 @@ public WeakReference(T referent) { super(referent); - MM_Interface.addWeakReference(this,referent); + MemoryManager.addWeakReference(this,referent); } public WeakReference(T referent, ReferenceQueue<T> q) { super(referent, q); - MM_Interface.addWeakReference(this,referent); + MemoryManager.addWeakReference(this,referent); } } Modified: rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/VMRuntime.java =================================================================== --- rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/VMRuntime.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/VMRuntime.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -35,15 +35,15 @@ } static long freeMemory() { - return MM_Interface.freeMemory().toLong(); + return MemoryManager.freeMemory().toLong(); } static long totalMemory() { - return MM_Interface.totalMemory().toLong(); + return MemoryManager.totalMemory().toLong(); } static long maxMemory() { - return MM_Interface.maxMemory().toLong(); + return MemoryManager.maxMemory().toLong(); } static void gc() { Modified: rvmroot/trunk/libraryInterface/GNUClasspath/LGPL/src/gnu/java/nio/VMChannel.java =================================================================== --- rvmroot/trunk/libraryInterface/GNUClasspath/LGPL/src/gnu/java/nio/VMChannel.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/libraryInterface/GNUClasspath/LGPL/src/gnu/java/nio/VMChannel.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -49,7 +49,7 @@ import java.nio.MappedByteBuffer; import org.jikesrvm.VM; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.scheduler.greenthreads.FileSystem; /** @@ -254,7 +254,7 @@ * @throws IOException If an error occurs or dst is not a direct buffers. */ private int read(byte[] dst, int pos, int len) throws IOException { - if (MM_Interface.willNeverMove(dst)) { + if (MemoryManager.willNeverMove(dst)) { return read(nfd.getNativeFD(),dst,pos,len); } else { byte[] buffer; @@ -280,7 +280,7 @@ * @throws IOException */ private static int read(int fd, byte[] dst, int position, int len) throws IOException { - if (VM.VerifyAssertions) VM._assert(MM_Interface.willNeverMove(dst)); + if (VM.VerifyAssertions) VM._assert(MemoryManager.willNeverMove(dst)); int bytes = FileSystem.readBytes(fd,dst,position,len); if (bytes < 0) { throw new IOException("Error code "+Integer.toString(bytes)); @@ -389,13 +389,13 @@ * @throws IOException */ public int write(byte[] src, int pos, int len) throws IOException { - if (MM_Interface.willNeverMove(src)) { + if (MemoryManager.willNeverMove(src)) { return write(nfd.getNativeFD(), src, pos, len); } else { byte[] buffer; // Rebuffer the IO in a thread-local DirectBuffer buffer = localByteArray.get(len); - if (VM.VerifyAssertions) VM._assert(MM_Interface.willNeverMove(buffer)); + if (VM.VerifyAssertions) VM._assert(MemoryManager.willNeverMove(buffer)); System.arraycopy(src, pos, buffer,0,len); return write(nfd.getNativeFD(),buffer,0,len); } Modified: rvmroot/trunk/libraryInterface/Harmony/ASF/src/java/lang/Runtime.java =================================================================== --- rvmroot/trunk/libraryInterface/Harmony/ASF/src/java/lang/Runtime.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/libraryInterface/Harmony/ASF/src/java/lang/Runtime.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -29,7 +29,7 @@ import org.apache.harmony.kernel.vm.VM; import org.jikesrvm.classloader.RVMClass; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.DynamicLibrary; import org.jikesrvm.scheduler.Scheduler; import org.jikesrvm.scheduler.greenthreads.VMProcess; @@ -295,7 +295,7 @@ * */ public long freeMemory() { - return MM_Interface.freeMemory().toLong(); + return MemoryManager.freeMemory().toLong(); } /** @@ -470,7 +470,7 @@ * */ public long totalMemory() { - return MM_Interface.totalMemory().toLong(); + return MemoryManager.totalMemory().toLong(); } /** @@ -590,6 +590,6 @@ * Long.MAX_VALUE. */ public long maxMemory() { - return MM_Interface.maxMemory().toLong(); + return MemoryManager.maxMemory().toLong(); } } Modified: rvmroot/trunk/rvm/src/Dummy.java =================================================================== --- rvmroot/trunk/rvm/src/Dummy.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/Dummy.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -31,7 +31,7 @@ static Reflection e; static VMProcess f; static org.vmmagic.pragma.SaveVolatile i; - static org.jikesrvm.mm.mminterface.MM_Interface l; + static org.jikesrvm.mm.mminterface.MemoryManager l; static RecompilationManager o; static org.jikesrvm.ArchitectureSpecific.MultianewarrayHelper r; static org.vmmagic.unboxed.Address s; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/CommandLineArgs.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/CommandLineArgs.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/CommandLineArgs.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -19,7 +19,7 @@ import org.jikesrvm.compilers.baseline.BaselineCompiler; import org.jikesrvm.compilers.baseline.BaselineOptions; import org.jikesrvm.compilers.common.RuntimeCompiler; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import static org.jikesrvm.runtime.SysCall.sysCall; import org.jikesrvm.scheduler.Scheduler; @@ -524,10 +524,10 @@ // GC options // ------------------------------------------------------------------- case GC_HELP_ARG: // -X:gc passed 'help' as an option - MM_Interface.processCommandLineArg("help"); + MemoryManager.processCommandLineArg("help"); break; case GC_ARG: // "-X:gc:arg" pass 'arg' as an option - MM_Interface.processCommandLineArg(arg); + MemoryManager.processCommandLineArg(arg); break; // ---------------------------------------------------- Modified: rvmroot/trunk/rvm/src/org/jikesrvm/Services.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/Services.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/Services.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -13,7 +13,7 @@ package org.jikesrvm; import org.jikesrvm.mm.mminterface.MM_Constants; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.Entrypoints; import org.jikesrvm.runtime.Magic; import org.jikesrvm.scheduler.Synchronization; @@ -334,7 +334,7 @@ public static void setArrayUninterruptible(Object[] dst, int index, Object value) { if (VM.runningVM) { if (MM_Constants.NEEDS_WRITE_BARRIER) { - MM_Interface.arrayStoreWriteBarrier(dst, index, value); + MemoryManager.arrayStoreWriteBarrier(dst, index, value); } else { Magic.setObjectAtOffset(dst, Offset.fromIntZeroExtend(index << LOG_BYTES_IN_ADDRESS), value); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/VM.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/VM.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/VM.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -28,7 +28,7 @@ import org.jikesrvm.compilers.baseline.EdgeCounts; import org.jikesrvm.compilers.common.BootImageCompiler; import org.jikesrvm.compilers.common.RuntimeCompiler; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.BootRecord; import org.jikesrvm.runtime.DynamicLibrary; import org.jikesrvm.runtime.Entrypoints; @@ -183,7 +183,7 @@ VM.sysWriteln("Setting up memory manager: bootrecord = ", Magic.objectAsAddress(BootRecord.the_boot_record)); } - MM_Interface.boot(BootRecord.the_boot_record); + MemoryManager.boot(BootRecord.the_boot_record); // Reset the options for the baseline compiler to avoid carrying // them over from bootimage writing time. @@ -204,7 +204,7 @@ // Allow Memory Manager to respond to its command line arguments // if (verboseBoot >= 1) VM.sysWriteln("Collector processing rest of boot options"); - MM_Interface.postBoot(); + MemoryManager.postBoot(); // Initialize class loader. // @@ -403,7 +403,7 @@ // Inform interested subsystems that VM is fully booted. VM.fullyBooted = true; - MM_Interface.fullyBootedVM(); + MemoryManager.fullyBootedVM(); BaselineCompiler.fullyBootedVM(); runClassInitializer("java.util.logging.Level"); @@ -2348,7 +2348,7 @@ } RuntimeEntrypoints.init(); Scheduler.init(); - MM_Interface.init(); + MemoryManager.init(); } /** Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/DynamicTypeCheck.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/DynamicTypeCheck.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/DynamicTypeCheck.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -13,7 +13,7 @@ package org.jikesrvm.classloader; import org.jikesrvm.VM; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.TIB; import org.jikesrvm.objectmodel.TIBLayoutConstants; import org.jikesrvm.runtime.Magic; @@ -111,10 +111,10 @@ short[] tsi; if (t.isJavaLangObjectType()) { if (VM.VerifyAssertions) VM._assert(depth == 0); - tsi = MM_Interface.newNonMovingShortArray(1); + tsi = MemoryManager.newNonMovingShortArray(1); } else { int size = MIN_SUPERCLASS_IDS_SIZE <= depth ? depth + 1 : MIN_SUPERCLASS_IDS_SIZE; - tsi = MM_Interface.newNonMovingShortArray(size); + tsi = MemoryManager.newNonMovingShortArray(size); RVMType p; if (t.isArrayType() || t.asClass().isInterface()) { p = RVMType.JavaLangObjectType; @@ -147,7 +147,7 @@ int serialIdx = RVMType.JavaIoSerializableType.getDoesImplementIndex(); int size = Math.max(cloneIdx, serialIdx); size = Math.max(MIN_DOES_IMPLEMENT_SIZE, size + 1); - int[] tmp = MM_Interface.newNonMovingIntArray(size); + int[] tmp = MemoryManager.newNonMovingIntArray(size); tmp[cloneIdx] = RVMType.JavaLangCloneableType.getDoesImplementBitMask(); tmp[serialIdx] |= RVMType.JavaIoSerializableType.getDoesImplementBitMask(); arrayDoesImplement = tmp; @@ -164,7 +164,7 @@ static int[] buildDoesImplement(RVMClass t) { if (t.isJavaLangObjectType()) { // object implements no interfaces. - return MM_Interface.newNonMovingIntArray(MIN_DOES_IMPLEMENT_SIZE); + return MemoryManager.newNonMovingIntArray(MIN_DOES_IMPLEMENT_SIZE); } RVMClass[] superInterfaces = t.getDeclaredInterfaces(); @@ -186,7 +186,7 @@ } // then create and populate it - int[] mine = MM_Interface.newNonMovingIntArray(size); + int[] mine = MemoryManager.newNonMovingIntArray(size); if (t.isInterface()) { mine[t.getDoesImplementIndex()] = t.getDoesImplementBitMask(); } else { Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/InterfaceInvocation.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/InterfaceInvocation.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/InterfaceInvocation.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -16,7 +16,7 @@ import org.jikesrvm.ArchitectureSpecific.InterfaceMethodConflictResolver; import org.jikesrvm.VM; import org.jikesrvm.SizeConstants; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.IMT; import org.jikesrvm.objectmodel.ITable; import org.jikesrvm.objectmodel.ITableArray; @@ -216,7 +216,7 @@ */ private static void populateIMT(RVMClass klass, IMTDict d) { TIB tib = klass.getTypeInformationBlock(); - IMT IMT = MM_Interface.newIMT(); + IMT IMT = MemoryManager.newIMT(); klass.setIMT(IMT); d.populateIMT(klass, tib, IMT); tib.setImt(IMT); @@ -231,7 +231,7 @@ ITableArray iTables = tib.getITableArray(); if (iTables == null) { - iTables = MM_Interface.newITableArray(2); + iTables = MemoryManager.newITableArray(2); tib.setITableArray(iTables); } else { for(int i=0; i < iTables.length(); i++) { @@ -239,7 +239,7 @@ return; // some other thread just built the iTable } } - ITableArray tmp = MM_Interface.newITableArray(iTables.length() + 1); + ITableArray tmp = MemoryManager.newITableArray(iTables.length() + 1); for(int i=0; i < iTables.length(); i++) { tmp.set(i, iTables.get(i)); } @@ -260,7 +260,7 @@ private static ITable buildITable(RVMClass C, RVMClass I) { RVMMethod[] interfaceMethods = I.getDeclaredMethods(); TIB tib = C.getTypeInformationBlock(); - ITable iTable = MM_Interface.newITable(interfaceMethods.length + 1); + ITable iTable = MemoryManager.newITable(interfaceMethods.length + 1); iTable.set(0, I); for (RVMMethod im : interfaceMethods) { if (im.isClassInitializer()) continue; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMArray.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMArray.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMArray.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -16,7 +16,7 @@ import org.jikesrvm.VM; import org.jikesrvm.Constants; import org.jikesrvm.mm.mminterface.MM_Constants; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.ObjectModel; import org.jikesrvm.objectmodel.TIB; import org.jikesrvm.runtime.Magic; @@ -470,12 +470,12 @@ // virtual method fields and substituting an appropriate type field. // TIB javaLangObjectTIB = RVMType.JavaLangObjectType.getTypeInformationBlock(); - TIB allocatedTib = MM_Interface.newTIB(javaLangObjectTIB.numVirtualMethods()); + TIB allocatedTib = MemoryManager.newTIB(javaLangObjectTIB.numVirtualMethods()); superclassIds = DynamicTypeCheck.buildSuperclassIds(this); doesImplement = DynamicTypeCheck.buildDoesImplement(this); publishResolved(allocatedTib, superclassIds, doesImplement); - MM_Interface.notifyClassResolved(this); + MemoryManager.notifyClassResolved(this); } /** @@ -1010,7 +1010,7 @@ if (!MM_Constants.NEEDS_READ_BARRIER && ((src != dst) || loToHi)) { if (!MM_Constants.NEEDS_WRITE_BARRIER || - !MM_Interface.arrayCopyWriteBarrier(src, srcOffset, dst, dstOffset, bytes)) { + !MemoryManager.arrayCopyWriteBarrier(src, srcOffset, dst, dstOffset, bytes)) { Memory.alignedWordCopy(Magic.objectAsAddress(dst).plus(dstOffset), Magic.objectAsAddress(src).plus(srcOffset), bytes); @@ -1030,12 +1030,12 @@ while (len-- != 0) { Object value; if (MM_Constants.NEEDS_READ_BARRIER) { - value = MM_Interface.arrayLoadReadBarrier(src, srcOffset.toInt() >> LOG_BYTES_IN_ADDRESS); + value = MemoryManager.arrayLoadReadBarrier(src, srcOffset.toInt() >> LOG_BYTES_IN_ADDRESS); } else { value = Magic.getObjectAtOffset(src, srcOffset); } if (MM_Constants.NEEDS_WRITE_BARRIER) { - MM_Interface.arrayStoreWriteBarrier(dst, dstOffset.toInt() >> LOG_BYTES_IN_ADDRESS, value); + MemoryManager.arrayStoreWriteBarrier(dst, dstOffset.toInt() >> LOG_BYTES_IN_ADDRESS, value); } else { Magic.setObjectAtOffset(dst, dstOffset, value); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -21,7 +21,7 @@ import org.jikesrvm.Constants; import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.compilers.opt.inlining.ClassLoadingDependencyManager; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.FieldLayoutContext; import org.jikesrvm.objectmodel.IMT; import org.jikesrvm.objectmodel.ObjectModel; @@ -1773,9 +1773,9 @@ // record offsets of those instance fields that contain references // if (typeRef.isRuntimeTable()) { - referenceOffsets = MM_Interface.newNonMovingIntArray(0); + referenceOffsets = MemoryManager.newNonMovingIntArray(0); } else { - referenceOffsets = MM_Interface.newNonMovingIntArray(referenceFieldCount); + referenceOffsets = MemoryManager.newNonMovingIntArray(referenceFieldCount); for (int i = 0, j = 0, n = instanceFields.length; i < n; ++i) { RVMField field = instanceFields[i]; if (field.isTraced()) { @@ -1828,9 +1828,9 @@ // allocate "type information block" TIB allocatedTib; if (isInterface()) { - allocatedTib = MM_Interface.newTIB(0); + allocatedTib = MemoryManager.newTIB(0); } else { - allocatedTib = MM_Interface.newTIB(virtualMethods.length); + allocatedTib = MemoryManager.newTIB(virtualMethods.length); } superclassIds = DynamicTypeCheck.buildSuperclassIds(this); @@ -1845,7 +1845,7 @@ } Callbacks.notifyClassResolved(this); - MM_Interface.notifyClassResolved(this); + MemoryManager.notifyClassResolved(this); // check for a "finalize" method that overrides the one in java.lang.Object // @@ -2015,7 +2015,7 @@ public synchronized void makeFieldTraced(RVMField field) { int[] oldOffsets = referenceOffsets; int fieldOffset = field.getOffset().toInt(); - referenceOffsets = MM_Interface.newNonMovingIntArray(oldOffsets.length + 1); + referenceOffsets = MemoryManager.newNonMovingIntArray(oldOffsets.length + 1); int i; for(i=0; i < oldOffsets.length && oldOffsets[i] < fieldOffset; i++) { referenceOffsets[i] = oldOffsets[i]; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMField.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMField.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMField.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -16,7 +16,7 @@ import java.io.IOException; import org.jikesrvm.VM; import org.jikesrvm.mm.mminterface.MM_Constants; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.Magic; import org.jikesrvm.runtime.Statics; import org.vmmagic.pragma.Uninterruptible; @@ -296,13 +296,13 @@ public Object getObjectValueUnchecked(Object obj) { if (isStatic()) { if (MM_Constants.NEEDS_GETSTATIC_READ_BARRIER && !isUntraced()) { - return MM_Interface.getstaticReadBarrier(getOffset(), getId()); + return MemoryManager.getstaticReadBarrier(getOffset(), getId()); } else { return Statics.getSlotContentsAsObject(getOffset()); } } else { if (MM_Constants.NEEDS_READ_BARRIER && !isUntraced()) { - return MM_Interface.getfieldReadBarrier(obj, getOffset(), getId()); + return MemoryManager.getfieldReadBarrier(obj, getOffset(), getId()); } else { return Magic.getObjectAtOffset(obj, getOffset()); } @@ -391,13 +391,13 @@ public void setObjectValueUnchecked(Object obj, Object ref) { if (isStatic()) { if (MM_Constants.NEEDS_PUTSTATIC_WRITE_BARRIER && !isUntraced()) { - MM_Interface.putstaticWriteBarrier(getOffset(), ref, getId()); + MemoryManager.putstaticWriteBarrier(getOffset(), ref, getId()); } else { Statics.setSlotContents(getOffset(), ref); } } else { if (MM_Constants.NEEDS_WRITE_BARRIER && !isUntraced()) { - MM_Interface.putfieldWriteBarrier(obj, getOffset(), ref, getId()); + MemoryManager.putfieldWriteBarrier(obj, getOffset(), ref, getId()); } else { Magic.setObjectAtOffset(obj, getOffset(), ref); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMType.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMType.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMType.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -16,7 +16,7 @@ import org.jikesrvm.Constants; import org.jikesrvm.SizeConstants; import org.jikesrvm.ArchitectureSpecific.CodeArray; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.TIB; import org.jikesrvm.runtime.Statics; import org.vmmagic.pragma.Entrypoint; @@ -237,7 +237,7 @@ this.dimension = dimension; /* install partial type information block (no method dispatch table) for use in type checking. */ - TIB tib = MM_Interface.newTIB(0); + TIB tib = MemoryManager.newTIB(0); tib.setType(this); Statics.setSlotContents(getTibOffset(), tib); } @@ -257,7 +257,7 @@ this.dimension = dimension; /* install partial type information block (no method dispatch table) for use in type checking. */ - TIB tib = MM_Interface.newTIB(0); + TIB tib = MemoryManager.newTIB(0); tib.setType(this); Statics.setSlotContents(getTibOffset(), tib); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/SpecializedMethodManager.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/SpecializedMethodManager.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/SpecializedMethodManager.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -12,7 +12,7 @@ */ package org.jikesrvm.classloader; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.VM; @@ -21,7 +21,7 @@ */ public final class SpecializedMethodManager { /** The number of specialized methods. Currently the MM is the only consumer. */ - private static final int numSpecializedMethods = MM_Interface.numSpecializedMethods(); + private static final int numSpecializedMethods = MemoryManager.numSpecializedMethods(); /** All the specialized methods */ private static final SpecializedMethod[] methods = new SpecializedMethod[numSpecializedMethods]; @@ -52,7 +52,7 @@ if (VM.VerifyAssertions) VM._assert(id >= 0); if (VM.VerifyAssertions) VM._assert(id < numSpecializedMethods); if (VM.VerifyAssertions) VM._assert(methods[id] == null); - methods[id] = MM_Interface.createSpecializedMethod(id); + methods[id] = MemoryManager.createSpecializedMethod(id); } /** Can not create an instance of the manager */ Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TableBasedDynamicLinker.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TableBasedDynamicLinker.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TableBasedDynamicLinker.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -14,7 +14,7 @@ import org.jikesrvm.VM; import org.jikesrvm.Constants; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.Magic; import org.jikesrvm.runtime.RuntimeEntrypoints; import org.vmmagic.pragma.Entrypoint; @@ -43,7 +43,7 @@ private static int[] memberOffsets; static { - memberOffsets = MM_Interface.newContiguousIntArray(32000); + memberOffsets = MemoryManager.newContiguousIntArray(32000); if (NEEDS_DYNAMIC_LINK != 0) { java.util.Arrays.fill(memberOffsets, NEEDS_DYNAMIC_LINK); } @@ -84,7 +84,7 @@ static synchronized void ensureCapacity(int id) { if (id >= memberOffsets.length) { int oldLen = memberOffsets.length; - int[] tmp1 = MM_Interface.newContiguousIntArray((oldLen * 3) / 2); + int[] tmp1 = MemoryManager.newContiguousIntArray((oldLen * 3) / 2); System.arraycopy(memberOffsets, 0, tmp1, 0, oldLen); if (NEEDS_DYNAMIC_LINK != 0) { java.util.Arrays.fill(tmp1, oldLen, tmp1.length, NEEDS_DYNAMIC_LINK); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -40,7 +40,7 @@ import org.jikesrvm.ia32.ProcessorLocalState; import org.jikesrvm.jni.ia32.JNICompiler; import org.jikesrvm.mm.mminterface.MM_Constants; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.ObjectModel; import org.jikesrvm.runtime.ArchEntrypoints; import org.jikesrvm.runtime.Entrypoints; @@ -2926,10 +2926,10 @@ protected final void emit_resolved_new(RVMClass typeRef) { int instanceSize = typeRef.getInstanceSize(); Offset tibOffset = typeRef.getTibOffset(); - int whichAllocator = MM_Interface.pickAllocator(typeRef, method); + int whichAllocator = MemoryManager.pickAllocator(typeRef, method); int align = ObjectModel.getAlignment(typeRef, false); int offset = ObjectModel.getOffsetForAlignment(typeRef, false); - int site = MM_Interface.getAllocationSite(true); + int site = MemoryManager.getAllocationSite(true); asm.emitPUSH_Imm(instanceSize); asm.emitPUSH_Abs(Magic.getTocPointer().plus(tibOffset)); // put tib on stack asm.emitPUSH_Imm(typeRef.hasFinalizer() ? 1 : 0); // does the class have a finalizer? @@ -2948,7 +2948,7 @@ */ @Override protected final void emit_unresolved_new(TypeReference typeRef) { - int site = MM_Interface.getAllocationSite(true); + int site = MemoryManager.getAllocationSite(true); asm.emitPUSH_Imm(typeRef.getId()); asm.emitPUSH_Imm(site); // site genParameterRegisterLoad(asm, 2); // pass 2 parameter words @@ -2965,8 +2965,8 @@ int width = array.getLogElementSize(); Offset tibOffset = array.getTibOffset(); int headerSize = ObjectModel.computeHeaderSize(array); - int whichAllocator = MM_Interface.pickAllocator(array, method); - int site = MM_Interface.getAllocationSite(true); + int whichAllocator = MemoryManager.pickAllocator(array, method); + int site = MemoryManager.getAllocationSite(true); int align = ObjectModel.getAlignment(array); int offset = ObjectModel.getOffsetForAlignment(array, false); // count is already on stack- nothing required @@ -2988,7 +2988,7 @@ */ @Override protected final void emit_unresolved_newarray(TypeReference tRef) { - int site = MM_Interface.getAllocationSite(true); + int site = MemoryManager.getAllocationSite(true); // count is already on stack- nothing required asm.emitPUSH_Imm(tRef.getId()); asm.emitPUSH_Imm(site); // site Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineMagic.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineMagic.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineMagic.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -26,7 +26,7 @@ import org.jikesrvm.ia32.RegisterConstants.GPR; import org.jikesrvm.jni.FunctionTable; import org.jikesrvm.mm.mminterface.CollectorThread; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.IMT; import org.jikesrvm.objectmodel.JavaHeader; import org.jikesrvm.objectmodel.ObjectModel; @@ -142,7 +142,7 @@ private static void check(ObjectReference value) { if (!inCheck) { inCheck = true; - if (!MM_Interface.validRef(value) && FAIL_ON_BAD_REFERENCES) { + if (!MemoryManager.validRef(value) && FAIL_ON_BAD_REFERENCES) { VM.sysFail("Bad object reference encountered"); } inCheck = false; @@ -1579,8 +1579,8 @@ int width = array.getLogElementSize(); Offset tibOffset = array.getTibOffset(); int headerSize = ObjectModel.computeHeaderSize(array); - int whichAllocator = MM_Interface.pickAllocator(array, cm); - int site = MM_Interface.getAllocationSite(true); + int whichAllocator = MemoryManager.pickAllocator(array, cm); + int site = MemoryManager.getAllocationSite(true); int align = ObjectModel.getAlignment(array); int offset = ObjectModel.getOffsetForAlignment(array, false); // count is already on stack- nothing required Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/Barriers.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/Barriers.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/Barriers.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -29,7 +29,7 @@ Assembler asm = comp.asm; asm.emitLAddrToc(S0, Entrypoints.arrayStoreWriteBarrierMethod.getOffset()); asm.emitMTCTR(S0); - asm.emitBCCTRL(); // MM_Interface.arrayStoreWriteBarrier(Object ref, int index, Object value) + asm.emitBCCTRL(); // MemoryManager.arrayStoreWriteBarrier(Object ref, int index, Object value) } // on entry java stack contains ...|target_ref|ref_to_store| @@ -42,7 +42,7 @@ asm.emitNullCheck(T0); comp.peekAddr(T2, 0); // value to store asm.emitLVAL(T3, locationMetadata); - asm.emitBCCTRL(); // MM_Interface.putfieldWriteBarrier(T0,T1,T2,T3) + asm.emitBCCTRL(); // MemoryManager.putfieldWriteBarrier(T0,T1,T2,T3) } // on entry java stack contains ...|target_ref|ref_to_store| @@ -55,7 +55,7 @@ asm.emitLVALAddr(T1, fieldOffset); // offset comp.peekAddr(T2, 0); // value to store asm.emitLVAL(T3, locationMetadata); - asm.emitBCCTRL(); // MM_Interface.putfieldWriteBarrier(T0,T1,T2,T3) + asm.emitBCCTRL(); // MemoryManager.putfieldWriteBarrier(T0,T1,T2,T3) } // on entry java stack contains ...|ref_to_store| @@ -66,7 +66,7 @@ asm.emitMTCTR(S0); comp.peekAddr(T1, 0); // value to store asm.emitLVAL(T2, locationMetadata); - asm.emitBCCTRL(); // MM_Interface.putstaticWriteBarrier(T0,T1) + asm.emitBCCTRL(); // MemoryManager.putstaticWriteBarrier(T0,T1) } // on entry java stack contains ...|ref_to_store| @@ -77,7 +77,7 @@ asm.emitLVALAddr(T0, fieldOffset); // offset comp.peekAddr(T1, 0); // value to store asm.emitLVAL(T2, locationMetadata); - asm.emitBCCTRL(); // MM_Interface.putstaticWriteBarrier(T0,T1) + asm.emitBCCTRL(); // MemoryManager.putstaticWriteBarrier(T0,T1) } // on entry T0, T1 already contain the appropriate values @@ -85,7 +85,7 @@ Assembler asm = comp.asm; asm.emitLAddrToc(S0, Entrypoints.arrayLoadReadBarrierMethod.getOffset()); asm.emitMTCTR(S0); - asm.emitBCCTRL(); // MM_Interface.arrayLoadReadBarrier(T0,T1) + asm.emitBCCTRL(); // MemoryManager.arrayLoadReadBarrier(T0,T1) } // on entry java stack contains ...|source_ref| @@ -97,7 +97,7 @@ comp.peekAddr(T0, 0); // object base asm.emitNullCheck(T0); asm.emitLVAL(T2, locationMetadata); - asm.emitBCCTRL(); // MM_Interface.getfieldReadBarrier(T0,T1,T2) + asm.emitBCCTRL(); // MemoryManager.getfieldReadBarrier(T0,T1,T2) } // on entry java stack contains ...|source_ref| @@ -109,7 +109,7 @@ asm.emitNullCheck(T0); asm.emitLVALAddr(T1, fieldOffset); // offset asm.emitLVAL(T2, locationMetadata); - asm.emitBCCTRL(); // MM_Interface.getfieldReadBarrier(T0,T1,T2) + asm.emitBCCTRL(); // MemoryManager.getfieldReadBarrier(T0,T1,T2) } // on entry java stack contains ...| @@ -119,7 +119,7 @@ asm.emitLAddrToc(S0, Entrypoints.getstaticReadBarrierMethod.getOffset()); asm.emitMTCTR(S0); asm.emitLVAL(T1, locationMetadata); - asm.emitBCCTRL(); // MM_Interface.getstaticReadBarrier(T0,T1) + asm.emitBCCTRL(); // MemoryManager.getstaticReadBarrier(T0,T1) } // on entry java stack contains ...| @@ -129,6 +129,6 @@ asm.emitMTCTR(S0); asm.emitLVALAddr(T0, fieldOffset); // offset asm.emitLVAL(T1, locationMetadata); - asm.emitBCCTRL(); // MM_Interface.getstaticReadBarrier(T0,T1) + asm.emitBCCTRL(); // MemoryManager.getstaticReadBarrier(T0,T1) } } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -40,7 +40,7 @@ import org.jikesrvm.jni.ppc.JNICompiler; import org.jikesrvm.jni.ppc.JNIStackframeLayoutConstants; import org.jikesrvm.mm.mminterface.MM_Constants; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.ObjectModel; import org.jikesrvm.ppc.BaselineConstants; import org.jikesrvm.ppc.TrapConstants; @@ -2968,10 +2968,10 @@ protected final void emit_resolved_new(RVMClass typeRef) { int instanceSize = typeRef.getInstanceSize(); Offset tibOffset = typeRef.getTibOffset(); - int whichAllocator = MM_Interface.pickAllocator(typeRef, method); + int whichAllocator = MemoryManager.pickAllocator(typeRef, method); int align = ObjectModel.getAlignment(typeRef); int offset = ObjectModel.getOffsetForAlignment(typeRef, false); - int site = MM_Interface.getAllocationSite(true); + int site = MemoryManager.getAllocationSite(true); asm.emitLAddrToc(T0, Entrypoints.resolvedNewScalarMethod.getOffset()); asm.emitMTCTR(T0); asm.emitLVAL(T0, instanceSize); @@ -2990,7 +2990,7 @@ * @param typeRef the type reference to dynamically link & instantiate */ protected final void emit_unresolved_new(TypeReference typeRef) { - int site = MM_Interface.getAllocationSite(true); + int site = MemoryManager.getAllocationSite(true); asm.emitLAddrToc(T0, Entrypoints.unresolvedNewScalarMethod.getOffset()); asm.emitMTCTR(T0); asm.emitLVAL(T0, typeRef.getId()); @@ -3007,8 +3007,8 @@ int width = array.getLogElementSize(); Offset tibOffset = array.getTibOffset(); int headerSize = ObjectModel.computeArrayHeaderSize(array); - int whichAllocator = MM_Interface.pickAllocator(array, method); - int site = MM_Interface.getAllocationSite(true); + int whichAllocator = MemoryManager.pickAllocator(array, method); + int site = MemoryManager.getAllocationSite(true); int align = ObjectModel.getAlignment(array); int offset = ObjectModel.getOffsetForAlignment(array, false); asm.emitLAddrToc(T0, Entrypoints.resolvedNewArrayMethod.getOffset()); @@ -3030,7 +3030,7 @@ * @param typeRef the type reference to dynamically link & instantiate */ protected final void emit_unresolved_newarray(TypeReference typeRef) { - int site = MM_Interface.getAllocationSite(true); + int site = MemoryManager.getAllocationSite(true); asm.emitLAddrToc(T0, Entrypoints.unresolvedNewArrayMethod.getOffset()); asm.emitMTCTR(T0); peekInt(T0, 0); // T0 := number of elements Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ExpandRuntimeServices.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ExpandRuntimeServices.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ExpandRuntimeServices.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -71,7 +71,7 @@ import org.jikesrvm.compilers.opt.ir.operand.RegisterOperand; import org.jikesrvm.compilers.opt.ir.operand.TypeOperand; import org.jikesrvm.mm.mminterface.MM_Constants; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.ObjectModel; import org.jikesrvm.runtime.Entrypoints; @@ -138,7 +138,7 @@ RVMClass cls = (RVMClass) Type.getVMType(); IntConstantOperand hasFinalizer = IRTools.IC(cls.hasFinalizer() ? 1 : 0); RVMMethod callSite = inst.position.getMethod(); - IntConstantOperand allocator = IRTools.IC(MM_Interface.pickAllocator(cls, callSite)); + IntConstantOperand allocator = IRTools.IC(MemoryManager.pickAllocator(cls, callSite)); IntConstantOperand align = IRTools.IC(ObjectModel.getAlignment(cls)); IntConstantOperand offset = IRTools.IC(ObjectModel.getOffsetForAlignment(cls, false)); Operand tib = ConvertToLowLevelIR.getTIB(inst, ir, Type); @@ -148,7 +148,7 @@ inst.insertBefore(Move.create(REF_MOVE, tmp, tib)); tib = tmp.copyRO(); } - IntConstantOperand site = IRTools.IC(MM_Interface.getAllocationSite(true)); + IntConstantOperand site = IRTools.IC(MemoryManager.getAllocationSite(true)); RVMMethod target = Entrypoints.resolvedNewScalarMethod; Call.mutate7(inst, CALL, @@ -176,7 +176,7 @@ case NEW_UNRESOLVED_opcode: { int typeRefId = New.getType(inst).getTypeRef().getId(); RVMMethod target = Entrypoints.unresolvedNewScalarMethod; - IntConstantOperand site = IRTools.IC(MM_Interface.getAllocationSite(true)); + IntConstantOperand site = IRTools.IC(MemoryManager.getAllocationSite(true)); Call.mutate2(inst, CALL, New.getClearResult(inst), @@ -195,7 +195,7 @@ Operand width = IRTools.IC(array.getLogElementSize()); Operand headerSize = IRTools.IC(ObjectModel.computeArrayHeaderSize(array)); RVMMethod callSite = inst.position.getMethod(); - IntConstantOperand allocator = IRTools.IC(MM_Interface.pickAllocator(array, callSite)); + IntConstantOperand allocator = IRTools.IC(MemoryManager.pickAllocator(array, callSite)); IntConstantOperand align = IRTools.IC(ObjectModel.getAlignment(array)); IntConstantOperand offset = IRTools.IC(ObjectModel.getOffsetForAlignment(array, false)); Operand tib = ConvertToLowLevelIR.getTIB(inst, ir, Array); @@ -205,7 +205,7 @@ inst.insertBefore(Move.create(REF_MOVE, tmp, tib)); tib = tmp.copyRO(); } - IntConstantOperand site = IRTools.IC(MM_Interface.getAllocationSite(true)); + IntConstantOperand site = IRTools.IC(MemoryManager.getAllocationSite(true)); RVMMethod target = Entrypoints.resolvedNewArrayMethod; Call.mutate8(inst, CALL, @@ -235,7 +235,7 @@ int typeRefId = NewArray.getType(inst).getTypeRef().getId(); Operand numberElements = NewArray.getClearSize(inst); RVMMethod target = Entrypoints.unresolvedNewArrayMethod; - IntConstantOperand site = IRTools.IC(MM_Interface.getAllocationSite(true)); + IntConstantOperand site = IRTools.IC(MemoryManager.getAllocationSite(true)); Call.mutate3(inst, CALL, NewArray.getClearResult(inst), Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/ir/operand/ObjectConstantOperand.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/ir/operand/ObjectConstantOperand.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/ir/operand/ObjectConstantOperand.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -17,7 +17,7 @@ import org.jikesrvm.classloader.BootstrapClassLoader; import org.jikesrvm.classloader.TypeReference; import org.vmmagic.unboxed.Offset; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; /** * Represents a constant object operand (for example, from an @@ -54,7 +54,7 @@ offset = i; // prior to writing the boot image we don't know where objects will reside, // so we must treat them as movable when writing the boot image - movable = !VM.runningVM || !MM_Interface.willNeverMove(v); + movable = !VM.runningVM || !MemoryManager.willNeverMove(v); } /** Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptGenericGCMapIterator.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptGenericGCMapIterator.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptGenericGCMapIterator.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -19,7 +19,7 @@ import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.compilers.common.CompiledMethods; import org.jikesrvm.mm.mminterface.GCMapIterator; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.Magic; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.unboxed.Address; @@ -414,7 +414,7 @@ for (int i = firstReg; i <= lastReg; i++) { Address regLocation = registerLocations.get(i).toAddress(); Address regValue = regLocation.loadAddress(); - if (MM_Interface.addressInVM(regValue)) { + if (MemoryManager.addressInVM(regValue)) { VM.sysWrite(" reg#", getCurrentRegister()); VM.sysWrite(", location ==>", regLocation); VM.sysWriteln(", suspicious value ==>", regValue); @@ -469,7 +469,7 @@ VM.sysWrite("\n"); } - if (MM_Interface.addressInVM(ptr)) { + if (MemoryManager.addressInVM(ptr)) { VM.sysWrite(" spill location:"); VM.sysWrite(i); VM.sysWrite(" contains a suspicious value ==>"); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/ia32/CodeArray.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/ia32/CodeArray.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/ia32/CodeArray.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -14,7 +14,7 @@ import org.jikesrvm.ArchitectureSpecific; import org.jikesrvm.VM; -import org.jikesrvm.mm.mminterface.MM_Interface; +import org.jikesrvm.mm.mminterface.MemoryManager; import org.vmmagic.pragma.Uninterruptible; /** @@ -67,7 +67,7 @@ */ public static ArchitectureSpecific.CodeArray create(int numInstrs, boolean isHot) { if (VM.runningVM) { - return MM_Interface.allocateCode(numInstrs, isHot); + return MemoryManager.allocateCode(numInstrs, isHot); } else { return ArchitectureSpecific.CodeArray.create(numInstrs); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/ia32/Registers.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/ia32/Registers.java 2008-07-23 18:25:59 UTC (rev 14776) +++ rvmroot/trunk/rvm/src/org/jikesrvm/ia32/Registers.java 2008-07-23 19:14:40 UTC (rev 14777) @@ -14,7 +14,7 @@ import org.jikesrvm.runtime.ArchEntrypoints; impo... [truncated message content] |
From: <dgr...@us...> - 2008-07-23 19:54:25
|
Revision: 14778 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14778&view=rev Author: dgrove-oss Date: 2008-07-23 19:54:19 +0000 (Wed, 23 Jul 2008) Log Message: ----------- RVM-594 : WIP : rename org.jikesrvm.mm.mminterface.MM_Constants to MemoryManagerConstants; MM_ProcessorContext to ProcessorContext. Modified Paths: -------------- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/Reference.java rvmroot/trunk/rvm/src/org/jikesrvm/Services.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMArray.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMField.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ConvertToLowLevelIR.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ExpandRuntimeServices.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/DebugUtil.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeaderConstants.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/MiscHeader.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/MiscHeaderConstants.java rvmroot/trunk/rvm/src/org/jikesrvm/osr/ObjectHolder.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Statics.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Processor.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Scheduler.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenScheduler.java Added Paths: ----------- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MemoryManagerConstants.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/ProcessorContext.java Removed Paths: ------------- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_Constants.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_ProcessorContext.java Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -20,7 +20,7 @@ import org.jikesrvm.jni.JNIGlobalRefTable; import org.jikesrvm.mm.mminterface.Selected; import org.jikesrvm.mm.mminterface.CollectorThread; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.mm.mminterface.SpecializedScanMethod; import org.jikesrvm.VM; import org.jikesrvm.classloader.RVMClass; @@ -293,7 +293,7 @@ * @param trace The trace to use for computing roots. */ public void computeThreadRoots(TraceLocal trace) { - boolean processCodeLocations = MM_Constants.MOVES_CODE; + boolean processCodeLocations = MemoryManagerConstants.MOVES_CODE; /* Set status flag */ threadStacksScanned = true; Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/Reference.java =================================================================== --- rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/Reference.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/Reference.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -12,7 +12,7 @@ */ package java.lang.ref; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.Magic; import org.vmmagic.pragma.Inline; @@ -88,7 +88,7 @@ private Object getInternal(Address tmp) { Object ref = Magic.addressAsObject(tmp); - if (MM_Constants.NEEDS_REFTYPE_READ_BARRIER) { + if (MemoryManagerConstants.NEEDS_REFTYPE_READ_BARRIER) { ref = MemoryManager.referenceTypeReadBarrier(ref); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/Services.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/Services.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/Services.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -12,7 +12,7 @@ */ package org.jikesrvm; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.Entrypoints; import org.jikesrvm.runtime.Magic; @@ -333,7 +333,7 @@ @UninterruptibleNoWarn public static void setArrayUninterruptible(Object[] dst, int index, Object value) { if (VM.runningVM) { - if (MM_Constants.NEEDS_WRITE_BARRIER) { + if (MemoryManagerConstants.NEEDS_WRITE_BARRIER) { MemoryManager.arrayStoreWriteBarrier(dst, index, value); } else { Magic.setObjectAtOffset(dst, Offset.fromIntZeroExtend(index << LOG_BYTES_IN_ADDRESS), value); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMArray.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMArray.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMArray.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -15,7 +15,7 @@ import org.jikesrvm.ArchitectureSpecific; import org.jikesrvm.VM; import org.jikesrvm.Constants; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.ObjectModel; import org.jikesrvm.objectmodel.TIB; @@ -1008,8 +1008,8 @@ Offset dstOffset = Offset.fromIntZeroExtend(dstIdx << LOG_BYTES_IN_ADDRESS); int bytes = len << LOG_BYTES_IN_ADDRESS; - if (!MM_Constants.NEEDS_READ_BARRIER && ((src != dst) || loToHi)) { - if (!MM_Constants.NEEDS_WRITE_BARRIER || + if (!MemoryManagerConstants.NEEDS_READ_BARRIER && ((src != dst) || loToHi)) { + if (!MemoryManagerConstants.NEEDS_WRITE_BARRIER || !MemoryManager.arrayCopyWriteBarrier(src, srcOffset, dst, dstOffset, bytes)) { Memory.alignedWordCopy(Magic.objectAsAddress(dst).plus(dstOffset), Magic.objectAsAddress(src).plus(srcOffset), @@ -1029,12 +1029,12 @@ // perform the copy while (len-- != 0) { Object value; - if (MM_Constants.NEEDS_READ_BARRIER) { + if (MemoryManagerConstants.NEEDS_READ_BARRIER) { value = MemoryManager.arrayLoadReadBarrier(src, srcOffset.toInt() >> LOG_BYTES_IN_ADDRESS); } else { value = Magic.getObjectAtOffset(src, srcOffset); } - if (MM_Constants.NEEDS_WRITE_BARRIER) { + if (MemoryManagerConstants.NEEDS_WRITE_BARRIER) { MemoryManager.arrayStoreWriteBarrier(dst, dstOffset.toInt() >> LOG_BYTES_IN_ADDRESS, value); } else { Magic.setObjectAtOffset(dst, dstOffset, value); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMField.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMField.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMField.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -15,7 +15,7 @@ import java.io.DataInputStream; import java.io.IOException; import org.jikesrvm.VM; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.Magic; import org.jikesrvm.runtime.Statics; @@ -295,13 +295,13 @@ */ public Object getObjectValueUnchecked(Object obj) { if (isStatic()) { - if (MM_Constants.NEEDS_GETSTATIC_READ_BARRIER && !isUntraced()) { + if (MemoryManagerConstants.NEEDS_GETSTATIC_READ_BARRIER && !isUntraced()) { return MemoryManager.getstaticReadBarrier(getOffset(), getId()); } else { return Statics.getSlotContentsAsObject(getOffset()); } } else { - if (MM_Constants.NEEDS_READ_BARRIER && !isUntraced()) { + if (MemoryManagerConstants.NEEDS_READ_BARRIER && !isUntraced()) { return MemoryManager.getfieldReadBarrier(obj, getOffset(), getId()); } else { return Magic.getObjectAtOffset(obj, getOffset()); @@ -390,13 +390,13 @@ */ public void setObjectValueUnchecked(Object obj, Object ref) { if (isStatic()) { - if (MM_Constants.NEEDS_PUTSTATIC_WRITE_BARRIER && !isUntraced()) { + if (MemoryManagerConstants.NEEDS_PUTSTATIC_WRITE_BARRIER && !isUntraced()) { MemoryManager.putstaticWriteBarrier(getOffset(), ref, getId()); } else { Statics.setSlotContents(getOffset(), ref); } } else { - if (MM_Constants.NEEDS_WRITE_BARRIER && !isUntraced()) { + if (MemoryManagerConstants.NEEDS_WRITE_BARRIER && !isUntraced()) { MemoryManager.putfieldWriteBarrier(obj, getOffset(), ref, getId()); } else { Magic.setObjectAtOffset(obj, getOffset(), ref); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -39,7 +39,7 @@ import org.jikesrvm.ia32.BaselineConstants; import org.jikesrvm.ia32.ProcessorLocalState; import org.jikesrvm.jni.ia32.JNICompiler; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.ObjectModel; import org.jikesrvm.runtime.ArchEntrypoints; @@ -496,7 +496,7 @@ asm.emitPOP_Reg(T0); // T0 is array index asm.emitPOP_Reg(S0); // S0 is array ref if (generateBoundsChecks) genBoundsCheck(asm, T0, S0); // T0 is index, S0 is address of array - if (MM_Constants.NEEDS_READ_BARRIER) { + if (MemoryManagerConstants.NEEDS_READ_BARRIER) { asm.emitADD_Reg_Imm(SP, WORDSIZE * -2); // rewind 2 args on stack Barriers.compileArrayLoadBarrier(asm, true); } else { @@ -627,7 +627,7 @@ genParameterRegisterLoad(asm, 2); // pass 2 parameter // call checkstore(array ref, value) asm.emitCALL_Abs(Magic.getTocPointer().plus(Entrypoints.checkstoreMethod.getOffset())); - if (MM_Constants.NEEDS_WRITE_BARRIER) { + if (MemoryManagerConstants.NEEDS_WRITE_BARRIER) { asm.emitMOV_Reg_RegDisp(T0, SP, ONE_SLOT); // T0 is array index asm.emitMOV_Reg_RegDisp(S0, SP, TWO_SLOTS); // S0 is array ref if (generateBoundsChecks) genBoundsCheck(asm, T0, S0); // T0 is index, S0 is address of array @@ -2390,7 +2390,7 @@ @Override protected final void emit_unresolved_getstatic(FieldReference fieldRef) { emitDynamicLinkingSequence(asm, T0, fieldRef, true); - if (MM_Constants.NEEDS_GETSTATIC_READ_BARRIER && !fieldRef.getFieldContentsType().isPrimitiveType()) { + if (MemoryManagerConstants.NEEDS_GETSTATIC_READ_BARRIER && !fieldRef.getFieldContentsType().isPrimitiveType()) { Barriers.compileGetstaticBarrier(asm, T0, fieldRef.getId()); return; } @@ -2412,7 +2412,7 @@ protected final void emit_resolved_getstatic(FieldReference fieldRef) { RVMField field = fieldRef.peekResolvedField(); Offset fieldOffset = field.getOffset(); - if (MM_Constants.NEEDS_GETSTATIC_READ_BARRIER && !fieldRef.getFieldContentsType().isPrimitiveType() && !field.isUntraced()) { + if (MemoryManagerConstants.NEEDS_GETSTATIC_READ_BARRIER && !fieldRef.getFieldContentsType().isPrimitiveType() && !field.isUntraced()) { Barriers.compileGetstaticBarrierImm(asm, fieldOffset, fieldRef.getId()); return; } @@ -2432,7 +2432,7 @@ @Override protected final void emit_unresolved_putstatic(FieldReference fieldRef) { emitDynamicLinkingSequence(asm, T0, fieldRef, true); - if (MM_Constants.NEEDS_PUTSTATIC_WRITE_BARRIER && fieldRef.getFieldContentsType().isReferenceType()) { + if (MemoryManagerConstants.NEEDS_PUTSTATIC_WRITE_BARRIER && fieldRef.getFieldContentsType().isReferenceType()) { Barriers.compilePutstaticBarrier(asm, T0, fieldRef.getId()); asm.emitADD_Reg_Imm(SP, WORDSIZE); } else { @@ -2455,7 +2455,7 @@ protected final void emit_resolved_putstatic(FieldReference fieldRef) { RVMField field = fieldRef.peekResolvedField(); Offset fieldOffset = field.getOffset(); - if (MM_Constants.NEEDS_PUTSTATIC_WRITE_BARRIER && field.isReferenceType() && !field.isUntraced()) { + if (MemoryManagerConstants.NEEDS_PUTSTATIC_WRITE_BARRIER && field.isReferenceType() && !field.isUntraced()) { Barriers.compilePutstaticBarrierImm(asm, fieldOffset, fieldRef.getId()); asm.emitADD_Reg_Imm(SP, WORDSIZE); } else { @@ -2479,7 +2479,7 @@ emitDynamicLinkingSequence(asm, T0, fieldRef, true); if (fieldType.isReferenceType()) { // 32bit reference load - if (MM_Constants.NEEDS_READ_BARRIER) { + if (MemoryManagerConstants.NEEDS_READ_BARRIER) { Barriers.compileGetfieldBarrier(asm, T0, fieldRef.getId()); } else { asm.emitMOV_Reg_RegDisp(S0, SP, NO_SLOT); // S0 is object reference @@ -2539,7 +2539,7 @@ Offset fieldOffset = field.getOffset(); if (field.isReferenceType()) { // 32bit reference load - if (MM_Constants.NEEDS_READ_BARRIER && !field.isUntraced()) { + if (MemoryManagerConstants.NEEDS_READ_BARRIER && !field.isUntraced()) { Barriers.compileGetfieldBarrierImm(asm, fieldOffset, fieldRef.getId()); } else { asm.emitMOV_Reg_RegDisp(S0, SP, NO_SLOT); // S0 is object reference @@ -2598,7 +2598,7 @@ emitDynamicLinkingSequence(asm, T0, fieldRef, true); if (fieldType.isReferenceType()) { // 32bit reference store - if (MM_Constants.NEEDS_WRITE_BARRIER) { + if (MemoryManagerConstants.NEEDS_WRITE_BARRIER) { Barriers.compilePutfieldBarrier(asm, T0, fieldRef.getId()); asm.emitADD_Reg_Imm(SP, WORDSIZE * 2); // complete popping the value and reference } else { @@ -2653,7 +2653,7 @@ Barriers.compileModifyCheck(asm, 4); if (field.isReferenceType()) { // 32bit reference store - if (MM_Constants.NEEDS_WRITE_BARRIER && !field.isUntraced()) { + if (MemoryManagerConstants.NEEDS_WRITE_BARRIER && !field.isUntraced()) { Barriers.compilePutfieldBarrierImm(asm, fieldOffset, fieldRef.getId()); asm.emitADD_Reg_Imm(SP, WORDSIZE * 2); // complete popping the value and reference } else { @@ -3384,7 +3384,7 @@ if (!VM.runningTool && ((BaselineCompiledMethod) compiledMethod).hasCounterArray()) { // use (nonvolatile) EBX to hold base of this method's counter array - if (MM_Constants.NEEDS_READ_BARRIER) { + if (MemoryManagerConstants.NEEDS_READ_BARRIER) { asm.emitPUSH_Abs(Magic.getTocPointer().plus(Entrypoints.edgeCountersField.getOffset())); asm.emitPUSH_Imm(getEdgeCounterIndex()); Barriers.compileArrayLoadBarrier(asm, false); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -39,7 +39,7 @@ import org.jikesrvm.compilers.common.assembler.ppc.AssemblerConstants; import org.jikesrvm.jni.ppc.JNICompiler; import org.jikesrvm.jni.ppc.JNIStackframeLayoutConstants; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.ObjectModel; import org.jikesrvm.ppc.BaselineConstants; @@ -931,7 +931,7 @@ @Override protected final void emit_aaload() { genBoundsCheck(); - if (MM_Constants.NEEDS_READ_BARRIER) { + if (MemoryManagerConstants.NEEDS_READ_BARRIER) { Barriers.compileArrayLoadBarrier(this); pushAddr(T0); } else { @@ -1034,7 +1034,7 @@ asm.emitBCCTRL(); // checkstore(arrayref, value) popAddr(T2); // T2 is value to store genBoundsCheck(); - if (MM_Constants.NEEDS_WRITE_BARRIER) { + if (MemoryManagerConstants.NEEDS_WRITE_BARRIER) { Barriers.compileArrayStoreBarrier(this); } else { asm.emitSLWI(T1, T1, LOG_BYTES_IN_ADDRESS); // convert index to offset @@ -2438,7 +2438,7 @@ protected final void emit_unresolved_getstatic(FieldReference fieldRef) { emitDynamicLinkingSequence(T0, fieldRef, true); TypeReference fieldType = fieldRef.getFieldContentsType(); - if (MM_Constants.NEEDS_GETSTATIC_READ_BARRIER && fieldType.isReferenceType()) { + if (MemoryManagerConstants.NEEDS_GETSTATIC_READ_BARRIER && fieldType.isReferenceType()) { Barriers.compileGetstaticBarrier(this, fieldType.getId()); pushAddr(T0); return; @@ -2468,7 +2468,7 @@ RVMField field = fieldRef.peekResolvedField(); Offset fieldOffset = field.getOffset(); TypeReference fieldType = fieldRef.getFieldContentsType(); - if (MM_Constants.NEEDS_GETSTATIC_READ_BARRIER && fieldType.isReferenceType() && !field.isUntraced()) { + if (MemoryManagerConstants.NEEDS_GETSTATIC_READ_BARRIER && fieldType.isReferenceType() && !field.isUntraced()) { Barriers.compileGetstaticBarrierImm(this, fieldOffset, fieldType.getId()); pushAddr(T0); return; @@ -2496,7 +2496,7 @@ */ protected final void emit_unresolved_putstatic(FieldReference fieldRef) { emitDynamicLinkingSequence(T0, fieldRef, true); - if (MM_Constants.NEEDS_PUTSTATIC_WRITE_BARRIER && !fieldRef.getFieldContentsType().isPrimitiveType()) { + if (MemoryManagerConstants.NEEDS_PUTSTATIC_WRITE_BARRIER && !fieldRef.getFieldContentsType().isPrimitiveType()) { Barriers.compilePutstaticBarrier(this, fieldRef.getId()); // NOTE: offset is in T0 from emitDynamicLinkingSequence discardSlots(1); return; @@ -2525,7 +2525,7 @@ protected final void emit_resolved_putstatic(FieldReference fieldRef) { RVMField field = fieldRef.peekResolvedField(); Offset fieldOffset = field.getOffset(); - if (MM_Constants.NEEDS_PUTSTATIC_WRITE_BARRIER && !fieldRef.getFieldContentsType().isPrimitiveType() && !field.isUntraced()) { + if (MemoryManagerConstants.NEEDS_PUTSTATIC_WRITE_BARRIER && !fieldRef.getFieldContentsType().isPrimitiveType() && !field.isUntraced()) { Barriers.compilePutstaticBarrierImm(this, fieldOffset, fieldRef.getId()); discardSlots(1); return; @@ -2555,7 +2555,7 @@ TypeReference fieldType = fieldRef.getFieldContentsType(); // T1 = field offset from emitDynamicLinkingSequence() emitDynamicLinkingSequence(T1, fieldRef, true); - if (MM_Constants.NEEDS_READ_BARRIER && fieldType.isReferenceType()) { + if (MemoryManagerConstants.NEEDS_READ_BARRIER && fieldType.isReferenceType()) { Barriers.compileGetfieldBarrier(this, fieldType.getId()); discardSlots(1); pushAddr(T0); @@ -2605,7 +2605,7 @@ RVMField field = fieldRef.peekResolvedField(); TypeReference fieldType = fieldRef.getFieldContentsType(); Offset fieldOffset = field.getOffset(); - if (MM_Constants.NEEDS_READ_BARRIER && fieldType.isReferenceType() && !field.isUntraced()) { + if (MemoryManagerConstants.NEEDS_READ_BARRIER && fieldType.isReferenceType() && !field.isUntraced()) { Barriers.compileGetfieldBarrierImm(this, fieldOffset, fieldType.getId()); discardSlots(1); pushAddr(T0); @@ -2656,7 +2656,7 @@ emitDynamicLinkingSequence(T1, fieldRef, true); if (fieldType.isReferenceType()) { // 32/64bit reference store - if (MM_Constants.NEEDS_WRITE_BARRIER) { + if (MemoryManagerConstants.NEEDS_WRITE_BARRIER) { // NOTE: offset is in T1 from emitDynamicLinkingSequence Barriers.compilePutfieldBarrier(this, fieldRef.getId()); discardSlots(2); @@ -2710,7 +2710,7 @@ TypeReference fieldType = fieldRef.getFieldContentsType(); if (fieldType.isReferenceType()) { // 32/64bit reference store - if (MM_Constants.NEEDS_WRITE_BARRIER && !field.isUntraced()) { + if (MemoryManagerConstants.NEEDS_WRITE_BARRIER && !field.isUntraced()) { Barriers.compilePutfieldBarrierImm(this, fieldOffset, fieldRef.getId()); discardSlots(2); } else { Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ConvertToLowLevelIR.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ConvertToLowLevelIR.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ConvertToLowLevelIR.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -141,7 +141,7 @@ import org.jikesrvm.compilers.opt.ir.operand.TrapCodeOperand; import org.jikesrvm.compilers.opt.ir.operand.TypeOperand; import org.jikesrvm.compilers.opt.specialization.SpecializedMethod; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.runtime.Entrypoints; import org.jikesrvm.runtime.Magic; import org.vmmagic.unboxed.Address; @@ -1191,7 +1191,7 @@ /** get the class tib for type */ static Operand getTIB(Instruction s, IR ir, TypeOperand type) { RVMType t = type.getVMType(); - if (VM.BuildForIA32 && !MM_Constants.MOVES_TIBS && VM.runningVM && t != null && t.isResolved()) { + if (VM.BuildForIA32 && !MemoryManagerConstants.MOVES_TIBS && VM.runningVM && t != null && t.isResolved()) { Address addr = Magic.objectAsAddress(t.getTypeInformationBlock()); return new AddressConstantOperand(addr); } else if (!t.isResolved()) { Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ExpandRuntimeServices.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ExpandRuntimeServices.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/hir2lir/ExpandRuntimeServices.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -70,7 +70,7 @@ import org.jikesrvm.compilers.opt.ir.operand.Operand; import org.jikesrvm.compilers.opt.ir.operand.RegisterOperand; import org.jikesrvm.compilers.opt.ir.operand.TypeOperand; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.ObjectModel; import org.jikesrvm.runtime.Entrypoints; @@ -372,7 +372,7 @@ break; case REF_ASTORE_opcode: { - if (MM_Constants.NEEDS_WRITE_BARRIER) { + if (MemoryManagerConstants.NEEDS_WRITE_BARRIER) { RVMMethod target = Entrypoints.arrayStoreWriteBarrierMethod; Instruction wb = Call.create3(CALL, @@ -395,7 +395,7 @@ break; case REF_ALOAD_opcode: { - if (MM_Constants.NEEDS_READ_BARRIER) { + if (MemoryManagerConstants.NEEDS_READ_BARRIER) { RVMMethod target = Entrypoints.arrayLoadReadBarrierMethod; Instruction rb = Call.create2(CALL, @@ -415,7 +415,7 @@ break; case PUTFIELD_opcode: { - if (MM_Constants.NEEDS_WRITE_BARRIER) { + if (MemoryManagerConstants.NEEDS_WRITE_BARRIER) { LocationOperand loc = PutField.getLocation(inst); FieldReference fieldRef = loc.getFieldRef(); if (!fieldRef.getFieldContentsType().isPrimitiveType()) { @@ -446,7 +446,7 @@ break; case GETFIELD_opcode: { - if (MM_Constants.NEEDS_READ_BARRIER) { + if (MemoryManagerConstants.NEEDS_READ_BARRIER) { LocationOperand loc = GetField.getLocation(inst); FieldReference fieldRef = loc.getFieldRef(); if (GetField.getResult(inst).getType().isReferenceType()) { @@ -474,7 +474,7 @@ break; case PUTSTATIC_opcode: { - if (MM_Constants.NEEDS_PUTSTATIC_WRITE_BARRIER) { + if (MemoryManagerConstants.NEEDS_PUTSTATIC_WRITE_BARRIER) { LocationOperand loc = PutStatic.getLocation(inst); FieldReference field = loc.getFieldRef(); if (!field.getFieldContentsType().isPrimitiveType()) { @@ -500,7 +500,7 @@ break; case GETSTATIC_opcode: { - if (MM_Constants.NEEDS_GETSTATIC_READ_BARRIER) { + if (MemoryManagerConstants.NEEDS_GETSTATIC_READ_BARRIER) { LocationOperand loc = GetStatic.getLocation(inst); FieldReference field = loc.getFieldRef(); if (!field.getFieldContentsType().isPrimitiveType()) { Modified: rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/DebugUtil.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/DebugUtil.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/DebugUtil.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -91,7 +91,7 @@ Space.printVMMap(); return false; } - if (MM_Constants.MOVES_OBJECTS) { + if (MemoryManagerConstants.MOVES_OBJECTS) { /* TODO: Work out how to check if forwarded if (Plan.isForwardedOrBeingForwarded(ref)) { Deleted: rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_Constants.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_Constants.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_Constants.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -1,52 +0,0 @@ -/* - * This file is part of the Jikes RVM project (http://jikesrvm.org). - * - * This file is licensed to You under the Common Public License (CPL); - * You may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.opensource.org/licenses/cpl1.0.php - * - * See the COPYRIGHT.txt file distributed with this work for information - * regarding copyright ownership. - */ -package org.jikesrvm.mm.mminterface; - -import org.jikesrvm.SizeConstants; - -/** - * This class merely exposes the MMTk constants into the Jikes RVM - * package space so that they can be accessed by the VM in an - * MM-neutral way. It is separate from MemoryManager to break - * cyclic class-loading dependencies. - */ -public class MM_Constants implements SizeConstants { - /** True if the selected plan needs support for linearly scanning the heap */ - public static final boolean NEEDS_LINEAR_SCAN = Selected.Constraints.get().needsLinearScan(); - /** Number of bits in the GC header required by the selected plan */ - public static final int GC_HEADER_BITS = Selected.Constraints.get().gcHeaderBits(); - /** Number of additional bytes required in the header by the selected plan */ - public static final int GC_HEADER_BYTES = Selected.Constraints.get().gcHeaderWords() << LOG_BYTES_IN_WORD; - /** True if the selected plan requires a read barrier on reference types */ - public static final boolean NEEDS_REFTYPE_READ_BARRIER = Selected.Constraints.get().needsReferenceTypeReadBarrier(); - /** True if the selected plan requires write barriers on putfield, arraystore or modifycheck */ - public static final boolean NEEDS_WRITE_BARRIER = Selected.Constraints.get().needsWriteBarrier(); - /** True if the selected plan requires read barriers on getfield or arrayload */ - public static final boolean NEEDS_READ_BARRIER = Selected.Constraints.get().needsReadBarrier(); - /** True if the selected plan requires write barriers on putstatic */ - public static final boolean NEEDS_PUTSTATIC_WRITE_BARRIER = Selected.Constraints.get().needsStaticWriteBarrier(); - /** True if the selected plan requires read barriers on getstatic */ - public static final boolean NEEDS_GETSTATIC_READ_BARRIER = Selected.Constraints.get().needsStaticReadBarrier(); - /** True if the selected plan requires concurrent worker threads */ - public static final boolean NEEDS_CONCURRENT_WORKERS = Selected.Constraints.get().needsConcurrentWorkers(); - /** True if the selected plan needs support for generating a GC trace */ - public static final boolean GENERATE_GC_TRACE = Selected.Constraints.get().generateGCTrace(); - /** True if the selected plan may move objects */ - public static final boolean MOVES_OBJECTS = Selected.Constraints.get().movesObjects(); - /** True if the selected plan moves tib objects */ - public static final boolean MOVES_TIBS = false; - /** True if the selected plan moves code */ - public static final boolean MOVES_CODE = false; - -} - Deleted: rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_ProcessorContext.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_ProcessorContext.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_ProcessorContext.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -1,22 +0,0 @@ -/* - * This file is part of the Jikes RVM project (http://jikesrvm.org). - * - * This file is licensed to You under the Common Public License (CPL); - * You may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.opensource.org/licenses/cpl1.0.php - * - * See the COPYRIGHT.txt file distributed with this work for information - * regarding copyright ownership. - */ -package org.jikesrvm.mm.mminterface; - -import org.jikesrvm.scheduler.Processor; - -/** - * Processor must extend this class to associate appropriate context with processor. - */ -public abstract class MM_ProcessorContext extends Selected.Mutator { - public final Selected.Collector collectorContext = new Selected.Collector((Processor) this); -} Copied: rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MemoryManagerConstants.java (from rev 14777, rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_Constants.java) =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MemoryManagerConstants.java (rev 0) +++ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MemoryManagerConstants.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -0,0 +1,52 @@ +/* + * This file is part of the Jikes RVM project (http://jikesrvm.org). + * + * This file is licensed to You under the Common Public License (CPL); + * You may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.opensource.org/licenses/cpl1.0.php + * + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. + */ +package org.jikesrvm.mm.mminterface; + +import org.jikesrvm.SizeConstants; + +/** + * This class merely exposes the MMTk constants into the Jikes RVM + * package space so that they can be accessed by the VM in an + * MM-neutral way. It is separate from MemoryManager to break + * cyclic class-loading dependencies. + */ +public class MemoryManagerConstants implements SizeConstants { + /** True if the selected plan needs support for linearly scanning the heap */ + public static final boolean NEEDS_LINEAR_SCAN = Selected.Constraints.get().needsLinearScan(); + /** Number of bits in the GC header required by the selected plan */ + public static final int GC_HEADER_BITS = Selected.Constraints.get().gcHeaderBits(); + /** Number of additional bytes required in the header by the selected plan */ + public static final int GC_HEADER_BYTES = Selected.Constraints.get().gcHeaderWords() << LOG_BYTES_IN_WORD; + /** True if the selected plan requires a read barrier on reference types */ + public static final boolean NEEDS_REFTYPE_READ_BARRIER = Selected.Constraints.get().needsReferenceTypeReadBarrier(); + /** True if the selected plan requires write barriers on putfield, arraystore or modifycheck */ + public static final boolean NEEDS_WRITE_BARRIER = Selected.Constraints.get().needsWriteBarrier(); + /** True if the selected plan requires read barriers on getfield or arrayload */ + public static final boolean NEEDS_READ_BARRIER = Selected.Constraints.get().needsReadBarrier(); + /** True if the selected plan requires write barriers on putstatic */ + public static final boolean NEEDS_PUTSTATIC_WRITE_BARRIER = Selected.Constraints.get().needsStaticWriteBarrier(); + /** True if the selected plan requires read barriers on getstatic */ + public static final boolean NEEDS_GETSTATIC_READ_BARRIER = Selected.Constraints.get().needsStaticReadBarrier(); + /** True if the selected plan requires concurrent worker threads */ + public static final boolean NEEDS_CONCURRENT_WORKERS = Selected.Constraints.get().needsConcurrentWorkers(); + /** True if the selected plan needs support for generating a GC trace */ + public static final boolean GENERATE_GC_TRACE = Selected.Constraints.get().generateGCTrace(); + /** True if the selected plan may move objects */ + public static final boolean MOVES_OBJECTS = Selected.Constraints.get().movesObjects(); + /** True if the selected plan moves tib objects */ + public static final boolean MOVES_TIBS = false; + /** True if the selected plan moves code */ + public static final boolean MOVES_CODE = false; + +} + Copied: rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/ProcessorContext.java (from rev 14777, rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MM_ProcessorContext.java) =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/ProcessorContext.java (rev 0) +++ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/ProcessorContext.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -0,0 +1,22 @@ +/* + * This file is part of the Jikes RVM project (http://jikesrvm.org). + * + * This file is licensed to You under the Common Public License (CPL); + * You may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.opensource.org/licenses/cpl1.0.php + * + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. + */ +package org.jikesrvm.mm.mminterface; + +import org.jikesrvm.scheduler.Processor; + +/** + * Processor must extend this class to associate appropriate context with processor. + */ +public abstract class ProcessorContext extends Selected.Mutator { + public final Selected.Collector collectorContext = new Selected.Collector((Processor) this); +} Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -19,7 +19,7 @@ import org.jikesrvm.classloader.RVMArray; import org.jikesrvm.classloader.RVMClass; import org.jikesrvm.classloader.RVMType; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.runtime.Magic; import org.jikesrvm.runtime.Memory; import org.jikesrvm.scheduler.Lock; @@ -98,7 +98,7 @@ static { if (VM.VerifyAssertions) { - VM._assert(MiscHeader.REQUESTED_BITS + MM_Constants.GC_HEADER_BITS <= NUM_AVAILABLE_BITS); + VM._assert(MiscHeader.REQUESTED_BITS + MemoryManagerConstants.GC_HEADER_BITS <= NUM_AVAILABLE_BITS); } } @@ -218,7 +218,7 @@ */ public static int bytesUsed(Object obj, RVMClass type) { int size = type.getInstanceSize(); - if (MM_Constants.MOVES_OBJECTS) { + if (MemoryManagerConstants.MOVES_OBJECTS) { if (ADDRESS_BASED_HASHING) { Word hashState = Magic.getWordAtOffset(obj, STATUS_OFFSET).and(HASH_STATE_MASK); if (hashState.EQ(HASH_STATE_HASHED_AND_MOVED)) { @@ -248,7 +248,7 @@ */ public static int bytesUsed(Object obj, RVMArray type, int numElements) { int size = type.getInstanceSize(numElements); - if (MM_Constants.MOVES_OBJECTS) { + if (MemoryManagerConstants.MOVES_OBJECTS) { if (ADDRESS_BASED_HASHING) { Word hashState = Magic.getWordAtOffset(obj, STATUS_OFFSET).and(HASH_STATE_MASK); if (hashState.EQ(HASH_STATE_HASHED_AND_MOVED)) { @@ -265,7 +265,7 @@ */ @Inline public static Address objectStartRef(ObjectReference obj) { - if (MM_Constants.MOVES_OBJECTS) { + if (MemoryManagerConstants.MOVES_OBJECTS) { if (ADDRESS_BASED_HASHING && !DYNAMIC_HASH_OFFSET) { Word hashState = obj.toAddress().loadWord(STATUS_OFFSET).and(HASH_STATE_MASK); if (hashState.EQ(HASH_STATE_HASHED_AND_MOVED)) { @@ -493,7 +493,7 @@ @Inline public static int getObjectHashCode(Object o) { if (ADDRESS_BASED_HASHING) { - if (MM_Constants.MOVES_OBJECTS) { + if (MemoryManagerConstants.MOVES_OBJECTS) { Word hashState = Magic.getWordAtOffset(o, STATUS_OFFSET).and(HASH_STATE_MASK); if (hashState.EQ(HASH_STATE_HASHED)) { // HASHED, NOT MOVED Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeaderConstants.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeaderConstants.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeaderConstants.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -14,7 +14,7 @@ import org.jikesrvm.VM; import org.jikesrvm.SizeConstants; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.vmmagic.unboxed.Offset; import org.vmmagic.unboxed.Word; @@ -44,7 +44,7 @@ /** Number of bytes used by the Java Header */ int JAVA_HEADER_BYTES = TIB_BYTES + STATUS_BYTES; /** Number of bytes used by the GC Header */ - int GC_HEADER_BYTES = MM_Constants.GC_HEADER_BYTES; + int GC_HEADER_BYTES = MemoryManagerConstants.GC_HEADER_BYTES; /** Number of bytes used by the miscellaneous header */ int MISC_HEADER_BYTES = MiscHeaderConstants.NUM_BYTES_HEADER; /** Size of GC and miscellaneous headers */ @@ -70,7 +70,7 @@ * In a copying collector, this forces us to add a word * to copied objects that have had their hashcode taken. */ - boolean ADDRESS_BASED_HASHING = !MM_Constants.GENERATE_GC_TRACE; + boolean ADDRESS_BASED_HASHING = !MemoryManagerConstants.GENERATE_GC_TRACE; /** How many bits in the header are available for the GC and MISC headers? */ int NUM_AVAILABLE_BITS = ADDRESS_BASED_HASHING ? 8 : 2; @@ -85,7 +85,7 @@ * Does this object model place the hash for a hashed and moved object * after the data (at a dynamic offset) */ - boolean DYNAMIC_HASH_OFFSET = ADDRESS_BASED_HASHING && MM_Constants.NEEDS_LINEAR_SCAN; + boolean DYNAMIC_HASH_OFFSET = ADDRESS_BASED_HASHING && MemoryManagerConstants.NEEDS_LINEAR_SCAN; /** * Can we perform a linear scan? Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/MiscHeader.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/MiscHeader.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/MiscHeader.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -14,7 +14,7 @@ import org.jikesrvm.VM; import org.jikesrvm.Constants; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.runtime.Magic; import org.vmmagic.pragma.Entrypoint; import org.vmmagic.pragma.LogicallyUninterruptible; @@ -88,7 +88,7 @@ @Uninterruptible public static void initializeHeader(Object obj, TIB tib, int size, boolean isScalar) { /* Only perform initialization when it is required */ - if (MM_Constants.GENERATE_GC_TRACE) { + if (MemoryManagerConstants.GENERATE_GC_TRACE) { Address ref = Magic.objectAsAddress(obj); ref.store(oid, OBJECT_OID_OFFSET); ref.store(time, OBJECT_DEATH_OFFSET); @@ -108,7 +108,7 @@ public static void initializeHeader(BootImageInterface bootImage, Address ref, TIB tib, int size, boolean isScalar) { /* Only perform initialization when it is required */ - if (MM_Constants.GENERATE_GC_TRACE) { + if (MemoryManagerConstants.GENERATE_GC_TRACE) { bootImage.setAddressWord(ref.plus(OBJECT_OID_OFFSET), oid, false, false); bootImage.setAddressWord(ref.plus(OBJECT_DEATH_OFFSET), time, false, false); bootImage.setAddressWord(ref.plus(OBJECT_LINK_OFFSET), prevAddress, false, false); @@ -118,34 +118,34 @@ } public static void updateDeathTime(Object object) { - if (VM.VerifyAssertions) VM._assert(MM_Constants.GENERATE_GC_TRACE); - if (MM_Constants.GENERATE_GC_TRACE) { + if (VM.VerifyAssertions) VM._assert(MemoryManagerConstants.GENERATE_GC_TRACE); + if (MemoryManagerConstants.GENERATE_GC_TRACE) { Magic.objectAsAddress(object).store(time, OBJECT_DEATH_OFFSET); } } public static void setDeathTime(Object object, Word time_) { - if (VM.VerifyAssertions) VM._assert(MM_Constants.GENERATE_GC_TRACE); - if (MM_Constants.GENERATE_GC_TRACE) { + if (VM.VerifyAssertions) VM._assert(MemoryManagerConstants.GENERATE_GC_TRACE); + if (MemoryManagerConstants.GENERATE_GC_TRACE) { Magic.objectAsAddress(object).store(time_, OBJECT_DEATH_OFFSET); } } public static void setLink(Object object, ObjectReference link) { - if (VM.VerifyAssertions) VM._assert(MM_Constants.GENERATE_GC_TRACE); - if (MM_Constants.GENERATE_GC_TRACE) { + if (VM.VerifyAssertions) VM._assert(MemoryManagerConstants.GENERATE_GC_TRACE); + if (MemoryManagerConstants.GENERATE_GC_TRACE) { Magic.objectAsAddress(object).store(link, OBJECT_LINK_OFFSET); } } public static void updateTime(Word time_) { - if (VM.VerifyAssertions) VM._assert(MM_Constants.GENERATE_GC_TRACE); + if (VM.VerifyAssertions) VM._assert(MemoryManagerConstants.GENERATE_GC_TRACE); time = time_; } public static Word getOID(Object object) { - if (VM.VerifyAssertions) VM._assert(MM_Constants.GENERATE_GC_TRACE); - if (MM_Constants.GENERATE_GC_TRACE) { + if (VM.VerifyAssertions) VM._assert(MemoryManagerConstants.GENERATE_GC_TRACE); + if (MemoryManagerConstants.GENERATE_GC_TRACE) { return Magic.objectAsAddress(object).plus(OBJECT_OID_OFFSET).loadWord(); } else { return Word.zero(); @@ -153,8 +153,8 @@ } public static Word getDeathTime(Object object) { - if (VM.VerifyAssertions) VM._assert(MM_Constants.GENERATE_GC_TRACE); - if (MM_Constants.GENERATE_GC_TRACE) { + if (VM.VerifyAssertions) VM._assert(MemoryManagerConstants.GENERATE_GC_TRACE); + if (MemoryManagerConstants.GENERATE_GC_TRACE) { return Magic.objectAsAddress(object).plus(OBJECT_DEATH_OFFSET).loadWord(); } else { return Word.zero(); @@ -162,8 +162,8 @@ } public static ObjectReference getLink(Object ref) { - if (VM.VerifyAssertions) VM._assert(MM_Constants.GENERATE_GC_TRACE); - if (MM_Constants.GENERATE_GC_TRACE) { + if (VM.VerifyAssertions) VM._assert(MemoryManagerConstants.GENERATE_GC_TRACE); + if (MemoryManagerConstants.GENERATE_GC_TRACE) { return ObjectReference.fromObject(Magic.getObjectAtOffset(ref, OBJECT_LINK_OFFSET)); } else { return ObjectReference.nullReference(); @@ -171,8 +171,8 @@ } public static Address getBootImageLink() { - if (VM.VerifyAssertions) VM._assert(MM_Constants.GENERATE_GC_TRACE); - if (MM_Constants.GENERATE_GC_TRACE) { + if (VM.VerifyAssertions) VM._assert(MemoryManagerConstants.GENERATE_GC_TRACE); + if (MemoryManagerConstants.GENERATE_GC_TRACE) { return prevAddress.toAddress(); } else { return Address.zero(); @@ -180,8 +180,8 @@ } public static Word getOID() { - if (VM.VerifyAssertions) VM._assert(MM_Constants.GENERATE_GC_TRACE); - if (MM_Constants.GENERATE_GC_TRACE) { + if (VM.VerifyAssertions) VM._assert(MemoryManagerConstants.GENERATE_GC_TRACE); + if (MemoryManagerConstants.GENERATE_GC_TRACE) { return oid; } else { return Word.zero(); @@ -189,8 +189,8 @@ } public static void setOID(Word oid_) { - if (VM.VerifyAssertions) VM._assert(MM_Constants.GENERATE_GC_TRACE); - if (MM_Constants.GENERATE_GC_TRACE) { + if (VM.VerifyAssertions) VM._assert(MemoryManagerConstants.GENERATE_GC_TRACE); + if (MemoryManagerConstants.GENERATE_GC_TRACE) { oid = oid_; } } @@ -206,7 +206,7 @@ */ public static void dumpHeader(Object ref) { // by default nothing to do, unless the misc header is required - if (MM_Constants.GENERATE_GC_TRACE) { + if (MemoryManagerConstants.GENERATE_GC_TRACE) { VM.sysWrite(" OID=", getOID(ref)); VM.sysWrite(" LINK=", getLink(ref)); VM.sysWrite(" DEATH=", getDeathTime(ref)); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/MiscHeaderConstants.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/MiscHeaderConstants.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/MiscHeaderConstants.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -13,7 +13,7 @@ package org.jikesrvm.objectmodel; import org.jikesrvm.Constants; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; /** * Defines other header words not used for @@ -30,7 +30,7 @@ */ /* amount by which tracing causes headers to grow */ int GC_TRACING_HEADER_WORDS = - (MM_Constants.GENERATE_GC_TRACE ? 3 : 0); + (MemoryManagerConstants.GENERATE_GC_TRACE ? 3 : 0); int GC_TRACING_HEADER_BYTES = GC_TRACING_HEADER_WORDS << LOG_BYTES_IN_ADDRESS; /** Modified: rvmroot/trunk/rvm/src/org/jikesrvm/osr/ObjectHolder.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/osr/ObjectHolder.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/osr/ObjectHolder.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -14,7 +14,7 @@ import org.jikesrvm.VM; import org.jikesrvm.SizeConstants; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.Magic; import org.vmmagic.pragma.Inline; @@ -94,7 +94,7 @@ VM.sysWriteln("ObjectHolder cleanRefs"); } /* refs[h] = null; */ - if (MM_Constants.NEEDS_WRITE_BARRIER) { + if (MemoryManagerConstants.NEEDS_WRITE_BARRIER) { MemoryManager.arrayStoreWriteBarrier(refs, h, null); } else { Magic.setObjectAtOffset(refs, Offset.fromIntSignExtend(h << LOG_BYTES_IN_ADDRESS), null); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Statics.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Statics.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Statics.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -15,7 +15,7 @@ import org.jikesrvm.VM; import org.jikesrvm.Constants; import org.jikesrvm.ArchitectureSpecific.CodeArray; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.TIB; import org.jikesrvm.util.BitVector; @@ -569,7 +569,7 @@ // happen as the fault would only ever occur when not running the // VM. We suppress the warning as we know the error can't happen. - if (VM.runningVM && MM_Constants.NEEDS_PUTSTATIC_WRITE_BARRIER) { + if (VM.runningVM && MemoryManagerConstants.NEEDS_PUTSTATIC_WRITE_BARRIER) { MemoryManager.putstaticWriteBarrier(offset, object, 0); } else { setSlotContents(offset, Magic.objectAsAddress(object).toWord()); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Processor.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Processor.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Processor.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -15,7 +15,7 @@ import org.jikesrvm.ArchitectureSpecific.ProcessorLocalState; import org.jikesrvm.VM; import org.jikesrvm.Constants; -import org.jikesrvm.mm.mminterface.MM_ProcessorContext; +import org.jikesrvm.mm.mminterface.ProcessorContext; import org.jikesrvm.runtime.Entrypoints; import org.jikesrvm.runtime.Magic; import org.vmmagic.pragma.Entrypoint; @@ -33,7 +33,7 @@ */ @Uninterruptible @NonMoving -public abstract class Processor extends MM_ProcessorContext implements Constants { +public abstract class Processor extends ProcessorContext implements Constants { /* * definitions for VP status for implementation of jni */ Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Scheduler.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Scheduler.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Scheduler.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -26,7 +26,7 @@ import org.jikesrvm.compilers.opt.runtimesupport.OptCompiledMethod; import org.jikesrvm.compilers.opt.runtimesupport.OptEncodedCallSiteTree; import org.jikesrvm.compilers.opt.runtimesupport.OptMachineCodeMap; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.Magic; import org.jikesrvm.scheduler.greenthreads.GreenScheduler; @@ -181,7 +181,7 @@ if (index > threadHighWatermark) { threadHighWatermark = index; } - if (MM_Constants.NEEDS_WRITE_BARRIER) { + if (MemoryManagerConstants.NEEDS_WRITE_BARRIER) { MemoryManager.arrayStoreWriteBarrier(Scheduler.threads, index, thread); } else { @@ -219,7 +219,7 @@ * barrier. Generational collectors may not care about a null * store, but a reference counting collector sure does. */ - if (MM_Constants.NEEDS_WRITE_BARRIER) + if (MemoryManagerConstants.NEEDS_WRITE_BARRIER) MemoryManager.arrayStoreWriteBarrier(Scheduler.threads, threadSlot, null); Magic.setObjectAtOffset(Scheduler.threads, Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -13,7 +13,7 @@ package org.jikesrvm.scheduler; import org.jikesrvm.VM; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.Magic; import org.vmmagic.pragma.Inline; @@ -75,7 +75,7 @@ */ @Inline public static boolean tryCompareAndSwap(Object base, Offset offset, Object testValue, Object newValue) { - if (MM_Constants.NEEDS_WRITE_BARRIER) { + if (MemoryManagerConstants.NEEDS_WRITE_BARRIER) { return MemoryManager.tryCompareAndSwapWriteBarrier(base, offset, testValue, newValue); } else { Object oldValue; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenScheduler.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenScheduler.java 2008-07-23 19:14:40 UTC (rev 14777) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenScheduler.java 2008-07-23 19:54:19 UTC (rev 14778) @@ -17,7 +17,7 @@ import org.jikesrvm.classloader.TypeReference; import org.jikesrvm.mm.mminterface.CollectorThread; import org.jikesrvm.mm.mminterface.ConcurrentCollectorThread; -import org.jikesrvm.mm.mminterface.MM_Constants; +import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.osr.ObjectHolder; import org.jikesrvm.runtime.BootRecord; @@ -273,7 +273,7 @@ t.start(getProcessor(i).readyQueue); } - if (MM_Constants.NEEDS_CONCURRENT_WORKERS) { + if (MemoryManagerConstants.NEEDS_CONCURRENT_WORKERS) { // Start concurrent collector threads on each Processor. for (int i = getFirstProcessorId(); i <= getLastProcessorId(); i++) { GreenThread t = ConcurrentCollectorThread.createConcurrentCollectorThread(getProcessor(i)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cap...@us...> - 2008-07-24 20:18:46
|
Revision: 14789 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14789&view=rev Author: captain5050 Date: 2008-07-24 20:18:43 +0000 (Thu, 24 Jul 2008) Log Message: ----------- RVM-598 wip, add UnpreemptibleNoWarn annotation for unpreemptible code that calls interruptible code. Modified Paths: -------------- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/AnnotatedElement.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMMethod.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TypeReference.java Added Paths: ----------- rvmroot/trunk/common/vmmagic/src/org/vmmagic/pragma/UnpreemptibleNoWarn.java Added: rvmroot/trunk/common/vmmagic/src/org/vmmagic/pragma/UnpreemptibleNoWarn.java =================================================================== --- rvmroot/trunk/common/vmmagic/src/org/vmmagic/pragma/UnpreemptibleNoWarn.java (rev 0) +++ rvmroot/trunk/common/vmmagic/src/org/vmmagic/pragma/UnpreemptibleNoWarn.java 2008-07-24 20:18:43 UTC (rev 14789) @@ -0,0 +1,33 @@ +/* + * This file is part of the Jikes RVM project (http://jikesrvm.org). + * + * This file is licensed to You under the Common Public License (CPL); + * You may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.opensource.org/licenses/cpl1.0.php + * + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. + */ +package org.vmmagic.pragma; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.ElementType; +import org.vmmagic.Pragma; + +/** + * A special case of {@link Unpreemptible} where the code may call out to other + * interruptible routines. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +@Pragma +public @interface UnpreemptibleNoWarn { + /** + * @return Explanation of why code needs to be unpreemptible + */ + String value() default ""; +} Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/AnnotatedElement.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/AnnotatedElement.java 2008-07-24 17:35:29 UTC (rev 14788) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/AnnotatedElement.java 2008-07-24 20:18:43 UTC (rev 14789) @@ -233,6 +233,14 @@ } /** + * Return true if this element has a UninterruptibleNoWarn annotation. + * @see org.vmmagic.pragma.UninterruptibleNoWarn + */ + public final boolean hasUnpreemptibleNoWarnAnnotation() { + return isAnnotationDeclared(TypeReference.UnpreemptibleNoWarn); + } + + /** * Return true if this element has a Uninterruptible annotation. * @see org.vmmagic.pragma.Uninterruptible */ Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMMethod.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMMethod.java 2008-07-24 17:35:29 UTC (rev 14788) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMMethod.java 2008-07-24 20:18:43 UTC (rev 14789) @@ -573,6 +573,7 @@ if (hasUninterruptibleNoWarnAnnotation()) return false; if (hasUninterruptibleAnnotation()) return false; if (hasUnpreemptibleAnnotation()) return false; + if (hasUnpreemptibleNoWarnAnnotation()) return false; if (getDeclaringClass().hasUnpreemptibleAnnotation()) return false; return !getDeclaringClass().hasUninterruptibleAnnotation(); } @@ -588,6 +589,7 @@ if (hasUninterruptibleAnnotation()) return false; if (hasUninterruptibleNoWarnAnnotation()) return false; if (hasUnpreemptibleAnnotation()) return true; + if (hasUnpreemptibleNoWarnAnnotation()) return true; return getDeclaringClass().hasUnpreemptibleAnnotation(); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TypeReference.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TypeReference.java 2008-07-24 17:35:29 UTC (rev 14788) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TypeReference.java 2008-07-24 20:18:43 UTC (rev 14789) @@ -160,7 +160,9 @@ findOrCreate(org.vmmagic.pragma.LogicallyUninterruptible.class); public static final TypeReference Preemptible = findOrCreate(org.vmmagic.pragma.Preemptible.class); public static final TypeReference UninterruptibleNoWarn = - findOrCreate(org.vmmagic.pragma.UninterruptibleNoWarn.class); + findOrCreate(org.vmmagic.pragma.UninterruptibleNoWarn.class); + public static final TypeReference UnpreemptibleNoWarn = + findOrCreate(org.vmmagic.pragma.UnpreemptibleNoWarn.class); public static final TypeReference Uninterruptible = findOrCreate(org.vmmagic.pragma.Uninterruptible.class); public static final TypeReference Unpreemptible = findOrCreate(org.vmmagic.pragma.Unpreemptible.class); public static final TypeReference SpecializedMethodInvoke = findOrCreate(org.vmmagic.pragma.SpecializedMethodInvoke.class); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cap...@us...> - 2008-07-24 20:25:00
|
Revision: 14791 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14791&view=rev Author: captain5050 Date: 2008-07-24 20:24:53 +0000 (Thu, 24 Jul 2008) Log Message: ----------- RVM-598: increase use of unpreemptible, in particular thread yield and locking code should be unpreemptible as it can cause a context switch. Modified Paths: -------------- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ReferenceProcessor.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Strings.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/gcspy/Util.java rvmroot/trunk/rvm/src/org/jikesrvm/Services.java rvmroot/trunk/rvm/src/org/jikesrvm/VM.java rvmroot/trunk/rvm/src/org/jikesrvm/adaptive/measurements/organizers/Organizer.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMType.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/BaselineCompiledMethod.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineExceptionDeliverer.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/CompiledMethod.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/ExceptionTable.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/HardwareTrapCompiledMethod.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptCompiledMethod.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptSaveVolatile.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/ia32/OptExceptionDeliverer.java rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNICompiledMethod.java rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIEnvironment.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/CollectorThread.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Handshake.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MemoryManager.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/ExceptionDeliverer.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Processor.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Scheduler.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenLock.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenProcessor.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenScheduler.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenThread.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/ThreadEventWaitQueue.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/ThreadIOQueue.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/ThreadProcessWaitQueue.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/Wait.java Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -12,28 +12,29 @@ */ package org.jikesrvm.mm.mmtk; -import org.mmtk.plan.Plan; -import org.mmtk.plan.CollectorContext; -import org.mmtk.plan.MutatorContext; -import org.mmtk.utility.Finalizer; -import org.mmtk.utility.options.Options; - +import org.jikesrvm.ArchitectureSpecific; import org.jikesrvm.VM; +import org.jikesrvm.classloader.Atom; +import org.jikesrvm.classloader.RVMMethod; import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.compilers.common.CompiledMethods; +import org.jikesrvm.mm.mminterface.Selected; +import org.jikesrvm.mm.mminterface.CollectorThread; import org.jikesrvm.runtime.Magic; import org.jikesrvm.scheduler.Processor; +import org.jikesrvm.scheduler.RVMThread; import org.jikesrvm.scheduler.Scheduler; -import org.jikesrvm.scheduler.RVMThread; -import org.jikesrvm.ArchitectureSpecific; -import org.jikesrvm.classloader.Atom; -import org.jikesrvm.classloader.RVMMethod; -import org.jikesrvm.mm.mminterface.Selected; -import org.jikesrvm.mm.mminterface.CollectorThread; +import org.mmtk.plan.CollectorContext; +import org.mmtk.plan.MutatorContext; +import org.mmtk.plan.Plan; +import org.mmtk.utility.Finalizer; +import org.mmtk.utility.options.Options; +import org.vmmagic.pragma.Inline; +import org.vmmagic.pragma.Interruptible; +import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; +import org.vmmagic.unboxed.Address; -import org.vmmagic.unboxed.*; -import org.vmmagic.pragma.*; - @Uninterruptible public class Collection extends org.mmtk.vm.Collection implements org.mmtk.utility.Constants, org.jikesrvm.Constants { @@ -73,7 +74,7 @@ * @param why the reason why a collection was triggered. 0 to * <code>TRIGGER_REASONS - 1</code>. */ - @LogicallyUninterruptible + @Unpreemptible("Becoming another thread interrupts the current thread, avoid preemption in the process") public final void triggerCollection(int why) { triggerCollectionStatic(why); } @@ -81,7 +82,7 @@ /** * Joins a collection. */ - @LogicallyUninterruptible + @Unpreemptible("Becoming another thread interrupts the current thread, avoid preemption in the process") public final void joinCollection() { if (Options.verbose.getValue() >= 4) { VM.sysWriteln("Entered Collection.joinCollection(). Stack:"); @@ -101,7 +102,7 @@ * @param why the reason why a collection was triggered. 0 to * <code>TRIGGER_REASONS - 1</code>. */ - @LogicallyUninterruptible + @Unpreemptible("Change state of thread possibly context switching if generating exception") public static void triggerCollectionStatic(int why) { if (VM.VerifyAssertions) VM._assert((why >= 0) && (why < TRIGGER_REASONS)); @@ -135,7 +136,7 @@ * Check if there is an out of memory error waiting. */ @Inline - @LogicallyUninterruptible + @Unpreemptible("Exceptions may possibly cause yields") private static void checkForOutOfMemoryError(boolean afterCollection) { RVMThread myThread = Scheduler.getCurrentThread(); OutOfMemoryError oome = myThread.getOutOfMemoryError(); @@ -193,6 +194,7 @@ * Trigger an asynchronous collection, checking for memory * exhaustion first. */ + @Unpreemptible("Becoming another thread interrupts the current thread, avoid preemption in the process") public final void triggerAsyncCollection(int why) { Plan.setCollectionTriggered(); if (Options.verbose.getValue() >= 1) { @@ -313,6 +315,7 @@ * true if yielded. */ @Inline + @Unpreemptible("Becoming another thread interrupts the current thread, avoid preemption in the process") public boolean yieldpoint() { if (Processor.getCurrentProcessor().takeYieldpoint != 0) { RVMThread.yieldpointFromBackedge(); Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ReferenceProcessor.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ReferenceProcessor.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ReferenceProcessor.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -53,7 +53,7 @@ * Class fields */ - private static Lock lock = new Lock("ReferenceProcessor"); + private static final Lock lock = new Lock("ReferenceProcessor"); private static final ReferenceProcessor softReferenceProcessor = new ReferenceProcessor(Semantics.SOFT); @@ -202,6 +202,7 @@ * @param ref The reference to add */ @NoInline + @Unpreemptible("Non-preemptible but yield when table needs to be grown") private void addCandidate(Reference<?> ref, ObjectReference referent) { if (TRACE) { ObjectReference referenceAsAddress = ObjectReference.fromObject(ref); Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Strings.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Strings.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Strings.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -18,7 +18,8 @@ import org.vmmagic.pragma.*; -@Uninterruptible public final class Strings extends org.mmtk.vm.Strings { +@Uninterruptible +public final class Strings extends org.mmtk.vm.Strings { /** * Log a message. * @@ -46,24 +47,28 @@ * <b>TODO:</b> There are special memory management semantics here that * someone should document. * - * @param src the source string + * @param str the source string * @param dst the destination array * @param dstBegin the start offset in the desination array * @param dstEnd the index after the last character in the * destination to copy to * @return the number of characters copied. */ - @LogicallyUninterruptible - public int copyStringToChars(String src, char [] dst, + public int copyStringToChars(String str, char [] dst, int dstBegin, int dstEnd) { - if (VM.runningVM) + if (VM.runningVM) { Processor.getCurrentProcessor().disableThreadSwitching("Disabled for MMTk string copy"); - int len = src.length(); - int n = (dstBegin + len <= dstEnd) ? len : (dstEnd - dstBegin); - for (int i = 0; i < n; i++) - Services.setArrayNoBarrier(dst, dstBegin + i, src.charAt(i)); - if (VM.runningVM) + } + char[] str_backing = java.lang.JikesRVMSupport.getBackingCharArray(str); + int str_length = java.lang.JikesRVMSupport.getStringLength(str); + int str_offset = java.lang.JikesRVMSupport.getStringOffset(str); + int n = (dstBegin + str_length <= dstEnd) ? str_length : (dstEnd - dstBegin); + for (int i = 0; i < n; i++) { + Services.setArrayNoBarrier(dst, dstBegin + i, str_backing[str_offset+i]); + } + if (VM.runningVM) { Processor.getCurrentProcessor().enableThreadSwitching(); + } return n; } } Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/gcspy/Util.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/gcspy/Util.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/gcspy/Util.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -19,7 +19,6 @@ import org.jikesrvm.runtime.Magic; import static org.jikesrvm.runtime.SysCall.sysCall; -import org.jikesrvm.scheduler.Synchronization; import org.jikesrvm.classloader.RVMArray; import org.jikesrvm.objectmodel.ObjectModel; import org.jikesrvm.runtime.RuntimeEntrypoints; @@ -32,8 +31,8 @@ */ @Uninterruptible public class Util extends org.mmtk.vm.gcspy.Util implements Constants { private static final boolean DEBUG_ = false; - private static final int LOG_BYTES_IN_WORD = LOG_BYTES_IN_INT; - private static final int BYTES_IN_WORD = 1 << LOG_BYTES_IN_WORD; + public static final int KILOBYTE = 1024; + public static final int MEGABYTE = 1024 * 1024; /** * Allocate an array of bytes with malloc @@ -63,27 +62,6 @@ sysCall.sysFree(addr); } - - // From VM.java - @SuppressWarnings({"unused", "CanBeFinal", "UnusedDeclaration"}) // Accessed by native code - private static int sysWriteLock = 0; - private static Offset sysWriteLockOffset = Offset.max(); - - private static void swLock() { - if (org.jikesrvm.VM.BuildWithGCSpy) { - if (sysWriteLockOffset.isMax()) return; - while (!Synchronization.testAndSet(Magic.getJTOC(), sysWriteLockOffset, 1)) - ; - } - } - - private static void swUnlock() { - if (org.jikesrvm.VM.BuildWithGCSpy) { - if (sysWriteLockOffset.isMax()) return; - Synchronization.fetchAndStore(Magic.getJTOC(), sysWriteLockOffset, 0); - } - } - /** * Convert a String to a 0-terminated array of bytes * @@ -94,7 +72,7 @@ * which are interruptible. We protect these calls with a * swLock/swUnlock mechanism, as per VM.sysWrite on String */ - @LogicallyUninterruptible + @Unpreemptible public final Address getBytes(String str) { if (org.jikesrvm.VM.BuildWithGCSpy) { if (str == null) @@ -106,36 +84,20 @@ // Grab some memory sufficient to hold the null terminated string, // rounded up to an integral number of ints. - int len; - swLock(); - len = str.length(); - swUnlock(); - int size = ((len >>> LOG_BYTES_IN_WORD) + 1) << LOG_BYTES_IN_WORD; + char[] str_backing = java.lang.JikesRVMSupport.getBackingCharArray(str); + int str_length = java.lang.JikesRVMSupport.getStringLength(str); + int str_offset = java.lang.JikesRVMSupport.getStringOffset(str); + int size = (str_length + 4) & -4; Address rtn = malloc(size); - // Write the string into it, one word at a time, being carefull about endianism - for (int w = 0; w <= (len >>> LOG_BYTES_IN_WORD); w++) { - int value = 0; - int offset = w << LOG_BYTES_IN_WORD; - int shift = 0; - for (int b = 0; b < BYTES_IN_WORD; b++) { - byte byteVal = 0; - if (offset + b < len) { - swLock(); - byteVal = (byte) str.charAt(offset + b); // dodgy conversion! - swUnlock(); - } - // Endianism matters - if (org.jikesrvm.VM.BuildForIA32) { - value = (byteVal << shift) | value; - } else { - org.jikesrvm.VM._assert(org.jikesrvm.VM.NOT_REACHED); - value = (value << shift) | byteVal; // not tested - } - shift += BITS_IN_BYTE; - } - rtn.store(value, Offset.fromIntSignExtend(offset)); + // Write the string into it, one byte at a time (dodgy conversion) + for (int i=0; i < str_length; i++) { + rtn.store((byte)str_backing[str_offset+i], Offset.fromIntSignExtend(i)); } + // Zero rest of byte[] + for (int i=str_length; i < size; i++) { + rtn.store((byte)0, Offset.fromIntSignExtend(i-str_offset)); + } if (DEBUG_) { sysCall.sysWriteBytes(2/*SysTraceFd*/, rtn, size); Log.write("\n"); } @@ -145,9 +107,6 @@ } } - public static final int KILOBYTE = 1024; - public static final int MEGABYTE = 1024 * 1024; - /** * Pretty print a size, converting from bytes to kilo- or mega-bytes as appropriate * @@ -223,4 +182,3 @@ return 0; } } - Modified: rvmroot/trunk/rvm/src/org/jikesrvm/Services.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/Services.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/Services.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -21,6 +21,8 @@ import org.vmmagic.pragma.NoInline; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.pragma.UninterruptibleNoWarn; +import org.vmmagic.pragma.Unpreemptible; +import org.vmmagic.pragma.UnpreemptibleNoWarn; import org.vmmagic.unboxed.Offset; /** @@ -434,4 +436,18 @@ else return src[index]; } + + @Unpreemptible("Creates arrays possibly causes scheduling") + public static String stringConcatenator(String... args) { + String result=""; + for (String s:args) { + result = stringConcatenate(result, s); + } + return result; + } + + @UnpreemptibleNoWarn("Creates arrays possibly causes scheduling, no warning on call to string API") + public static String stringConcatenate(String a, String b) { + return a.concat(b); + } } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/VM.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/VM.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/VM.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -50,10 +50,11 @@ import org.vmmagic.pragma.Entrypoint; import org.vmmagic.pragma.Inline; import org.vmmagic.pragma.Interruptible; -import org.vmmagic.pragma.LogicallyUninterruptible; import org.vmmagic.pragma.NoInline; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.pragma.UninterruptibleNoWarn; +import org.vmmagic.pragma.Unpreemptible; +import org.vmmagic.pragma.UnpreemptibleNoWarn; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Extent; import org.vmmagic.unboxed.ObjectReference; @@ -982,15 +983,22 @@ } } - @LogicallyUninterruptible @NoInline /* don't waste code space inlining these --dave */ public static void writeField(int fieldWidth, String s) { write(s); - int len = s.length(); + int len = getStringLength(s); while (fieldWidth > len++) write(" "); } + @UninterruptibleNoWarn("Interruptible code not reachable at runtime") + private static int getStringLength(String s) { + if (VM.runningVM) { + return java.lang.JikesRVMSupport.getStringLength(s); + } else { + return s.length(); + } + } /** * Low level print to console. * @param value print value and left-fill with enough spaces to print at least fieldWidth characters @@ -2158,8 +2166,8 @@ * Exit virtual machine. * @param value value to pass to host o/s */ - @LogicallyUninterruptible /* TODO: This is completely wrong. This method is very much Interruptible */ @NoInline + @UnpreemptibleNoWarn public static void sysExit(int value) { handlePossibleRecursiveCallToSysExit(); if (Options.stackTraceAtExit) { @@ -2185,6 +2193,7 @@ * Should only be called if the VM is running. * @param value exit value */ + @Uninterruptible public static void shutdown(int value) { handlePossibleRecursiveShutdown(); @@ -2381,7 +2390,7 @@ * they are never called while gc is disabled. */ @Inline - @Interruptible + @Unpreemptible("We may boost the size of the stack with GC disabled and may get preempted doing this") public static void disableGC() { disableGC(false); // Recursion is not allowed in this context. } @@ -2393,7 +2402,7 @@ * enableGC(). */ @Inline - @Interruptible + @Unpreemptible("We may boost the size of the stack with GC disabled and may get preempted doing this") public static void disableGC(boolean recursiveOK) { // current (non-gc) thread is going to be holding raw addresses, therefore we must: // Modified: rvmroot/trunk/rvm/src/org/jikesrvm/adaptive/measurements/organizers/Organizer.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/adaptive/measurements/organizers/Organizer.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/adaptive/measurements/organizers/Organizer.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -18,6 +18,7 @@ import org.jikesrvm.scheduler.greenthreads.GreenThreadQueue; import org.vmmagic.pragma.NonMoving; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; /** * An Organizer acts an an intermediary between the low level @@ -84,7 +85,7 @@ * listener uses its own protocol to ensure that exactly 1 * thread will attempt to activate the organizer. */ - @Uninterruptible + @Unpreemptible private void passivate() { if (listener != null) { if (VM.VerifyAssertions) VM._assert(!listener.isActive()); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMType.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMType.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMType.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -296,6 +296,18 @@ } /** + * Instance of java.lang.Class corresponding to this type. + * This is commonly used for reflection. + */ + @Uninterruptible + public final Class<?> getResolvedClassForType() { + // Resolve the class so that we don't need to resolve it + // in reflection code + if (VM.VerifyAssertions) VM._assert(VM.runningVM && isResolved()); + return classForType; + } + + /** * Get offset of tib slot from start of jtoc, in bytes. */ @Uninterruptible Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/BaselineCompiledMethod.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/BaselineCompiledMethod.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/BaselineCompiledMethod.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -30,6 +30,7 @@ import org.jikesrvm.runtime.StackBrowser; import org.vmmagic.pragma.SynchronizedObject; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Offset; /** @@ -161,6 +162,7 @@ return exceptionDeliverer; } + @Unpreemptible public int findCatchBlockForInstruction(Offset instructionOffset, RVMType exceptionType) { if (eTable == null) { return -1; @@ -298,6 +300,7 @@ } /** Get the lock acquisition offset */ + @Uninterruptible public Offset getLockAcquisitionOffset() { return Offset.fromIntZeroExtend(lockOffset); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -119,6 +119,7 @@ /** * The last true local */ + @Uninterruptible public static int getEmptyStackOffset(NormalMethod m) { return getFirstLocalOffset(m) - (m.getLocalWords() << LG_WORDSIZE) + WORDSIZE; } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineExceptionDeliverer.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineExceptionDeliverer.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineExceptionDeliverer.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -24,6 +24,7 @@ import org.jikesrvm.scheduler.Processor; import org.jikesrvm.scheduler.Scheduler; import org.jikesrvm.scheduler.RVMThread; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Offset; @@ -37,6 +38,7 @@ * Pass control to a catch block. */ @Override + @Unpreemptible("Deliver exception possibly from unpreemptible code") public void deliverException(CompiledMethod compiledMethod, Address catchBlockInstructionAddress, Throwable exceptionObject, ArchitectureSpecific.Registers registers) { Address fp = registers.getInnermostFramePointer(); @@ -78,6 +80,7 @@ /** * Unwind a stackframe. */ + @Unpreemptible("Unwind stack possibly from unpreemptible code") public void unwindStackFrame(CompiledMethod compiledMethod, ArchitectureSpecific.Registers registers) { NormalMethod method = (NormalMethod) compiledMethod.getMethod(); Address fp = registers.getInnermostFramePointer(); @@ -88,7 +91,7 @@ if (instr.sGT(lockOffset)) { // we actually have the lock, so must unlock it. Object lock; if (method.isStatic()) { - lock = method.getDeclaringClass().getClassForType(); + lock = method.getDeclaringClass().getResolvedClassForType(); } else { lock = Magic.addressAsObject(fp.plus(BaselineCompilerImpl.locationToOffset(((BaselineCompiledMethod) compiledMethod).getGeneralLocalLocation( @@ -107,5 +110,3 @@ registers.unwindStackFrame(); } } - - Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/CompiledMethod.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/CompiledMethod.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/CompiledMethod.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -27,6 +27,7 @@ import org.vmmagic.pragma.Interruptible; import org.vmmagic.pragma.SynchronizedObject; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Offset; import org.vmmagic.unboxed.Word; @@ -426,6 +427,7 @@ * gc disabled when called by RuntimeEntrypoints.deliverException(). * </ul> */ + @Unpreemptible public abstract int findCatchBlockForInstruction(Offset instructionOffset, RVMType exceptionType); /** Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/ExceptionTable.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/ExceptionTable.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/ExceptionTable.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -17,6 +17,7 @@ import org.jikesrvm.classloader.DynamicTypeCheck; import org.jikesrvm.classloader.RVMType; import org.jikesrvm.objectmodel.TIB; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Offset; /** @@ -42,6 +43,7 @@ * @param exceptionType the type of exception that was raised * @return the machine code offset of the catch block. */ + @Unpreemptible public static int findCatchBlockForInstruction(int[] eTable, Offset instructionOffset, RVMType exceptionType) { for (int i = 0, n = eTable.length; i < n; i += 4) { // note that instructionOffset points to the instruction after the PEI Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/HardwareTrapCompiledMethod.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/HardwareTrapCompiledMethod.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/HardwareTrapCompiledMethod.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -20,6 +20,7 @@ import org.jikesrvm.runtime.StackBrowser; import org.vmmagic.pragma.SynchronizedObject; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Offset; /** @@ -52,6 +53,7 @@ return null; } + @Unpreemptible public int findCatchBlockForInstruction(Offset instructionOffset, RVMType exceptionType) { return -1; } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptCompiledMethod.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptCompiledMethod.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptCompiledMethod.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -41,6 +41,7 @@ import org.vmmagic.pragma.Interruptible; import org.vmmagic.pragma.SynchronizedObject; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Offset; /** @@ -84,7 +85,7 @@ /** * Find "catch" block for a machine instruction of this method. */ - @Interruptible + @Unpreemptible public int findCatchBlockForInstruction(Offset instructionOffset, RVMType exceptionType) { if (eTable == null) { return -1; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptSaveVolatile.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptSaveVolatile.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptSaveVolatile.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -21,7 +21,7 @@ import org.vmmagic.pragma.Entrypoint; import org.vmmagic.pragma.Interruptible; import org.vmmagic.pragma.SaveVolatile; -import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Offset; @@ -37,7 +37,7 @@ * @see org.jikesrvm.compilers.opt.driver.OptimizingCompiler (hooks to recognize & specially compile this class) */ @SaveVolatile -@Uninterruptible +@Unpreemptible("Yield methods shouldn't be preempted") public class OptSaveVolatile { /** Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/ia32/OptExceptionDeliverer.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/ia32/OptExceptionDeliverer.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/runtimesupport/ia32/OptExceptionDeliverer.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -23,6 +23,7 @@ import org.jikesrvm.scheduler.Processor; import org.jikesrvm.scheduler.Scheduler; import org.jikesrvm.scheduler.RVMThread; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Offset; @@ -38,6 +39,7 @@ /** * Pass control to a catch block. */ + @Unpreemptible("Deliver exception possibly from unpreemptible code") public void deliverException(CompiledMethod compiledMethod, Address catchBlockInstructionAddress, Throwable exceptionObject, Registers registers) { OptCompiledMethod optMethod = (OptCompiledMethod) compiledMethod; @@ -116,6 +118,7 @@ /** * Unwind a stackframe. */ + @Unpreemptible("Unwind stack possibly from unpreemptible code") public void unwindStackFrame(CompiledMethod compiledMethod, Registers registers) { Address fp = registers.getInnermostFramePointer(); OptCompiledMethod optMethod = (OptCompiledMethod) compiledMethod; @@ -154,4 +157,3 @@ } } } - Modified: rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNICompiledMethod.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNICompiledMethod.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNICompiledMethod.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -21,6 +21,7 @@ import org.jikesrvm.runtime.StackBrowser; import org.vmmagic.pragma.SynchronizedObject; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Offset; /** @@ -67,6 +68,7 @@ return false; } + @Unpreemptible public int findCatchBlockForInstruction(Offset instructionOffset, RVMType exceptionType) { return -1; } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIEnvironment.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIEnvironment.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIEnvironment.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -19,6 +19,7 @@ import org.jikesrvm.scheduler.Processor; import org.vmmagic.pragma.Entrypoint; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.pragma.Untraced; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.AddressArray; @@ -27,7 +28,7 @@ /** * A JNIEnvironment is created for each Java thread. */ -public class JNIEnvironment implements SizeConstants { +public final class JNIEnvironment implements SizeConstants { /** * initial size for JNI refs, later grow as needed @@ -179,6 +180,7 @@ * terminating a thread that has a JNI environment allocated to it. * @param env the JNIEnvironment to deallocate */ + @Unpreemptible("Deallocate environment but may contend with environment being allocated") public static synchronized void deallocateEnvironment(JNIEnvironment env) { env.next = pool; pool = env; @@ -188,27 +190,27 @@ * accessor methods */ @Uninterruptible - public final boolean hasNativeStackFrame() { + public boolean hasNativeStackFrame() { return alwaysHasNativeFrame || JNIRefsTop != 0; } @Uninterruptible - public final Address topJavaFP() { + public Address topJavaFP() { return JNITopJavaFP; } @Uninterruptible - public final AddressArray refsArray() { + public AddressArray refsArray() { return JNIRefs; } @Uninterruptible - public final int refsTop() { + public int refsTop() { return JNIRefsTop; } @Uninterruptible - public final int savedRefsFP() { + public int savedRefsFP() { return JNIRefsSavedFP; } @@ -219,7 +221,7 @@ * @param ref the object to put on stack * @return offset of entry in JNIRefs stack */ - public final int pushJNIRef(Object ref) { + public int pushJNIRef(Object ref) { if (ref == null) { return 0; } @@ -252,7 +254,7 @@ * @param offset in JNIRefs stack * @return reference at that offset */ - public final Object getJNIRef(int offset) { + public Object getJNIRef(int offset) { if (offset > JNIRefsTop) { VM.sysWrite("JNI ERROR: getJNIRef for illegal offset > TOP, "); VM.sysWrite(offset); @@ -272,7 +274,7 @@ * Remove a reference from the JNIRefs stack. * @param offset in JNIRefs stack */ - public final void deleteJNIRef(int offset) { + public void deleteJNIRef(int offset) { if (offset > JNIRefsTop) { VM.sysWrite("JNI ERROR: getJNIRef for illegal offset > TOP, "); VM.sysWrite(offset); @@ -290,7 +292,7 @@ * Dump the JNIRefs stack to the sysWrite stream */ @Uninterruptible - public final void dumpJniRefsStack() { + public void dumpJniRefsStack() { int jniRefOffset = JNIRefsTop; VM.sysWrite("\n* * dump of JNIEnvironment JniRefs Stack * *\n"); VM.sysWrite("* JNIRefs = "); @@ -316,7 +318,7 @@ * to the Java caller; clear the exception by recording null * @param e An exception or error */ - public final void recordException(Throwable e) { + public void recordException(Throwable e) { // don't overwrite the first exception except to clear it if (pendingException == null || e == null) { pendingException = e; @@ -326,7 +328,7 @@ /** * @return the pending exception */ - public final Throwable getException() { + public Throwable getException() { return pendingException; } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/CollectorThread.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/CollectorThread.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/CollectorThread.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -36,6 +36,7 @@ import org.vmmagic.pragma.NoOptCompile; import org.vmmagic.pragma.NonMoving; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Offset; @@ -280,7 +281,7 @@ * * @param handshake Handshake for the requested collection */ - @Uninterruptible + @Unpreemptible("Becoming another thread interrupts the current thread, avoid preemption in the process") public static void asyncCollect(Handshake handshake, int why) { handshake.requestAndContinue(why); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Handshake.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Handshake.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Handshake.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -20,6 +20,7 @@ import org.jikesrvm.scheduler.greenthreads.GreenThread; import org.vmmagic.pragma.LogicallyUninterruptible; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; /** * Handshake handles mutator requests to initiate a collection, and @@ -82,7 +83,7 @@ * caller continues until it yields to the GC. It may thus make * this call at an otherwise unsafe point. */ - @Uninterruptible + @Unpreemptible("Change state of thread possibly context switching if generating exception") public void requestAndContinue(int why) { request(why); } @@ -119,7 +120,7 @@ * for the collection. They reside in the thread dispatch queues of their * processors, until the collector threads re-enable thread switching. */ - @Uninterruptible + @Unpreemptible("Becoming another thread interrupts the current thread, avoid preemption in the process") private void initiateCollection() { /* check that scheduler initialization is complete */ @@ -174,7 +175,7 @@ * * @return The number of GC threads. */ - @Uninterruptible + @Unpreemptible("Becoming another thread interrupts the current thread, avoid preemption in the process") private int waitForPrecedingGC() { /* * Get the number of GC threads. Include NativeDaemonProcessor @@ -228,7 +229,7 @@ * * @return true if the completion flag is not already set. */ - @Uninterruptible + @Unpreemptible("Becoming another thread interrupts the current thread, avoid preemption in the process") private boolean request(int why) { lock.acquire(); if (completionFlag) { @@ -274,5 +275,3 @@ lock.release(); } } - - Modified: rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MemoryManager.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MemoryManager.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MemoryManager.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -55,6 +55,8 @@ import org.vmmagic.pragma.NoInline; import org.vmmagic.pragma.Pure; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; +import org.vmmagic.pragma.UnpreemptibleNoWarn; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Extent; import org.vmmagic.unboxed.ObjectReference; @@ -669,7 +671,7 @@ * See also: bytecode 0xbc ("newarray") and 0xbd ("anewarray") */ @Inline - @Interruptible + @Unpreemptible public static Object allocateArray(int numElements, int logElementSize, int headerSize, TIB tib, int allocator, int align, int offset, int site) { int elemBytes = numElements << logElementSize; @@ -688,7 +690,7 @@ * so it can be forced out of line. */ @NoInline - @Interruptible + @UnpreemptibleNoWarn private static void throwLargeArrayOutOfMemoryError() { throw new OutOfMemoryError(); } @@ -819,7 +821,7 @@ * @return The stack */ @Inline - @Interruptible + @Unpreemptible public static byte[] newStack(int bytes, boolean immortal) { if (!VM.runningVM) { return new byte[bytes]; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -29,6 +29,7 @@ import org.vmmagic.pragma.Interruptible; import org.vmmagic.pragma.NoInline; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.ObjectReference; import org.vmmagic.unboxed.Offset; @@ -576,6 +577,7 @@ /** * Generic lock */ + @Unpreemptible("Become another thread when lock is contended, don't preempt in other cases") public static void genericLock(Object o) { ThinLock.lock(o, STATUS_OFFSET); } @@ -583,6 +585,7 @@ /** * Generic unlock */ + @Unpreemptible("No interruption unless of exceptions") public static void genericUnlock(Object o) { ThinLock.unlock(o, STATUS_OFFSET); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -26,6 +26,7 @@ import org.vmmagic.pragma.Inline; import org.vmmagic.pragma.Interruptible; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Extent; import org.vmmagic.unboxed.ObjectReference; @@ -462,6 +463,7 @@ * Generic lock */ @Entrypoint + @Unpreemptible("Become another thread when lock is contended, don't preempt in other cases") public static void genericLock(Object o) { JavaHeader.genericLock(o); } @@ -470,6 +472,7 @@ * Generic unlock */ @Entrypoint + @Unpreemptible("No preemption normally, but may raise exceptions") public static void genericUnlock(Object o) { JavaHeader.genericUnlock(o); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/runtime/ExceptionDeliverer.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/runtime/ExceptionDeliverer.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/runtime/ExceptionDeliverer.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -14,6 +14,7 @@ import org.jikesrvm.ArchitectureSpecific.Registers; import org.jikesrvm.compilers.common.CompiledMethod; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Address; /** @@ -59,6 +60,7 @@ * @param registers registers to be loaded before passing control to * catch block */ + @Unpreemptible("Deliver exception possibly from unpreemptible code") public abstract void deliverException(CompiledMethod compiledMethod, Address catchBlockInstructionAddress, Throwable exceptionObject, Registers registers); @@ -82,5 +84,6 @@ * @param registers thread state to be updated by restoring non-volatiles * and unwinding the stackframe */ + @Unpreemptible("Unwind stack possibly from unpreemptible code") public abstract void unwindStackFrame(CompiledMethod compiledMethod, Registers registers); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -36,6 +36,8 @@ import org.vmmagic.pragma.NoInline; import org.vmmagic.pragma.Pure; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; +import org.vmmagic.pragma.UnpreemptibleNoWarn; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Offset; @@ -583,6 +585,7 @@ */ @NoInline @Entrypoint + @Unpreemptible("Deliver exception possibly from unpreemptible code") public static void athrow(Throwable exceptionObject) { RVMThread myThread = Scheduler.getCurrentThread(); Registers exceptionRegisters = myThread.getExceptionRegisters(); @@ -923,6 +926,7 @@ * <li> <em> or </em> current thread is terminated if no catch block is found * </ul> */ + @Unpreemptible("Deliver exception trying to avoid preemption") private static void deliverException(Throwable exceptionObject, Registers exceptionRegisters) { if (VM.TraceExceptionDelivery) { VM.sysWriteln("RuntimeEntrypoints.deliverException() entered; just got an exception object."); @@ -966,11 +970,14 @@ VM.sysWriteln("RuntimeEntrypoints.deliverException() found no catch block."); } /* No appropriate catch block found. */ + handleUncaughtException(exceptionObject); + } + @UnpreemptibleNoWarn("Uncaught exception handling that may cause preemption") + private static void handleUncaughtException(Throwable exceptionObject) { Scheduler.getCurrentThread().handleUncaughtException(exceptionObject); } - /** * Skip over all frames below currfp with saved code pointers outside of heap * (C frames), stopping at the native frame immediately preceding the glue @@ -1030,6 +1037,7 @@ * invokers save/restore any nonvolatiles, so we're probably ok. * --dave 6/29/01 */ + @Uninterruptible private static void unwindInvisibleStackFrame(Registers registers) { registers.unwindStackFrame(); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Processor.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Processor.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Processor.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -22,6 +22,7 @@ import org.vmmagic.pragma.Inline; import org.vmmagic.pragma.NonMoving; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.pragma.Untraced; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Offset; @@ -358,6 +359,7 @@ * Note: This method is ONLY intended for use by Thread. * @param timerTick timer interrupted if true */ + @Unpreemptible("Becoming another thread interrupts the current thread, avoid preemption in the process") public abstract void dispatch(boolean timerTick); /** Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -38,11 +38,12 @@ import org.vmmagic.pragma.BaselineSaveLSRegisters; import org.vmmagic.pragma.Entrypoint; import org.vmmagic.pragma.Interruptible; -import org.vmmagic.pragma.LogicallyUninterruptible; import org.vmmagic.pragma.NoInline; import org.vmmagic.pragma.NoOptCompile; import org.vmmagic.pragma.NonMoving; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; +import org.vmmagic.pragma.UnpreemptibleNoWarn; import org.vmmagic.pragma.Untraced; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Offset; @@ -556,8 +557,8 @@ * @param oldState the previous thread state * @param newState the new thread state */ - @LogicallyUninterruptible @Entrypoint + @UnpreemptibleNoWarn("Change state of thread possibly context switching if generating exception") protected final void changeThreadState(State oldState, State newState) { if (trace) { VM.sysWrite("Thread.changeThreadState: thread=", threadSlot, name); @@ -568,8 +569,15 @@ if (state == oldState) { state = newState; } else { - throw new IllegalThreadStateException("Illegal thread state change from " + - oldState + " to " + newState + " when in state " + state + " in thread " + name); + throw new IllegalThreadStateException( + Services.stringConcatenator("Illegal thread state change from ", + java.lang.JikesRVMSupport.getEnumName(oldState), + " to ", + java.lang.JikesRVMSupport.getEnumName(newState), + " when in state ", + java.lang.JikesRVMSupport.getEnumName(state), + " in thread ", + name)); } } @@ -644,6 +652,7 @@ * Update internal state of Thread and Scheduler to indicate that * a thread is about to start */ + @Unpreemptible("Exceptions may possibly cause yields") public final void registerThread() { changeThreadState(State.NEW, State.RUNNABLE); registerThreadInternal(); @@ -801,6 +810,7 @@ // OSR_BaselineExecStateExtractor.java, should then restore all non-volatiles before stack replacement //todo fix this -- related to SaveVolatile @Entrypoint + @Unpreemptible("Becoming another thread interrupts the current thread, avoid preemption in the process") public static void yieldpointFromPrologue() { Address fp = Magic.getFramePointer(); org.jikesrvm.scheduler.greenthreads.GreenThread.yieldpoint(PROLOGUE, fp); @@ -816,6 +826,7 @@ // OSR_BaselineExecStateExtractor.java, should then restore all non-volatiles before stack replacement // TODO fix this -- related to SaveVolatile @Entrypoint + @Unpreemptible("Becoming another thread interrupts the current thread, avoid preemption in the process") public static void yieldpointFromBackedge() { Address fp = Magic.getFramePointer(); org.jikesrvm.scheduler.greenthreads.GreenThread.yieldpoint(BACKEDGE, fp); @@ -831,6 +842,7 @@ // OSR_BaselineExecStateExtractor.java, should then restore all non-volatiles before stack replacement // TODO fix this -- related to SaveVolatile @Entrypoint + @Unpreemptible("Becoming another thread interrupts the current thread, avoid preemption in the process") public static void yieldpointFromEpilogue() { Address fp = Magic.getFramePointer(); org.jikesrvm.scheduler.greenthreads.GreenThread.yieldpoint(EPILOGUE, fp); @@ -849,7 +861,7 @@ * Suspend execution of current thread until it is resumed. * Call only if caller has appropriate security clearance. */ - @LogicallyUninterruptible + @Unpreemptible("Exceptions may possibly cause yields") public final void suspend() { Throwable rethrow = null; changeThreadState(State.RUNNABLE, State.SUSPENDED); @@ -967,8 +979,7 @@ * @param o the object synchronized on * @param millis the number of milliseconds to wait for notification */ - @LogicallyUninterruptible - /* only loses control at expected points -- I think -dave */ + @Interruptible public static void wait(Object o, long millis) { if (STATS) timedWaitOperations++; RVMThread t = Scheduler.getCurrentThread(); @@ -992,15 +1003,16 @@ */ protected abstract void notifyAllInternal(Object o, Lock l); - @LogicallyUninterruptible - private static void raiseIllegalMonitorStateException(String msg, Object o) { - throw new IllegalMonitorStateException(msg + o); + @UnpreemptibleNoWarn("Possible context when generating exception") + public static void raiseIllegalMonitorStateException(String msg, Object o) { + throw new IllegalMonitorStateException(Services.stringConcatenate(msg, o.toString())); } /** * Support for Java {@link java.lang.Object#notify()} synchronization primitive. * * @param o the object synchronized on */ + @Interruptible public static void notify(Object o) { if (STATS) notifyOperations++; Lock l = ObjectModel.getHeavyLock(o, false); @@ -1018,6 +1030,7 @@ * @param o the object synchronized on * @see java.lang.Object#notifyAll */ + @Interruptible public static void notifyAll(Object o) { if (STATS) notifyAllOperations++; Scheduler.LockModel l = (Scheduler.LockModel)ObjectModel.getHeavyLock(o, false); @@ -1041,7 +1054,6 @@ /** * Deliver the throwable stopping/interrupting this thread */ - @LogicallyUninterruptible public void kill(Throwable cause, boolean throwImmediately) { // yield() will notice the following and take appropriate action this.causeOfThreadDeath = cause; @@ -1141,7 +1153,6 @@ /** * Get this thread's index in {@link Scheduler#threads}[]. */ - @LogicallyUninterruptible public final int getIndex() { if (VM.VerifyAssertions) VM._assert((state == State.TERMINATED) || Scheduler.threads[threadSlot] == this); return threadSlot; @@ -1163,7 +1174,7 @@ * @param exceptionRegisters register state at which stack overflow trap * was encountered (null --> normal method call, not a trap) */ - @Interruptible + @Unpreemptible public static void resizeCurrentStack(int newSize, Registers exceptionRegisters) { if (traceAdjustments) VM.sysWrite("Thread: resizeCurrentStack\n"); if (MemoryManager.gcInProgress()) { @@ -1560,18 +1571,22 @@ /** * Throw the external interrupt associated with the thread now it is running */ - @LogicallyUninterruptible + @Unpreemptible("Exceptions may possibly cause yields") protected final void postExternalInterrupt() { throwInterruptWhenScheduled = false; Throwable t = causeOfThreadDeath; causeOfThreadDeath = null; if (t instanceof InterruptedException && t != proxyInterruptException) { - t.fillInStackTrace(); + fillInStackTrace(t); } state = State.RUNNABLE; RuntimeEntrypoints.athrow(t); } + @UnpreemptibleNoWarn("Call out to API possibly losing control") + private static void fillInStackTrace(Throwable t) { + t.fillInStackTrace(); + } /** * Was this thread interrupted? * @return whether the thread has been interrupted Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Scheduler.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Scheduler.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Scheduler.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -32,9 +32,10 @@ import org.jikesrvm.scheduler.greenthreads.GreenScheduler; import org.vmmagic.pragma.Entrypoint; import org.vmmagic.pragma.Interruptible; -import org.vmmagic.pragma.LogicallyUninterruptible; import org.vmmagic.pragma.NonMoving; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.UninterruptibleNoWarn; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Offset; @@ -151,16 +152,9 @@ * <b>Assumption:</b> call is guarded by threadCreationMutex. * @return the thread slot assigned this thread */ - @LogicallyUninterruptible static int assignThreadSlot(RVMThread thread) { if (!VM.runningVM) { - // create primordial thread (in boot image) - int threadSlot = Scheduler.PRIMORDIAL_THREAD_INDEX; - Scheduler.threads[threadSlot] = (ThreadModel)thread; - // note that Scheduler.threadAllocationIndex (search hint) - // is out of date - Scheduler.numActiveThreads ++; - return PRIMORDIAL_THREAD_INDEX; + return bootImageAssignThreadSlot(thread); } else { Scheduler.threadCreationMutex.lock("thread creation mutex"); for (int cnt = threads.length; --cnt >= 1;) { @@ -197,6 +191,16 @@ } } + @UninterruptibleNoWarn("Only called when writing the boot image") + private static int bootImageAssignThreadSlot(RVMThread thread) { + // create primordial thread (in boot image) + int threadSlot = Scheduler.PRIMORDIAL_THREAD_INDEX; + Scheduler.threads[threadSlot] = (ThreadModel)thread; + // note that Scheduler.threadAllocationIndex (search hint) + // is out of date + Scheduler.numActiveThreads ++; + return PRIMORDIAL_THREAD_INDEX; + } /** * Release this thread's threads[] slot. * Assumption: call is guarded by threadCreationMutex. @@ -265,11 +269,13 @@ /** * Schedule another thread */ + @Unpreemptible("Becoming another thread interrupts the current thread, avoid preemption in the process") protected abstract void yieldInternal(); /** * Schedule another thread */ + @Unpreemptible("Becoming another thread interrupts the current thread, avoid preemption in the process") public static void yield() { getScheduler().yieldInternal(); } @@ -318,11 +324,9 @@ getScheduler().bootInternal(); } /** Scheduler specific sysExit shutdown */ - @Interruptible protected abstract void sysExitInternal(); /** Scheduler specific sysExit shutdown */ - @Interruptible public static void sysExit() { getScheduler().sysExitInternal(); } @@ -657,19 +661,22 @@ /** * Dump stack of calling thread, starting at callers frame */ - @LogicallyUninterruptible public static void dumpStack() { if (VM.runningVM) { dumpStack(Magic.getFramePointer()); } else { - StackTraceElement[] elements = - (new Throwable("--traceback from Jikes RVM's Scheduler class--")).getStackTrace(); - for (StackTraceElement element: elements) { - System.err.println(element.toString()); - } + bootImageDumpStack(); } } + @UninterruptibleNoWarn("Only called when writing the boot image") + private static void bootImageDumpStack() { + StackTraceElement[] elements = + (new Throwable("--traceback from Jikes RVM's Scheduler class--")).getStackTrace(); + for (StackTraceElement element: elements) { + System.err.println(element.toString()); + } + } /** * Dump state of a (stopped) thread's stack. * @param fp address of starting frame. first frame output Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java 2008-07-24 20:20:47 UTC (rev 14790) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java 2008-07-24 20:24:53 UTC (rev 14791) @@ -20,9 +20,9 @@ import org.jikesrvm.runtime.Magic; import org.vmmagic.pragma.Entrypoint; import org.vmmagic.pragma.Inline; -import org.vmmagic.pragma.LogicallyUninterruptible; import org.vmmagic.pragma.NoInline; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Offset; import org.vmmagic.unboxed.Word; @@ -74,6 +74,7 @@ */ @Inline @Entrypoint + @Unpreemptible("Become another thread when lock is contended, don't preempt in other cases") static void inlineLock(Object o, Offset lockOffset) { Word old = Magic.prepareWord(o, lockOffset); if (old.rshl(TL_THREAD_ID_SHIFT).isZero()) { @@ -100,6 +101,7 @@ */ @Inline @Entrypoint + @Unpreemptible("No preemption normally, but may raise exceptions") static void inlineUnlock(Object o, Offset lockOffset) { Word old = Magic.prepareWord(o, lockOffset); Word threadId = Word.fromIntZeroExtend(Processor.getCurrentProcessor().threadId); @@ -121,6 +123,7 @@ * @param lockOffset the offset of the thin lock word in the object. */ @NoInline + @Unpreemptible("Become another thread when lock is contended, don't preempt in other cases") public static void lock(Object o, Offset lockOffset) { major: while (true) { // repeat only if attempt to lock a promoted lock fails @@ -197,6 +200,7 @@ * @param lockOffset the offset of the thin lock word in the object. */ @NoInline + @Unpreemptible("No preemption normally, but may raise exceptions") public static void unlock(Object o, Offset lockOffset) { Magic.sync(); // prevents stale data from being seen by next owner of the lock while (true) { // spurious contention detected @@ -212,7 +216,7 @@ Scheduler.trace("Lock", "unlock error: thin lock word = ", old.toAddress()); Scheduler.trace("Lock", "unlock error: thin lock word = ", Magic.objectAsAddress(o)); // Scheduler.trace("Lock", Thread.getCurrentThread().toString(), 0); - raiseIllegalMonitorStateException("thin unlocking", o); + RVMThread.raiseIllegalMonitorStateException("thin unlocking", o); } if (old.and(TL_LOCK_COUNT_MASK).isZero()) { // get count, 0 is the last lock Word changed = old.and(TL_UNLOCK_MASK); @@ -230,11 +234,6 @@ } } - @LogicallyUninterruptible - private static void raiseIllegalMonitorStateException(String msg, Object o) { - throw new IllegalMonitorStateException(msg + o); - } - ////////////////////////////////////////////... [truncated message content] |
From: <cap...@us...> - 2008-07-25 21:09:42
|
Revision: 14800 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14800&view=rev Author: captain5050 Date: 2008-07-25 21:09:37 +0000 (Fri, 25 Jul 2008) Log Message: ----------- RVM-115: remove logically uninteruptible from RVM code. Reduce use of warnings. Tighten unpreemptible to uninteruptible and remove use of no warn variants if possible. Modified Paths: -------------- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ReferenceProcessor.java rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/Reference.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineMagic.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/CompiledMethods.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/GenerateMagic.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/CollectorThread.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/ConcurrentCollectorThread.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Handshake.java rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/MiscHeader.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Magic.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/MagicNames.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenScheduler.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenThreadQueue.java Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ReferenceProcessor.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ReferenceProcessor.java 2008-07-25 21:05:12 UTC (rev 14799) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ReferenceProcessor.java 2008-07-25 21:09:37 UTC (rev 14800) @@ -333,6 +333,7 @@ * @param addr the address of the Reference object * @return <code>true</code> if the reference was enqueued */ + @Unpreemptible public boolean enqueueReference(ObjectReference addr) { Reference<?> reference = (Reference<?>)addr.toObject(); return reference.enqueue(); @@ -377,6 +378,7 @@ * be the address of a heap object, depending on the VM. * @param trace the thread local trace element. */ + @UnpreemptibleNoWarn("Call out to ReferenceQueue API") public ObjectReference processReference(TraceLocal trace, ObjectReference reference) { if (VM.VerifyAssertions) VM._assert(!reference.isNull()); Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/Reference.java =================================================================== --- rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/Reference.java 2008-07-25 21:05:12 UTC (rev 14799) +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/ref/Reference.java 2008-07-25 21:09:37 UTC (rev 14800) @@ -16,8 +16,8 @@ import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.Magic; import org.vmmagic.pragma.Inline; -import org.vmmagic.pragma.LogicallyUninterruptible; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.UnpreemptibleNoWarn; import org.vmmagic.unboxed.Address; /** @@ -43,7 +43,7 @@ * classpath release. * @see java.lang.ref.ReferenceQueue */ - Reference nextOnQueue; + Reference<T> nextOnQueue; /** @@ -110,8 +110,7 @@ * that users might find confusing. We think the problem is actually * not a 'real' problem... */ - @LogicallyUninterruptible - @Uninterruptible + @UnpreemptibleNoWarn("Call out to ReferenceQueue API") public boolean enqueue() { if (nextOnQueue == null && queue != null) { queue.enqueue(this); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineMagic.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineMagic.java 2008-07-25 21:05:12 UTC (rev 14799) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineMagic.java 2008-07-25 21:09:37 UTC (rev 14800) @@ -39,6 +39,7 @@ import org.jikesrvm.scheduler.Processor; import org.jikesrvm.scheduler.ProcessorTable; import org.jikesrvm.scheduler.RVMThread; +import org.jikesrvm.scheduler.greenthreads.GreenProcessor; import org.jikesrvm.util.ImmutableEntryHashMapRVM; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.AddressArray; @@ -958,6 +959,7 @@ generators.put(getMethodReference(Magic.class, MagicNames.objectAsShortArray, Object.class, short[].class), g); generators.put(getMethodReference(Magic.class, MagicNames.objectAsIntArray, Object.class, int[].class), g); generators.put(getMethodReference(Magic.class, MagicNames.objectAsProcessor, Object.class, Processor.class), g); + generators.put(getMethodReference(Magic.class, MagicNames.processorAsGreenProcessor, Processor.class, GreenProcessor.class), g); generators.put(getMethodReference(Magic.class, MagicNames.objectAsThread, Object.class, RVMThread.class), g); generators.put(getMethodReference(Magic.class, MagicNames.threadAsCollectorThread, RVMThread.class, CollectorThread.class), g); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java 2008-07-25 21:05:12 UTC (rev 14799) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java 2008-07-25 21:09:37 UTC (rev 14800) @@ -4770,6 +4770,7 @@ methodName == MagicNames.objectAsShortArray || methodName == MagicNames.objectAsIntArray || methodName == MagicNames.objectAsProcessor || + methodName == MagicNames.processorAsGreenProcessor || methodName == MagicNames.objectAsThread || methodName == MagicNames.threadAsCollectorThread || methodName == MagicNames.floatAsIntBits || Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/CompiledMethods.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/CompiledMethods.java 2008-07-25 21:05:12 UTC (rev 14799) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/common/CompiledMethods.java 2008-07-25 21:09:37 UTC (rev 14800) @@ -17,6 +17,7 @@ import java.util.TreeMap; import org.jikesrvm.VM; +import org.jikesrvm.Services; import org.jikesrvm.SizeConstants; import org.jikesrvm.classloader.RVMArray; import org.jikesrvm.classloader.RVMMethod; @@ -88,9 +89,11 @@ /** * Set entry in compiled method lookup */ + @Uninterruptible private static void setCompiledMethod(int cmid, CompiledMethod cm) { int column = cmid >> LOG_ROW_SIZE; - compiledMethods[column][cmid & ROW_MASK] = cm; + CompiledMethod[] col = compiledMethods[column]; + Services.setArrayUninterruptible(col, cmid & ROW_MASK, cm); } /** @@ -220,6 +223,7 @@ * NOTE: It's expected that this is processed during GC, after scanning * stacks to determine which methods are currently executing. */ + @Uninterruptible public static void snipObsoleteCompiledMethods() { Magic.isync(); if (!scanForObsoleteMethods) return; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/GenerateMagic.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/GenerateMagic.java 2008-07-25 21:05:12 UTC (rev 14799) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/GenerateMagic.java 2008-07-25 21:09:37 UTC (rev 14800) @@ -102,6 +102,7 @@ import org.jikesrvm.runtime.ArchEntrypoints; import org.jikesrvm.runtime.MagicNames; import org.jikesrvm.scheduler.Scheduler; +import org.jikesrvm.scheduler.greenthreads.GreenProcessor; import org.vmmagic.pragma.Interruptible; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Offset; @@ -511,6 +512,10 @@ RegisterOperand reg = gc.temps.makeTemp(Scheduler.getProcessorType()); bc2ir.appendInstruction(Move.create(REF_MOVE, reg, bc2ir.popRef())); bc2ir.push(reg.copyD2U()); + } else if (methodName == MagicNames.processorAsGreenProcessor) { + RegisterOperand reg = gc.temps.makeTemp(TypeReference.findOrCreate(GreenProcessor.class)); + bc2ir.appendInstruction(Move.create(REF_MOVE, reg, bc2ir.popRef())); + bc2ir.push(reg.copyD2U()); } else if (methodName == MagicNames.objectAsThread) { RegisterOperand reg = gc.temps.makeTemp(Scheduler.getThreadType()); bc2ir.appendInstruction(Move.create(REF_MOVE, reg, bc2ir.popRef())); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/CollectorThread.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/CollectorThread.java 2008-07-25 21:05:12 UTC (rev 14799) +++ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/CollectorThread.java 2008-07-25 21:09:37 UTC (rev 14800) @@ -32,11 +32,11 @@ import org.vmmagic.pragma.BaselineNoRegisters; import org.vmmagic.pragma.BaselineSaveLSRegisters; import org.vmmagic.pragma.Interruptible; -import org.vmmagic.pragma.LogicallyUninterruptible; import org.vmmagic.pragma.NoOptCompile; import org.vmmagic.pragma.NonMoving; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.pragma.Unpreemptible; +import org.vmmagic.pragma.UnpreemptibleNoWarn; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Offset; @@ -267,8 +267,7 @@ * * @param handshake Handshake for the requested collection */ - @LogicallyUninterruptible - @Uninterruptible + @Unpreemptible("Becoming another thread interrupts the current thread, avoid preemption in the process") public static void collect(Handshake handshake, int why) { handshake.requestAndAwaitCompletion(why); } @@ -338,15 +337,13 @@ * different for the different allocators/collectors that the RVM * can be configured to use. */ - @LogicallyUninterruptible - // due to call to snipObsoleteCompiledMethods @NoOptCompile // refs stored in registers by opt compiler will not be relocated by GC @BaselineNoRegisters // refs stored in registers by baseline compiler will not be relocated by GC, so use stack only @BaselineSaveLSRegisters // and store all registers from previous method in prologue, so that we can stack access them while scanning this thread. - @Uninterruptible + @Unpreemptible public void run() { for (int count = 0; ; count++) { /* suspend this thread: it will resume when scheduled by @@ -513,8 +510,7 @@ * Allocate an OutOfMemoryError for a given thread. * @param thread */ - @LogicallyUninterruptible - @Uninterruptible + @UnpreemptibleNoWarn("Calls out to interruptible OOME constructor") public void allocateOOMEForThread(RVMThread thread) { /* We are running inside a gc thread, so we will allocate if physically possible */ this.setThreadForStackTrace(thread); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/ConcurrentCollectorThread.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/ConcurrentCollectorThread.java 2008-07-25 21:05:12 UTC (rev 14799) +++ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/ConcurrentCollectorThread.java 2008-07-25 21:09:37 UTC (rev 14800) @@ -19,9 +19,9 @@ import org.jikesrvm.scheduler.greenthreads.GreenScheduler; import org.jikesrvm.scheduler.greenthreads.GreenThread; import org.vmmagic.pragma.Interruptible; -import org.vmmagic.pragma.LogicallyUninterruptible; import org.vmmagic.pragma.NonMoving; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Unpreemptible; /** * Threads that perform collector work while mutators are active. these @@ -106,8 +106,7 @@ /** * Run method for concurrent collector thread. */ - @LogicallyUninterruptible - @Uninterruptible + @Unpreemptible public void run() { if (verbose >= 1) VM.sysWriteln("GC Message: Concurrent collector thread entered run..."); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Handshake.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Handshake.java 2008-07-25 21:05:12 UTC (rev 14799) +++ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/Handshake.java 2008-07-25 21:09:37 UTC (rev 14800) @@ -18,7 +18,6 @@ import org.jikesrvm.scheduler.Scheduler; import org.jikesrvm.scheduler.greenthreads.GreenScheduler; import org.jikesrvm.scheduler.greenthreads.GreenThread; -import org.vmmagic.pragma.LogicallyUninterruptible; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.pragma.Unpreemptible; @@ -65,8 +64,7 @@ * collector thread, which will disable further thread switching on * the processor until it has completed the collection. */ - @LogicallyUninterruptible - @Uninterruptible + @Unpreemptible public void requestAndAwaitCompletion(int why) { if (request(why)) { if (verbose >= 1) VM.sysWriteln("GC Message: Handshake.requestAndAwaitCompletion - yielding"); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/MiscHeader.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/MiscHeader.java 2008-07-25 21:05:12 UTC (rev 14799) +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/MiscHeader.java 2008-07-25 21:09:37 UTC (rev 14800) @@ -17,7 +17,7 @@ import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.runtime.Magic; import org.vmmagic.pragma.Entrypoint; -import org.vmmagic.pragma.LogicallyUninterruptible; +import org.vmmagic.pragma.Interruptible; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.ObjectReference; @@ -104,7 +104,7 @@ * @param size the number of bytes allocated by the GC system for this object. * @param isScalar are we initializing a scalar (true) or array (false) object? */ - @LogicallyUninterruptible + @Interruptible("Only called during boot iamge creation") public static void initializeHeader(BootImageInterface bootImage, Address ref, TIB tib, int size, boolean isScalar) { /* Only perform initialization when it is required */ Modified: rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Magic.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Magic.java 2008-07-25 21:05:12 UTC (rev 14799) +++ rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Magic.java 2008-07-25 21:09:37 UTC (rev 14800) @@ -20,6 +20,7 @@ import org.jikesrvm.objectmodel.TIB; import org.jikesrvm.scheduler.Processor; import org.jikesrvm.scheduler.RVMThread; +import org.jikesrvm.scheduler.greenthreads.GreenProcessor; import org.vmmagic.Intrinsic; import org.vmmagic.pragma.Entrypoint; import org.vmmagic.pragma.Uninterruptible; @@ -613,6 +614,17 @@ /** * Cast object. * Note: for use by gc to avoid checkcast during GC + * @param proc processor + * @return proc as green processor (no checking on cast) + */ + public static GreenProcessor processorAsGreenProcessor(Processor proc) { + if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler + return null; + } + + /** + * Cast object. + * Note: for use by gc to avoid checkcast during GC * @param object object reference * @return object reference as thread (no checking on cast) */ Modified: rvmroot/trunk/rvm/src/org/jikesrvm/runtime/MagicNames.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/runtime/MagicNames.java 2008-07-25 21:05:12 UTC (rev 14799) +++ rvmroot/trunk/rvm/src/org/jikesrvm/runtime/MagicNames.java 2008-07-25 21:09:37 UTC (rev 14800) @@ -121,6 +121,7 @@ public static final Atom tibAsObject = Atom.findOrCreateAsciiAtom("tibAsObject"); public static final Atom objectAsProcessor = Atom.findOrCreateAsciiAtom("objectAsProcessor"); + public static final Atom processorAsGreenProcessor = Atom.findOrCreateAsciiAtom("processorAsGreenProcessor"); public static final Atom objectAsThread = Atom.findOrCreateAsciiAtom("objectAsThread"); public static final Atom threadAsCollectorThread = Atom.findOrCreateAsciiAtom("threadAsCollectorThread"); public static final Atom floatAsIntBits = Atom.findOrCreateAsciiAtom("floatAsIntBits"); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java 2008-07-25 21:05:12 UTC (rev 14799) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java 2008-07-25 21:09:37 UTC (rev 14800) @@ -21,9 +21,8 @@ import org.jikesrvm.runtime.Magic; import org.vmmagic.pragma.Inline; import org.vmmagic.pragma.Interruptible; -import org.vmmagic.pragma.LogicallyUninterruptible; import org.vmmagic.pragma.Uninterruptible; -import org.vmmagic.pragma.UninterruptibleNoWarn; +import org.vmmagic.pragma.UnpreemptibleNoWarn; import org.vmmagic.unboxed.Word; /** @@ -342,7 +341,7 @@ * * @return a free Lock; or <code>null</code>, if garbage collection is not enabled */ - @LogicallyUninterruptible // The caller is prepared to lose control when it allocates a lock -- dave + @UnpreemptibleNoWarn("Possible preemption when allocating a lock") static Lock allocate() { Processor mine = Processor.getCurrentProcessor(); if (mine.isInitialized && !mine.threadSwitchingEnabled()) { @@ -404,7 +403,7 @@ /** * Grow the locks table by allocating a new spine chunk. */ - @LogicallyUninterruptible // The caller is prepared to lose control when it allocates a lock -- dave + @UnpreemptibleNoWarn("Possible preemption when allocating lock array") static void growLocks(int id) { int spineId = id >> LOG_LOCK_CHUNK_SIZE; if (spineId >= LOCK_SPINE_SIZE) { @@ -523,9 +522,11 @@ * * @param l The lock object */ - @UninterruptibleNoWarn // aastore is ok in this case + @Uninterruptible public static void addLock(Lock l) { - locks[l.index >> LOG_LOCK_CHUNK_SIZE][l.index & LOCK_CHUNK_MASK] = l; + Lock[] chunk = locks[l.index >> LOG_LOCK_CHUNK_SIZE]; + int index = l.index & LOCK_CHUNK_MASK; + Services.setArrayUninterruptible(chunk, index, l); } /** Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-07-25 21:05:12 UTC (rev 14799) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-07-25 21:09:37 UTC (rev 14800) @@ -486,15 +486,14 @@ * String representation of thread */ @Override - @Interruptible + @Unpreemptible public String toString() { - return (name == null) ? "Thread-" + getIndex() : name; + return (name == null) ? Services.stringConcatenate("Thread-", getIndex()) : name; } /** * Get the current java.lang.Thread. */ - @Interruptible public final Thread getJavaLangThread() { return thread; } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenScheduler.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenScheduler.java 2008-07-25 21:05:12 UTC (rev 14799) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenScheduler.java 2008-07-25 21:09:37 UTC (rev 14800) @@ -430,11 +430,20 @@ /** * Get a Processor */ - @UninterruptibleNoWarn + @Uninterruptible public static GreenProcessor getProcessor(int id) { - return (GreenProcessor)processors.get(id); + if (VM.runningVM) { + return Magic.processorAsGreenProcessor(processors.get(id)); + } else { + return bootImageGreenProcessorCast(processors.get(id)); + } } + @UninterruptibleNoWarn("Only called during boot image compilation") + private static GreenProcessor bootImageGreenProcessorCast(Processor proc) { + return (GreenProcessor)proc; + } + /** * Returns if the VM is ready for a garbage collection. * Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenThreadQueue.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenThreadQueue.java 2008-07-25 21:05:12 UTC (rev 14799) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/greenthreads/GreenThreadQueue.java 2008-07-25 21:09:37 UTC (rev 14800) @@ -90,7 +90,6 @@ /** Add a thread to tail of queue. */ @Override - @UninterruptibleNoWarn public void enqueue(GreenThread t) { if (debugName != null) { if (t==null) { @@ -101,19 +100,7 @@ } // not currently on any other queue if (VM.VerifyAssertions && t.getNext() != null) { - VM.sysWrite("Thread sitting on >1 queue: "); - VM.sysWrite(Magic.getObjectType(t).getDescriptor()); - VM.sysWrite(" ", t.getIndex()); - VM.sysWrite(" ", t.toString()); - VM.sysWrite(" ", t.getJavaLangThread().toString()); - t = t.getNext(); - VM.sysWrite(" on same queue as: "); - VM.sysWrite(Magic.getObjectType(t).getDescriptor()); - VM.sysWrite(" ", t.getIndex()); - VM.sysWrite(" ", t.toString()); - VM.sysWrite(" ", t.getJavaLangThread().toString()); - Scheduler.dumpVirtualMachine(); - VM.sysFail("Thread sitting on >1 queue"); + moreThanOneQueueFailure(t); } // not dead if (VM.VerifyAssertions) VM._assert(t.isQueueable()); @@ -125,6 +112,22 @@ tail = t; } + @UninterruptibleNoWarn("Handle error that kills VM in otherwise uninterruptible code") + private static void moreThanOneQueueFailure(GreenThread t) { + VM.sysWrite("Thread sitting on >1 queue: "); + VM.sysWrite(Magic.getObjectType(t).getDescriptor()); + VM.sysWrite(" ", t.getIndex()); + VM.sysWrite(" ", t.toString()); + VM.sysWrite(" ", t.getJavaLangThread().toString()); + t = t.getNext(); + VM.sysWrite(" on same queue as: "); + VM.sysWrite(Magic.getObjectType(t).getDescriptor()); + VM.sysWrite(" ", t.getIndex()); + VM.sysWrite(" ", t.toString()); + VM.sysWrite(" ", t.getJavaLangThread().toString()); + Scheduler.dumpVirtualMachine(); + VM.sysFail("Thread sitting on >1 queue"); + } /** * Remove a thread from the head of the queue. * @return the thread (null --> queue is empty) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cap...@us...> - 2008-07-28 15:14:48
|
Revision: 14812 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14812&view=rev Author: captain5050 Date: 2008-07-28 15:14:42 +0000 (Mon, 28 Jul 2008) Log Message: ----------- Clean up sys call template annotations Modified Paths: -------------- rvmroot/trunk/rvm/src/org/jikesrvm/apt/annotations/GenerateImplementation.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/SysCall.java rvmroot/trunk/tools/ant-tasks/src/org/jikesrvm/tools/apt/SysCallProcessor.java Removed Paths: ------------- rvmroot/trunk/rvm/src/org/jikesrvm/runtime/SysCallUtil.java Modified: rvmroot/trunk/rvm/src/org/jikesrvm/apt/annotations/GenerateImplementation.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/apt/annotations/GenerateImplementation.java 2008-07-28 14:16:44 UTC (rev 14811) +++ rvmroot/trunk/rvm/src/org/jikesrvm/apt/annotations/GenerateImplementation.java 2008-07-28 15:14:42 UTC (rev 14812) @@ -12,6 +12,16 @@ */ package org.jikesrvm.apt.annotations; +import static java.lang.annotation.ElementType.TYPE; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.SOURCE; +import java.lang.annotation.Target; + +@Retention(SOURCE) +@Target({TYPE}) public @interface GenerateImplementation { - String generatedClass(); + /** + * @return name of class generated + */ + String value(); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/runtime/SysCall.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/runtime/SysCall.java 2008-07-28 14:16:44 UTC (rev 14811) +++ rvmroot/trunk/rvm/src/org/jikesrvm/runtime/SysCall.java 2008-07-28 15:14:42 UTC (rev 14812) @@ -38,11 +38,22 @@ * for each method declared here. */ @Uninterruptible -@GenerateImplementation(generatedClass = "org.jikesrvm.runtime.SysCallImpl") +@GenerateImplementation("org.jikesrvm.runtime.SysCallImpl") public abstract class SysCall { - public static final SysCall sysCall = SysCallUtil.getImplementation(SysCall.class); + /** + * Actual implementation of the SysCall class + */ + public static final SysCall sysCall; + static { + try { + sysCall = (SysCall)Class.forName("org.jikesrvm.runtime.SysCallImpl").newInstance(); + } catch (final Exception e) { + throw new Error(e); + } + } + // lowlevel write to console @SysCallTemplate public abstract void sysConsoleWriteChar(char v); Deleted: rvmroot/trunk/rvm/src/org/jikesrvm/runtime/SysCallUtil.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/runtime/SysCallUtil.java 2008-07-28 14:16:44 UTC (rev 14811) +++ rvmroot/trunk/rvm/src/org/jikesrvm/runtime/SysCallUtil.java 2008-07-28 15:14:42 UTC (rev 14812) @@ -1,28 +0,0 @@ -/* - * This file is part of the Jikes RVM project (http://jikesrvm.org). - * - * This file is licensed to You under the Common Public License (CPL); - * You may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.opensource.org/licenses/cpl1.0.php - * - * See the COPYRIGHT.txt file distributed with this work for information - * regarding copyright ownership. - */ -package org.jikesrvm.runtime; - -/** - * Utility class to get at implementation of SysCall interface. - */ -public class SysCallUtil { - @SuppressWarnings({"unchecked"}) - public static <T> T getImplementation(Class<T> type) { - try { - return (T) Class.forName(type.getName() + "Impl").newInstance(); - } catch (final Exception e) { - throw new IllegalStateException("Error creating generated implementation of " + type.getName(), e); - } - } - -} Modified: rvmroot/trunk/tools/ant-tasks/src/org/jikesrvm/tools/apt/SysCallProcessor.java =================================================================== --- rvmroot/trunk/tools/ant-tasks/src/org/jikesrvm/tools/apt/SysCallProcessor.java 2008-07-28 14:16:44 UTC (rev 14811) +++ rvmroot/trunk/tools/ant-tasks/src/org/jikesrvm/tools/apt/SysCallProcessor.java 2008-07-28 15:14:42 UTC (rev 14812) @@ -147,7 +147,7 @@ String generatedClass; AnnotationMirror ann = getAnnotation(d,GEN_IMPL_ANNOTATION); if (ann != null) { - generatedClass = getAnnotationElementValue("generatedClass()", ann); + generatedClass = getAnnotationElementValue("value()", ann); } else { generatedClass = d.getQualifiedName()+"Impl"; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dfr...@us...> - 2008-08-08 02:29:21
|
Revision: 14850 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14850&view=rev Author: dframpton-oss Date: 2008-08-08 02:29:16 +0000 (Fri, 08 Aug 2008) Log Message: ----------- RVM-614 - Possible fix for safe LinkageTriplets with poisoning on AIX. Modified Paths: -------------- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMType.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TypeReference.java rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIEnvironment.java Added Paths: ----------- rvmroot/trunk/rvm/src/org/jikesrvm/jni/LinkageTripletTable.java Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java 2008-08-07 20:22:28 UTC (rev 14849) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java 2008-08-08 02:29:16 UTC (rev 14850) @@ -262,6 +262,13 @@ trace.processRootEdge(jniFunctions.plus(i << LOG_BYTES_IN_ADDRESS), true); } + Address linkageTriplets = Magic.objectAsAddress(JNIEnvironment.LinkageTriplets); + if (linkageTriplets != null) { + for(int i=start; i < end; i++) { + trace.processRootEdge(linkageTriplets.plus(i << LOG_BYTES_IN_ADDRESS), true); + } + } + /* scan jni global refs */ Address jniGlobalRefs = Magic.objectAsAddress(JNIGlobalRefTable.JNIGlobalRefs); size = JNIGlobalRefTable.JNIGlobalRefs.length(); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMType.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMType.java 2008-08-07 20:22:28 UTC (rev 14849) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMType.java 2008-08-08 02:29:16 UTC (rev 14850) @@ -122,6 +122,7 @@ public static final RVMClass IMTType; public static final RVMClass ProcessorTableType; public static final RVMClass FunctionTableType; + public static final RVMClass LinkageTripletTableType; static { // Primitive types @@ -157,6 +158,7 @@ IMTType = TypeReference.IMT.resolve().asClass(); ProcessorTableType = TypeReference.ProcessorTable.resolve().asClass(); FunctionTableType = TypeReference.FunctionTable.resolve().asClass(); + LinkageTripletTableType = TypeReference.LinkageTripletTable.resolve().asClass(); // Java clases JavaLangObjectType = TypeReference.JavaLangObject.resolve().asClass(); JavaLangObjectArrayType = TypeReference.JavaLangObjectArray.resolve().asArray(); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TypeReference.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TypeReference.java 2008-08-07 20:22:28 UTC (rev 14849) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TypeReference.java 2008-08-08 02:29:16 UTC (rev 14850) @@ -123,6 +123,7 @@ public static final TypeReference IMT = findOrCreate(org.jikesrvm.objectmodel.IMT.class); public static final TypeReference ProcessorTable = findOrCreate(org.jikesrvm.scheduler.ProcessorTable.class); public static final TypeReference FunctionTable = findOrCreate(org.jikesrvm.jni.FunctionTable.class); + public static final TypeReference LinkageTripletTable = findOrCreate(org.jikesrvm.jni.LinkageTripletTable.class); public static final TypeReference JavaLangObject = findOrCreate(java.lang.Object.class); public static final TypeReference JavaLangClass = findOrCreate(java.lang.Class.class); @@ -527,7 +528,8 @@ */ @Uninterruptible public boolean isRuntimeTable() { - return this == IMT || this == TIB || this == ITable || this == ITableArray || this == ProcessorTable || this == FunctionTable; + return this == IMT || this == TIB || this == ITable || this == ITableArray || + this == ProcessorTable || this == FunctionTable || this == LinkageTripletTable; } /** Modified: rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIEnvironment.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIEnvironment.java 2008-08-07 20:22:28 UTC (rev 14849) +++ rvmroot/trunk/rvm/src/org/jikesrvm/jni/JNIEnvironment.java 2008-08-08 02:29:16 UTC (rev 14850) @@ -55,7 +55,7 @@ * a function pointer. * This is an array of such triples that matches JNIFunctions. */ - private static AddressArray[] LinkageTriplets; + public static LinkageTripletTable LinkageTriplets; /** * Stash the JTOC somewhere we can find it later @@ -340,9 +340,9 @@ JNIFunctions = functions; if (VM.BuildForPowerOpenABI) { // Allocate the linkage triplets in the bootimage too (so they won't move) - LinkageTriplets = new AddressArray[functions.length()]; + LinkageTriplets = LinkageTripletTable.allocate(functions.length()); for (int i = 0; i < functions.length(); i++) { - LinkageTriplets[i] = AddressArray.create(3); + LinkageTriplets.set(i, AddressArray.create(3)); } } } @@ -355,7 +355,7 @@ if (VM.BuildForPowerOpenABI) { // fill in the TOC and IP entries for each linkage triplet for (int i = 0; i < JNIFunctions.length(); i++) { - AddressArray triplet = LinkageTriplets[i]; + AddressArray triplet = LinkageTriplets.get(i); triplet.set(1, Magic.getTocPointer()); triplet.set(0, Magic.objectAsAddress(JNIFunctions.get(i))); } Added: rvmroot/trunk/rvm/src/org/jikesrvm/jni/LinkageTripletTable.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/jni/LinkageTripletTable.java (rev 0) +++ rvmroot/trunk/rvm/src/org/jikesrvm/jni/LinkageTripletTable.java 2008-08-08 02:29:16 UTC (rev 14850) @@ -0,0 +1,93 @@ +/* + * This file is part of the Jikes RVM project (http://jikesrvm.org). + * + * This file is licensed to You under the Common Public License (CPL); + * You may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.opensource.org/licenses/cpl1.0.php + * + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. + */ +package org.jikesrvm.jni; + +import org.jikesrvm.VM; +import org.jikesrvm.objectmodel.RuntimeTable; +import org.vmmagic.Intrinsic; +import org.vmmagic.pragma.*; +import org.vmmagic.unboxed.AddressArray; + +/** + * This class holds a triplet for each entry of the JNI function table. + */ +@NonMoving +public final class LinkageTripletTable implements RuntimeTable<AddressArray> { + + /** + * The backing data used during boot image writing. + */ + private final AddressArray[] data; + + /** + * Private constructor. Can not create instances. + */ + private LinkageTripletTable(int size) { + this.data = new AddressArray[size]; + } + + /** + * Create a new LinkageTripletTable of the specified size. + * + * @param size The size of the LinkageTripletTable + * @return The created LinkageTripletTable instance. + */ + public static LinkageTripletTable allocate(int size) { + if (VM.VerifyAssertions && VM.runningVM) VM._assert(VM.NOT_REACHED); + return new LinkageTripletTable(size); + } + + /** + * Return the backing array (for boot image writing) + */ + public AddressArray[] getBacking() { + if (VM.VerifyAssertions) VM._assert(!VM.runningVM); + return data; + } + + /** + * Get a LinkageTripletTable entry. + * + * @param index The index of the entry to get + * @return The value of that entry + */ + @Intrinsic + @Uninterruptible + public AddressArray get(int index) { + if (VM.VerifyAssertions && VM.runningVM) VM._assert(VM.NOT_REACHED); + return data[index]; + } + + /** + * Set a LinkageTripletTable entry. + * + * @param index The index of the entry to set + * @param value The value to set the entry to. + */ + @Intrinsic + @UninterruptibleNoWarn("Interruptible code not reachable at runtime") + public void set(int index, AddressArray value) { + if (VM.VerifyAssertions && VM.runningVM) VM._assert(VM.NOT_REACHED); + data[index] = value; + } + + /** + * Return the length of the LinkageTripletTable + */ + @Intrinsic + @Uninterruptible + public int length() { + if (VM.VerifyAssertions && VM.runningVM) VM._assert(VM.NOT_REACHED); + return data.length; + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cap...@us...> - 2008-08-08 20:50:14
|
Revision: 14858 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14858&view=rev Author: captain5050 Date: 2008-08-08 20:50:09 +0000 (Fri, 08 Aug 2008) Log Message: ----------- RVM-528 from Aleksey Shipilev Modified Paths: -------------- rvmroot/trunk/build.xml Added Paths: ----------- rvmroot/trunk/build/eclipse/classpath.harmony.template Copied: rvmroot/trunk/build/eclipse/classpath.harmony.template (from rev 14857, rvmroot/trunk/build/eclipse/classpath.template) =================================================================== --- rvmroot/trunk/build/eclipse/classpath.harmony.template (rev 0) +++ rvmroot/trunk/build/eclipse/classpath.harmony.template 2008-08-08 20:50:09 UTC (rev 14858) @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ This file is part of the Jikes RVM project (http://jikesrvm.org). + ~ + ~ This file is licensed to You under the Common Public License (CPL); + ~ You may not use this file except in compliance with the License. You + ~ may obtain a copy of the License at + ~ + ~ http://www.opensource.org/licenses/cpl1.0.php + ~ + ~ See the COPYRIGHT.txt file distributed with this work for information + ~ regarding copyright ownership. + --> +<classpath> + <classpathentry kind="src" path="libraryInterface/Common/src"/> + <classpathentry kind="src" path="libraryInterface/Harmony/ASF/src"/> + <classpathentry kind="src" path="libraryInterface/Harmony/CPL/src"/> + <classpathentry kind="src" path="MMTk/ext/vm/jikesrvm"/> + <classpathentry kind="src" path="MMTk/src"/> + <classpathentry kind="src" path="common/vmmagic/src"/> + <classpathentry kind="src" path="common/options/src"/> + <classpathentry excluding="**/@OTHER_ARCH@/**|org/jikesrvm/tools/header_gen/GenArch_@OTHER_ARCH@.java" kind="src" path="rvm/src"/> + + <classpathentry kind="src" path="eclipse/gen-base"/> + <classpathentry kind="src" path="eclipse/gen-config"/> + <classpathentry kind="src" path="eclipse/gen-arch"/> + + <classpathentry kind="lib" path="eclipse/accessibility.jar"/> + <classpathentry kind="lib" path="eclipse/annotation.jar"/> + <classpathentry kind="lib" path="eclipse/applet.jar"/> + <classpathentry kind="lib" path="eclipse/archive.jar"/> + <classpathentry kind="lib" path="eclipse/auth.jar"/> + <classpathentry kind="lib" path="eclipse/awt.jar"/> + <classpathentry kind="lib" path="eclipse/bcel-5.2.jar"/> + <classpathentry kind="lib" path="eclipse/bcprov.jar"/> + <classpathentry kind="lib" path="eclipse/beans.jar"/> + <classpathentry kind="lib" path="eclipse/concurrent.jar"/> + <classpathentry kind="lib" path="eclipse/crypto.jar"/> + <classpathentry kind="lib" path="eclipse/icu4j-3_8.jar"/> + <classpathentry kind="lib" path="eclipse/icu4j-charsets-3_8.jar"/> + <classpathentry kind="lib" path="eclipse/imageio.jar"/> + <classpathentry kind="lib" path="eclipse/instrument.jar"/> + <classpathentry kind="lib" path="eclipse/jndi.jar"/> + <classpathentry kind="lib" path="eclipse/lang-management.jar"/> + <classpathentry kind="lib" path="eclipse/logging.jar"/> + <classpathentry kind="lib" path="eclipse/luni.jar"/> + <classpathentry kind="lib" path="eclipse/luni-kernel-stubs.jar"/> + <classpathentry kind="lib" path="eclipse/math.jar"/> + <classpathentry kind="lib" path="eclipse/misc.jar"/> + <classpathentry kind="lib" path="eclipse/mx4j.jar"/> + <classpathentry kind="lib" path="eclipse/mx4j-remote.jar"/> + <classpathentry kind="lib" path="eclipse/nio_char.jar"/> + <classpathentry kind="lib" path="eclipse/nio.jar"/> + <classpathentry kind="lib" path="eclipse/pack200.jar"/> + <classpathentry kind="lib" path="eclipse/prefs.jar"/> + <classpathentry kind="lib" path="eclipse/print.jar"/> + <classpathentry kind="lib" path="eclipse/regex.jar"/> + <classpathentry kind="lib" path="eclipse/resolver.jar"/> + <classpathentry kind="lib" path="eclipse/rmi.jar"/> + <classpathentry kind="lib" path="eclipse/security.jar"/> + <classpathentry kind="lib" path="eclipse/security-kernel-stubs.jar"/> + <classpathentry kind="lib" path="eclipse/sound.jar"/> + <classpathentry kind="lib" path="eclipse/sql.jar"/> + <classpathentry kind="lib" path="eclipse/suncompat.jar"/> + <classpathentry kind="lib" path="eclipse/swing.jar"/> + <classpathentry kind="lib" path="eclipse/text.jar"/> + <classpathentry kind="lib" path="eclipse/xalan.jar"/> + <classpathentry kind="lib" path="eclipse/xercesImpl.jar"/> + <classpathentry kind="lib" path="eclipse/xml-apis.jar"/> + <classpathentry kind="lib" path="eclipse/x-net.jar"/> + <classpathentry kind="lib" path="eclipse/yoko.jar"/> + <classpathentry kind="lib" path="eclipse/yoko-core.jar"/> + <classpathentry kind="lib" path="eclipse/yoko-rmi-impl.jar"/> + <classpathentry kind="lib" path="eclipse/yoko-rmi-spec.jar"/> + + <classpathentry kind="output" path="eclipse/bin"/> +</classpath> Property changes on: rvmroot/trunk/build/eclipse/classpath.harmony.template ___________________________________________________________________ Added: svn:mergeinfo + Modified: rvmroot/trunk/build.xml =================================================================== --- rvmroot/trunk/build.xml 2008-08-08 17:47:09 UTC (rev 14857) +++ rvmroot/trunk/build.xml 2008-08-08 20:50:09 UTC (rev 14858) @@ -2190,7 +2190,28 @@ <delete file=".project"/> <delete file=".classpath"/> <mkdir dir="eclipse"/> - <copy file="${classpath.lib.dir}/classpath.jar" tofile="eclipse/classpath.jar"/> + <if> + <conditions> + <equals arg1="${classlib.provider}" arg2="GNU Classpath"/> + </conditions> + <sequential> + <copy file="${classpath.lib.dir}/classpath.jar" tofile="eclipse/classpath.jar" /> + <property name="classpath.template.name" value="classpath.template" /> + </sequential> + </if> + <if> + <conditions> + <equals arg1="${classlib.provider}" arg2="Harmony"/> + </conditions> + <sequential> + <copy toDir="eclipse" verbose="true"> + <fileset dir="${harmony.lib.dir}"> + <include name="**/*.jar" /> + </fileset> + </copy> + <property name="classpath.template.name" value="classpath.harmony.template" /> + </sequential> + </if> <copy todir="eclipse/gen-base"> <fileset dir="${generated.java}"><include name="**/*.*"/></fileset> </copy> @@ -2218,7 +2239,7 @@ </sequential> </if> <property name="other.arch" value="ppc"/> - <copy file="build/eclipse/classpath.template" tofile=".classpath"> + <copy file="build/eclipse/${classpath.template.name}" tofile=".classpath"> <filterset> <filter token="OTHER_ARCH" value="${other.arch}"/> <filter token="ARCH" value="${target.arch}"/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cap...@us...> - 2008-08-09 09:09:50
|
Revision: 14859 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14859&view=rev Author: captain5050 Date: 2008-08-09 09:09:47 +0000 (Sat, 09 Aug 2008) Log Message: ----------- RVM-624 WIP from Aleksey Shipilev. Modified Paths: -------------- rvmroot/trunk/build.xml rvmroot/trunk/rvm/src/org/jikesrvm/VM.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Entrypoints.java Modified: rvmroot/trunk/build.xml =================================================================== --- rvmroot/trunk/build.xml 2008-08-08 20:50:09 UTC (rev 14858) +++ rvmroot/trunk/build.xml 2008-08-09 09:09:47 UTC (rev 14859) @@ -1081,6 +1081,7 @@ <pathelement location="${harmony.lib.dir}/annotation.jar"/> <pathelement location="${harmony.lib.dir}/archive.jar"/> <pathelement location="${harmony.lib.dir}/instrument.jar"/> + <pathelement location="${harmony.lib.dir}/logging.jar"/> <pathelement location="${harmony.lib.dir}/nio.jar"/> <pathelement location="${harmony.lib.dir}/nio_char.jar"/> <pathelement location="${harmony.lib.dir}/regex.jar"/> Modified: rvmroot/trunk/rvm/src/org/jikesrvm/VM.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/VM.java 2008-08-08 20:50:09 UTC (rev 14858) +++ rvmroot/trunk/rvm/src/org/jikesrvm/VM.java 2008-08-09 09:09:47 UTC (rev 14859) @@ -420,12 +420,14 @@ Entrypoints.luni3.setObjectValueUnchecked(null, null); Entrypoints.luni4.setObjectValueUnchecked(null, null); Entrypoints.luni5.setObjectValueUnchecked(null, null); + Entrypoints.luni6.setObjectValueUnchecked(null, null); //runClassInitializer("java.lang.String$ConsolePrintStream"); runClassInitializer("org.apache.harmony.luni.util.Msg"); runClassInitializer("org.apache.harmony.archive.internal.nls.Messages"); runClassInitializer("org.apache.harmony.luni.internal.nls.Messages"); runClassInitializer("org.apache.harmony.nio.internal.nls.Messages"); runClassInitializer("org.apache.harmony.niochar.internal.nls.Messages"); + runClassInitializer("java.util.logging.LogManager"); } // Initialize compiler that compiles dynamically loaded classes. Modified: rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Entrypoints.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Entrypoints.java 2008-08-08 20:50:09 UTC (rev 14858) +++ rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Entrypoints.java 2008-08-09 09:09:47 UTC (rev 14859) @@ -422,6 +422,7 @@ public static final RVMField luni3; public static final RVMField luni4; public static final RVMField luni5; + public static final RVMField luni6; static { if (VM.BuildForHarmony) { @@ -430,12 +431,14 @@ luni3 = getField("Lorg/apache/harmony/luni/internal/nls/Messages;", "bundle", java.util.ResourceBundle.class); luni4 = getField("Lorg/apache/harmony/nio/internal/nls/Messages;", "bundle", java.util.ResourceBundle.class); luni5 = getField("Lorg/apache/harmony/niochar/internal/nls/Messages;", "bundle", java.util.ResourceBundle.class); + luni6 = getField(java.util.logging.LogManager.class, "manager", java.util.logging.LogManager.class); } else { luni1 = null; luni2 = null; luni3 = null; luni4 = null; luni5 = null; + luni6 = null; } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cap...@us...> - 2008-08-10 16:12:52
|
Revision: 14866 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14866&view=rev Author: captain5050 Date: 2008-08-10 16:12:45 +0000 (Sun, 10 Aug 2008) Log Message: ----------- RVM-517: implementations of reflection using bytecodes. Modified Paths: -------------- rvmroot/trunk/libraryInterface/Common/src/java/lang/reflect/VMCommonLibrarySupport.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMMethod.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TypeReference.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Reflection.java Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/reflect/VMCommonLibrarySupport.java =================================================================== --- rvmroot/trunk/libraryInterface/Common/src/java/lang/reflect/VMCommonLibrarySupport.java 2008-08-10 16:11:23 UTC (rev 14865) +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/reflect/VMCommonLibrarySupport.java 2008-08-10 16:12:45 UTC (rev 14866) @@ -166,7 +166,7 @@ throws IllegalAccessException, IllegalArgumentException, ExceptionInInitializerError, InvocationTargetException { // validate number and types of arguments - if (checkArguments(args, method)) { + if (!Reflection.needsCheckArgs || checkArguments(args, method)) { if (method.isStatic()) { return invokeStatic(receiver, args, method, jlrMethod, accessingClass); } else { @@ -417,7 +417,7 @@ checkAccess(constructor, accessingClass); } // validate number and types of arguments to constructor - if (!checkArguments(args, constructor)) { + if (Reflection.needsCheckArgs && !checkArguments(args, constructor)) { args = makeArgumentsCompatible(args, constructor); } RVMClass cls = constructor.getDeclaringClass(); @@ -579,17 +579,17 @@ if (type.isDoubleType()) { return field.getDoubleValueUnchecked(object); } else if (type.isFloatType()) { - return (double)field.getFloatValueUnchecked(object); + return field.getFloatValueUnchecked(object); } else if (type.isLongType()) { - return (double)field.getLongValueUnchecked(object); + return field.getLongValueUnchecked(object); } else if (type.isIntType()) { - return (double)field.getIntValueUnchecked(object); + return field.getIntValueUnchecked(object); } else if (type.isShortType()) { - return (double)field.getShortValueUnchecked(object); + return field.getShortValueUnchecked(object); } else if (type.isCharType()) { - return (double)field.getCharValueUnchecked(object); + return field.getCharValueUnchecked(object); } else if (type.isByteType()) { - return (double)field.getByteValueUnchecked(object); + return field.getByteValueUnchecked(object); } else { throwNewIllegalArgumentException("field type mismatch"); return 0.0d; @@ -603,15 +603,15 @@ if (type.isFloatType()) { return field.getFloatValueUnchecked(object); } else if (type.isLongType()) { - return (float)field.getLongValueUnchecked(object); + return field.getLongValueUnchecked(object); } else if (type.isIntType()) { - return (float)field.getIntValueUnchecked(object); + return field.getIntValueUnchecked(object); } else if (type.isShortType()) { - return (float)field.getShortValueUnchecked(object); + return field.getShortValueUnchecked(object); } else if (type.isCharType()) { - return (float)field.getCharValueUnchecked(object); + return field.getCharValueUnchecked(object); } else if (type.isByteType()) { - return (float)field.getByteValueUnchecked(object); + return field.getByteValueUnchecked(object); } else { throwNewIllegalArgumentException("field type mismatch"); return 0.0f; @@ -625,11 +625,11 @@ if (type.isIntType()) { return field.getIntValueUnchecked(object); } else if (type.isShortType()) { - return (int)field.getShortValueUnchecked(object); + return field.getShortValueUnchecked(object); } else if (type.isCharType()) { - return (int)field.getCharValueUnchecked(object); + return field.getCharValueUnchecked(object); } else if (type.isByteType()) { - return (int)field.getByteValueUnchecked(object); + return field.getByteValueUnchecked(object); } else { throwNewIllegalArgumentException("field type mismatch"); return 0; @@ -643,13 +643,13 @@ if (type.isLongType()) { return field.getLongValueUnchecked(object); } else if (type.isIntType()) { - return (long)field.getIntValueUnchecked(object); + return field.getIntValueUnchecked(object); } else if (type.isShortType()) { - return (long)field.getShortValueUnchecked(object); + return field.getShortValueUnchecked(object); } else if (type.isCharType()) { - return (long)field.getCharValueUnchecked(object); + return field.getCharValueUnchecked(object); } else if (type.isByteType()) { - return (long)field.getByteValueUnchecked(object); + return field.getByteValueUnchecked(object); } else { throwNewIllegalArgumentException("field type mismatch"); return 0L; @@ -663,7 +663,7 @@ if (type.isShortType()) { return field.getShortValueUnchecked(object); } else if (type.isByteType()) { - return (short)field.getByteValueUnchecked(object); + return field.getByteValueUnchecked(object); } else { throwNewIllegalArgumentException("field type mismatch"); return 0; @@ -783,17 +783,17 @@ if (type.isByteType()) field.setByteValueUnchecked(object, value); else if (type.isLongType()) - field.setLongValueUnchecked(object, (long)value); + field.setLongValueUnchecked(object, value); else if (type.isIntType()) - field.setIntValueUnchecked(object, (int)value); + field.setIntValueUnchecked(object, value); else if (type.isShortType()) - field.setShortValueUnchecked(object, (short)value); + field.setShortValueUnchecked(object, value); else if (type.isCharType()) field.setCharValueUnchecked(object, (char)value); else if (type.isDoubleType()) - field.setDoubleValueUnchecked(object, (double)value); + field.setDoubleValueUnchecked(object, value); else if (type.isFloatType()) - field.setFloatValueUnchecked(object, (float)value); + field.setFloatValueUnchecked(object, value); else throwNewIllegalArgumentException("field type mismatch"); } @@ -804,15 +804,15 @@ if (type.isCharType()) field.setCharValueUnchecked(object, value); else if (type.isLongType()) - field.setLongValueUnchecked(object, (long)value); + field.setLongValueUnchecked(object, value); else if (type.isIntType()) - field.setIntValueUnchecked(object, (int)value); + field.setIntValueUnchecked(object, value); else if (type.isShortType()) field.setShortValueUnchecked(object, (short)value); else if (type.isDoubleType()) - field.setDoubleValueUnchecked(object, (double)value); + field.setDoubleValueUnchecked(object, value); else if (type.isFloatType()) - field.setFloatValueUnchecked(object, (float)value); + field.setFloatValueUnchecked(object, value); else throwNewIllegalArgumentException("field type mismatch"); } @@ -832,7 +832,7 @@ if (type.isFloatType()) field.setFloatValueUnchecked(object, value); else if (type.isDoubleType()) - field.setDoubleValueUnchecked(object, (double)value); + field.setDoubleValueUnchecked(object, value); else throwNewIllegalArgumentException("field type mismatch"); } @@ -843,11 +843,11 @@ if (type.isIntType()) field.setIntValueUnchecked(object, value); else if (type.isLongType()) - field.setLongValueUnchecked(object, (long) value); + field.setLongValueUnchecked(object, value); else if (type.isDoubleType()) - field.setDoubleValueUnchecked(object, (double)value); + field.setDoubleValueUnchecked(object, value); else if (type.isFloatType()) - field.setFloatValueUnchecked(object, (float)value); + field.setFloatValueUnchecked(object, value); else throwNewIllegalArgumentException("field type mismatch"); } @@ -858,9 +858,9 @@ if (type.isLongType()) field.setLongValueUnchecked(object, value); else if (type.isDoubleType()) - field.setDoubleValueUnchecked(object, (double)value); + field.setDoubleValueUnchecked(object, value); else if (type.isFloatType()) - field.setFloatValueUnchecked(object, (float)value); + field.setFloatValueUnchecked(object, value); else throwNewIllegalArgumentException("field type mismatch"); } @@ -870,13 +870,13 @@ if (type.isShortType()) field.setShortValueUnchecked(object, value); else if (type.isLongType()) - field.setLongValueUnchecked(object, (long)value); + field.setLongValueUnchecked(object, value); else if (type.isIntType()) - field.setIntValueUnchecked(object, (int)value); + field.setIntValueUnchecked(object, value); else if (type.isDoubleType()) - field.setDoubleValueUnchecked(object, (double)value); + field.setDoubleValueUnchecked(object, value); else if (type.isFloatType()) - field.setFloatValueUnchecked(object, (float)value); + field.setFloatValueUnchecked(object, value); else throwNewIllegalArgumentException("field type mismatch"); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java 2008-08-10 16:11:23 UTC (rev 14865) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java 2008-08-10 16:12:45 UTC (rev 14866) @@ -16,9 +16,10 @@ import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.annotation.Inherited; -import org.jikesrvm.VM; + import org.jikesrvm.Callbacks; import org.jikesrvm.Constants; +import org.jikesrvm.VM; import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.compilers.opt.inlining.ClassLoadingDependencyManager; import org.jikesrvm.mm.mminterface.MemoryManager; @@ -210,6 +211,7 @@ private final LinkedListRVM<Object> objectCache; /** The imt for this class **/ + @SuppressWarnings("unused") private IMT imt; // --- Assertion support --- // @@ -614,7 +616,7 @@ // @Uninterruptible - private static int packCPEntry(byte type, int value) { + static int packCPEntry(byte type, int value) { return (type << 29) | (value & 0x1fffffff); } @@ -2455,4 +2457,44 @@ public boolean isReferenceType() { return true; } + + /** + * Count of reflective classes that have been created to provide unique names + */ + private static int numberOfReflectionClasses = 0; + + /** + * Create a synthetic class that extends ReflectionBase and invokes the given method + * @param methodToCall the method we wish to call reflectively + * @return the syntethic class + */ + public static Class<?> createReflectionClass(RVMMethod methodToCall) { + if (DynamicTypeCheck.instanceOfResolved(TypeReference.baseReflectionClass.resolve(), methodToCall.getDeclaringClass())) { + return null; + } + int[] constantPool = new int[methodToCall.getParameterTypes().length+3]; + TypeReference reflectionClass = TypeReference.findOrCreate("Lorg/jikesrvm/classloader/ReflectionBase$$Reflect"+numberOfReflectionClasses+";"); + numberOfReflectionClasses++; + MethodReference reflectionMethodRef = MethodReference.findOrCreate(reflectionClass, + Atom.findOrCreateUnicodeAtom("invoke"), + Atom.findOrCreateUnicodeAtom("(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;") + ).asMethodReference(); + MethodReference constructorMethodRef = MethodReference.findOrCreate(reflectionClass, + Atom.findOrCreateUnicodeAtom("<init>"), + Atom.findOrCreateUnicodeAtom("()V") + ).asMethodReference(); + + RVMMethod[] reflectionMethods = new RVMMethod[]{methodToCall.createReflectionMethod(reflectionClass, + constantPool, + reflectionMethodRef), + RVMMethod.createDefaultConstructor(reflectionClass, constructorMethodRef)}; + RVMClass klass = + new RVMClass(reflectionClass, constantPool, (short) (ACC_SYNTHETIC | ACC_PUBLIC | ACC_FINAL), // modifiers + TypeReference.baseReflectionClass.resolve().asClass(), // superClass + emptyVMClass, // declaredInterfaces + emptyVMField, reflectionMethods, + null, null, null, null, null, null, null, null); + reflectionClass.setType(klass); + return klass.getClassForType(); + } } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMMethod.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMMethod.java 2008-08-10 16:11:23 UTC (rev 14865) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMMethod.java 2008-08-10 16:12:45 UTC (rev 14866) @@ -28,6 +28,7 @@ import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Offset; +import static org.jikesrvm.classloader.TypeReference.baseReflectionClass; /** * A method of a java class corresponding to a method_info structure @@ -814,4 +815,195 @@ } return result; } + + /** + * Create a method to act as a default constructor (just return) + * @param klass class for method + * @param memRef reference for default constructor + * @return method normal (bytecode containing) method that just returns + */ + static RVMMethod createDefaultConstructor(TypeReference klass, MemberReference memRef) { + return new NormalMethod(klass, + memRef, + (short) (ACC_PUBLIC | ACC_FINAL | ACC_SYNTHETIC), + null, + (short) 1, + (short) 0, + new byte[]{(byte)JBC_return}, + null, + null, + new int[0], + null, + null, + null, + null); + } + + /** + * Create a method for reflectively invoking this method + * + * @param reflectionClass the class this method will belong to + * @param constantPool for the class + * @param memRef the member reference corresponding to this method + * @param interfaceMethod the interface method that will copied to + * produce the annotation method + * @param constantPoolIndex the index of the field that will be + * returned by this method + * @return the created method + */ + RVMMethod createReflectionMethod(TypeReference reflectionClass, int[] constantPool, + MethodReference memRef) { + TypeReference[] parameters = getParameterTypes(); + int numParams = parameters.length; + byte[] bytecodes; + int curBC = 0; + if (!isStatic()) { + bytecodes = new byte[8 * numParams + 8]; + bytecodes[curBC] = JBC_aload_1; + curBC++; + } else { + bytecodes = new byte[8 * numParams + 7]; + } + for (int i=0; i < numParams; i++) { + if (parameters[i].isVoidType()) { + bytecodes[curBC+1] = + bytecodes[curBC+2] = + bytecodes[curBC+3] = + bytecodes[curBC+4] = + bytecodes[curBC+5] = + bytecodes[curBC+6] = + bytecodes[curBC+7] = + (byte)JBC_nop; + continue; + } + bytecodes[curBC] = (byte)JBC_aload_2; + bytecodes[curBC+1] = (byte)JBC_sipush; + bytecodes[curBC+2] = (byte)(i >>> 8); + bytecodes[curBC+3] = (byte)i; + bytecodes[curBC+4] = (byte)JBC_aaload; + if (!parameters[i].isPrimitiveType()) { + bytecodes[curBC+5] = (byte)JBC_checkcast; + if (VM.VerifyAssertions) VM._assert(parameters[i].getId() != 0); + constantPool[i+1] = RVMClass.packCPEntry(RVMClass.CP_CLASS, parameters[i].getId()); + bytecodes[curBC+6] = (byte)((i+1) >>> 8); + bytecodes[curBC+7] = (byte)(i+1); + } else { + bytecodes[curBC+5] = (byte)JBC_invokestatic; + MemberReference unboxMethod; + if (parameters[i].isBooleanType()) { + unboxMethod = MethodReference.findOrCreate(baseReflectionClass, + Atom.findOrCreateUnicodeAtom("unboxAsBoolean"), + Atom.findOrCreateUnicodeAtom("(Ljava/lang/Object;)Z")); + } else if (parameters[i].isByteType()) { + unboxMethod = MethodReference.findOrCreate(baseReflectionClass, + Atom.findOrCreateUnicodeAtom("unboxAsByte"), + Atom.findOrCreateUnicodeAtom("(Ljava/lang/Object;)B")); + } else if (parameters[i].isShortType()) { + unboxMethod = MethodReference.findOrCreate(baseReflectionClass, + Atom.findOrCreateUnicodeAtom("unboxAsShort"), + Atom.findOrCreateUnicodeAtom("(Ljava/lang/Object;)S")); + } else if (parameters[i].isCharType()) { + unboxMethod = MethodReference.findOrCreate(baseReflectionClass, + Atom.findOrCreateUnicodeAtom("unboxAsChar"), + Atom.findOrCreateUnicodeAtom("(Ljava/lang/Object;)C")); + } else if (parameters[i].isIntType()) { + unboxMethod = MethodReference.findOrCreate(baseReflectionClass, + Atom.findOrCreateUnicodeAtom("unboxAsInt"), + Atom.findOrCreateUnicodeAtom("(Ljava/lang/Object;)I")); + } else if (parameters[i].isLongType()) { + unboxMethod = MethodReference.findOrCreate(baseReflectionClass, + Atom.findOrCreateUnicodeAtom("unboxAsLong"), + Atom.findOrCreateUnicodeAtom("(Ljava/lang/Object;)J")); + } else if (parameters[i].isFloatType()) { + unboxMethod = MethodReference.findOrCreate(baseReflectionClass, + Atom.findOrCreateUnicodeAtom("unboxAsFloat"), + Atom.findOrCreateUnicodeAtom("(Ljava/lang/Object;)F")); + } else { + if (VM.VerifyAssertions) VM._assert(parameters[i].isDoubleType()); + unboxMethod = MethodReference.findOrCreate(baseReflectionClass, + Atom.findOrCreateUnicodeAtom("unboxAsDouble"), + Atom.findOrCreateUnicodeAtom("(Ljava/lang/Object;)D")); + } + constantPool[i+1] = RVMClass.packCPEntry(RVMClass.CP_MEMBER, unboxMethod.getId()); + bytecodes[curBC+6] = (byte)((i+1) >>> 8); + bytecodes[curBC+7] = (byte)(i+1); + } + curBC+=8; + } + if (isStatic()) { + bytecodes[curBC] = (byte)JBC_invokestatic; + } else if (isObjectInitializer()) { + bytecodes[curBC] = (byte)JBC_invokespecial; + } else { + bytecodes[curBC] = (byte)JBC_invokevirtual; + } + constantPool[numParams+1] = RVMClass.packCPEntry(RVMClass.CP_MEMBER, getId()); + bytecodes[curBC+1] = (byte)((numParams+1) >>> 8); + bytecodes[curBC+2] = (byte)(numParams+1); + TypeReference returnType = getReturnType(); + if (!returnType.isPrimitiveType()) { + bytecodes[curBC+3] = (byte)JBC_nop; + bytecodes[curBC+4] = (byte)JBC_nop; + bytecodes[curBC+5] = (byte)JBC_nop; + } else if (returnType.isVoidType()) { + bytecodes[curBC+3] = (byte)JBC_aconst_null; + bytecodes[curBC+4] = (byte)JBC_nop; + bytecodes[curBC+5] = (byte)JBC_nop; + } else { + MemberReference boxMethod; + if (returnType.isBooleanType()) { + boxMethod = MethodReference.findOrCreate(baseReflectionClass, + Atom.findOrCreateUnicodeAtom("boxAsBoolean"), + Atom.findOrCreateUnicodeAtom("(Z)Ljava/lang/Object;")); + } else if (returnType.isByteType()) { + boxMethod = MethodReference.findOrCreate(baseReflectionClass, + Atom.findOrCreateUnicodeAtom("boxAsByte"), + Atom.findOrCreateUnicodeAtom("(B)Ljava/lang/Object;")); + } else if (returnType.isShortType()) { + boxMethod = MethodReference.findOrCreate(baseReflectionClass, + Atom.findOrCreateUnicodeAtom("boxAsShort"), + Atom.findOrCreateUnicodeAtom("(S)Ljava/lang/Object;")); + } else if (returnType.isCharType()) { + boxMethod = MethodReference.findOrCreate(baseReflectionClass, + Atom.findOrCreateUnicodeAtom("boxAsChar"), + Atom.findOrCreateUnicodeAtom("(C)Ljava/lang/Object;")); + } else if (returnType.isIntType()) { + boxMethod = MethodReference.findOrCreate(baseReflectionClass, + Atom.findOrCreateUnicodeAtom("boxAsInt"), + Atom.findOrCreateUnicodeAtom("(I)Ljava/lang/Object;")); + } else if (returnType.isLongType()) { + boxMethod = MethodReference.findOrCreate(baseReflectionClass, + Atom.findOrCreateUnicodeAtom("boxAsLong"), + Atom.findOrCreateUnicodeAtom("(J)Ljava/lang/Object;")); + } else if (returnType.isFloatType()) { + boxMethod = MethodReference.findOrCreate(baseReflectionClass, + Atom.findOrCreateUnicodeAtom("boxAsFloat"), + Atom.findOrCreateUnicodeAtom("(F)Ljava/lang/Object;")); + } else { + if (VM.VerifyAssertions) VM._assert(returnType.isDoubleType()); + boxMethod = MethodReference.findOrCreate(baseReflectionClass, + Atom.findOrCreateUnicodeAtom("boxAsDouble"), + Atom.findOrCreateUnicodeAtom("(D)Ljava/lang/Object;")); + } + constantPool[numParams+2] = RVMClass.packCPEntry(RVMClass.CP_MEMBER, boxMethod.getId()); + bytecodes[curBC+3] = (byte)JBC_invokestatic; + bytecodes[curBC+4] = (byte)((numParams+2) >>> 8); + bytecodes[curBC+5] = (byte)(numParams+2); + } + bytecodes[curBC+6] = (byte)JBC_areturn; + return new NormalMethod(reflectionClass, + memRef, + (short) (ACC_PUBLIC | ACC_FINAL | ACC_SYNTHETIC), + null, + (short) 3, + (short) (getParameterWords() + 2), + bytecodes, + null, + null, + constantPool, + null, + null, + null, + null); + } } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TypeReference.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TypeReference.java 2008-08-10 16:11:23 UTC (rev 14865) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/TypeReference.java 2008-08-10 16:12:45 UTC (rev 14866) @@ -15,6 +15,7 @@ import org.jikesrvm.VM; import static org.jikesrvm.SizeConstants.BYTES_IN_ADDRESS; +import org.jikesrvm.runtime.ReflectionBase; import org.jikesrvm.util.ImmutableEntryHashSetRVM; // TODO: The following is due to a bug in checkstyle 4.3 @@ -178,6 +179,8 @@ findOrCreate(org.jikesrvm.mm.mminterface.CollectorThread.class); public static final TypeReference RVMArray = findOrCreate(org.jikesrvm.classloader.RVMArray.class); + /** Abstract base of reflective method invoker classes */ + static final TypeReference baseReflectionClass = TypeReference.findOrCreate(ReflectionBase.class); // Synthetic types used by the opt compiler public static final TypeReference NULL_TYPE = @@ -194,6 +197,7 @@ /** * Hash value based on name, used for canonical type dictionary */ + @Override public int hashCode() { return name.hashCode(); } @@ -202,6 +206,7 @@ * Are two keys equivalent? Used for canonical type dictionary. * NB ignores id value */ + @Override public boolean equals(Object other) { if (other instanceof TypeReference) { TypeReference that = (TypeReference) other; @@ -807,6 +812,7 @@ return type; } + @Override public String toString() { return "< " + classloader + ", " + name + " >"; } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Reflection.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Reflection.java 2008-08-10 16:11:23 UTC (rev 14865) +++ rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Reflection.java 2008-08-10 16:12:45 UTC (rev 14866) @@ -18,10 +18,13 @@ import org.jikesrvm.Constants; import org.jikesrvm.classloader.RVMClass; import org.jikesrvm.classloader.RVMMethod; +import org.jikesrvm.classloader.RVMType; import org.jikesrvm.classloader.TypeReference; import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.scheduler.Processor; +import org.jikesrvm.util.HashMapRVM; import org.vmmagic.pragma.NoInline; +import org.vmmagic.pragma.Pure; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.WordArray; @@ -30,7 +33,34 @@ */ public class Reflection implements Constants { + /** Perform reflection using bytecodes (true) or out-of-line machine code (false) */ + private static boolean bytecodeReflection = true; + /** + * Does the reflective method scheme need to check the arguments are valid? + * Bytecode reflection doesn't need arguments checking as they are checking as + * they are unwrapped + */ + public static boolean needsCheckArgs = !bytecodeReflection; + + /** Map from a method to a reflective method capable of invoking it */ + private static final HashMapRVM<RVMMethod, ReflectionBase> invokeMethods = + bytecodeReflection ? new HashMapRVM<RVMMethod, ReflectionBase>() : null; + + static { + RVMType type = TypeReference.findOrCreate(ReflectionBase.class).resolve(); + RVMMethod defaultConstructor = null; + RVMMethod[] methods = type.asClass().getConstructorMethods(); + for (RVMMethod method : methods) { + if (method.getParameterTypes().length == 0) { + defaultConstructor = method; + break; + } + } + getInvoker(defaultConstructor); + } + + /** * Call a method. * @param method method to be called * @param thisArg "this" argument (ignored if method is static) @@ -46,7 +76,35 @@ } public static Object invoke(RVMMethod method, Object thisArg, Object[] otherArgs, boolean isNonvirtual) { + if (!bytecodeReflection) { + return outOfLineInvoke(method, thisArg, otherArgs, isNonvirtual); + } else { + return getInvoker(method).invoke(thisArg, otherArgs); + } + } + @Pure + @SuppressWarnings("unchecked") + private static ReflectionBase getInvoker(RVMMethod method) { + ReflectionBase invoker = invokeMethods.get(method); + if (invoker == null) { + Class<ReflectionBase> reflectionClass = (Class<ReflectionBase>)RVMClass.createReflectionClass(method); + if (reflectionClass != null) { + try { + invoker = reflectionClass.newInstance(); + } catch (Throwable e) { + throw new Error(e); + } + } else { + invoker = ReflectionBase.nullInvoker; + } + invokeMethods.put(method, invoker); + } + return invoker; + } + + private static Object outOfLineInvoke(RVMMethod method, Object thisArg, Object[] otherArgs, boolean isNonvirtual) { + // the class must be initialized before we can invoke a method // RVMClass klass = method.getDeclaringClass(); @@ -83,9 +141,9 @@ unwrapChar(wrapChar((char) 0)); unwrapShort(wrapShort((short) 0)); unwrapInt(wrapInt(0)); - unwrapLong(wrapLong((long) 0)); - unwrapFloat(wrapFloat((float) 0)); - unwrapDouble(wrapDouble((double) 0)); + unwrapLong(wrapLong(0)); + unwrapFloat(wrapFloat(0)); + unwrapDouble(wrapDouble(0)); firstUse = false; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dfr...@us...> - 2008-08-13 08:00:28
|
Revision: 14877 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14877&view=rev Author: dframpton-oss Date: 2008-08-13 08:00:20 +0000 (Wed, 13 Aug 2008) Log Message: ----------- Replace finalization to more closely match reference types. Should fix up some of the Poisoning (and possibly the ConcMS) failures. Tested here by running core and pre-commit several times, I will watch to make sure nothing regresses. Modified Paths: -------------- rvmroot/trunk/MMTk/ext/vm/harness/org/mmtk/harness/vm/Factory.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Factory.java rvmroot/trunk/MMTk/src/org/mmtk/plan/SimpleCollector.java rvmroot/trunk/MMTk/src/org/mmtk/vm/Factory.java rvmroot/trunk/MMTk/src/org/mmtk/vm/VM.java rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MemoryManager.java Added Paths: ----------- rvmroot/trunk/MMTk/ext/vm/harness/org/mmtk/harness/vm/FinalizableProcessor.java rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/FinalizableProcessor.java rvmroot/trunk/MMTk/src/org/mmtk/vm/FinalizableProcessor.java Removed Paths: ------------- rvmroot/trunk/MMTk/src/org/mmtk/utility/Finalizer.java Modified: rvmroot/trunk/MMTk/ext/vm/harness/org/mmtk/harness/vm/Factory.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/harness/org/mmtk/harness/vm/Factory.java 2008-08-12 11:38:32 UTC (rev 14876) +++ rvmroot/trunk/MMTk/ext/vm/harness/org/mmtk/harness/vm/Factory.java 2008-08-13 08:00:20 UTC (rev 14877) @@ -142,6 +142,17 @@ } /** + * Create a new FinalizableProcessor instance using the appropriate VM-specific + * concrete FinalizableProcessor sub-class. + * + * @see FinalizableProcessor + * @return A concrete VM-specific FinalizableProcessor instance. + */ + public FinalizableProcessor newFinalizableProcessor() { + return new FinalizableProcessor(); + } + + /** * Create a new Scanning instance using the appropriate VM-specific * concrete Scanning sub-class. * Added: rvmroot/trunk/MMTk/ext/vm/harness/org/mmtk/harness/vm/FinalizableProcessor.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/harness/org/mmtk/harness/vm/FinalizableProcessor.java (rev 0) +++ rvmroot/trunk/MMTk/ext/vm/harness/org/mmtk/harness/vm/FinalizableProcessor.java 2008-08-13 08:00:20 UTC (rev 14877) @@ -0,0 +1,47 @@ +/* + * This file is part of the Jikes RVM project (http://jikesrvm.org). + * + * This file is licensed to You under the Common Public License (CPL); + * You may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.opensource.org/licenses/cpl1.0.php + * + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. + */ +package org.mmtk.harness.vm; + +import org.mmtk.plan.TraceLocal; +import org.vmmagic.pragma.Uninterruptible; + +/** + * This class manages finalizable objects. + */ +@Uninterruptible +public final class FinalizableProcessor extends org.mmtk.vm.FinalizableProcessor { + + /** + * Clear the contents of the table. This is called when finalization is + * disabled to make it easier for VMs to change this setting at runtime. + */ + public void clear() { + } + + /** + * Scan through the list of references. + * + * @param trace the thread local trace element. + * @param nursery true if it is safe to only scan new references. + */ + public void scan(TraceLocal trace, boolean nursery) { + Assert.notImplemented(); + } + + /** + * Iterate over and forward entries in the table. + */ + public void forward(TraceLocal trace, boolean nursery) { + Assert.notImplemented(); + } +} Property changes on: rvmroot/trunk/MMTk/ext/vm/harness/org/mmtk/harness/vm/FinalizableProcessor.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java 2008-08-12 11:38:32 UTC (rev 14876) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java 2008-08-13 08:00:20 UTC (rev 14877) @@ -27,7 +27,6 @@ import org.mmtk.plan.CollectorContext; import org.mmtk.plan.MutatorContext; import org.mmtk.plan.Plan; -import org.mmtk.utility.Finalizer; import org.mmtk.utility.options.Options; import org.vmmagic.pragma.Inline; import org.vmmagic.pragma.Interruptible; @@ -337,7 +336,7 @@ */ @Uninterruptible public static void scheduleFinalizerThread() { - int finalizedCount = Finalizer.countToBeFinalized(); + int finalizedCount = FinalizableProcessor.countReadyForFinalize(); if (finalizedCount > 0) { Scheduler.scheduleFinalizer(); } Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Factory.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Factory.java 2008-08-12 11:38:32 UTC (rev 14876) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Factory.java 2008-08-13 08:00:20 UTC (rev 14877) @@ -186,6 +186,22 @@ } /** + * Create a new FinalizableProcessor instance using the appropriate VM-specific + * concrete FinalizableProcessor sub-class. + * + * @see ReferenceProcessor + * @return A concrete VM-specific FinalizableProcessor instance. + */ + public org.mmtk.vm.FinalizableProcessor newFinalizableProcessor() { + try { + return FinalizableProcessor.getProcessor(); + } catch (Exception e) { + VM.sysFail("Failed to allocate new FinalizableProcessor!"); + return null; // never get here + } + } + + /** * Create a new Scanning instance using the appropriate VM-specific * concrete Scanning sub-class. * Added: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/FinalizableProcessor.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/FinalizableProcessor.java (rev 0) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/FinalizableProcessor.java 2008-08-13 08:00:20 UTC (rev 14877) @@ -0,0 +1,306 @@ +/* + * This file is part of the Jikes RVM project (http://jikesrvm.org). + * + * This file is licensed to You under the Common Public License (CPL); + * You may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.opensource.org/licenses/cpl1.0.php + * + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. + */ +package org.jikesrvm.mm.mmtk; + +import org.vmmagic.pragma.*; +import org.vmmagic.unboxed.*; + +import org.jikesrvm.SizeConstants; +import org.jikesrvm.VM; +import org.jikesrvm.mm.mminterface.Selected; +import org.jikesrvm.runtime.Magic; +import org.jikesrvm.scheduler.Scheduler; +import org.mmtk.plan.TraceLocal; + +/** + * This class manages the processing of finalizable objects. + */ +@Uninterruptible +public final class FinalizableProcessor extends org.mmtk.vm.FinalizableProcessor implements SizeConstants { + + /******************************************************************** + * Class fields + */ + + /** The FinalizableProcessor singleton */ + private static final FinalizableProcessor finalizableProcessor = new FinalizableProcessor(); + + /** Stress the system? */ + private static final boolean STRESS = VM.ForceFrequentGC; + + /** Initial size of the reference object table */ + private static final int INITIAL_SIZE = STRESS ? 1 : 256; + + /** Amount to grow the table by when it is filled */ + private static final double GROWTH_FACTOR = 2.0; + + /************************************************************************* + * Instance fields + */ + + /** Used to ensure mutual exclusion during table manipulation */ + private final Lock lock = new Lock("AddressTable"); + + /** The table of candidates */ + protected volatile AddressArray table = AddressArray.create(INITIAL_SIZE); + + /** The table of ready objects */ + protected volatile Object[] readyForFinalize = new Object[INITIAL_SIZE]; + + /** Index of first entry created since last collection */ + protected int nurseryIndex = 0; + + /** Index of the first free slot in the table. */ + protected volatile int maxIndex = 0; + + /** Flag to prevent a race between threads growing the table. */ + private volatile boolean growingTables = false; + + /** Next object ready to be finalized */ + private volatile int nextReadyIndex = 0; + + /** Last object ready to be finalized */ + private volatile int lastReadyIndex = 0; + + /** + * Create a new table. + */ + protected FinalizableProcessor() {} + + /** + * Grow the table. + * + * Can GC when it allocates, but the rest of the code can't tolerate GC. + * This method is called without the reference processor lock held, but with + * the flag <code>growingTable</code> set. + */ + @UninterruptibleNoWarn + @Unpreemptible("Non-preemptible but allocates larger table") + private void growTables() { + if (maxIndex >= table.length()) { + int newLength = STRESS ? table.length() + 1 : (int)(table.length() * GROWTH_FACTOR); + AddressArray newTable = AddressArray.create(newLength); + for (int i=0; i < table.length(); i++) { + newTable.set(i, table.get(i)); + } + table = newTable; + } + + if (maxIndex >= freeReady()) { + /* Logically we need to be able to store all these values in the ready table */ + int readyLength = table.length() + countReady(); + if (readyLength > readyForFinalize.length) { + /* Need to grow the ready table also */ + Object[] newReadyForFinalize = new Object[readyLength]; + int j = 0; + for(int i=nextReadyIndex; i < lastReadyIndex && i < readyForFinalize.length; i++) { + newReadyForFinalize[j++] = readyForFinalize[i]; + } + if (lastReadyIndex < nextReadyIndex) { + for(int i=0; i < lastReadyIndex; i++) { + newReadyForFinalize[j++] = readyForFinalize[i]; + } + } + lastReadyIndex = j; + nextReadyIndex = 0; + readyForFinalize = newReadyForFinalize; + } + } + } + + /** + * Allocate an entry in the table. This should be called from an unpreemptible + * context so that the entry can be filled. This method is responsible for growing + * the table if necessary. + * + * @return The allocated index. + */ + @NoInline + @Unpreemptible("Non-preemptible but yield when table needs to be grown") + public void add(Object object) { + /* + * Ensure that only one thread at a time can grow the + * table of references. The volatile flag <code>growingTable</code> is + * used to allow growing the table to trigger GC, but to prevent + * any other thread from accessing the table while it is being grown. + * + * If the table has space, threads will add the reference, incrementing maxIndex + * and exit. + * + * If the table is full, the first thread to notice will grow the table. + * Subsequent threads will release the lock and yield at (1) while the + * first thread grows the table. + */ + lock.acquire(); + while (growingTables || maxIndex >= table.length() || maxIndex >= freeReady()) { + if (growingTables) { + lock.release(); + Scheduler.yield(); // (1) Allow another thread to grow the table + lock.acquire(); + } else { + growingTables = true; // Prevent other threads from growing table while lock is released + lock.release(); // Can't hold the lock while allocating + growTables(); + lock.acquire(); + growingTables = false; // Allow other threads to grow the table rather than waiting for us + } + } + table.set(maxIndex++, Magic.objectAsAddress(object)); + lock.release(); + } + + /** + * Clear the contents of the table. This is called when reference types are + * disabled to make it easier for VMs to change this setting at runtime. + */ + public void clear() { + maxIndex = 0; + } + + /** + * Scan through all entries in the table and forward. + * + * Currently ignores the nursery hint. + * + * TODO parallelise this code? + * + * @param trace The trace + * @param nursery Is this a nursery collection ? + */ + @Override + public void forward(TraceLocal trace, boolean nursery) { + for (int i=0 ; i < maxIndex; i++) { + ObjectReference ref = table.get(i).toObjectReference(); + table.set(i, trace.getForwardedFinalizable(ref).toAddress()); + } + } + + /** + * Scan through the list of references. Calls ReferenceProcessor's + * processReference method for each reference and builds a new + * list of those references still active. + * + * Depending on the value of <code>nursery</code>, we will either + * scan all references, or just those created since the last scan. + * + * TODO parallelise this code + * + * @param nursery Scan only the newly created references + */ + @Override + @UninterruptibleNoWarn + public void scan(TraceLocal trace, boolean nursery) { + int toIndex = nursery ? nurseryIndex : 0; + + for (int fromIndex = toIndex; fromIndex < maxIndex; fromIndex++) { + ObjectReference ref = table.get(fromIndex).toObjectReference(); + + /* Determine liveness (and forward if necessary) */ + if (trace.isLive(ref)) { + table.set(toIndex++, trace.getForwardedFinalizable(ref).toAddress()); + continue; + } + + /* Make ready for finalize */ + ref = trace.retainForFinalize(ref); + + /* Add to object table */ + Offset offset = Word.fromIntZeroExtend(lastReadyIndex).lsh(LOG_BYTES_IN_ADDRESS).toOffset(); + Selected.Plan.get().storeObjectReference(Magic.objectAsAddress(readyForFinalize).plus(offset), ref); + lastReadyIndex = (lastReadyIndex + 1) % readyForFinalize.length; + } + nurseryIndex = maxIndex = toIndex; + } + + /** + * Get an object to run finalize(). + * + * @return The object to finalize() + */ + @NoInline + @Unpreemptible("Non-preemptible but may pause if another thread is growing the table") + public Object getReady() { + lock.acquire(); + while (growingTables) { + lock.release(); + Scheduler.yield(); // (1) Allow another thread to grow the table + lock.acquire(); + } + Object result = null; + if (nextReadyIndex != lastReadyIndex) { + result = readyForFinalize[nextReadyIndex]; + readyForFinalize[nextReadyIndex] = null; + nextReadyIndex = (nextReadyIndex + 1) % readyForFinalize.length; + } + lock.release(); + return result; + } + + /*********************************************************************** + * Statistics and debugging + */ + + /** + * The number of entries in the table. + */ + public int count() { + return maxIndex; + } + + /** + * The number of entries ready to be finalized. + */ + public int countReady() { + return ((lastReadyIndex - nextReadyIndex) + readyForFinalize.length) % readyForFinalize.length; + } + + /** + * The number of entries ready to be finalized. + */ + public int freeReady() { + return readyForFinalize.length - countReady(); + } + + /*********************************************************************** + * Static methods. + */ + + /** Get the singleton */ + public static FinalizableProcessor getProcessor() { + return finalizableProcessor; + } + + /** + * Add a finalization candidate. + * @param object The object with a finalizer. + */ + @Unpreemptible("Non-preemptible but may pause if table needs to be grown") + public static void addCandidate(Object object) { + finalizableProcessor.add(object); + } + + /** + * Get an object to call the finalize() method on it. + */ + @Unpreemptible("Non-preemptible but may pause if table is being grown") + public static Object getForFinalize() { + return finalizableProcessor.getReady(); + } + + /** + * The number of objects waiting for finalize() calls. + */ + public static int countReadyForFinalize() { + return finalizableProcessor.countReady(); + } +} Property changes on: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/FinalizableProcessor.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/SimpleCollector.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/SimpleCollector.java 2008-08-12 11:38:32 UTC (rev 14876) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/SimpleCollector.java 2008-08-13 08:00:20 UTC (rev 14877) @@ -12,7 +12,6 @@ */ package org.mmtk.plan; -import org.mmtk.utility.Finalizer; import org.mmtk.utility.Log; import org.mmtk.utility.options.Options; @@ -108,9 +107,9 @@ if (phaseId == Simple.FINALIZABLE) { if (primary) { if (Options.noFinalizer.getValue()) - Finalizer.clear(); + VM.finalizableProcessor.clear(); else - Finalizer.moveToFinalizable(getCurrentTrace()); + VM.finalizableProcessor.scan(getCurrentTrace(),global().isCurrentGCNursery()); } return; } @@ -138,7 +137,7 @@ if (phaseId == Simple.FORWARD_FINALIZABLE) { if (primary && !Options.noFinalizer.getValue() && VM.activePlan.constraints().needsForwardAfterLiveness()) { - Finalizer.forward(getCurrentTrace()); + VM.finalizableProcessor.forward(getCurrentTrace(),global().isCurrentGCNursery()); } return; } Deleted: rvmroot/trunk/MMTk/src/org/mmtk/utility/Finalizer.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/utility/Finalizer.java 2008-08-12 11:38:32 UTC (rev 14876) +++ rvmroot/trunk/MMTk/src/org/mmtk/utility/Finalizer.java 2008-08-13 08:00:20 UTC (rev 14877) @@ -1,277 +0,0 @@ -/* - * This file is part of the Jikes RVM project (http://jikesrvm.org). - * - * This file is licensed to You under the Common Public License (CPL); - * You may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.opensource.org/licenses/cpl1.0.php - * - * See the COPYRIGHT.txt file distributed with this work for information - * regarding copyright ownership. - */ -package org.mmtk.utility; - -import org.mmtk.plan.TraceLocal; -import org.mmtk.vm.Lock; -import org.mmtk.vm.VM; -import org.mmtk.vm.SynchronizedCounter; -import org.vmmagic.pragma.*; -import org.vmmagic.unboxed.*; - -/** - * This class manages finalization. When an object is created if its - * class has a finalize() method, addElement below is called, and a - * FinalizerListElement (see FinalizerListElement) is created for it. - * While the object is old, the integer field of the list element - * holds its value (this does not keep the object live during gc. At - * the end of gc, the list of FinalizerListElements is scanned for - * objects which have become garbage. Those which have are made live - * again are moved to the live object list for finalization. - * - * Elsewhere, there is a distinguished Finalizer thread which - * enqueues itself on the Scheduler finalizerQueue. At the end of gc, - * if needed and if the Scheduler finalizerQueue is not empty, - * the finalizer thread is scheduled to be run when gc is completed. - */ -@Uninterruptible public class Finalizer { - - // ----------------// - // Implementation // - // ----------------// - - private static int INITIAL_SIZE = 32768; - private static double growthFactor = 2.0; - private static final Lock lock = VM.newLock("Finalizer"); - private static final SynchronizedCounter gcLock = VM.newSynchronizedCounter(); - - /* Use an AddressArray rather than ObjectReference array to *avoid* this - being traced. We don't want this array to keep the candiates alive */ - private static AddressArray candidate = AddressArray.create(INITIAL_SIZE); - private static int candidateEnd; // candidate[0] .. candidate[candidateEnd-1] contains non-zero entries - private static ObjectReferenceArray live = ObjectReferenceArray.create(INITIAL_SIZE); - private static int liveStart; // live[liveStart] .. live[liveEnd-1] are the non-null entries - private static int liveEnd; - - // -----------// - // interface // - // -----------// - - // Add item. - // - @Interruptible - @NoInline - // (SJF: This method must NOT be inlined into an inlined allocation sequence, since it contains a lock!) - // - public static void addCandidate(ObjectReference item) { - - /* The following is tricky due to its littering of deadlock potential and - * thread (logical and physical) race conditions, hence the unusual comment - * verbosity. - * - * If we know we need to expand newCandidate array, then do a preventive - * full collection. This prevents two-stage deadlock arising when - * AddressArray.create(int) must adjust page tables, requiring acquiring - * the immortal mutator lock which might be held by another thread which - * attempts to add a finalizer candidate also while simultaneously holding - * the immortal mutator lock. - */ - if (candidateEnd >= candidate.length()) { - /* must guard against multiple logical or physical processors executing - * mutator threads which enter this method concurrently. the first thread - * in should commence the collection; all subsequent threads must block, - * until the GC succeeds. Note we cannot invoke System.gc() here, since - * that method will return immediately if collection is already in- - * progress. - */ - if (gcLock.increment() == 0) { // lead concurrent mutator - /* Note the above lock is insufficient to guarantee that only a single - * thread is in explicit collection (since another thread could have - * executed System.gc() directly). Thus, use System.gc() here, rather than - * org.mmtk.vm.Collection.triggerCollection(org.mmtk.vm.Collection.EXTERNAL_GC_TRIGGER), - * to prevent collection from being concurrently executed. See RVM - * bug 1511447 and RVM patch 1512948 for more detail. - */ - try { - System.gc(); - } finally { - // release trailing concurrent mutators (in while-loop below) - gcLock.reset(); - } - } else { // trailing concurrent mutators - // wait until lead thread finishes above collection - while (gcLock.peek() != 0) { - /* must do a yielded-spin, since the concurrent - * thread may be on the same physically processor. - * plus, gc may take a long time and we should - * hog as few cycles as possible while we wait patiently. - */ - Thread.yield(); - } - } - } - - try { - lock.acquire(); - int origLength = candidate.length(); - if (candidateEnd >= origLength) { - /* the above explicit collection will ensure this - * does not deadlock due to necessity for physical - * memory management (e.g. virtual page allocation) - * to satisfy this allocation request. - */ - AddressArray newCandidate = AddressArray.create((int) (growthFactor * origLength)); - for (int i=0; i<origLength; i++) { - newCandidate.set(i, candidate.get(i)); - } - candidate = newCandidate; - } - candidate.set(candidateEnd++, item.toAddress()); - } finally { - lock.release(); - } - } - - private static void compactCandidates() { - int leftCursor = 0; - int rightCursor = candidateEnd - 1; - // Invariant: Slots left of leftCursor are non-empty and slots right of rightCursor are empty - while (true) { - // Advance left cursor until it hits empty slot - while (leftCursor < rightCursor && !candidate.get(leftCursor).isZero()) - leftCursor++; - // Back-advance right cursor until it hits non-empty slot - while (rightCursor > leftCursor && candidate.get(rightCursor).isZero()) - rightCursor--; - if (leftCursor >= rightCursor) // can be greater on first iteration if totally empty - break; - if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(candidate.get(leftCursor).isZero() && !candidate.get(rightCursor).isZero()); - candidate.set(leftCursor, candidate.get(rightCursor)); - candidate.set(rightCursor, Address.zero()); - } - if (candidate.get(leftCursor).isZero()) - candidateEnd = leftCursor; - else - candidateEnd = leftCursor + 1; - } - - /* Add revived object that needs to be finalized - * - * The aastore is actually uninterruptible since the target is an array of Objects. - */ - @LogicallyUninterruptible - private static void addLive(ObjectReference obj) { - if (liveEnd == live.length()) { - ObjectReferenceArray newLive = live; - if (liveStart == 0) - newLive = ObjectReferenceArray.create((int) (growthFactor * live.length())); - for (int i = liveStart; i < liveEnd; i++) - newLive.set(i - liveStart, live.get(i)); - for (int i = liveEnd - liveStart; i < live.length(); i++) - newLive.set(i, ObjectReference.nullReference()); - liveEnd -= liveStart; - liveStart = 0; - live = newLive; - } - live.set(liveEnd++, obj); - } - - /** - * Called from the mutator thread: return the first object queued on - * the finalize list, or null if none - * - * The aastore is actually uninterruptible since the target is an - * array of Objects. - */ - @LogicallyUninterruptible - public static ObjectReference get() { - - if (liveStart == liveEnd) return ObjectReference.nullReference(); - - ObjectReference obj = live.get(liveStart); - live.set(liveStart++, ObjectReference.nullReference()); - - return obj; - } - - /** - * Move all finalizable objects to the to-be-finalized queue - * Called on shutdown. Caller must also schedule the finalizer thread. - */ - public static void finalizeAll() { - - int cursor = 0; - while (cursor < candidateEnd) { - Address cand = candidate.get(cursor); - candidate.set(cursor, Address.zero()); - addLive(cand.toObjectReference()); - cursor++; - } - - compactCandidates(); - - } - - - public static void clear() { - candidateEnd = 0; - } - - - /** - * Scan the array for objects which have become finalizable and move - * them to the Finalizable class - * - * @param trace The trace instance to use. - */ - public static int moveToFinalizable(TraceLocal trace) { - int cursor = 0; - int newFinalizeCount = 0; - - while (cursor < candidateEnd) { - Address cand = candidate.get(cursor); - boolean isFinalizable = trace.readyToFinalize(cand.toObjectReference()); - if (isFinalizable) { // object died, enqueue for finalization - candidate.set(cursor, Address.zero()); - addLive(trace.retainForFinalize(cand.toObjectReference())); - newFinalizeCount++; - } else { // live beforehand but possibly moved - candidate.set(cursor, trace.getForwardedFinalizable(cand.toObjectReference()).toAddress()); - } - cursor++; - } - compactCandidates(); - - return newFinalizeCount; - } // moveToFinalizable - - /** - * Scan the array for objects which have become finalizable and move - * them to the Finalizable class - * - * @param trace The trace object to use for forwarding. - */ - @Inline - public static void forward(TraceLocal trace) { - int cursor = 0; - - while (cursor < candidateEnd) { - Address cand = candidate.get(cursor); - ObjectReference newCandidate = trace.getForwardedFinalizable(cand.toObjectReference()); - candidate.set(cursor, newCandidate.toAddress()); - cursor++; - } - } - - - // methods for statistics and debugging - - static int countHasFinalizer() { - return candidateEnd; - } - - public static int countToBeFinalized() { - return liveEnd - liveStart; - } - -} Modified: rvmroot/trunk/MMTk/src/org/mmtk/vm/Factory.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/vm/Factory.java 2008-08-12 11:38:32 UTC (rev 14876) +++ rvmroot/trunk/MMTk/src/org/mmtk/vm/Factory.java 2008-08-13 08:00:20 UTC (rev 14877) @@ -119,7 +119,17 @@ */ public abstract ReferenceProcessor newReferenceProcessor(ReferenceProcessor.Semantics semantics); + /** + * Create a new FinalizbleProcessor instance using the appropriate VM-specific + * concrete FinalizableProcessor sub-class. + * + * @see FinalizableProcessor + * @return A concrete VM-specific FinalizableProcessor instance. + */ + public abstract FinalizableProcessor newFinalizableProcessor(); + + /** * Create a new Scanning instance using the appropriate VM-specific * concrete Scanning sub-class. * Added: rvmroot/trunk/MMTk/src/org/mmtk/vm/FinalizableProcessor.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/vm/FinalizableProcessor.java (rev 0) +++ rvmroot/trunk/MMTk/src/org/mmtk/vm/FinalizableProcessor.java 2008-08-13 08:00:20 UTC (rev 14877) @@ -0,0 +1,42 @@ +/* + * This file is part of the Jikes RVM project (http://jikesrvm.org). + * + * This file is licensed to You under the Common Public License (CPL); + * You may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.opensource.org/licenses/cpl1.0.php + * + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. + */ +package org.mmtk.vm; + +import org.mmtk.plan.TraceLocal; +import org.vmmagic.pragma.Uninterruptible; + +/** + * This class manages finalizable objects. + */ +@Uninterruptible +public abstract class FinalizableProcessor { + + /** + * Clear the contents of the table. This is called when finalization is + * disabled to make it easier for VMs to change this setting at runtime. + */ + public abstract void clear(); + + /** + * Scan through the list of references. + * + * @param trace the thread local trace element. + * @param nursery true if it is safe to only scan new references. + */ + public abstract void scan(TraceLocal trace, boolean nursery); + + /** + * Iterate over and forward entries in the table. + */ + public abstract void forward(TraceLocal trace, boolean nursery); +} Property changes on: rvmroot/trunk/MMTk/src/org/mmtk/vm/FinalizableProcessor.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Modified: rvmroot/trunk/MMTk/src/org/mmtk/vm/VM.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/vm/VM.java 2008-08-12 11:38:32 UTC (rev 14876) +++ rvmroot/trunk/MMTk/src/org/mmtk/vm/VM.java 2008-08-13 08:00:20 UTC (rev 14877) @@ -103,6 +103,8 @@ @Untraced public static final ReferenceProcessor phantomReferences; @Untraced + public static final FinalizableProcessor finalizableProcessor; + @Untraced public static final Scanning scanning; @Untraced public static final Statistics statistics; @@ -149,6 +151,7 @@ weakReferences = factory.newReferenceProcessor(ReferenceProcessor.Semantics.WEAK); softReferences = factory.newReferenceProcessor(ReferenceProcessor.Semantics.SOFT); phantomReferences = factory.newReferenceProcessor(ReferenceProcessor.Semantics.PHANTOM); + finalizableProcessor = factory.newFinalizableProcessor(); scanning = factory.newScanning(); statistics = factory.newStatistics(); strings = factory.newStrings(); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MemoryManager.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MemoryManager.java 2008-08-12 11:38:32 UTC (rev 14876) +++ rvmroot/trunk/rvm/src/org/jikesrvm/mm/mminterface/MemoryManager.java 2008-08-13 08:00:20 UTC (rev 14877) @@ -25,6 +25,7 @@ import org.jikesrvm.classloader.RVMType; import org.jikesrvm.classloader.TypeReference; import org.jikesrvm.mm.mmtk.Collection; +import org.jikesrvm.mm.mmtk.FinalizableProcessor; import org.jikesrvm.mm.mmtk.ReferenceProcessor; import org.jikesrvm.mm.mmtk.SynchronizedCounter; import org.jikesrvm.objectmodel.BootImageInterface; @@ -42,7 +43,6 @@ import org.mmtk.plan.Plan; import org.mmtk.policy.Space; import org.mmtk.utility.Constants; -import org.mmtk.utility.Finalizer; import org.mmtk.utility.Memory; import org.mmtk.utility.alloc.Allocator; import org.mmtk.utility.gcspy.GCspy; @@ -1109,7 +1109,7 @@ */ @Interruptible public static void addFinalizer(Object object) { - Finalizer.addCandidate(ObjectReference.fromObject(object)); + FinalizableProcessor.addCandidate(object); } /** @@ -1118,8 +1118,9 @@ * * @return the object needing to be finialized */ + @Unpreemptible("Non-preemptible but may yield if finalizable table is being grown") public static Object getFinalizedObject() { - return Finalizer.get().toObject(); + return FinalizableProcessor.getForFinalize(); } /*********************************************************************** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cap...@us...> - 2008-08-14 09:52:45
|
Revision: 14882 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14882&view=rev Author: captain5050 Date: 2008-08-14 09:52:40 +0000 (Thu, 14 Aug 2008) Log Message: ----------- RVM-630 WIP: Make path names sensitive to differences between UNIX and Windows. In the build ant file try to use path rather than value. In the Java use constants from File when appropriate. Modified Paths: -------------- rvmroot/trunk/build.xml rvmroot/trunk/rvm/src/org/jikesrvm/classloader/ApplicationClassLoader.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/BootstrapClassLoader.java rvmroot/trunk/tools/ant-tasks/src/org/jikesrvm/tools/template/GenerateFromTemplate.java rvmroot/trunk/tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImageWriter.java Modified: rvmroot/trunk/build.xml =================================================================== --- rvmroot/trunk/build.xml 2008-08-14 09:49:45 UTC (rev 14881) +++ rvmroot/trunk/build.xml 2008-08-14 09:52:40 UTC (rev 14882) @@ -489,9 +489,8 @@ <mkdir dir="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/ir"/> <GenerateFromTemplate> <args> - <arg value="${build.ir.dir}/Operator.template"/> - <arg - value="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/ir/Operator.java"/> + <arg path="${build.ir.dir}/Operator.template"/> + <arg path="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/ir/Operator.java"/> <arg value="ARCH_IR_DIR=@{arch}"/> <arg value="ARCHITECTURE=@{arch}"/> <arg value="ARCH_BITS=@{addressSize}"/> @@ -504,9 +503,8 @@ <GenerateFromTemplate> <args> - <arg value="${build.ir.dir}/Operators.template"/> - <arg - value="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/ir/Operators.java"/> + <arg path="${build.ir.dir}/Operators.template"/> + <arg path="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/ir/Operators.java"/> <arg value="ARCH_IR_DIR=@{arch}"/> <arg value="ARCHITECTURE=@{arch}"/> <arg value="ARCH_BITS=@{addressSize}"/> @@ -519,9 +517,8 @@ <GenerateFromTemplate> <args> - <arg value="${build.ir.dir}/OperatorNames.template"/> - <arg - value="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/ir/OperatorNames.java"/> + <arg path="${build.ir.dir}/OperatorNames.template"/> + <arg path="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/ir/OperatorNames.java"/> <arg value="ARCH_IR_DIR=@{arch}"/> <arg value="ARCHITECTURE=@{arch}"/> <arg value="ARCH_BITS=@{addressSize}"/> @@ -534,9 +531,8 @@ <GenerateFromTemplate> <args> - <arg value="${build.ir.dir}/InstructionFormats.template"/> - <arg - value="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/ir/InstructionFormats.RAW"/> + <arg path="${build.ir.dir}/InstructionFormats.template"/> + <arg path="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/ir/InstructionFormats.RAW"/> <arg value="ARCH_IR_DIR=@{arch}"/> <arg value="ARCH_IF_LIST=${build.ir.dir}/@{arch}/InstructionFormatList.dat"/> <arg value="ARCHITECTURE=@{arch}"/> @@ -547,17 +543,16 @@ </GenerateFromTemplate> <exec executable="${perl.exe}" failonerror="true"> - <arg value="${build.ir.dir}/splitInstructionFormats.perl"/> - <arg value="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/ir"/> - <arg - value="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/ir/InstructionFormats.RAW"/> + <arg path="${build.ir.dir}/splitInstructionFormats.perl"/> + <arg path="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/ir"/> + <arg path="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/ir/InstructionFormats.RAW"/> </exec> <mkdir dir="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/lir2mir/@{arch}"/> <GenerateFromTemplate> <args> - <arg value="${build.burs.dir}/ir.template"/> - <arg value="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/lir2mir/@{arch}/ir.brg"/> + <arg path="${build.burs.dir}/ir.template"/> + <arg path="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/lir2mir/@{arch}/ir.brg"/> <arg value="ARCHITECTURE_IR_DIR=${build.ir.dir}/@{arch}"/> <arg value="ARCH_OP_LIST=@{operatorList}"/> <arg value="THE_RULE_FILE=@{rulesList}"/> @@ -597,8 +592,7 @@ files="BURS_State.template"/> </concat> - <concat - destfile="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/lir2mir/@{arch}/BURS_STATE.java"> + <concat destfile="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/lir2mir/@{arch}/BURS_STATE.java"> <filelist dir="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/lir2mir/@{arch}" files="burg.template"/> <filelist dir="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/lir2mir/@{arch}" @@ -607,9 +601,8 @@ <mkdir dir="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/instrsched"/> <GenerateFromTemplate> <args> - <arg value="${basedir}/rvm/src-generated/opt-scheduler/OperatorClass.template"/> - <arg - value="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/instrsched/OperatorClass.java"/> + <arg path="${basedir}/rvm/src-generated/opt-scheduler/OperatorClass.template"/> + <arg path="${generated.dir}/@{arch}-@{addressSize}/main/java/org/jikesrvm/compilers/opt/instrsched/OperatorClass.java"/> <arg value="ARCHITECTURE_IR_DIR=@{arch}"/> <arg value="ADDRESS_MODE=@{addressSize}"/> </args> @@ -719,40 +712,69 @@ <mkdir dir="${generated.java}/org/jikesrvm/compilers/opt"/> <mkdir dir="${generated.java}/org/jikesrvm/adaptive/util"/> + <path id="template.vm.booleanopts.dat"> + <pathelement path="${options.dir}/BooleanOptions.vm.dat"/> + </path> + <path id="template.vm.valueopts.dat"> + <pathelement path="${options.dir}/ValueOptions.vm.dat"/> + </path> <GenerateFromTemplate> <args> - <arg value="${options.dir}/Options.template"/> - <arg value="${generated.java}/org/jikesrvm/Options.java"/> - <arg value="BOOLEAN_DAT_FILES=${options.dir}/BooleanOptions.vm.dat"/> - <arg value="VALUE_DAT_FILES=${options.dir}/ValueOptions.vm.dat"/> + <arg path="${options.dir}/Options.template"/> + <arg path="${generated.java}/org/jikesrvm/Options.java"/> + <arg value="BOOLEAN_DAT_FILES=${toString:template.vm.booleanopts.dat}"/> + <arg value="VALUE_DAT_FILES=${toString:template.vm.valueopts.dat}"/> </args> </GenerateFromTemplate> <mkdir dir="${generated.java}/org/jikesrvm/compilers/baseline"/> + <path id="template.shared.booleanopts.dat"> + <pathelement path="${options.dir}/SharedBooleanOptions.dat"/> + </path> + <path id="template.shared.valueopts.dat"> + <pathelement path="${options.dir}/SharedValueOptions.dat"/> + </path> + <path id="template.base.booleanopts.dat"> + <pathelement path="${options.dir}/BooleanOptions.baseline.dat"/> + </path> + <path id="template.base.valueopts.dat"> + <pathelement path="${options.dir}/ValueOptions.baseline.dat"/> + </path> <GenerateFromTemplate> <args> - <arg value="${options.dir}/BaselineOptions.template"/> - <arg value="${generated.java}/org/jikesrvm/compilers/baseline/BaselineOptions.java"/> - <arg - value="BOOLEAN_DAT_FILES=${options.dir}/BooleanOptions.baseline.dat ${options.dir}/SharedBooleanOptions.dat"/> - <arg value="VALUE_DAT_FILES=${options.dir}/ValueOptions.baseline.dat ${options.dir}/SharedValueOptions.dat"/> + <arg path="${options.dir}/BaselineOptions.template"/> + <arg path="${generated.java}/org/jikesrvm/compilers/baseline/BaselineOptions.java"/> + <arg value="BOOLEAN_DAT_FILES=${toString:template.base.booleanopts.dat} ${toString:template.shared.booleanopts.dat}"/> + <arg value="VALUE_DAT_FILES=${toString:template.base.valueopts.dat} ${toString:template.shared.valueopts.dat}"/> <arg value="MYTYPE=BaselineOptions"/> </args> </GenerateFromTemplate> + <path id="template.opt.booleanopts.dat"> + <pathelement path="${options.dir}/BooleanOptions.opt.dat"/> + </path> + <path id="template.opt.valueopts.dat"> + <pathelement path="${options.dir}/ValueOptions.opt.dat"/> + </path> <GenerateFromTemplate> <args> - <arg value="${options.dir}/OptOptions.template"/> - <arg value="${generated.java}/org/jikesrvm/compilers/opt/OptOptions.java"/> - <arg value="BOOLEAN_DAT_FILES=${options.dir}/BooleanOptions.opt.dat ${options.dir}/SharedBooleanOptions.dat"/> - <arg value="VALUE_DAT_FILES=${options.dir}/ValueOptions.opt.dat ${options.dir}/SharedValueOptions.dat"/> + <arg path="${options.dir}/OptOptions.template"/> + <arg path="${generated.java}/org/jikesrvm/compilers/opt/OptOptions.java"/> + <arg value="BOOLEAN_DAT_FILES=${toString:template.opt.booleanopts.dat} ${toString:template.shared.booleanopts.dat}"/> + <arg value="VALUE_DAT_FILES=${toString:template.opt.valueopts.dat} ${toString:template.shared.valueopts.dat}"/> <arg value="MYTYPE=OptOptions"/> </args> </GenerateFromTemplate> + <path id="template.aos.booleanopts.dat"> + <pathelement path="${options.dir}/BooleanOptions.aos.dat"/> + </path> + <path id="template.aos.valueopts.dat"> + <pathelement path="${options.dir}/ValueOptions.aos.dat"/> + </path> <GenerateFromTemplate> <args> - <arg value="${options.dir}/AOSOptions.template"/> - <arg value="${generated.java}/org/jikesrvm/adaptive/util/AOSExternalOptions.java"/> - <arg value="BOOLEAN_DAT_FILES=${options.dir}/BooleanOptions.aos.dat"/> - <arg value="VALUE_DAT_FILES=${options.dir}/ValueOptions.aos.dat"/> + <arg path="${options.dir}/AOSOptions.template"/> + <arg path="${generated.java}/org/jikesrvm/adaptive/util/AOSExternalOptions.java"/> + <arg value="BOOLEAN_DAT_FILES=${toString:template.aos.booleanopts.dat}"/> + <arg value="VALUE_DAT_FILES=${toString:template.aos.valueopts.dat}"/> <arg value="MYTYPE=AOSExternalOptions"/> </args> </GenerateFromTemplate> @@ -763,7 +785,7 @@ <property name="build.ia32-assembler.dir" location="${basedir}/rvm/src-generated/ia32-assembler"/> <exec executable="${bash.exe}" failonerror="true" dir="${build.ia32-assembler.dir}"> <arg value="genAssembler.sh"/> - <arg value="${generated.ia32.java}/org/jikesrvm/compilers/common/assembler/ia32/Assembler.java"/> + <arg path="${generated.ia32.java}/org/jikesrvm/compilers/common/assembler/ia32/Assembler.java"/> <arg value="Assembler.in"/> </exec> @@ -1204,8 +1226,8 @@ <pathelement location="${build.rt.jar}"/> </classpath> <arg value="${classlib.provider}"/> - <arg value="${generated.asm}:${build.rt.jar}:${build.vm.jar}${build.extra.rt.jars}"/> - <arg value="${generated.asm}"/> + <arg path="${generated.asm}:${build.rt.jar}:${build.vm.jar}${build.extra.rt.jars}"/> + <arg path="${generated.asm}"/> </java> <zip destfile="${build.rt.jar}" update="true" basedir="${generated.asm}" compress="false"> <include name="java/**"/> @@ -1343,20 +1365,20 @@ <sysproperty key="rvm.properties" value="${build.base}/rvm.properties"/> <jvmarg value="-Xbootclasspath/a:${rvm.class.path}"/> <arg value="-log"/> - <arg value="${build.base}/BootImageWriterOutput.txt"/> + <arg path="${build.base}/BootImageWriterOutput.txt"/> <arg value="-classpath"/> - <arg value="${rvm.class.path}"/> + <arg path="${rvm.class.path}"/> <arg value="-n"/> - <arg value="${build.base}/Primordials.txt"/> + <arg path="${build.base}/Primordials.txt"/> <arg value="-oc"/> - <arg value="${build.base}/RVM.code.image"/> + <arg path="${build.base}/RVM.code.image"/> <arg value="-od"/> - <arg value="${build.base}/RVM.data.image"/> + <arg path="${build.base}/RVM.data.image"/> <arg value="-or"/> - <arg value="${build.base}/RVM.rmap.image"/> + <arg path="${build.base}/RVM.rmap.image"/> <arg value="-demographics"/> <arg value="-m"/> - <arg value="${build.base}/RVM.map"/> + <arg path="${build.base}/RVM.map"/> <!-- <arg value="-trace"/> --> <!-- <arg value="-detailed"/> --> <!-- <arg value="-X:bc:verbose=true"/> --> Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/ApplicationClassLoader.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/ApplicationClassLoader.java 2008-08-14 09:49:45 UTC (rev 14881) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/ApplicationClassLoader.java 2008-08-14 09:52:40 UTC (rev 14882) @@ -73,7 +73,7 @@ } } - if (elt.indexOf(":") != -1) { + if (elt.indexOf(File.pathSeparatorChar) != -1) { addURL(new URL(elt)); } else if (elt.startsWith(File.separator)) { addURL(new URL("file", null, -1, elt)); Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/BootstrapClassLoader.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/BootstrapClassLoader.java 2008-08-14 09:49:45 UTC (rev 14881) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/BootstrapClassLoader.java 2008-08-14 09:52:40 UTC (rev 14882) @@ -110,7 +110,7 @@ */ synchronized RVMType loadVMClass(String className) throws NoClassDefFoundError { try { - InputStream is = getResourceAsStream(className.replace('.', '/') + ".class"); + InputStream is = getResourceAsStream(className.replace('.', File.separatorChar) + ".class"); if (is == null) throw new NoClassDefFoundError(className); DataInputStream dataInputStream = new DataInputStream(is); RVMType type = null; @@ -186,7 +186,7 @@ if (className.startsWith("L") && className.endsWith(";")) { className = className.substring(1, className.length() - 2); } - InputStream is = getResourceAsStream(className.replace('.', '/') + ".class"); + InputStream is = getResourceAsStream(className.replace('.', File.separatorChar) + ".class"); if (is == null) throw new ClassNotFoundException(className); DataInputStream dataInputStream = new DataInputStream(is); Class<?> cls = null; @@ -309,7 +309,10 @@ zipFileCache.put(path, zf); } } - + // Zip spec. states that separator must be '/' in the path + if (File.separatorChar != '/') { + name = name.replace(File.separatorChar, '/'); + } ZipEntry ze = zf.getEntry(name); if (ze == null) continue; Modified: rvmroot/trunk/tools/ant-tasks/src/org/jikesrvm/tools/template/GenerateFromTemplate.java =================================================================== --- rvmroot/trunk/tools/ant-tasks/src/org/jikesrvm/tools/template/GenerateFromTemplate.java 2008-08-14 09:49:45 UTC (rev 14881) +++ rvmroot/trunk/tools/ant-tasks/src/org/jikesrvm/tools/template/GenerateFromTemplate.java 2008-08-14 09:52:40 UTC (rev 14882) @@ -246,6 +246,7 @@ inDir = args[0].substring(0, args[0].lastIndexOf(File.separator)+1); else inDir = ""; + if (DEBUG) System.out.println("inDir="+inDir); inStream = new FileInputStream(args[0]); outStream = new FileOutputStream(args[1]); Modified: rvmroot/trunk/tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImageWriter.java =================================================================== --- rvmroot/trunk/tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImageWriter.java 2008-08-14 09:49:45 UTC (rev 14881) +++ rvmroot/trunk/tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImageWriter.java 2008-08-14 09:52:40 UTC (rev 14882) @@ -13,6 +13,7 @@ package org.jikesrvm.tools.bootImageWriter; import java.io.BufferedOutputStream; +import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; @@ -1240,6 +1241,9 @@ typeName = typeName.trim(); // ignore leading and trailing whitespace if (typeName.length() == 0) continue; // ignore comment-only and whitespace-only lines + if (File.separatorChar != '/') { + typeName = typeName.replace(File.separatorChar, '/'); + } // debugging: TypeDescriptorParsing.validateAsTypeDescriptor(typeName); if (TypeDescriptorParsing.isValidTypeDescriptor(typeName)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cap...@us...> - 2008-08-14 21:47:09
|
Revision: 14888 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14888&view=rev Author: captain5050 Date: 2008-08-14 21:47:03 +0000 (Thu, 14 Aug 2008) Log Message: ----------- Cache reflective method invoker objects in java.lang.reflect objects. Configure JNI/Finalization/.. to use out-of-line invocation (configurable using org.jikesrvm.runtime.Reflection.bytecodeReflection), but use bytecode reflection for java.lang.reflect invocation (configurable using org.jikesrvm.runtime.Reflection.cacheInvokerInJavaLangReflect). Modified Paths: -------------- rvmroot/trunk/libraryInterface/Common/src/java/lang/Class.java rvmroot/trunk/libraryInterface/Common/src/java/lang/reflect/VMCommonLibrarySupport.java rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMConstructor.java rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMMethod.java rvmroot/trunk/libraryInterface/Harmony/ASF/src/java/lang/reflect/Constructor.java rvmroot/trunk/libraryInterface/Harmony/ASF/src/java/lang/reflect/Method.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMMethod.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/Simplifier.java rvmroot/trunk/rvm/src/org/jikesrvm/jni/ia32/JNIHelpers.java rvmroot/trunk/rvm/src/org/jikesrvm/jni/ppc/JNIHelpers.java rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Reflection.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/FinalizerThread.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/MainThread.java rvmroot/trunk/rvm/src/org/jikesrvm/tools/oth/OptTestHarness.java Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/Class.java =================================================================== --- rvmroot/trunk/libraryInterface/Common/src/java/lang/Class.java 2008-08-14 21:41:06 UTC (rev 14887) +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/Class.java 2008-08-14 21:47:03 UTC (rev 14888) @@ -635,7 +635,7 @@ T obj = (T)RuntimeEntrypoints.resolvedNewScalar(cls); // Run the default constructor on the it. - Reflection.invoke(defaultConstructor, obj, null); + Reflection.invoke(defaultConstructor, null, obj, null, true); return obj; } Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/reflect/VMCommonLibrarySupport.java =================================================================== --- rvmroot/trunk/libraryInterface/Common/src/java/lang/reflect/VMCommonLibrarySupport.java 2008-08-14 21:41:06 UTC (rev 14887) +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/reflect/VMCommonLibrarySupport.java 2008-08-14 21:47:03 UTC (rev 14888) @@ -24,6 +24,7 @@ import org.jikesrvm.runtime.RuntimeEntrypoints; import org.jikesrvm.runtime.Magic; import org.jikesrvm.runtime.Reflection; +import org.jikesrvm.runtime.ReflectionBase; import org.vmmagic.pragma.Inline; import org.vmmagic.pragma.NoInline; import org.vmmagic.pragma.Pure; @@ -162,28 +163,28 @@ } /* ---- Reflective Method Invocation Support ---- */ @Inline(value=Inline.When.ArgumentsAreConstant, arguments={2}) - static Object invoke(Object receiver, Object[] args, RVMMethod method, Method jlrMethod, RVMClass accessingClass) + static Object invoke(Object receiver, Object[] args, RVMMethod method, Method jlrMethod, RVMClass accessingClass, ReflectionBase invoker) throws IllegalAccessException, IllegalArgumentException, ExceptionInInitializerError, InvocationTargetException { // validate number and types of arguments - if (!Reflection.needsCheckArgs || checkArguments(args, method)) { + if (!Reflection.needsCheckArgs(invoker) || checkArguments(args, method)) { if (method.isStatic()) { - return invokeStatic(receiver, args, method, jlrMethod, accessingClass); + return invokeStatic(receiver, args, method, jlrMethod, accessingClass, invoker); } else { - return invokeVirtual(receiver, args, method, jlrMethod, accessingClass); + return invokeVirtual(receiver, args, method, jlrMethod, accessingClass, invoker); } } else { Object[] compatibleArgs = makeArgumentsCompatible(args, method); if (method.isStatic()) { - return invokeStatic(receiver, compatibleArgs, method, jlrMethod, accessingClass); + return invokeStatic(receiver, compatibleArgs, method, jlrMethod, accessingClass, invoker); } else { - return invokeVirtual(receiver, compatibleArgs, method, jlrMethod, accessingClass); + return invokeVirtual(receiver, compatibleArgs, method, jlrMethod, accessingClass, invoker); } } } @Inline(value=Inline.When.ArgumentsAreConstant, arguments={2}) - private static Object invokeStatic(Object receiver, Object[] args, RVMMethod method, Method jlrMethod, RVMClass accessingClass) + private static Object invokeStatic(Object receiver, Object[] args, RVMMethod method, Method jlrMethod, RVMClass accessingClass, ReflectionBase invoker) throws IllegalAccessException, IllegalArgumentException, ExceptionInInitializerError, InvocationTargetException { // Accessibility checks @@ -199,14 +200,14 @@ // Invoke method try { - return Reflection.invoke(method, receiver, args); + return Reflection.invoke(method, invoker, receiver, args, true); } catch (Throwable t) { throw new InvocationTargetException(t); } } @Inline(value=Inline.When.ArgumentsAreConstant, arguments={2}) - private static Object invokeVirtual(Object receiver, Object[] args, RVMMethod method, Method jlrMethod, RVMClass accessingClass) + private static Object invokeVirtual(Object receiver, Object[] args, RVMMethod method, Method jlrMethod, RVMClass accessingClass, ReflectionBase invoker) throws IllegalAccessException, IllegalArgumentException, ExceptionInInitializerError, InvocationTargetException { // validate "this" argument @@ -229,7 +230,7 @@ // Invoke method try { - return Reflection.invoke(method, receiver, args); + return Reflection.invoke(method, invoker, receiver, args, false); } catch (Throwable t) { throw new InvocationTargetException(t); } @@ -410,14 +411,14 @@ * Construct an object from the given constructor args, called from the accessing class */ @Inline(value=Inline.When.ArgumentsAreConstant, arguments={0}) - static Object construct(RVMMethod constructor, Constructor<?> cons, Object[] args, RVMClass accessingClass) + static Object construct(RVMMethod constructor, Constructor<?> cons, Object[] args, RVMClass accessingClass, ReflectionBase invoker) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { // Check accessibility if (!constructor.isPublic() && !cons.isAccessible()) { checkAccess(constructor, accessingClass); } // validate number and types of arguments to constructor - if (Reflection.needsCheckArgs && !checkArguments(args, constructor)) { + if (Reflection.needsCheckArgs(invoker) && !checkArguments(args, constructor)) { args = makeArgumentsCompatible(args, constructor); } RVMClass cls = constructor.getDeclaringClass(); @@ -432,7 +433,7 @@ Object obj = RuntimeEntrypoints.resolvedNewScalar(cls); // Run the constructor on the instance. try { - Reflection.invoke(constructor, obj, args); + Reflection.invoke(constructor, invoker, obj, args, true); } catch (Throwable e) { throw new InvocationTargetException(e); } Modified: rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMConstructor.java =================================================================== --- rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMConstructor.java 2008-08-14 21:41:06 UTC (rev 14887) +++ rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMConstructor.java 2008-08-14 21:47:03 UTC (rev 14888) @@ -17,6 +17,8 @@ import org.jikesrvm.classloader.RVMClass; import org.jikesrvm.classloader.RVMMethod; import org.jikesrvm.classloader.TypeReference; +import org.jikesrvm.runtime.Reflection; +import org.jikesrvm.runtime.ReflectionBase; /** * Implementation of java.lang.reflect.VMConstructor for JikesRVM. @@ -26,17 +28,24 @@ */ final class VMConstructor { final RVMMethod constructor; + private final ReflectionBase invoker; Constructor<?> cons; // Prevent this class from being instantiated. @SuppressWarnings("unused") private VMConstructor() { constructor = null; + invoker = null; } // For use by JikesRVMSupport VMConstructor(RVMMethod m) { constructor = m; + if (Reflection.cacheInvokerInJavaLangReflect) { + invoker = m.getInvoker(); + } else { + invoker = null; + } } public boolean equals(Object other) { @@ -76,7 +85,7 @@ IllegalAccessException, IllegalArgumentException, InvocationTargetException { - return VMCommonLibrarySupport.construct(constructor, cons, args, RVMClass.getClassFromStackFrame(2)); + return VMCommonLibrarySupport.construct(constructor, cons, args, RVMClass.getClassFromStackFrame(2), invoker); } String getSignature() { Modified: rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMMethod.java =================================================================== --- rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMMethod.java 2008-08-14 21:41:06 UTC (rev 14887) +++ rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMMethod.java 2008-08-14 21:47:03 UTC (rev 14888) @@ -15,6 +15,8 @@ import java.lang.annotation.Annotation; import org.jikesrvm.classloader.*; +import org.jikesrvm.runtime.ReflectionBase; +import org.jikesrvm.runtime.Reflection; /** * Implementation of java.lang.reflect.Field for JikesRVM. @@ -24,17 +26,24 @@ */ final class VMMethod { final RVMMethod method; + private final ReflectionBase invoker; Method m; // Prevent this class from being instantiated. @SuppressWarnings("unused") private VMMethod() { method = null; + invoker = null; } // For use by JikesRVMSupport VMMethod(RVMMethod m) { method = m; + if (Reflection.cacheInvokerInJavaLangReflect) { + invoker = m.getInvoker(); + } else { + invoker = null; + } } public boolean equals(Object other) { @@ -77,7 +86,7 @@ Object invoke(Object receiver, Object[] args) throws IllegalAccessException, IllegalArgumentException, ExceptionInInitializerError, InvocationTargetException { - return VMCommonLibrarySupport.invoke(receiver, args, method, m, RVMClass.getClassFromStackFrame(2)); + return VMCommonLibrarySupport.invoke(receiver, args, method, m, RVMClass.getClassFromStackFrame(2), invoker); } // AnnotatedElement interface Modified: rvmroot/trunk/libraryInterface/Harmony/ASF/src/java/lang/reflect/Constructor.java =================================================================== --- rvmroot/trunk/libraryInterface/Harmony/ASF/src/java/lang/reflect/Constructor.java 2008-08-14 21:41:06 UTC (rev 14887) +++ rvmroot/trunk/libraryInterface/Harmony/ASF/src/java/lang/reflect/Constructor.java 2008-08-14 21:47:03 UTC (rev 14888) @@ -23,6 +23,7 @@ import org.jikesrvm.classloader.RVMMember; import org.jikesrvm.classloader.RVMMethod; import org.jikesrvm.classloader.TypeReference; +import org.jikesrvm.runtime.ReflectionBase; import org.jikesrvm.runtime.RuntimeEntrypoints; import org.jikesrvm.runtime.Reflection; @@ -39,10 +40,20 @@ private final RVMMethod vmConstructor; /** + * Possible reflective method invoker + */ + private final ReflectionBase invoker; + + /** * Constructor */ Constructor(RVMMethod vmConstructor){ this.vmConstructor = vmConstructor; + if (Reflection.cacheInvokerInJavaLangReflect) { + invoker = vmConstructor.getInvoker(); + } else { + invoker = null; + } } /** @@ -51,6 +62,7 @@ private Constructor(){ //do nothing this.vmConstructor = null; + invoker = null; } public TypeVariable<Constructor<T>>[] getTypeParameters() { @@ -272,7 +284,7 @@ */ public T newInstance(Object... args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - return (T)VMCommonLibrarySupport.construct(vmConstructor, this, args, RVMClass.getClassFromStackFrame(1)); + return (T)VMCommonLibrarySupport.construct(vmConstructor, this, args, RVMClass.getClassFromStackFrame(1), invoker); } /** Modified: rvmroot/trunk/libraryInterface/Harmony/ASF/src/java/lang/reflect/Method.java =================================================================== --- rvmroot/trunk/libraryInterface/Harmony/ASF/src/java/lang/reflect/Method.java 2008-08-14 21:41:06 UTC (rev 14887) +++ rvmroot/trunk/libraryInterface/Harmony/ASF/src/java/lang/reflect/Method.java 2008-08-14 21:47:03 UTC (rev 14888) @@ -23,6 +23,8 @@ import org.jikesrvm.classloader.RVMClass; import org.jikesrvm.classloader.RVMMember; import org.jikesrvm.classloader.RVMMethod; +import org.jikesrvm.runtime.Reflection; +import org.jikesrvm.runtime.ReflectionBase; /** * This class must be implemented by the VM vendor. This class models a method. @@ -32,12 +34,18 @@ */ public final class Method extends AccessibleObject implements GenericDeclaration, Member { private final RVMMethod vmMethod; + private final ReflectionBase invoker; /** * Constructor */ Method(RVMMethod vmMethod){ this.vmMethod = vmMethod; + if (Reflection.cacheInvokerInJavaLangReflect) { + invoker = vmMethod.getInvoker(); + } else { + invoker = null; + } } /** @@ -45,6 +53,7 @@ */ private Method(){ vmMethod = null; + invoker = null; } public TypeVariable<Method>[] getTypeParameters() { @@ -332,7 +341,7 @@ public Object invoke(Object receiver, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { - return VMCommonLibrarySupport.invoke(receiver, args, vmMethod, this, RVMClass.getClassFromStackFrame(1)); + return VMCommonLibrarySupport.invoke(receiver, args, vmMethod, this, RVMClass.getClassFromStackFrame(1), invoker); } /** Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java 2008-08-14 21:41:06 UTC (rev 14887) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java 2008-08-14 21:47:03 UTC (rev 14888) @@ -2459,46 +2459,41 @@ } /** - * Count of reflective classes that have been created to provide unique names - */ - private static int numberOfReflectionClasses = 0; - - /** * Create a synthetic class that extends ReflectionBase and invokes the given method * @param methodToCall the method we wish to call reflectively - * @return the syntethic class + * @return the synthetic class */ static Class<?> createReflectionClass(RVMMethod methodToCall) { + if (VM.VerifyAssertions) VM._assert(VM.runningVM); if (DynamicTypeCheck.instanceOfResolved(TypeReference.baseReflectionClass.resolve(), methodToCall.getDeclaringClass())) { + // Avoid reflection on reflection base class return null; } int[] constantPool = new int[methodToCall.getParameterTypes().length+3]; - String reflectionClassName; - synchronized (RVMClass.class) { - reflectionClassName = "Lorg/jikesrvm/classloader/ReflectionBase$$Reflect"+numberOfReflectionClasses+";"; - numberOfReflectionClasses++; - } + String reflectionClassName = "Lorg/jikesrvm/classloader/ReflectionBase$$Reflect"+methodToCall.getMemberRef().getId()+";"; TypeReference reflectionClass = TypeReference.findOrCreate(reflectionClassName); - MethodReference reflectionMethodRef = MethodReference.findOrCreate(reflectionClass, - Atom.findOrCreateUnicodeAtom("invoke"), - Atom.findOrCreateUnicodeAtom("(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;") - ).asMethodReference(); - MethodReference constructorMethodRef = MethodReference.findOrCreate(reflectionClass, - Atom.findOrCreateUnicodeAtom("<init>"), - Atom.findOrCreateUnicodeAtom("()V") - ).asMethodReference(); + RVMType klass = reflectionClass.peekType(); + if (klass == null) { + MethodReference reflectionMethodRef = MethodReference.findOrCreate(reflectionClass, + Atom.findOrCreateUnicodeAtom("invoke"), + Atom.findOrCreateUnicodeAtom("(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;") + ).asMethodReference(); + MethodReference constructorMethodRef = MethodReference.findOrCreate(reflectionClass, + Atom.findOrCreateUnicodeAtom("<init>"), + Atom.findOrCreateUnicodeAtom("()V") + ).asMethodReference(); - RVMMethod[] reflectionMethods = new RVMMethod[]{methodToCall.createReflectionMethod(reflectionClass, - constantPool, - reflectionMethodRef), - RVMMethod.createDefaultConstructor(reflectionClass, constructorMethodRef)}; - RVMClass klass = - new RVMClass(reflectionClass, constantPool, (short) (ACC_SYNTHETIC | ACC_PUBLIC | ACC_FINAL), // modifiers - TypeReference.baseReflectionClass.resolve().asClass(), // superClass - emptyVMClass, // declaredInterfaces - emptyVMField, reflectionMethods, - null, null, null, null, null, null, null, null); - reflectionClass.setType(klass); + RVMMethod[] reflectionMethods = new RVMMethod[]{ + methodToCall.createReflectionMethod(reflectionClass, constantPool, reflectionMethodRef), + RVMMethod.createDefaultConstructor(reflectionClass, constructorMethodRef)}; + klass = + new RVMClass(reflectionClass, constantPool, (short) (ACC_SYNTHETIC | ACC_PUBLIC | ACC_FINAL), // modifiers + TypeReference.baseReflectionClass.resolve().asClass(), // superClass + emptyVMClass, // declaredInterfaces + emptyVMField, reflectionMethods, + null, null, null, null, null, null, null, null); + reflectionClass.setType(klass); + } return klass.getClassForType(); } } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMMethod.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMMethod.java 2008-08-14 21:41:06 UTC (rev 14887) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMMethod.java 2008-08-14 21:47:03 UTC (rev 14888) @@ -21,6 +21,7 @@ import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.compilers.common.CompiledMethods; import org.jikesrvm.runtime.Entrypoints; +import org.jikesrvm.runtime.Reflection; import org.jikesrvm.runtime.ReflectionBase; import org.jikesrvm.runtime.Statics; import org.jikesrvm.util.HashMapRVM; @@ -819,7 +820,8 @@ /** Map from a method to a reflective method capable of invoking it */ private static final ImmutableEntryHashMapRVM<RVMMethod, ReflectionBase> invokeMethods = - new ImmutableEntryHashMapRVM<RVMMethod, ReflectionBase>(30); + Reflection.bytecodeReflection || Reflection.cacheInvokerInJavaLangReflect ? + new ImmutableEntryHashMapRVM<RVMMethod, ReflectionBase>(30) : null; /** * Get an instance of an object capable of reflectively invoking this method @@ -827,9 +829,16 @@ @Pure @SuppressWarnings("unchecked") public synchronized ReflectionBase getInvoker() { + if (!VM.runningVM) { + return null; + } ReflectionBase invoker; - synchronized(RVMMethod.class) { - invoker = invokeMethods.get(this); + if (invokeMethods != null) { + synchronized(RVMMethod.class) { + invoker = invokeMethods.get(this); + } + } else { + invoker = null; } if (invoker == null) { Class<ReflectionBase> reflectionClass = (Class<ReflectionBase>)RVMClass.createReflectionClass(this); @@ -842,8 +851,10 @@ } else { invoker = ReflectionBase.nullInvoker; } - synchronized(RVMMethod.class) { - invokeMethods.put(this, invoker); + if (invokeMethods != null) { + synchronized(RVMMethod.class) { + invokeMethods.put(this, invoker); + } } } return invoker; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/Simplifier.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/Simplifier.java 2008-08-14 21:41:06 UTC (rev 14887) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/Simplifier.java 2008-08-14 21:47:03 UTC (rev 14888) @@ -1333,7 +1333,6 @@ if (s.getPrev() != null) { int power = PowerOf2(val2); if (power != -1) { - int x = (1 << power)-1; RegisterOperand tempInt1 = regpool.makeTempInt(); RegisterOperand tempInt2 = regpool.makeTempInt(); RegisterOperand tempInt3 = regpool.makeTempInt(); @@ -3265,7 +3264,7 @@ Method m = null; try { if (VM.runningVM) { - result = Reflection.invoke(method, thisArg, otherArgs, !methOp.isVirtual()); + result = Reflection.invoke(method, null, thisArg, otherArgs, false); } else { Class<?>[] argTypes = new Class<?>[n]; for(int i=0; i < n; i++) { Modified: rvmroot/trunk/rvm/src/org/jikesrvm/jni/ia32/JNIHelpers.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/jni/ia32/JNIHelpers.java 2008-08-14 21:41:06 UTC (rev 14887) +++ rvmroot/trunk/rvm/src/org/jikesrvm/jni/ia32/JNIHelpers.java 2008-08-14 21:47:03 UTC (rev 14888) @@ -293,7 +293,7 @@ } // now invoke the method - return Reflection.invoke(targetMethod, obj, argObjectArray, skip4Args); + return Reflection.invoke(targetMethod, null, obj, argObjectArray, skip4Args); } /** Modified: rvmroot/trunk/rvm/src/org/jikesrvm/jni/ppc/JNIHelpers.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/jni/ppc/JNIHelpers.java 2008-08-14 21:41:06 UTC (rev 14887) +++ rvmroot/trunk/rvm/src/org/jikesrvm/jni/ppc/JNIHelpers.java 2008-08-14 21:47:03 UTC (rev 14888) @@ -535,7 +535,7 @@ } // now invoke the method - return Reflection.invoke(targetMethod, obj, argObjectArray, skip4Args); + return Reflection.invoke(targetMethod, null, obj, argObjectArray, skip4Args); } /* The method reads out parameters from registers saved in native->java glue stack frame (glueFP) Modified: rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Reflection.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Reflection.java 2008-08-14 21:41:06 UTC (rev 14887) +++ rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Reflection.java 2008-08-14 21:47:03 UTC (rev 14888) @@ -21,6 +21,7 @@ import org.jikesrvm.classloader.TypeReference; import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.scheduler.Processor; +import org.vmmagic.pragma.Inline; import org.vmmagic.pragma.NoInline; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.WordArray; @@ -31,14 +32,26 @@ public class Reflection implements Constants { /** Perform reflection using bytecodes (true) or out-of-line machine code (false) */ - private static boolean bytecodeReflection = true; + public static boolean bytecodeReflection = false; /** + * Cache the reflective method invoker in JavaLangReflect? If this is true and + * bytecodeReflection is false, then bytecode reflection will only be used for + * java.lang.reflect objects. + */ + public static boolean cacheInvokerInJavaLangReflect = true; + + /** * Does the reflective method scheme need to check the arguments are valid? * Bytecode reflection doesn't need arguments checking as they are checking as * they are unwrapped */ - public static boolean needsCheckArgs = !bytecodeReflection; + @Inline + public static boolean needsCheckArgs(ReflectionBase invoker) { + // Only need to check the arguments when the user may be packaging them and + // not using the bytecode based invoker (that checks them when they are unpacked) + return !bytecodeReflection && !cacheInvokerInJavaLangReflect; + } /** * Call a method. @@ -51,15 +64,25 @@ * @return return value (wrapped if primitive) * See also: java/lang/reflect/Method.invoke() */ - public static Object invoke(RVMMethod method, Object thisArg, Object[] otherArgs) { - return invoke(method, thisArg, otherArgs, false); - } - - public static Object invoke(RVMMethod method, Object thisArg, Object[] otherArgs, boolean isNonvirtual) { - if (!bytecodeReflection) { + @Inline + public static Object invoke(RVMMethod method, ReflectionBase invoker, Object thisArg, Object[] otherArgs, boolean isNonvirtual) { + if (!bytecodeReflection && !cacheInvokerInJavaLangReflect) { return outOfLineInvoke(method, thisArg, otherArgs, isNonvirtual); + } else if (!bytecodeReflection && cacheInvokerInJavaLangReflect) { + if (invoker != null) { + return invoker.invoke(thisArg, otherArgs); + } else { + return outOfLineInvoke(method, thisArg, otherArgs, isNonvirtual); + } + } else if (bytecodeReflection && !cacheInvokerInJavaLangReflect) { + if (VM.VerifyAssertions) VM._assert(invoker == null); + return method.getInvoker().invoke(thisArg, otherArgs); } else { - return method.getInvoker().invoke(thisArg, otherArgs); + if (invoker != null) { + return invoker.invoke(thisArg, otherArgs); + } else { + return method.getInvoker().invoke(thisArg, otherArgs); + } } } @@ -110,7 +133,7 @@ // choose actual method to be called // RVMMethod targetMethod; - if (method.isStatic() || method.isObjectInitializer() || isNonvirtual) { + if (isNonvirtual || method.isStatic() || method.isObjectInitializer()) { targetMethod = method; } else { int tibIndex = method.getOffset().toInt() >>> LOG_BYTES_IN_ADDRESS; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/FinalizerThread.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/FinalizerThread.java 2008-08-14 21:41:06 UTC (rev 14887) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/FinalizerThread.java 2008-08-14 21:47:03 UTC (rev 14888) @@ -35,7 +35,7 @@ private static final int verbose = 0; // currently goes up to 2 - private final Object[] none = new Object[0]; + private static final Object[] none = new Object[0]; public FinalizerThread() { super("FinalizerThread"); @@ -71,7 +71,7 @@ try { RVMMethod method = Magic.getObjectType(o).asClass().getFinalizer(); if (VM.VerifyAssertions) VM._assert(method != null); - Reflection.invoke(method, o, none); + Reflection.invoke(method, null, o, none, false); } catch (Exception e) { if (verbose >= 1) VM.sysWriteln("Throwable exception caught for finalize call"); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/MainThread.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/MainThread.java 2008-08-14 21:41:06 UTC (rev 14887) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/MainThread.java 2008-08-14 21:47:03 UTC (rev 14888) @@ -197,7 +197,7 @@ if (dbg) VM.sysWriteln("[MainThread.run() invoking \"main\" method... "); // invoke "main" method with argument list - Reflection.invoke(mainMethod, null, new Object[]{mainArgs}, false); + Reflection.invoke(mainMethod, null, null, new Object[]{mainArgs}, true); if (dbg) VM.sysWriteln(" MainThread.run(): \"main\" method completed.]"); } } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/tools/oth/OptTestHarness.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/tools/oth/OptTestHarness.java 2008-08-14 21:41:06 UTC (rev 14887) +++ rvmroot/trunk/rvm/src/org/jikesrvm/tools/oth/OptTestHarness.java 2008-08-14 21:47:03 UTC (rev 14888) @@ -411,7 +411,7 @@ return; } VM.sysWrite("**** START OF EXECUTION of " + mainMethod + " ****.\n"); - Reflection.invoke(mainMethod, null, new Object[]{mainArgs}, false); + Reflection.invoke(mainMethod, null, null, new Object[]{mainArgs}, true); VM.sysWrite("**** END OF EXECUTION of " + mainMethod + " ****.\n"); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cap...@us...> - 2008-08-15 18:22:28
|
Revision: 14894 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14894&view=rev Author: captain5050 Date: 2008-08-15 18:22:22 +0000 (Fri, 15 Aug 2008) Log Message: ----------- RVM-634: RuntimePure annotation Modified Paths: -------------- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/AnnotatedElement.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMMethod.java rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/Simplifier.java Added Paths: ----------- rvmroot/trunk/common/vmmagic/src/org/vmmagic/pragma/RuntimePure.java Added: rvmroot/trunk/common/vmmagic/src/org/vmmagic/pragma/RuntimePure.java =================================================================== --- rvmroot/trunk/common/vmmagic/src/org/vmmagic/pragma/RuntimePure.java (rev 0) +++ rvmroot/trunk/common/vmmagic/src/org/vmmagic/pragma/RuntimePure.java 2008-08-15 18:22:22 UTC (rev 14894) @@ -0,0 +1,36 @@ +/* + * This file is part of the Jikes RVM project (http://jikesrvm.org). + * + * This file is licensed to You under the Common Public License (CPL); + * You may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.opensource.org/licenses/cpl1.0.php + * + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. + */ +package org.vmmagic.pragma; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.ElementType; +import org.vmmagic.Pragma; + +/** + * This pragma is a variant of Pure that is used to mark methods that have a + * special behaviour at boot image writing time and are Pure at runtime + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +@Pragma +public @interface RuntimePure { + /** Enumeration of the special boot image return values */ + public enum ReturnValue { + /** the return value is unavailable until runtime*/ + Unavailable + } + /** What value should be returned */ + ReturnValue value() default ReturnValue.Unavailable; +} Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/AnnotatedElement.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/AnnotatedElement.java 2008-08-15 18:18:07 UTC (rev 14893) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/AnnotatedElement.java 2008-08-15 18:22:22 UTC (rev 14894) @@ -305,6 +305,14 @@ } /** + * Return true if this element has a RuntimePure annotation. + * @see org.vmmagic.pragma.RuntimePure + */ + public final boolean hasRuntimePureAnnotation() { + return isAnnotationPresent(org.vmmagic.pragma.RuntimePure.class); + } + + /** * Return true if this element has a NoNullCheck annotation. * @see org.vmmagic.pragma.NoNullCheck */ Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMMethod.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMMethod.java 2008-08-15 18:18:07 UTC (rev 14893) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMMethod.java 2008-08-15 18:22:22 UTC (rev 14894) @@ -27,6 +27,7 @@ import org.jikesrvm.util.HashMapRVM; import org.jikesrvm.util.ImmutableEntryHashMapRVM; import org.vmmagic.pragma.Pure; +import org.vmmagic.pragma.RuntimePure; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.pragma.Unpreemptible; import org.vmmagic.unboxed.Offset; @@ -617,10 +618,20 @@ * @return whether the method has a pure annotation */ public final boolean isPure() { - return hasPureAnnotation(); + return hasPureAnnotation() || hasRuntimePureAnnotation(); } /** + * Is the method RuntimePure? This is the same as Pure at runtime but has a + * special return value at boot image writing time + * + * @return whether the method has a pure annotation + */ + public final boolean isRuntimePure() { + return hasRuntimePureAnnotation(); + } + + /** * Has this method been marked as forbidden to inline? * ie., it is marked with the <CODE>NoInline</CODE> annotation or * the <CODE>NoOptCompile</CODE> annotation? @@ -826,7 +837,7 @@ /** * Get an instance of an object capable of reflectively invoking this method */ - @Pure + @RuntimePure @SuppressWarnings("unchecked") public synchronized ReflectionBase getInvoker() { if (!VM.runningVM) { Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/Simplifier.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/Simplifier.java 2008-08-15 18:18:07 UTC (rev 14893) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/Simplifier.java 2008-08-15 18:22:22 UTC (rev 14894) @@ -3232,7 +3232,16 @@ } } } - if (methOp.hasPreciseTarget() && methOp.getTarget().isPure()) { + if (!VM.runningVM && methOp.hasPreciseTarget() && methOp.getTarget().isRuntimePure()) { + RVMMethod method = methOp.getTarget(); + switch(method.getAnnotation(org.vmmagic.pragma.RuntimePure.class).value()) { + case Unavailable: // not available at boot image write time + return DefUseEffect.UNCHANGED; + default: + throw new Error("Unhandled RuntimePure value: " + + method.getAnnotation(org.vmmagic.pragma.RuntimePure.class).value()); + } + } else if (methOp.hasPreciseTarget() && methOp.getTarget().isPure()) { // Look for a precise method call to a pure method with all constant arguments RVMMethod method = methOp.getTarget(); int n = Call.getNumberOfParams(s); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cap...@us...> - 2008-08-15 18:25:10
|
Revision: 14895 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14895&view=rev Author: captain5050 Date: 2008-08-15 18:25:06 +0000 (Fri, 15 Aug 2008) Log Message: ----------- RVM-633: avoid reflection in finalizer thread and thereby simplify RVMMethod Modified Paths: -------------- rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/JikesRVMSupport.java rvmroot/trunk/libraryInterface/Harmony/CPL/src/java/lang/JikesRVMSupport.java rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/FinalizerThread.java Modified: rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/JikesRVMSupport.java =================================================================== --- rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/JikesRVMSupport.java 2008-08-15 18:22:22 UTC (rev 14894) +++ rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/JikesRVMSupport.java 2008-08-15 18:25:06 UTC (rev 14895) @@ -27,6 +27,13 @@ */ public class JikesRVMSupport { + /** + * Call the Object finalize method on the given object + */ + public static void invokeFinalize(Object o) throws Throwable { + o.finalize(); + } + public static void initializeInstrumentation(Instrumentation instrumenter) { VMClassLoader.setInstrumenter(instrumenter); } Modified: rvmroot/trunk/libraryInterface/Harmony/CPL/src/java/lang/JikesRVMSupport.java =================================================================== --- rvmroot/trunk/libraryInterface/Harmony/CPL/src/java/lang/JikesRVMSupport.java 2008-08-15 18:22:22 UTC (rev 14894) +++ rvmroot/trunk/libraryInterface/Harmony/CPL/src/java/lang/JikesRVMSupport.java 2008-08-15 18:25:06 UTC (rev 14895) @@ -26,6 +26,13 @@ */ public class JikesRVMSupport { + /** + * Call the Object finalize method on the given object + */ + public static void invokeFinalize(Object o) throws Throwable { + o.finalize(); + } + public static void initializeInstrumentation(Instrumentation instrumenter) { throw new Error("TODO"); } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java 2008-08-15 18:22:22 UTC (rev 14894) +++ rvmroot/trunk/rvm/src/org/jikesrvm/classloader/RVMClass.java 2008-08-15 18:25:06 UTC (rev 14895) @@ -177,10 +177,9 @@ private RVMMethod[] virtualMethods; /** - * method that overrides java.lang.Object.finalize() - * null => class does not have a finalizer + * Do objects of this class have a finalizer method? */ - private RVMMethod finalizeMethod; + private boolean hasFinalizer; /** type and virtual method dispatch table for class */ private TIB typeInformationBlock; @@ -866,20 +865,10 @@ @Uninterruptible public boolean hasFinalizer() { if (VM.VerifyAssertions) VM._assert(isResolved()); - return (finalizeMethod != null); + return hasFinalizer; } /** - * Get finalize method that overrides java.lang.Object.finalize(), - * if one exists - */ - @Uninterruptible - public RVMMethod getFinalizer() { - if (VM.VerifyAssertions) VM._assert(isResolved()); - return finalizeMethod; - } - - /** * Static fields of this class. * Values in these fields are shared by all class instances. */ @@ -1863,13 +1852,12 @@ // check for a "finalize" method that overrides the one in java.lang.Object // - finalizeMethod = null; if (!isInterface()) { final RVMMethod method = findVirtualMethod(RVMClassLoader.StandardObjectFinalizerMethodName, RVMClassLoader.StandardObjectFinalizerMethodDescriptor); if (!method.getDeclaringClass().isJavaLangObjectType()) { - finalizeMethod = method; + hasFinalizer = true; } } Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/FinalizerThread.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/FinalizerThread.java 2008-08-15 18:22:22 UTC (rev 14894) +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/FinalizerThread.java 2008-08-15 18:25:06 UTC (rev 14895) @@ -13,10 +13,8 @@ package org.jikesrvm.scheduler; import org.jikesrvm.VM; -import org.jikesrvm.classloader.RVMMethod; import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.runtime.Magic; -import org.jikesrvm.runtime.Reflection; import org.vmmagic.pragma.NonMoving; /** @@ -35,8 +33,6 @@ private static final int verbose = 0; // currently goes up to 2 - private static final Object[] none = new Object[0]; - public FinalizerThread() { super("FinalizerThread"); } @@ -69,10 +65,8 @@ VM.sysWriteln(); } try { - RVMMethod method = Magic.getObjectType(o).asClass().getFinalizer(); - if (VM.VerifyAssertions) VM._assert(method != null); - Reflection.invoke(method, null, o, none, false); - } catch (Exception e) { + java.lang.JikesRVMSupport.invokeFinalize(o); + } catch (Throwable e) { if (verbose >= 1) VM.sysWriteln("Throwable exception caught for finalize call"); } if (verbose >= 2) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cap...@us...> - 2008-08-16 11:29:22
|
Revision: 14898 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14898&view=rev Author: captain5050 Date: 2008-08-16 11:29:20 +0000 (Sat, 16 Aug 2008) Log Message: ----------- RVM-624: fix problems with initializing logging. Place all dlls in lib directory off dist, copy properties from Harmony's deploy directory into here. Modified Paths: -------------- rvmroot/trunk/build/components/harmony.xml rvmroot/trunk/build.xml rvmroot/trunk/tools/bootImageRunner/rvm.harmony Modified: rvmroot/trunk/build/components/harmony.xml =================================================================== --- rvmroot/trunk/build/components/harmony.xml 2008-08-16 11:26:49 UTC (rev 14897) +++ rvmroot/trunk/build/components/harmony.xml 2008-08-16 11:29:20 UTC (rev 14898) @@ -17,8 +17,9 @@ <property name="harmony.version" value="5.0M6"/> <property name="harmony.description" value="Apache Harmony class libraries"/> + <property name="harmony.patchlevel" value="1"/> <property name="harmony.component.dir" location="${components.dir}/harmony"/> - <property name="harmony.package.dir" value="${harmony.component.dir}/${harmony.version}"/> + <property name="harmony.package.dir" value="${harmony.component.dir}/${harmony.version}p${harmony.patchlevel}"/> <property name="harmony.dir" value="${harmony.package.dir}/harmony"/> <!-- **************************************************************************** --> @@ -141,6 +142,7 @@ <copy todir="${harmony.package.dir}/${target.name}/lib" flatten="true"> <fileset dir="${harmony.dir}"> <include name="deploy/jdk/jre/lib/**/*.jar"/> + <include name="deploy/jdk/jre/lib/**/*.properties"/> </fileset> </copy> <copy todir="${harmony.package.dir}/${target.name}/lib" flatten="true"> Modified: rvmroot/trunk/build.xml =================================================================== --- rvmroot/trunk/build.xml 2008-08-16 11:26:49 UTC (rev 14897) +++ rvmroot/trunk/build.xml 2008-08-16 11:29:20 UTC (rev 14898) @@ -1783,7 +1783,8 @@ <chmod file="${dist.base}/rvm" perm="ugo+rx"/> <copy file="${build.rt.jar}" todir="${dist.base}"/> <copy file="${build.vm.jar}" todir="${dist.base}"/> - <copy todir="${dist.base}"> + <mkdir dir="${dist.base}/lib"/> + <copy todir="${dist.base}/lib"> <fileset dir="${harmony.lib.dir}"> <include name="*.jar"/> <exclude name="*-src.jar"/> @@ -1838,6 +1839,21 @@ <include name="*${target.jni-suffix}"/> </fileset> </copy> + <copy todir="${dist.base}"> + <fileset dir="${build.base}"> + <include name="*${target.dll-ext}"/> + <include name="*${target.jni-suffix}"/> + <include name="JikesRVM"/> + <include name="JikesRVM-symbols.o"/> + </fileset> + </copy> + <chmod perm="ugo+rx"> + <fileset dir="${dist.base}"> + <include name="*${target.dll-ext}"/> + <include name="*${target.jni-suffix}"/> + <include name="JikesRVM"/> + </fileset> + </chmod> </sequential> </if> <if> @@ -1845,22 +1861,35 @@ <equals arg1="${classlib.provider}" arg2="Harmony"/> </conditions> <sequential> - <copy todir="${dist.base}"> + <mkdir dir="${dist.base}/lib"/> + <copy todir="${dist.base}/lib"> <fileset dir="${harmony.lib.dir}"> <include name="*${target.jni-suffix}"/> + <include name="*.properties"/> <exclude name="*vmi${target.jni-suffix}"/> </fileset> + <fileset dir="${build.base}"> + <include name="*${target.dll-ext}"/> + <include name="*${target.jni-suffix}"/> + </fileset> </copy> + <copy todir="${dist.base}"> + <fileset dir="${build.base}"> + <include name="JikesRVM"/> + <include name="JikesRVM-symbols.o"/> + </fileset> + </copy> + <chmod perm="ugo+rx"> + <fileset dir="${dist.base}/lib"> + <include name="*${target.dll-ext}"/> + <include name="*${target.jni-suffix}"/> + </fileset> + <fileset dir="${dist.base}"> + <include name="JikesRVM"/> + </fileset> + </chmod> </sequential> </if> - <copy todir="${dist.base}"> - <fileset dir="${build.base}"> - <include name="*${target.dll-ext}"/> - <include name="*${target.jni-suffix}"/> - <include name="JikesRVM"/> - <include name="JikesRVM-symbols.o"/> - </fileset> - </copy> <chmod perm="ugo+rx"> <fileset dir="${dist.base}"> <include name="*${target.dll-ext}"/> Modified: rvmroot/trunk/tools/bootImageRunner/rvm.harmony =================================================================== --- rvmroot/trunk/tools/bootImageRunner/rvm.harmony 2008-08-16 11:26:49 UTC (rev 14897) +++ rvmroot/trunk/tools/bootImageRunner/rvm.harmony 2008-08-16 11:29:20 UTC (rev 14898) @@ -14,10 +14,10 @@ export RVM_HOME="`dirname "$0"`" -export BASE_ARGS="-X:ic=$RVM_HOME/RVM.code.image -X:id=$RVM_HOME/RVM.data.image -X:ir=$RVM_HOME/RVM.rmap.image -X:vmClasses=$RVM_HOME/jksvm.jar:$RVM_HOME/rvmrt.jar:$RVM_HOME/luni.jar:$RVM_HOME/nio.jar:$RVM_HOME/nio_char.jar:$RVM_HOME/archive.jar:$RVM_HOME/concurrent.jar:$RVM_HOME/math.jar:$RVM_HOME/regex.jar:$RVM_HOME/icu4j-charsets-3_8.jar:$RVM_HOME/icu4j-3_8.jar:$RVM_HOME/yoko-rmi-impl.jar:$RVM_HOME/instrument.jar:$RVM_HOME/beans.jar:$RVM_HOME/xml-apis.jar:$RVM_HOME/mx4j.jar:$RVM_HOME/xalan.jar:$RVM_HOME/resolver.jar:$RVM_HOME/logging.jar:$RVM_HOME/bcprov.jar:$RVM_HOME/security.jar:$RVM_HOME/sql.jar:$RVM_HOME/print.jar:$RVM_HOME/mx4j-remote.jar:$RVM_HOME/luni-kernel-stubs.jar:$RVM_HOME/misc.jar:$RVM_HOME/accessibility.jar:$RVM_HOME/crypto.jar:$RVM_HOME/yoko.jar:$RVM_HOME/rmi.jar:$RVM_HOME/security-kernel-stubs.jar:$RVM_HOME/x-net.jar:$RVM_HOME/imageio.jar:$RVM_HOME/lang-management.jar:$RVM_HOME/applet.jar:$RVM_HOME/prefs.jar:$RVM_HOME/annotation.jar:$RVM_HOME/awt.jar:$RVM_HOME/xercesImpl.jar:$RVM_HOME/yoko-rmi-spec.jar:$RVM_HOME/swing.jar:$RVM_HOME/auth.jar:$RVM_HOME/yoko-core.jar:$RVM_HOME/text.jar:$RVM_HOME/jndi.jar:$RVM_HOME/suncompat.jar:$RVM_HOME/sound.jar:$RVM_HOME/bcel-5.2.jar -Duser.timezone=$(date +%Z) -Djava.home=$RVM_HOME -Djava.library.path=$RVM_HOME -Dvm.boot.library.path=$RVM_HOME -Duser.home=$HOME -Duser.dir=`pwd` -Duser.name=`whoami` -Dos.name=`uname -s` -Dos.version=`uname -r` -Dos.arch=`uname -m | tr ' ' '_'` -Dpath.separator=: -Dfile.separator=/ -Dfile.encoding=ISO-8859-1 -Djava.io.tmpdir=/tmp" +export BASE_ARGS="-X:ic=$RVM_HOME/RVM.code.image -X:id=$RVM_HOME/RVM.data.image -X:ir=$RVM_HOME/RVM.rmap.image -X:vmClasses=$RVM_HOME/jksvm.jar:$RVM_HOME/rvmrt.jar:$RVM_HOME/lib/luni.jar:$RVM_HOME/lib/nio.jar:$RVM_HOME/lib/nio_char.jar:$RVM_HOME/lib/archive.jar:$RVM_HOME/lib/concurrent.jar:$RVM_HOME/lib/math.jar:$RVM_HOME/lib/regex.jar:$RVM_HOME/lib/icu4j-charsets-3_8.jar:$RVM_HOME/lib/icu4j-3_8.jar:$RVM_HOME/lib/yoko-rmi-impl.jar:$RVM_HOME/lib/instrument.jar:$RVM_HOME/lib/beans.jar:$RVM_HOME/lib/xml-apis.jar:$RVM_HOME/lib/mx4j.jar:$RVM_HOME/lib/xalan.jar:$RVM_HOME/lib/resolver.jar:$RVM_HOME/lib/logging.jar:$RVM_HOME/lib/bcprov.jar:$RVM_HOME/lib/security.jar:$RVM_HOME/lib/sql.jar:$RVM_HOME/lib/print.jar:$RVM_HOME/lib/mx4j-remote.jar:$RVM_HOME/lib/luni-kernel-stubs.jar:$RVM_HOME/lib/misc.jar:$RVM_HOME/lib/accessibility.jar:$RVM_HOME/lib/crypto.jar:$RVM_HOME/lib/yoko.jar:$RVM_HOME/lib/rmi.jar:$RVM_HOME/lib/security-kernel-stubs.jar:$RVM_HOME/lib/x-net.jar:$RVM_HOME/lib/imageio.jar:$RVM_HOME/lib/lang-management.jar:$RVM_HOME/lib/applet.jar:$RVM_HOME/lib/prefs.jar:$RVM_HOME/lib/annotation.jar:$RVM_HOME/lib/awt.jar:$RVM_HOME/lib/xercesImpl.jar:$RVM_HOME/lib/yoko-rmi-spec.jar:$RVM_HOME/lib/swing.jar:$RVM_HOME/lib/auth.jar:$RVM_HOME/lib/yoko-core.jar:$RVM_HOME/lib/text.jar:$RVM_HOME/lib/jndi.jar:$RVM_HOME/lib/suncompat.jar:$RVM_HOME/lib/sound.jar:$RVM_HOME/lib/bcel-5.2.jar -Duser.timezone=$(date +%Z) -Djava.home=$RVM_HOME -Djava.library.path=$RVM_HOME/lib -Dvm.boot.library.path=$RVM_HOME/lib -Duser.home=$HOME -Duser.dir=`pwd` -Duser.name=`whoami` -Dos.name=`uname -s` -Dos.version=`uname -r` -Dos.arch=`uname -m | tr ' ' '_'` -Dpath.separator=: -Dfile.separator=/ -Dfile.encoding=ISO-8859-1 -Djava.io.tmpdir=/tmp" # This may need to be LIBPATH under AIX or SHLIB_PATH on HP-UX -export LD_LIBRARY_PATH=$RVM_HOME:$LD_LIBRARY_PATH +export LD_LIBRARY_PATH=$RVM_HOME:$RVM_HOME/lib:$LD_LIBRARY_PATH WRAP=exec @@ -27,7 +27,7 @@ fi if (( $# == 0 )) || ((( $# >= 1 )) && [[ $1 != -gdb ]] ); then - LD_PRELOAD="$LD_PRELOAD $RVM_HOME/@PRELOAD@" $WRAP "$RVM_HOME/JikesRVM" $BASE_ARGS "$@" + LD_PRELOAD="$LD_PRELOAD $RVM_HOME/lib/@PRELOAD@" $WRAP "$RVM_HOME/JikesRVM" $BASE_ARGS "$@" exit fi This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cap...@us...> - 2008-08-18 18:01:18
|
Revision: 14905 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14905&view=rev Author: captain5050 Date: 2008-08-18 18:01:08 +0000 (Mon, 18 Aug 2008) Log Message: ----------- RVM-443: don't use a field in java.lang.reflect.VM* to hold back references to its parent, pass the parent as an argument when necessary. This aids constant folding as the back reference was a non-final field. Modified Paths: -------------- rvmroot/trunk/build/components/classpath.xml rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMConstructor.java rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMField.java rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMMethod.java Added Paths: ----------- rvmroot/trunk/build/components/patches/classpath-cvs.RVM-443.patch rvmroot/trunk/build/components/patches/classpath-web.RVM-443.patch Modified: rvmroot/trunk/build/components/classpath.xml =================================================================== --- rvmroot/trunk/build/components/classpath.xml 2008-08-18 07:55:53 UTC (rev 14904) +++ rvmroot/trunk/build/components/classpath.xml 2008-08-18 18:01:08 UTC (rev 14905) @@ -19,7 +19,7 @@ <!-- in target patch-classpath-web --> <property name="classpath.version" value="97.2"/> <!-- Change this whenever you alter the patches. It will let people know classpath has changed. --> - <property name="classpath.patchlevel" value="3"/> + <property name="classpath.patchlevel" value="4"/> <property name="classpath.description" value="GNU Classpath"/> <property name="classpath.component.dir" location="${components.dir}/classpath"/> @@ -113,6 +113,8 @@ dir="${classpath.package.dir}/classpath/" strip="0"/> <patch patchfile="${components.patch.dir}/classpath-cvs.RVM-392.patch" dir="${classpath.package.dir}/classpath/" strip="0"/> + <patch patchfile="${components.patch.dir}/classpath-cvs.RVM-443.patch" + dir="${classpath.package.dir}/classpath/" strip="0"/> <patch patchfile="${components.patch.dir}/classpath-cvs.RVM-526.patch" dir="${classpath.package.dir}/classpath/" strip="0"/> </target> @@ -167,6 +169,8 @@ dir="${classpath.package.dir}/classpath/" strip="0"/> <patch patchfile="${components.patch.dir}/classpath-web.RVM-490-04.patch" dir="${classpath.package.dir}/classpath/" strip="0"/> + <patch patchfile="${components.patch.dir}/classpath-web.RVM-443.patch" + dir="${classpath.package.dir}/classpath/" strip="0"/> </target> <target name="patch" depends="patch-classpath-web,patch-classpath-cvs"/> Added: rvmroot/trunk/build/components/patches/classpath-cvs.RVM-443.patch =================================================================== --- rvmroot/trunk/build/components/patches/classpath-cvs.RVM-443.patch (rev 0) +++ rvmroot/trunk/build/components/patches/classpath-cvs.RVM-443.patch 2008-08-18 18:01:08 UTC (rev 14905) @@ -0,0 +1,550 @@ +Index: java/lang/reflect/Constructor.java +=================================================================== +RCS file: /sources/classpath/classpath/java/lang/reflect/Constructor.java,v +retrieving revision 1.10 +diff -u -r1.10 Constructor.java +--- java/lang/reflect/Constructor.java 23 Jun 2008 20:59:35 -0000 1.10 ++++ java/lang/reflect/Constructor.java 18 Aug 2008 17:14:28 -0000 +@@ -95,7 +95,6 @@ + Constructor(VMConstructor cons) + { + this.cons = cons; +- cons.cons = this; + } + + private Constructor() +@@ -316,7 +315,7 @@ + { + // Inescapable as the VM layer is 1.4 based. + @SuppressWarnings("unchecked") +- T ins = (T) cons.construct(args); ++ T ins = (T) cons.construct(args, this); + return ins; + } + +Index: java/lang/reflect/Field.java +=================================================================== +RCS file: /sources/classpath/classpath/java/lang/reflect/Field.java,v +retrieving revision 1.10 +diff -u -r1.10 Field.java +--- java/lang/reflect/Field.java 23 Jun 2008 20:59:35 -0000 1.10 ++++ java/lang/reflect/Field.java 18 Aug 2008 17:14:28 -0000 +@@ -96,7 +96,6 @@ + Field(VMField f) + { + this.f = f; +- f.f = this; + } + + /** +@@ -257,7 +256,7 @@ + public Object get(Object o) + throws IllegalAccessException + { +- return f.get(o); ++ return f.get(this, o); + } + + /** +@@ -280,7 +279,7 @@ + public boolean getBoolean(Object o) + throws IllegalAccessException + { +- return f.getBoolean(o); ++ return f.getBoolean(this, o); + } + + /** +@@ -303,7 +302,7 @@ + public byte getByte(Object o) + throws IllegalAccessException + { +- return f.getByte(o); ++ return f.getByte(this, o); + } + + /** +@@ -324,7 +323,7 @@ + public char getChar(Object o) + throws IllegalAccessException + { +- return f.getChar(o); ++ return f.getChar(this, o); + } + + /** +@@ -347,7 +346,7 @@ + public short getShort(Object o) + throws IllegalAccessException + { +- return f.getShort(o); ++ return f.getShort(this, o); + } + + /** +@@ -370,7 +369,7 @@ + public int getInt(Object o) + throws IllegalAccessException + { +- return f.getInt(o); ++ return f.getInt(this, o); + } + + /** +@@ -393,7 +392,7 @@ + public long getLong(Object o) + throws IllegalAccessException + { +- return f.getLong(o); ++ return f.getLong(this, o); + } + + /** +@@ -416,7 +415,7 @@ + public float getFloat(Object o) + throws IllegalAccessException + { +- return f.getFloat(o); ++ return f.getFloat(this, o); + } + + /** +@@ -440,7 +439,7 @@ + public double getDouble(Object o) + throws IllegalAccessException + { +- return f.getDouble(o); ++ return f.getDouble(this, o); + } + + /** +@@ -491,7 +490,7 @@ + public void set(Object o, Object value) + throws IllegalAccessException + { +- f.set(o, value); ++ f.set(this, o, value); + } + + /** +@@ -514,7 +513,7 @@ + public void setBoolean(Object o, boolean value) + throws IllegalAccessException + { +- f.setBoolean(o, value); ++ f.setBoolean(this, o, value); + } + + /** +@@ -537,7 +536,7 @@ + public void setByte(Object o, byte value) + throws IllegalAccessException + { +- f.setByte(o, value); ++ f.setByte(this, o, value); + } + + /** +@@ -560,7 +559,7 @@ + public void setChar(Object o, char value) + throws IllegalAccessException + { +- f.setChar(o, value); ++ f.setChar(this, o, value); + } + + /** +@@ -583,7 +582,7 @@ + public void setShort(Object o, short value) + throws IllegalAccessException + { +- f.setShort(o, value); ++ f.setShort(this, o, value); + } + + /** +@@ -606,7 +605,7 @@ + public void setInt(Object o, int value) + throws IllegalAccessException + { +- f.setInt(o, value); ++ f.setInt(this, o, value); + } + + /** +@@ -629,7 +628,7 @@ + public void setLong(Object o, long value) + throws IllegalAccessException + { +- f.setLong(o, value); ++ f.setLong(this, o, value); + } + + /** +@@ -652,7 +651,7 @@ + public void setFloat(Object o, float value) + throws IllegalAccessException + { +- f.setFloat(o, value); ++ f.setFloat(this, o, value); + } + + /** +@@ -675,7 +674,7 @@ + public void setDouble(Object o, double value) + throws IllegalAccessException + { +- f.setDouble(o, value); ++ f.setDouble(this, o, value); + } + + /** +Index: java/lang/reflect/Method.java +=================================================================== +RCS file: /sources/classpath/classpath/java/lang/reflect/Method.java,v +retrieving revision 1.9 +diff -u -r1.9 Method.java +--- java/lang/reflect/Method.java 23 Jun 2008 20:59:35 -0000 1.9 ++++ java/lang/reflect/Method.java 18 Aug 2008 17:14:28 -0000 +@@ -96,7 +96,6 @@ + Method(VMMethod m) + { + this.m = m; +- m.m = this; + } + + /** +@@ -324,7 +323,7 @@ + public Object invoke(Object o, Object... args) + throws IllegalAccessException, InvocationTargetException + { +- return m.invoke(o, args); ++ return m.invoke(o, args, this); + } + + /** +Index: vm/reference/java/lang/reflect/VMConstructor.java +=================================================================== +RCS file: /sources/classpath/classpath/vm/reference/java/lang/reflect/VMConstructor.java,v +retrieving revision 1.4 +diff -u -r1.4 VMConstructor.java +--- vm/reference/java/lang/reflect/VMConstructor.java 6 Mar 2008 20:22:19 -0000 1.4 ++++ vm/reference/java/lang/reflect/VMConstructor.java 18 Aug 2008 17:14:41 -0000 +@@ -47,12 +47,6 @@ + Class clazz; + int slot; + +- /** +- * This field allows us to refer back to the main constructor instance. +- * It is set by the constructor of Constructor. +- */ +- Constructor cons; +- + VMConstructor(Class clazz, int slot) + { + this.clazz = clazz; +@@ -88,7 +82,7 @@ + */ + native Class[] getExceptionTypes(); + +- native Object construct(Object[] args) ++ native Object construct(Object[] args, Constructor cons) + throws InstantiationException, IllegalAccessException, + InvocationTargetException; + +Index: vm/reference/java/lang/reflect/VMField.java +=================================================================== +RCS file: /sources/classpath/classpath/vm/reference/java/lang/reflect/VMField.java,v +retrieving revision 1.5 +diff -u -r1.5 VMField.java +--- vm/reference/java/lang/reflect/VMField.java 16 Mar 2008 20:03:53 -0000 1.5 ++++ vm/reference/java/lang/reflect/VMField.java 18 Aug 2008 17:14:42 -0000 +@@ -46,12 +46,6 @@ + String name; + int slot; + +- /** +- * This field allows us to refer back to the main constructor instance. +- * It is set by the constructor of Field. +- */ +- Field f; +- + VMField(Class clazz, String name, int slot) + { + this.clazz = clazz; +@@ -112,16 +106,16 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #getBoolean(Object) +- * @see #getByte(Object) +- * @see #getChar(Object) +- * @see #getShort(Object) +- * @see #getInt(Object) +- * @see #getLong(Object) +- * @see #getFloat(Object) +- * @see #getDouble(Object) ++ * @see #getBoolean(Field f, Object) ++ * @see #getByte(Field f, Object) ++ * @see #getChar(Field f, Object) ++ * @see #getShort(Field f, Object) ++ * @see #getInt(Field f, Object) ++ * @see #getLong(Field f, Object) ++ * @see #getFloat(Field f, Object) ++ * @see #getDouble(Field f, Object) + */ +- native Object get(Object o) ++ native Object get(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -139,9 +133,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #get(Object) ++ * @see #get(Field f, Object) + */ +- native boolean getBoolean(Object o) ++ native boolean getBoolean(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -159,9 +153,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #get(Object) ++ * @see #get(Field f, Object) + */ +- native byte getByte(Object o) ++ native byte getByte(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -178,9 +172,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #get(Object) ++ * @see #get(Field f, Object) + */ +- native char getChar(Object o) ++ native char getChar(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -198,9 +192,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #get(Object) ++ * @see #get(Field f, Object) + */ +- native short getShort(Object o) ++ native short getShort(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -218,9 +212,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #get(Object) ++ * @see #get(Field f, Object) + */ +- native int getInt(Object o) ++ native int getInt(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -238,9 +232,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #get(Object) ++ * @see #get(Field f, Object) + */ +- native long getLong(Object o) ++ native long getLong(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -258,9 +252,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #get(Object) ++ * @see #get(Field f, Object) + */ +- native float getFloat(Object o) ++ native float getFloat(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -279,9 +273,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #get(Object) ++ * @see #get(Field f, Object) + */ +- native double getDouble(Object o) ++ native double getDouble(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -320,16 +314,16 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #setBoolean(Object, boolean) +- * @see #setByte(Object, byte) +- * @see #setChar(Object, char) +- * @see #setShort(Object, short) +- * @see #setInt(Object, int) +- * @see #setLong(Object, long) +- * @see #setFloat(Object, float) +- * @see #setDouble(Object, double) ++ * @see #setBoolean(Field f, Object, boolean) ++ * @see #setByte(Field f, Object, byte) ++ * @see #setChar(Field f, Object, char) ++ * @see #setShort(Field f, Object, short) ++ * @see #setInt(Field f, Object, int) ++ * @see #setLong(Field f, Object, long) ++ * @see #setFloat(Field f, Object, float) ++ * @see #setDouble(Field f, Object, double) + */ +- native void set(Object o, Object value) ++ native void set(Field f, Object o, Object value) + throws IllegalAccessException; + + /** +@@ -347,9 +341,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #set(Object, Object) ++ * @see #set(Field f, Object, Object) + */ +- native void setBoolean(Object o, boolean value) ++ native void setBoolean(Field f, Object o, boolean value) + throws IllegalAccessException; + + /** +@@ -367,9 +361,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #set(Object, Object) ++ * @see #set(Field f, Object, Object) + */ +- native void setByte(Object o, byte value) ++ native void setByte(Field f, Object o, byte value) + throws IllegalAccessException; + + /** +@@ -387,9 +381,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #set(Object, Object) ++ * @see #set(Field f, Object, Object) + */ +- native void setChar(Object o, char value) ++ native void setChar(Field f, Object o, char value) + throws IllegalAccessException; + + /** +@@ -407,9 +401,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #set(Object, Object) ++ * @see #set(Field f, Object, Object) + */ +- native void setShort(Object o, short value) ++ native void setShort(Field f, Object o, short value) + throws IllegalAccessException; + + /** +@@ -427,9 +421,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #set(Object, Object) ++ * @see #set(Field f, Object, Object) + */ +- native void setInt(Object o, int value) ++ native void setInt(Field f, Object o, int value) + throws IllegalAccessException; + + /** +@@ -447,9 +441,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #set(Object, Object) ++ * @see #set(Field f, Object, Object) + */ +- native void setLong(Object o, long value) ++ native void setLong(Field f, Object o, long value) + throws IllegalAccessException; + + /** +@@ -467,9 +461,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #set(Object, Object) ++ * @see #set(Field f, Object, Object) + */ +- native void setFloat(Object o, float value) ++ native void setFloat(Field f, Object o, float value) + throws IllegalAccessException; + + /** +@@ -487,9 +481,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #set(Object, Object) ++ * @see #set(Field f, Object, Object) + */ +- native void setDouble(Object o, double value) ++ native void setDouble(Field f, Object o, double value) + throws IllegalAccessException; + + /** +Index: vm/reference/java/lang/reflect/VMMethod.java +=================================================================== +RCS file: /sources/classpath/classpath/vm/reference/java/lang/reflect/VMMethod.java,v +retrieving revision 1.5 +diff -u -r1.5 VMMethod.java +--- vm/reference/java/lang/reflect/VMMethod.java 16 Mar 2008 20:03:53 -0000 1.5 ++++ vm/reference/java/lang/reflect/VMMethod.java 18 Aug 2008 17:14:42 -0000 +@@ -48,12 +48,6 @@ + String name; + int slot; + +- /** +- * This field allows us to refer back to the main constructor instance. +- * It is set by the constructor of Field. +- */ +- Method m; +- + public Class getDeclaringClass() + { + return clazz; +@@ -93,7 +87,7 @@ + */ + native Class[] getExceptionTypes(); + +- native Object invoke(Object o, Object[] args) ++ native Object invoke(Object o, Object[] args, Method m) + throws IllegalAccessException, InvocationTargetException; + + /** +[?1049h[?1h=[1;46r[?12;25h[?12l[?25h[27m[m[H[2J[?25l[46;1H"irogers@antigua:/home/antigua/IanR/classpath" [New DIRECTORY][2;1H[1m[34m~ [3;1H~ [4;1H~ [5;1H~ [6;1H~ [7;1H~ [8;1H~ [9;1H~ [10;1H~ [11;1H~ [12;1H~ [13;1H~ [14;1H~ [15;1H~ [16;1H~ [17;1H~ [18;1H~ [19;1H~ [20;1H~ [21;1H~ [22;1H~ [23;1H~ [24;1H~ [25;1H~ [26;1H~ [27;1H~ [28;1H~ [29;1H~ [30;1H~ [31;1H~ [32;1H~ [33;1H~ [34;1H~ [35;1H~ [36;1H~ [37;1H~ [38;1H~ [39;1H~ [40;1H~ [41;1H~ [42;1H~ [43;1H~ [44;1H~ [45;1H~ [m[46;140H0,0-1[9CAll[1;1H[?12l[?25h[?25l[46;1H[K[46;1H:[?12l[?25h [?25l[138C0,0-1[9CAll[1;1H[?12l[?25h[?25l[46;140H[K[46;1H:[?12l[?25hQ +[?25l[1m[37m[41mE492: Not an editor command: Q[m[109C0,0-1[9CAll[1;1H[?12l[?25h[?25l[46;1H[K[46;1H:[?12l[?25hq! +[?25l[46;1H[K[46;1H[?1l>[?12l[?25h[?1049l3 files to edit Added: rvmroot/trunk/build/components/patches/classpath-web.RVM-443.patch =================================================================== --- rvmroot/trunk/build/components/patches/classpath-web.RVM-443.patch (rev 0) +++ rvmroot/trunk/build/components/patches/classpath-web.RVM-443.patch 2008-08-18 18:01:08 UTC (rev 14905) @@ -0,0 +1,524 @@ +diff -u java/lang/reflect/Constructor.java java/lang/reflect/Constructor.java +--- java/lang/reflect/Constructor.java 2008-08-18 18:02:47.000000000 +0100 ++++ java/lang/reflect/Constructor.java 2008-08-18 18:04:22.000000000 +0100 +@@ -95,7 +95,6 @@ + Constructor(VMConstructor cons) + { + this.cons = cons; +- cons.cons = this; + } + + private Constructor() +@@ -315,7 +314,7 @@ + throws InstantiationException, IllegalAccessException, + InvocationTargetException + { +- return (T) cons.construct(args); ++ return (T) cons.construct(args, this); + } + + /** +diff -u java/lang/reflect/Field.java java/lang/reflect/Field.java +--- java/lang/reflect/Field.java 2008-08-18 18:02:47.000000000 +0100 ++++ java/lang/reflect/Field.java 2008-08-18 18:03:45.000000000 +0100 +@@ -96,7 +96,6 @@ + Field(VMField f) + { + this.f = f; +- f.f = this; + } + + /** +@@ -258,7 +257,7 @@ + public Object get(Object o) + throws IllegalAccessException + { +- return f.get(o); ++ return f.get(this, o); + } + + /** +@@ -281,7 +280,7 @@ + public boolean getBoolean(Object o) + throws IllegalAccessException + { +- return f.getBoolean(o); ++ return f.getBoolean(this, o); + } + + /** +@@ -304,7 +303,7 @@ + public byte getByte(Object o) + throws IllegalAccessException + { +- return f.getByte(o); ++ return f.getByte(this, o); + } + + /** +@@ -325,7 +324,7 @@ + public char getChar(Object o) + throws IllegalAccessException + { +- return f.getChar(o); ++ return f.getChar(this, o); + } + + /** +@@ -348,7 +347,7 @@ + public short getShort(Object o) + throws IllegalAccessException + { +- return f.getShort(o); ++ return f.getShort(this, o); + } + + /** +@@ -371,7 +370,7 @@ + public int getInt(Object o) + throws IllegalAccessException + { +- return f.getInt(o); ++ return f.getInt(this, o); + } + + /** +@@ -394,7 +393,7 @@ + public long getLong(Object o) + throws IllegalAccessException + { +- return f.getLong(o); ++ return f.getLong(this, o); + } + + /** +@@ -416,7 +415,7 @@ + public float getFloat(Object o) + throws IllegalAccessException + { +- return f.getFloat(o); ++ return f.getFloat(this, o); + } + + /** +@@ -441,7 +440,7 @@ + public double getDouble(Object o) + throws IllegalAccessException + { +- return f.getDouble(o); ++ return f.getDouble(this, o); + } + + /** +@@ -492,7 +491,7 @@ + public void set(Object o, Object value) + throws IllegalAccessException + { +- f.set(o, value); ++ f.set(this, o, value); + } + + /** +@@ -515,7 +514,7 @@ + public void setBoolean(Object o, boolean value) + throws IllegalAccessException + { +- f.setBoolean(o, value); ++ f.setBoolean(this, o, value); + } + + /** +@@ -538,7 +537,7 @@ + public void setByte(Object o, byte value) + throws IllegalAccessException + { +- f.setByte(o, value); ++ f.setByte(this, o, value); + } + + /** +@@ -561,7 +560,7 @@ + public void setChar(Object o, char value) + throws IllegalAccessException + { +- f.setChar(o, value); ++ f.setChar(this, o, value); + } + + /** +@@ -584,7 +583,7 @@ + public void setShort(Object o, short value) + throws IllegalAccessException + { +- f.setShort(o, value); ++ f.setShort(this, o, value); + } + + /** +@@ -607,7 +606,7 @@ + public void setInt(Object o, int value) + throws IllegalAccessException + { +- f.setInt(o, value); ++ f.setInt(this, o, value); + } + + /** +@@ -630,7 +629,7 @@ + public void setLong(Object o, long value) + throws IllegalAccessException + { +- f.setLong(o, value); ++ f.setLong(this, o, value); + } + + /** +@@ -653,7 +652,7 @@ + public void setFloat(Object o, float value) + throws IllegalAccessException + { +- f.setFloat(o, value); ++ f.setFloat(this, o, value); + } + + /** +@@ -676,7 +675,7 @@ + public void setDouble(Object o, double value) + throws IllegalAccessException + { +- f.setDouble(o, value); ++ f.setDouble(this, o, value); + } + + /** +diff -u java/lang/reflect/Method.java java/lang/reflect/Method.java +--- java/lang/reflect/Method.java 2008-08-18 18:02:47.000000000 +0100 ++++ java/lang/reflect/Method.java 2008-08-18 18:03:45.000000000 +0100 +@@ -96,7 +96,6 @@ + Method(VMMethod m) + { + this.m = m; +- m.m = this; + } + + /** +@@ -328,7 +327,7 @@ + public Object invoke(Object o, Object... args) + throws IllegalAccessException, InvocationTargetException + { +- return m.invoke(o, args); ++ return m.invoke(o, args, this); + } + + /** +diff -u vm/reference/java/lang/reflect/VMConstructor.java vm/reference/java/lang/reflect/VMConstructor.java +--- vm/reference/java/lang/reflect/VMConstructor.java 2008-08-18 18:03:26.000000000 +0100 ++++ vm/reference/java/lang/reflect/VMConstructor.java 2008-08-18 18:03:45.000000000 +0100 +@@ -47,12 +47,6 @@ + Class clazz; + int slot; + +- /** +- * This field allows us to refer back to the main constructor instance. +- * It is set by the constructor of Constructor. +- */ +- Constructor cons; +- + VMConstructor(Class clazz, int slot) + { + this.clazz = clazz; +@@ -88,7 +82,7 @@ + */ + native Class[] getExceptionTypes(); + +- native Object construct(Object[] args) ++ native Object construct(Object[] args, Constructor cons) + throws InstantiationException, IllegalAccessException, + InvocationTargetException; + +diff -u vm/reference/java/lang/reflect/VMField.java vm/reference/java/lang/reflect/VMField.java +--- vm/reference/java/lang/reflect/VMField.java 2008-08-18 18:03:26.000000000 +0100 ++++ vm/reference/java/lang/reflect/VMField.java 2008-08-18 18:04:53.000000000 +0100 +@@ -46,12 +46,6 @@ + String name; + int slot; + +- /** +- * This field allows us to refer back to the main constructor instance. +- * It is set by the constructor of Field. +- */ +- Field f; +- + VMField(Class declaringClass, String name, int slot) + { + this.declaringClass = declaringClass; +@@ -112,16 +106,16 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #getBoolean(Object) +- * @see #getByte(Object) +- * @see #getChar(Object) +- * @see #getShort(Object) +- * @see #getInt(Object) +- * @see #getLong(Object) +- * @see #getFloat(Object) +- * @see #getDouble(Object) ++ * @see #getBoolean(Field f, Object) ++ * @see #getByte(Field f, Object) ++ * @see #getChar(Field f, Object) ++ * @see #getShort(Field f, Object) ++ * @see #getInt(Field f, Object) ++ * @see #getLong(Field f, Object) ++ * @see #getFloat(Field f, Object) ++ * @see #getDouble(Field f, Object) + */ +- native Object get(Object o) ++ native Object get(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -139,9 +133,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #get(Object) ++ * @see #get(Field f, Object) + */ +- native boolean getBoolean(Object o) ++ native boolean getBoolean(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -159,9 +153,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #get(Object) ++ * @see #get(Field f, Object) + */ +- native byte getByte(Object o) ++ native byte getByte(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -178,9 +172,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #get(Object) ++ * @see #get(Field f, Object) + */ +- native char getChar(Object o) ++ native char getChar(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -198,9 +192,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #get(Object) ++ * @see #get(Field f, Object) + */ +- native short getShort(Object o) ++ native short getShort(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -218,9 +212,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #get(Object) ++ * @see #get(Field f, Object) + */ +- native int getInt(Object o) ++ native int getInt(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -238,9 +232,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #get(Object) ++ * @see #get(Field f, Object) + */ +- native long getLong(Object o) ++ native long getLong(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -258,9 +252,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #get(Object) ++ * @see #get(Field f, Object) + */ +- native float getFloat(Object o) ++ native float getFloat(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -279,9 +273,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #get(Object) ++ * @see #get(Field f, Object) + */ +- native double getDouble(Object o) ++ native double getDouble(Field f, Object o) + throws IllegalAccessException; + + /** +@@ -320,16 +314,16 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #setBoolean(Object, boolean) +- * @see #setByte(Object, byte) +- * @see #setChar(Object, char) +- * @see #setShort(Object, short) +- * @see #setInt(Object, int) +- * @see #setLong(Object, long) +- * @see #setFloat(Object, float) +- * @see #setDouble(Object, double) ++ * @see #setBoolean(Field f, Object, boolean) ++ * @see #setByte(Field f, Object, byte) ++ * @see #setChar(Field f, Object, char) ++ * @see #setShort(Field f, Object, short) ++ * @see #setInt(Field f, Object, int) ++ * @see #setLong(Field f, Object, long) ++ * @see #setFloat(Field f, Object, float) ++ * @see #setDouble(Field f, Object, double) + */ +- native void set(Object o, Object value) ++ native void set(Field f, Object o, Object value) + throws IllegalAccessException; + + /** +@@ -347,9 +341,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #set(Object, Object) ++ * @see #set(Field f, Object, Object) + */ +- native void setBoolean(Object o, boolean value) ++ native void setBoolean(Field f, Object o, boolean value) + throws IllegalAccessException; + + /** +@@ -367,9 +361,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #set(Object, Object) ++ * @see #set(Field f, Object, Object) + */ +- native void setByte(Object o, byte value) ++ native void setByte(Field f, Object o, byte value) + throws IllegalAccessException; + + /** +@@ -387,9 +381,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #set(Object, Object) ++ * @see #set(Field f, Object, Object) + */ +- native void setChar(Object o, char value) ++ native void setChar(Field f, Object o, char value) + throws IllegalAccessException; + + /** +@@ -407,9 +401,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #set(Object, Object) ++ * @see #set(Field f, Object, Object) + */ +- native void setShort(Object o, short value) ++ native void setShort(Field f, Object o, short value) + throws IllegalAccessException; + + /** +@@ -427,9 +421,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #set(Object, Object) ++ * @see #set(Field f, Object, Object) + */ +- native void setInt(Object o, int value) ++ native void setInt(Field f, Object o, int value) + throws IllegalAccessException; + + /** +@@ -447,9 +441,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #set(Object, Object) ++ * @see #set(Field f, Object, Object) + */ +- native void setLong(Object o, long value) ++ native void setLong(Field f, Object o, long value) + throws IllegalAccessException; + + /** +@@ -467,9 +461,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #set(Object, Object) ++ * @see #set(Field f, Object, Object) + */ +- native void setFloat(Object o, float value) ++ native void setFloat(Field f, Object o, float value) + throws IllegalAccessException; + + /** +@@ -487,9 +481,9 @@ + * requires an instance + * @throws ExceptionInInitializerError if accessing a static field triggered + * class initialization, which then failed +- * @see #set(Object, Object) ++ * @see #set(Field f, Object, Object) + */ +- native void setDouble(Object o, double value) ++ native void setDouble(Field f, Object o, double value) + throws IllegalAccessException; + + /** +diff -u vm/reference/java/lang/reflect/VMMethod.java vm/reference/java/lang/reflect/VMMethod.java +--- vm/reference/java/lang/reflect/VMMethod.java 2008-08-18 18:03:26.000000000 +0100 ++++ vm/reference/java/lang/reflect/VMMethod.java 2008-08-18 18:03:45.000000000 +0100 +@@ -48,12 +48,6 @@ + String name; + int slot; + +- /** +- * This field allows us to refer back to the main constructor instance. +- * It is set by the constructor of Field. +- */ +- Method m; +- + public Class getDeclaringClass() + { + return declaringClass; +@@ -93,7 +87,7 @@ + */ + native Class[] getExceptionTypes(); + +- native Object invoke(Object o, Object[] args) ++ native Object invoke(Object o, Object[] args, Method m) + throws IllegalAccessException, InvocationTargetException; + + /** +Only in vm/reference/java/lang/reflect: VMMethod.java.orig Modified: rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMConstructor.java =================================================================== --- rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMConstructor.java 2008-08-18 07:55:53 UTC (rev 14904) +++ rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMConstructor.java 2008-08-18 18:01:08 UTC (rev 14905) @@ -29,7 +29,6 @@ final class VMConstructor { final RVMMethod constructor; private final ReflectionBase invoker; - Constructor<?> cons; // Prevent this class from being instantiated. @SuppressWarnings("unused") @@ -81,7 +80,7 @@ return VMCommonLibrarySupport.typesToClasses(constructor.getParameterTypes()); } - Object construct(Object[] args) throws InstantiationException, + Object construct(Object[] args, Constructor<?> cons) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Modified: rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMField.java =================================================================== --- rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMField.java 2008-08-18 07:55:53 UTC (rev 14904) +++ rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMField.java 2008-08-18 18:01:08 UTC (rev 14905) @@ -26,7 +26,6 @@ public final class VMField { final RVMField field; - Field f; // Prevent this class from being instantiated. @SuppressWarnings("unused") @@ -51,39 +50,39 @@ return field.getDeclaringClass().getClassForType(); } - Object get(Object object) throws IllegalAccessException, IllegalArgumentException { + Object get(Field f, Object object) throws IllegalAccessException, IllegalArgumentException { return VMCommonLibrarySupport.get(object, field, f, RVMClass.getClassFromStackFrame(2)); } - boolean getBoolean(Object object) throws IllegalAccessException, IllegalArgumentException { + boolean getBoolean(Field f,Object object) throws IllegalAccessException, IllegalArgumentException { return VMCommonLibrarySupport.getBoolean(object, field, f, RVMClass.getClassFromStackFrame(2)); } - byte getByte(Object object) throws IllegalAccessException, IllegalArgumentException { + byte getByte(Field f, Object object) throws IllegalAccessException, IllegalArgumentException { return VMCommonLibrarySupport.getByte(object, field, f, RVMClass.getClassFromStackFrame(2)); } - char getChar(Object object) throws IllegalAccessException, IllegalArgumentException { + char getChar(Field f, Object object) throws IllegalAccessException, IllegalArgumentException { return VMCommonLibrarySupport.getChar(object, field, f, RVMClass.getClassFromStackFrame(2)); } - double getDouble(Object object) throws IllegalAccessException, IllegalArgumentException { + double getDouble(Field f, Object object) throws IllegalAccessException, IllegalArgumentException { return VMCommonLibrarySupport.getDouble(object, field, f, RVMClass.getClassFromStackFrame(2)); } - float getFloat(Object object) throws IllegalAccessException, IllegalArgumentException { + float getFloat(Field f, Object object) throws IllegalAccessException, IllegalArgumentException { return VMCommonLibrarySupport.getFloat(object, field, f, RVMClass.getClassFromStackFrame(2)); } - int getInt(Object object) throws IllegalAccessException, IllegalArgumentException { + int getInt(Field f, Object object) throws IllegalAccessException, IllegalArgumentException { return VMCommonLibrarySupport.getInt(object, field, f, RVMClass.getClassFromStackFrame(2)); } - long getLong(Object object) throws IllegalAccessException, IllegalArgumentException { + long getLong(Field f, Object object) throws IllegalAccessException, IllegalArgumentException { return VMCommonLibrarySupport.getLong(object, field, f, RVMClass.getClassFromStackFrame(2)); } - public short getShort(Object object) throws IllegalAccessException, IllegalArgumentException { + public short getShort(Field f, Object object) throws IllegalAccessException, IllegalArgumentException { return VMCommonLibrarySupport.getShort(object, field, f, RVMClass.getClassFromStackFrame(2)); } @@ -99,47 +98,47 @@ return field.getType().resolve().getClassForType(); } - void set(Object object, Object value) + void set(Field f, Object object, Object value) throws IllegalAccessException, IllegalArgumentException { VMCommonLibrarySupport.set(object, value, field, f, RVMClass.getClassFromStackFrame(2)); } - void setBoolean(Object object, boolean value) + void setBoolean(Field f, Object object, boolean value) throws IllegalAccessException, IllegalArgumentException { VMCommonLibrarySupport.setBoolean(object, value, field, f, RVMClass.getClassFromStackFrame(2)); } - void setByte(Object object, byte value) + void setByte(Field f, Object object, byte value) throws IllegalAccessException, IllegalArgumentException { VMCommonLibrarySupport.setByte(object, value, field, f, RVMClass.getClassFromStackFrame(2)); } - void setChar(Object object, char value) + void setChar(Field f, Object object, char value) throws IllegalAccessException, IllegalArgumentException { VMCommonLibrarySupport.setChar(object, value, field, f, RVMClass.getClassFromStackFrame(2)); } - void setDouble(Object object, double value) + void setDouble(Field f, Object object, double value) throws IllegalAccessException, IllegalArgumentException { VMCommonLibrarySupport.setDouble(object, value, field, f, RVMClass.getClassFromStackFrame(2)); } - void setFloat(Object object, float value) + void setFloat(Field f, Object object, float value) throws IllegalAccessException, IllegalArgumentException { VMCommonLibrarySupport.setFloat(object, value, field, f, RVMClass.getClassFromStackFrame(2)); } - void setInt(Object object, int value) + void setInt(Field f, Object object, int value) throws IllegalAccessException, IllegalArgumentException { VMCommonLibrarySupport.setInt(object, value, field, f, RVMClass.getClassFromStackFrame(2)); } - void setLong(Object object, long value) + void setLong(Field f, Object object, long value) throws IllegalAccessException, IllegalArgumentException { VMCommonLibrarySupport.setLong(object, value, field, f, RVMClass.getClassFromStackFrame(2)); } - void setShort(Object object, short value) + void setShort(Field f, Object object, short value) throws IllegalAccessException, IllegalArgumentException { VMCommonLibrarySupport.setShort(object, value, field, f, RVMClass.getClassFromStackFrame(2)); } Modified: rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMMethod.java =================================================================== --- rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMMethod.java 2008-08-18 07:55:53 UTC (rev 14904) +++ rvmroot/trunk/libraryInterface/GNUClasspath/CPL/src/java/lang/reflect/VMMethod.java 2008-08-18 18:01:08 UTC (rev 14905) @@ -27,7 +27,6 @@ final class VMMethod { final RVMMethod method; private final ReflectionBase invoker; - Method m; // Prevent this class from being instantiated. @SuppressWarnings("unused") @@ -83,7 +82,7 @@ return method.getReturnType().resolve().getClassForType(); } - Object invoke(Object receiver, Object[] args) + Object invoke(Object receiver, Object[] args, Method m) throws IllegalAccessException, IllegalArgumentException, ExceptionInInitializerError, InvocationTargetException { return VMCommonLibrarySupport.invoke(receiver, args, method, m, RVMClass.getClassFromStackFrame(2), invoker); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cap...@us...> - 2008-08-27 19:53:23
|
Revision: 14936 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14936&view=rev Author: captain5050 Date: 2008-08-27 19:53:20 +0000 (Wed, 27 Aug 2008) Log Message: ----------- Try to streamline java.lang.Class methods, use of pragma annotations and cache default constructor. Try to improve the code layout. Use generic array list rather than Collector class that was doing the same job. Modified Paths: -------------- rvmroot/trunk/build/primordials/Classpath-0.97.2.txt rvmroot/trunk/build/primordials/Harmony.txt rvmroot/trunk/libraryInterface/Common/src/java/lang/Class.java Modified: rvmroot/trunk/build/primordials/Classpath-0.97.2.txt =================================================================== --- rvmroot/trunk/build/primordials/Classpath-0.97.2.txt 2008-08-27 19:45:45 UTC (rev 14935) +++ rvmroot/trunk/build/primordials/Classpath-0.97.2.txt 2008-08-27 19:53:20 UTC (rev 14936) @@ -531,7 +531,6 @@ [[Ljava/lang/Object; [Ljava/lang/Class; Ljava/lang/Class$1; -Ljava/lang/Class$Collector; Ljava/lang/Class$MethodKey; Ljava/lang/Class$StaticData; Ljava/lang/Enum; Modified: rvmroot/trunk/build/primordials/Harmony.txt =================================================================== --- rvmroot/trunk/build/primordials/Harmony.txt 2008-08-27 19:45:45 UTC (rev 14935) +++ rvmroot/trunk/build/primordials/Harmony.txt 2008-08-27 19:53:20 UTC (rev 14936) @@ -434,7 +434,6 @@ [[Ljava/lang/Object; [Ljava/lang/Class; Ljava/lang/Class$1; -Ljava/lang/Class$Collector; Ljava/lang/Enum; [Ljava/lang/reflect/Field; Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/Class.java =================================================================== --- rvmroot/trunk/libraryInterface/Common/src/java/lang/Class.java 2008-08-27 19:45:45 UTC (rev 14935) +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/Class.java 2008-08-27 19:53:20 UTC (rev 14936) @@ -48,6 +48,9 @@ import org.jikesrvm.runtime.Reflection; import org.jikesrvm.runtime.RuntimeEntrypoints; import org.jikesrvm.runtime.StackBrowser; +import org.vmmagic.pragma.Inline; +import org.vmmagic.pragma.NoInline; +import org.vmmagic.pragma.Pure; /** * Implementation of java.lang.Class for JikesRVM. @@ -69,14 +72,6 @@ static final long serialVersionUID = 3206093459760846163L; /** - * Prevents this class from being instantiated, except by the - * create method in this class. - */ - private Class(RVMType type) { - this.type = type; - } - - /** * This field holds the RVMType object for this class. */ final RVMType type; @@ -91,389 +86,36 @@ */ Object[] signers; - public boolean desiredAssertionStatus() { - return type.getDesiredAssertionStatus(); - } + /** + * Cached default constructor value + */ + RVMMethod defaultConstructor; - public static Class<?> forName(String typeName) throws ClassNotFoundException { - ClassLoader parentCL = RVMClass.getClassLoaderFromStackFrame(1); - return forNameInternal(typeName, true, parentCL); + /** + * Prevents this class from being instantiated, except by the + * create method in this class. + */ + private Class(RVMType type) { + this.type = type; } - public static Class<?> forName(String className, - boolean initialize, - ClassLoader classLoader) - throws ClassNotFoundException, - LinkageError, - ExceptionInInitializerError { - if (classLoader == null) { - SecurityManager security = System.getSecurityManager(); - if (security != null) { - ClassLoader parentCL = RVMClass.getClassLoaderFromStackFrame(1); - if (parentCL != null) { - try { - security.checkPermission(new RuntimePermission("getClassLoader")); - } catch (SecurityException e) { - throw new ClassNotFoundException("Security exception when" + - " trying to get a classloader so we can load the" + - " class named \"" + className +"\"", e); - } - } - } - classLoader = BootstrapClassLoader.getBootstrapClassLoader(); - } - return forNameInternal(className, initialize, classLoader); + /** + * Create a java.lang.Class corresponding to a given RVMType + */ + static <T> Class<T> create(RVMType type) { + Class<T> c = new Class<T>(type); + return c; } - public Class<?>[] getClasses() throws SecurityException { - checkMemberAccess(Member.PUBLIC); - if (!type.isClassType()) return new Class[0]; - - ArrayList<Class<?>> publicClasses = new ArrayList<Class<?>>(); - for (Class<?> c = this; c != null; c = c.getSuperclass()) { - c.checkMemberAccess(Member.PUBLIC); - TypeReference[] declaredClasses = c.type.asClass().getDeclaredClasses(); - if (declaredClasses != null) { - for (TypeReference declaredClass : declaredClasses) { - if (declaredClass != null) { - RVMClass dc = declaredClass.resolve().asClass(); - if (dc.isPublic()) { - publicClasses.add(dc.getClassForType()); - } - } - } - } - } - Class<?>[] result = new Class[publicClasses.size()]; - result = publicClasses.toArray(result); - return result; + void setSigners(Object[] signers) { + this.signers = signers; } - public ClassLoader getClassLoader() { - SecurityManager security = System.getSecurityManager(); - if (security != null) { - ClassLoader parentCL = RVMClass.getClassLoaderFromStackFrame(1); - if (parentCL != null) { - security.checkPermission(new RuntimePermission("getClassLoader")); - } - } - ClassLoader cl = type.getClassLoader(); - return cl == BootstrapClassLoader.getBootstrapClassLoader() ? null : cl; + public boolean desiredAssertionStatus() { + return type.getDesiredAssertionStatus(); } - public Class<?> getComponentType() { - return type.isArrayType() ? type.asArray().getElementType().getClassForType(): null; - } - - public Constructor<T> getConstructor(Class<?>... parameterTypes) - throws NoSuchMethodException, SecurityException { - - checkMemberAccess(Member.PUBLIC); - if (!type.isClassType()) throw new NoSuchMethodException(); - - RVMMethod[] methods = type.asClass().getConstructorMethods(); - for (RVMMethod method : methods) { - if (method.isPublic() && - parametersMatch(method.getParameterTypes(), parameterTypes)) { - return JikesRVMSupport.createConstructor(method); - } - } - - throw new NoSuchMethodException("<init> " + parameterTypes); - } - - public Constructor<?>[] getConstructors() throws SecurityException { - checkMemberAccess(Member.PUBLIC); - if (!type.isClassType()) return new Constructor[0]; - - RVMMethod[] methods = type.asClass().getConstructorMethods(); - Collector coll = new Collector(methods.length); - for (RVMMethod method : methods) { - if (method.isPublic()) { - coll.collect(JikesRVMSupport.createConstructor(method)); - } - } - return coll.constructorArray(); - } - - public Class<?>[] getDeclaredClasses() throws SecurityException { - checkMemberAccess(Member.DECLARED); - if (!type.isClassType()) return new Class[0]; - - // Get array of declared classes from RVMClass object - RVMClass cls = type.asClass(); - TypeReference[] declaredClasses = cls.getDeclaredClasses(); - - // The array can be null if the class has no declared inner class members - if (declaredClasses == null) - return new Class[0]; - - // Count the number of actual declared inner and static classes. - // (The array may contain null elements, which we want to skip.) - int count = 0; - int length = declaredClasses.length; - for (int i = 0; i < length; ++i) { - if (declaredClasses[i] != null) { - ++count; - } - } - - // Now build actual result array. - Class<?>[] result = new Class[count]; - count = 0; - for (int i = 0; i < length; ++i) { - if (declaredClasses[i] != null) { - result[count++] = declaredClasses[i].resolve().getClassForType(); - } - } - - return result; - } - - public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) - throws NoSuchMethodException, SecurityException { - checkMemberAccess(Member.DECLARED); - if (!type.isClassType()) throw new NoSuchMethodException(); - - RVMMethod[] methods = type.asClass().getConstructorMethods(); - for (int i = 0, n = methods.length; i < n; ++i) { - RVMMethod method = methods[i]; - if (parametersMatch(method.getParameterTypes(), parameterTypes)) { - return JikesRVMSupport.createConstructor(method); - } - } - - throw new NoSuchMethodException("<init> " + parameterTypes); - } - - public Constructor<?>[] getDeclaredConstructors() throws SecurityException { - checkMemberAccess(Member.DECLARED); - if (!type.isClassType()) return new Constructor[0]; - - RVMMethod[] methods = type.asClass().getConstructorMethods(); - Constructor<?>[] ans = new Constructor[methods.length]; - for (int i = 0; i<methods.length; i++) { - ans[i] = JikesRVMSupport.createConstructor(methods[i]); - } - return ans; - } - - public Field getDeclaredField(String name) - throws NoSuchFieldException, SecurityException { - checkMemberAccess(Member.DECLARED); - if (!type.isClassType()) throw new NoSuchFieldException(); - - Atom aName = Atom.findUnicodeAtom(name); - if (aName == null) throw new NoSuchFieldException(name); - RVMField[] fields = type.asClass().getDeclaredFields(); - for (RVMField field : fields) { - if (field.getName() == aName) { - return JikesRVMSupport.createField(field); - } - } - - throw new NoSuchFieldException(name); - } - - public Field[] getDeclaredFields() throws SecurityException { - checkMemberAccess(Member.DECLARED); - if (!type.isClassType()) return new Field[0]; - - RVMField[] fields = type.asClass().getDeclaredFields(); - Field[] ans = new Field[fields.length]; - for (int i = 0; i < fields.length; i++) { - ans[i] = JikesRVMSupport.createField(fields[i]); - } - return ans; - } - - public Method getDeclaredMethod(String name, Class<?>... parameterTypes) - throws NoSuchMethodException, SecurityException { - checkMemberAccess(Member.DECLARED); - - if (!type.isClassType()) { - throw new NoSuchMethodException(name + parameterTypes); - } - - Atom aName = Atom.findUnicodeAtom(name); - if (aName == null || - aName == RVMClassLoader.StandardClassInitializerMethodName || - aName == RVMClassLoader.StandardObjectInitializerMethodName) { - // null means that we don't have such an atom; - // <init> and <clinit> are not methods. - throw new NoSuchMethodException(name + parameterTypes); - } - - RVMMethod[] methods = type.asClass().getDeclaredMethods(); - Method answer = null; - for (RVMMethod meth : methods) { - if (meth.getName() == aName && - parametersMatch(meth.getParameterTypes(), parameterTypes)) { - if (answer == null) { - answer = JikesRVMSupport.createMethod(meth); - } else { - Method m2 = JikesRVMSupport.createMethod(meth); - if (answer.getReturnType().isAssignableFrom(m2.getReturnType())) { - answer = m2; - } - } - } - } - - if (answer != null) return answer; - - throw new NoSuchMethodException(name + parameterTypes); - } - - public Method[] getDeclaredMethods() throws SecurityException { - checkMemberAccess(Member.DECLARED); - if (!type.isClassType()) return new Method[0]; - - RVMMethod[] methods = type.asClass().getDeclaredMethods(); - Collector coll = new Collector(methods.length); - for (RVMMethod meth : methods) { - if (!meth.isClassInitializer() && !meth.isObjectInitializer()) { - coll.collect(JikesRVMSupport.createMethod(meth)); - } - } - return coll.methodArray(); - } - - public Class<?> getDeclaringClass() { - if (!type.isClassType()) return null; - TypeReference dc = type.asClass().getDeclaringClass(); - if (dc == null) return null; - return dc.resolve().getClassForType(); - } - - public Field getField(String name) throws NoSuchFieldException, SecurityException { - checkMemberAccess(Member.PUBLIC); - if (!type.isClassType()) throw new NoSuchFieldException(); - - Atom aName = Atom.findUnicodeAtom(name); - if (aName == null) throw new NoSuchFieldException(name); - - Field ans = getFieldInternal(aName); - - if (ans == null) { - throw new NoSuchFieldException(name); - } else { - return ans; - } - } - - public Field[] getFields() throws SecurityException { - checkMemberAccess(Member.PUBLIC); - - RVMField[] static_fields = type.getStaticFields(); - RVMField[] instance_fields = type.getInstanceFields(); - Collector coll = new Collector(static_fields.length + instance_fields.length); - for (RVMField field : static_fields) { - if (field.isPublic()) { - coll.collect(JikesRVMSupport.createField(field)); - } - } - for (RVMField field : instance_fields) { - if (field.isPublic()) { - coll.collect(JikesRVMSupport.createField(field)); - } - } - - return coll.fieldArray(); - } - - public Class<?>[] getInterfaces() { - if (type.isArrayType()) { - // arrays implement JavaLangSerializable & JavaLangCloneable - return new Class[] { RVMType.JavaLangCloneableType.getClassForType(), - RVMType.JavaIoSerializableType.getClassForType() }; - } else if (type.isClassType()) { - RVMClass[] interfaces = type.asClass().getDeclaredInterfaces(); - Class<?>[] jinterfaces = new Class[interfaces.length]; - for (int i = 0; i != interfaces.length; i++) - jinterfaces[i] = interfaces[i].getClassForType(); - return jinterfaces; - } else { - return new Class[0]; - } - } - - public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException { - checkMemberAccess(Member.PUBLIC); - - if (!type.isClassType()) throw new NoSuchMethodException(name + parameterTypes); - - Atom aName = Atom.findUnicodeAtom(name); - if (aName == null || - aName == RVMClassLoader.StandardClassInitializerMethodName || - aName == RVMClassLoader.StandardObjectInitializerMethodName) { - // null means that we don't have such an atom; <init> and <clinit> are not methods. - throw new NoSuchMethodException(name + parameterTypes); - } - - // (1) Scan the declared public methods of this class and each of its superclasses - for (RVMClass current = type.asClass(); current != null; current = current.getSuperClass()) { - RVMMethod[] methods = current.getDeclaredMethods(); - Method answer = null; - for (RVMMethod meth : methods) { - if (meth.getName() == aName && meth.isPublic() && - parametersMatch(meth.getParameterTypes(), parameterTypes)) { - if (answer == null) { - answer = JikesRVMSupport.createMethod(meth); - } else { - Method m2 = JikesRVMSupport.createMethod(meth); - if (answer.getReturnType().isAssignableFrom(m2.getReturnType())) { - answer = m2; - } - } - } - } - if (answer != null) return answer; - } - - // (2) Now we need to consider methods inherited from interfaces. - // Because we inject the requisite Miranda methods, we can do this simply - // by looking at this class's virtual methods instead of searching interface hierarchies. - RVMMethod[] methods = type.asClass().getVirtualMethods(); - Method answer = null; - for (RVMMethod meth : methods) { - if (meth.getName() == aName && meth.isPublic() && - parametersMatch(meth.getParameterTypes(), parameterTypes)) { - if (answer == null) { - answer = JikesRVMSupport.createMethod(meth); - } else { - Method m2 = JikesRVMSupport.createMethod(meth); - if (answer.getReturnType().isAssignableFrom(m2.getReturnType())) { - answer = m2; - } - } - } - } - - if (answer != null) return answer; - - throw new NoSuchMethodException(name + parameterTypes); - } - - public Method[] getMethods() throws SecurityException { - checkMemberAccess(Member.PUBLIC); - - RVMMethod[] static_methods = type.getStaticMethods(); - RVMMethod[] virtual_methods = type.getVirtualMethods(); - Collector coll = new Collector(static_methods.length + virtual_methods.length); - for (RVMMethod meth : static_methods) { - if (meth.isPublic()) { - coll.collect(JikesRVMSupport.createMethod(meth)); - } - } - for (RVMMethod meth : virtual_methods) { - if (meth.isPublic()) { - coll.collect(JikesRVMSupport.createMethod(meth)); - } - } - return coll.methodArray(); - } - + @Pure public int getModifiers() { if (type.isClassType()) { return type.asClass().getModifiers(); @@ -492,6 +134,7 @@ } } + @Pure public String getName() { return type.toString(); } @@ -538,6 +181,7 @@ } @SuppressWarnings("unchecked") + @Pure public Class<? super T> getSuperclass() { if (type.isArrayType()) { return Object.class; @@ -551,96 +195,162 @@ } } + @Pure public boolean isAnnotation() { return type.isClassType() && type.asClass().isAnnotation(); } + @Pure public boolean isArray() { return type.isArrayType(); } + @Pure public boolean isAssignableFrom(Class<?> cls) { - return type == cls.type || RuntimeEntrypoints.isAssignableWith(type, cls.type); + return type.isAssignableFrom(cls.type); } + @Pure public boolean isInstance(Object object) { if (object == null) return false; if (isPrimitive()) return false; return isAssignableFrom(object.getClass()); } + @Pure public boolean isInterface() { return type.isClassType() && type.asClass().isInterface(); } + @Pure public boolean isPrimitive() { return type.isPrimitiveType(); } + @Pure public boolean isSynthetic() { return type.isClassType() && type.asClass().isSynthetic(); } - public T newInstance() throws IllegalAccessException, - InstantiationException, - ExceptionInInitializerError, - SecurityException { - // Basic checks - checkMemberAccess(Member.PUBLIC); - if (!type.isClassType()) - throw new InstantiationException(); + @Pure + public boolean isAnonymousClass() { + if (type.isClassType()) { + return type.asClass().isAnonymousClass(); + } else { + return false; + } + } - RVMClass cls = type.asClass(); + @Pure + public boolean isLocalClass() { + if (type.isClassType()) { + return type.asClass().isLocalClass(); + } else { + return false; + } + } - if (cls.isAbstract() || cls.isInterface()) - throw new InstantiationException(); - - if (!cls.isInitialized()) { - cls.resolve(); - cls.instantiate(); - cls.initialize(); + @Pure + public boolean isMemberClass() { + if (type.isClassType()) { + return type.asClass().isMemberClass(); + } else { + return false; } + } - // Find the defaultConstructor - RVMMethod defaultConstructor = null; - RVMMethod[] methods = type.asClass().getConstructorMethods(); - for (RVMMethod method : methods) { - if (method.getParameterTypes().length == 0) { - defaultConstructor = method; - break; + /** + * Utility method for use by classes in this package. + */ + static void setAccessible(final AccessibleObject obj) { + AccessController.doPrivileged(new PrivilegedAction<Object>() { + public Object run() { + obj.setAccessible(true); + return null; + } + }); + } + + public Type[] getGenericInterfaces() { + if (type.isPrimitiveType()) { + return new Type[0]; + } else if (type.isArrayType()) { + // arrays implement JavaLangSerializable & JavaLangCloneable + return new Class[] { RVMType.JavaLangCloneableType.getClassForType(), + RVMType.JavaIoSerializableType.getClassForType()}; + } else { + RVMClass klass = type.asClass(); + Atom sig = klass.getSignature(); + if (sig == null) { + return getInterfaces(); + } else { + return JikesRVMHelpers.getInterfaceTypesFromSignature(this, sig); } } - if (defaultConstructor == null) - throw new InstantiationException(); + } - // Check that caller is allowed to access it - if (!defaultConstructor.isPublic()) { - RVMClass accessingClass = RVMClass.getClassFromStackFrame(1); - VMCommonLibrarySupport.checkAccess(defaultConstructor, accessingClass); + public Type getGenericSuperclass() { + if (type.isArrayType()) { + return Object.class; + } else if (type.isPrimitiveType() || + (type.isClassType() && type.asClass().isInterface()) || + this == Object.class) { + return null; + } else { + RVMClass klass = type.asClass(); + Atom sig = klass.getSignature(); + if (sig == null) { + return getSuperclass(); + } else { + return JikesRVMHelpers.getSuperclassType(this, sig); + } } + } - // Ensure that the class is initialized - if (!cls.isInitialized()) { - try { - RuntimeEntrypoints.initializeClassForDynamicLink(cls); - } catch (Throwable e) { - ExceptionInInitializerError ex = new ExceptionInInitializerError(); - ex.initCause(e); - throw ex; + @SuppressWarnings("unchecked") + public TypeVariable<Class<T>>[] getTypeParameters() { + if (!type.isClassType()) { + return new TypeVariable[0]; + } else { + RVMClass klass = type.asClass(); + Atom sig = klass.getSignature(); + if (sig == null) { + return new TypeVariable[0]; + } else { + return JikesRVMHelpers.getTypeParameters(this, sig); } } + } - // Allocate an uninitialized instance; - @SuppressWarnings("unchecked") // yes, we're giving an anonymous object a type. - T obj = (T)RuntimeEntrypoints.resolvedNewScalar(cls); + @Pure + public String getSimpleName() { + if (type.isArrayType()) { + return getComponentType().getSimpleName() + "[]"; + } else { + String fullName = getName(); + return fullName.substring(fullName.lastIndexOf(".") + 1); + } + } - // Run the default constructor on the it. - Reflection.invoke(defaultConstructor, null, obj, null, true); - - return obj; + @Pure + public String getCanonicalName() { + if (type.isArrayType()) { + String componentName = getComponentType().getCanonicalName(); + if (componentName != null) + return componentName + "[]"; + } + if (isMemberClass()) { + String memberName = getDeclaringClass().getCanonicalName(); + if (memberName != null) + return memberName + "." + getSimpleName(); + } + if (isLocalClass() || isAnonymousClass()) + return null; + return getName(); } @Override + @Pure public String toString() { String name = getName(); if (isPrimitive()) { @@ -652,85 +362,151 @@ } } - /* - * Implementation below - */ + @SuppressWarnings("unchecked") + public T cast(Object obj) { + if (obj != null && ! isInstance(obj)) + throw new ClassCastException(); + return (T)obj; + } - /** - * Create a java.lang.Class corresponding to a given RVMType - */ - static <T> Class<T> create(RVMType type) { - Class<T> c = new Class<T>(type); - return c; + + @SuppressWarnings("unchecked") + public <U> Class<? extends U> asSubclass(Class<U> klass) { + if (! klass.isAssignableFrom(this)) + throw new ClassCastException(); + return (Class<? extends U>) this; } - void setSigners(Object[] signers) { - this.signers = signers; + public Class<?> getDeclaringClass() { + if (!type.isClassType()) return null; + TypeReference dc = type.asClass().getDeclaringClass(); + if (dc == null) return null; + return dc.resolve().getClassForType(); } - private static Class<?> forNameInternal(String className, - boolean initialize, - ClassLoader classLoader) - throws ClassNotFoundException, - LinkageError, - ExceptionInInitializerError { - try { - if (className.startsWith("[")) { - if (!validArrayDescriptor(className)) { - throw new ClassNotFoundException(className); + public Class<?>[] getClasses() throws SecurityException { + checkMemberAccess(Member.PUBLIC); + if (!type.isClassType()) return new Class[0]; + + ArrayList<Class<?>> publicClasses = new ArrayList<Class<?>>(); + for (Class<?> c = this; c != null; c = c.getSuperclass()) { + c.checkMemberAccess(Member.PUBLIC); + TypeReference[] declaredClasses = c.type.asClass().getDeclaredClasses(); + if (declaredClasses != null) { + for (TypeReference declaredClass : declaredClasses) { + if (declaredClass != null) { + RVMClass dc = declaredClass.resolve().asClass(); + if (dc.isPublic()) { + publicClasses.add(dc.getClassForType()); + } + } } } - Atom descriptor = Atom - .findOrCreateAsciiAtom(className.replace('.','/')) - .descriptorFromClassName(); - TypeReference tRef = TypeReference.findOrCreate(classLoader, descriptor); - RVMType ans = tRef.resolve(); - Callbacks.notifyForName(ans); - if (initialize && !ans.isInitialized()) { - ans.resolve(); - ans.instantiate(); - ans.initialize(); + } + Class<?>[] result = new Class[publicClasses.size()]; + result = publicClasses.toArray(result); + return result; + } + + public ClassLoader getClassLoader() { + SecurityManager security = System.getSecurityManager(); + if (security != null) { + ClassLoader parentCL = RVMClass.getClassLoaderFromStackFrame(1); + if (parentCL != null) { + security.checkPermission(new RuntimePermission("getClassLoader")); } - return ans.getClassForType(); - } catch (NoClassDefFoundError ncdfe) { - Throwable cause2 = ncdfe.getCause(); - ClassNotFoundException cnf; - // If we get a NCDFE that was caused by a CNFE, throw the original CNFE. - if (cause2 instanceof ClassNotFoundException) - cnf = (ClassNotFoundException) cause2; - else - cnf = new ClassNotFoundException(className, ncdfe); - throw cnf; } + ClassLoader cl = type.getClassLoader(); + return cl == BootstrapClassLoader.getBootstrapClassLoader() ? null : cl; } + public Class<?> getComponentType() { + return type.isArrayType() ? type.asArray().getElementType().getClassForType(): null; + } - private Field getFieldInternal(Atom name) { - RVMClass ctype = type.asClass(); - // (1) Check my public declared fields - RVMField[] fields = ctype.getDeclaredFields(); - for (RVMField field : fields) { - if (field.isPublic() && field.getName() == name) { - return JikesRVMSupport.createField(field); + public Class<?>[] getDeclaredClasses() throws SecurityException { + checkMemberAccess(Member.DECLARED); + if (!type.isClassType()) return new Class[0]; + + // Get array of declared classes from RVMClass object + RVMClass cls = type.asClass(); + TypeReference[] declaredClasses = cls.getDeclaredClasses(); + + // The array can be null if the class has no declared inner class members + if (declaredClasses == null) + return new Class[0]; + + // Count the number of actual declared inner and static classes. + // (The array may contain null elements, which we want to skip.) + int count = 0; + int length = declaredClasses.length; + for (int i = 0; i < length; ++i) { + if (declaredClasses[i] != null) { + ++count; } } - // (2) Check superinterfaces - RVMClass[] interfaces = ctype.getDeclaredInterfaces(); - for (RVMClass anInterface : interfaces) { - Field ans = anInterface.getClassForType().getFieldInternal(name); - if (ans != null) return ans; + // Now build actual result array. + Class<?>[] result = new Class[count]; + count = 0; + for (int i = 0; i < length; ++i) { + if (declaredClasses[i] != null) { + result[count++] = declaredClasses[i].resolve().getClassForType(); + } } - // (3) Check superclass (if I have one). - if (ctype.getSuperClass() != null) { - return ctype.getSuperClass().getClassForType().getFieldInternal(name); + return result; + } + + public Class<?>[] getInterfaces() { + if (type.isArrayType()) { + // arrays implement JavaLangSerializable & JavaLangCloneable + return new Class[] { RVMType.JavaLangCloneableType.getClassForType(), + RVMType.JavaIoSerializableType.getClassForType() }; + } else if (type.isClassType()) { + RVMClass[] interfaces = type.asClass().getDeclaredInterfaces(); + Class<?>[] jinterfaces = new Class[interfaces.length]; + for (int i = 0; i != interfaces.length; i++) + jinterfaces[i] = interfaces[i].getClassForType(); + return jinterfaces; + } else { + return new Class[0]; } + } - return null; + // --- Utilities --- + + /** + * Utility for security checks + */ + private void checkMemberAccess(int type) { + SecurityManager security = System.getSecurityManager(); + if (security != null) { + security.checkMemberAccess(this, type); + String packageName = getPackageName(); + if(packageName != "") { + security.checkPackageAccess(packageName); + } + } } + /** + * Compare parameter lists for agreement. + */ + private boolean parametersMatch(TypeReference[] lhs, Class<?>[] rhs) { + if (rhs == null) return lhs.length == 0; + if (lhs.length != rhs.length) return false; + for (int i = 0, n = lhs.length; i < n; ++i) { + if (rhs[i] == null) return false; + if (lhs[i].resolve() != rhs[i].type) { + return false; + } + } + return true; + } + + @Pure private String getPackageName() { String name = getName(); int index = name.lastIndexOf('.'); @@ -738,6 +514,7 @@ return ""; } + @Pure private String toResourceName(String resName) { // Turn package name into a directory path if (resName.charAt(0) == '/') return resName.substring(1); @@ -748,6 +525,7 @@ return qualifiedClassName.substring(0, classIndex + 1).replace('.', '/') + resName; } + @Pure private static boolean validArrayDescriptor(String name) { int i; int length = name.length(); @@ -776,95 +554,48 @@ return true; // a valid class descriptor } - /** - * Utility for security checks - */ - private void checkMemberAccess(int type) { - SecurityManager security = System.getSecurityManager(); - if (security != null) { - security.checkMemberAccess(this, type); - String packageName = getPackageName(); - if(packageName != "") { - security.checkPackageAccess(packageName); - } - } + @NoInline + private void throwNoSuchMethodException(String name, Class<?>... parameterTypes) throws NoSuchMethodException { + throw new NoSuchMethodException(name + " " + parameterTypes); } - /** - * Compare parameter lists for agreement. - */ - private boolean parametersMatch(TypeReference[] lhs, Class<?>[] rhs) { - if (rhs == null) return lhs.length == 0; - if (lhs.length != rhs.length) return false; - - for (int i = 0, n = lhs.length; i < n; ++i) { - if (rhs[i] == null) return false; - if (lhs[i].resolve() != rhs[i].type) { - return false; - } - } - return true; + @NoInline + private void throwNoSuchFieldException(String name) throws NoSuchFieldException { + throw new NoSuchFieldException(name); } - // aux class to build up collections of things - private static final class Collector { - private int n = 0; - private final Object[] coll; + // --- Harmony -- - Collector(int max) { - coll = new Object[max]; - } - - void collect(Object thing) { - coll[n++] = thing; - } - - // repeat for each class of interest - // - Method[] methodArray() { - Method[] ans = new Method[n]; - System.arraycopy(coll, 0, ans, 0, n); - return ans; - } - - Field[] fieldArray() { - Field[] ans = new Field[n]; - System.arraycopy(coll, 0, ans, 0, n); - return ans; - } - - Constructor<?>[] constructorArray() { - Constructor<?>[] ans = new Constructor[n]; - System.arraycopy(coll, 0, ans, 0, n); - return ans; - } + // TODO: Harmony + ClassLoader getClassLoaderImpl() { + return null; } - public boolean isAnonymousClass() { - if (type.isClassType()) { - return type.asClass().isAnonymousClass(); - } else { - return false; + // TODO: Harmony + static Class<?>[] getStackClasses(int maxDepth, boolean stopAtPrivileged) { + StackBrowser browser = new StackBrowser(); + if (maxDepth == -1) { + browser.init(); + maxDepth = 0; + while(browser.hasMoreFrames()) { + maxDepth++; + browser.up(); + } } - } - - public boolean isLocalClass() { - if (type.isClassType()) { - return type.asClass().isLocalClass(); - } else { - return false; + if (maxDepth == 0) return new Class[0]; + else if (maxDepth < 0) { + throw new Error("Unexpected negative call stack size" + maxDepth); } - } - - public boolean isMemberClass() { - if (type.isClassType()) { - return type.asClass().isMemberClass(); - } else { - return false; + Class<?>[] result = new Class[maxDepth]; + browser.init(); + for (int i=0; i < maxDepth; i++) { + result[i] = browser.getCurrentClass().getClassForType(); + browser.up(); } + return result; } - // AnnotatedElement interface + // --- AnnotatedElement interface --- public Annotation[] getDeclaredAnnotations() { return type.getDeclaredAnnotations(); @@ -874,94 +605,16 @@ return type.getAnnotations(); } - //@Override public <U extends Annotation> U getAnnotation(Class<U> annotationClass) { return type.getAnnotation(annotationClass); } - //@Override public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) { return type.isAnnotationPresent(annotationClass); } - // Generics support + // --- Enclosing support --- - public Type[] getGenericInterfaces() { - if (type.isPrimitiveType()) { - return new Type[0]; - } else if (type.isArrayType()) { - // arrays implement JavaLangSerializable & JavaLangCloneable - return new Class[] { RVMType.JavaLangCloneableType.getClassForType(), - RVMType.JavaIoSerializableType.getClassForType()}; - } else { - RVMClass klass = type.asClass(); - Atom sig = klass.getSignature(); - if (sig == null) { - return getInterfaces(); - } else { - return JikesRVMHelpers.getInterfaceTypesFromSignature(this, sig); - } - } - } - - public Type getGenericSuperclass() { - if (type.isArrayType()) { - return Object.class; - } else if (type.isPrimitiveType() || - (type.isClassType() && type.asClass().isInterface()) || - this == Object.class) { - return null; - } else { - RVMClass klass = type.asClass(); - Atom sig = klass.getSignature(); - if (sig == null) { - return getSuperclass(); - } else { - return JikesRVMHelpers.getSuperclassType(this, sig); - } - } - } - - @SuppressWarnings("unchecked") - public TypeVariable<Class<T>>[] getTypeParameters() { - if (!type.isClassType()) { - return new TypeVariable[0]; - } else { - RVMClass klass = type.asClass(); - Atom sig = klass.getSignature(); - if (sig == null) { - return new TypeVariable[0]; - } else { - return JikesRVMHelpers.getTypeParameters(this, sig); - } - } - } - - public String getSimpleName() { - if (type.isArrayType()) { - return getComponentType().getSimpleName() + "[]"; - } else { - String fullName = getName(); - return fullName.substring(fullName.lastIndexOf(".") + 1); - } - } - - public String getCanonicalName() { - if (type.isArrayType()) { - String componentName = getComponentType().getCanonicalName(); - if (componentName != null) - return componentName + "[]"; - } - if (isMemberClass()) { - String memberName = getDeclaringClass().getCanonicalName(); - if (memberName != null) - return memberName + "." + getSimpleName(); - } - if (isLocalClass() || isAnonymousClass()) - return null; - return getName(); - } - public Class<?> getEnclosingClass() { if (type.isClassType()) { TypeReference enclosingClass = type.asClass().getEnclosingClass(); @@ -983,15 +636,8 @@ throw new UnimplementedError(); } - @SuppressWarnings("unchecked") - public T cast(Object obj) { - if (obj != null && ! isInstance(obj)) - throw new ClassCastException(); - return (T)obj; - } + // --- Enumeration support --- - // Enumeration support - @SuppressWarnings("unchecked") public T[] getEnumConstants() { if (isEnum()) { @@ -1010,6 +656,7 @@ } } + @Pure public boolean isEnum() { if(type.isClassType()) { return type.asClass().isEnum(); @@ -1018,51 +665,431 @@ } } - /** - * Utility method for use by classes in this package. - */ - static void setAccessible(final AccessibleObject obj) { - AccessController.doPrivileged(new PrivilegedAction<Object>() { - public Object run() { - obj.setAccessible(true); - return null; + // --- Constructors --- + + @Pure + private RVMMethod getDefaultConstructor() { + if (this.defaultConstructor == null) { + RVMMethod defaultConstructor = null; + RVMMethod[] methods = type.asClass().getConstructorMethods(); + for (RVMMethod method : methods) { + if (method.getParameterTypes().length == 0) { + defaultConstructor = method; + break; + } + } + this.defaultConstructor = defaultConstructor; + } + return this.defaultConstructor; + } + + public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException { + checkMemberAccess(Member.PUBLIC); + if (!type.isClassType()) + throwNoSuchMethodException("<init>", parameterTypes); + + RVMMethod answer = null; + if (parameterTypes == null || parameterTypes.length == 0) { + answer = getDefaultConstructor(); + } else { + RVMMethod[] methods = type.asClass().getConstructorMethods(); + for (RVMMethod method : methods) { + if (method.isPublic() && + parametersMatch(method.getParameterTypes(), parameterTypes)) { + answer = method; + break; + } + } + } + if (answer == null) { + throwNoSuchMethodException("<init>", parameterTypes); + } + return JikesRVMSupport.createConstructor(answer); + } + + public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException { + checkMemberAccess(Member.DECLARED); + if (!type.isClassType()) + throwNoSuchMethodException("<init>", parameterTypes); + + RVMMethod answer = null; + if (parameterTypes == null || parameterTypes.length == 0) { + answer = getDefaultConstructor(); + } else { + RVMMethod[] methods = type.asClass().getConstructorMethods(); + for (RVMMethod method : methods) { + if (parametersMatch(method.getParameterTypes(), parameterTypes)) { + answer = method; + break; + } + } + } + if (answer == null) { + throwNoSuchMethodException("<init>", parameterTypes); + } + return JikesRVMSupport.createConstructor(answer); + } + + public Constructor<?>[] getConstructors() throws SecurityException { + checkMemberAccess(Member.PUBLIC); + if (!type.isClassType()) return new Constructor[0]; + + RVMMethod[] methods = type.asClass().getConstructorMethods(); + ArrayList<Constructor<T>> coll = new ArrayList<Constructor<T>>(methods.length); + for (RVMMethod method : methods) { + if (method.isPublic()) { + @SuppressWarnings("unchecked") + Constructor<T> x = (Constructor<T>)JikesRVMSupport.createConstructor(method); + coll.add(x); + } + } + return coll.toArray(new Constructor[coll.size()]); + } + + public Constructor<?>[] getDeclaredConstructors() throws SecurityException { + checkMemberAccess(Member.DECLARED); + if (!type.isClassType()) return new Constructor[0]; + + RVMMethod[] methods = type.asClass().getConstructorMethods(); + Constructor<?>[] ans = new Constructor[methods.length]; + for (int i = 0; i<methods.length; i++) { + ans[i] = JikesRVMSupport.createConstructor(methods[i]); + } + return ans; + } + + // --- ForName --- + + @Inline + public static Class<?> forName(String typeName) throws ClassNotFoundException { + ClassLoader parentCL = RVMClass.getClassLoaderFromStackFrame(1); + return forNameInternal(typeName, true, parentCL); + } + + public static Class<?> forName(String className, boolean initialize, ClassLoader classLoader) + throws ClassNotFoundException, + LinkageError, + ExceptionInInitializerError { + if (classLoader == null) { + SecurityManager security = System.getSecurityManager(); + if (security != null) { + ClassLoader parentCL = RVMClass.getClassLoaderFromStackFrame(1); + if (parentCL != null) { + try { + security.checkPermission(new RuntimePermission("getClassLoader")); + } catch (SecurityException e) { + throw new ClassNotFoundException("Security exception when" + + " trying to get a classloader so we can load the" + + " class named \"" + className +"\"", e); } - }); + } + } + classLoader = BootstrapClassLoader.getBootstrapClassLoader(); + } + return forNameInternal(className, initialize, classLoader); } - @SuppressWarnings("unchecked") - public <U> Class<? extends U> asSubclass(Class<U> klass) { - if (! klass.isAssignableFrom(this)) - throw new ClassCastException(); - return (Class<? extends U>) this; + private static Class<?> forNameInternal(String className, boolean initialize, ClassLoader classLoader) + throws ClassNotFoundException, LinkageError, ExceptionInInitializerError { + try { + if (className.startsWith("[")) { + if (!validArrayDescriptor(className)) { + throw new ClassNotFoundException(className); + } + } + Atom descriptor = Atom.findOrCreateAsciiAtom(className.replace('.','/')).descriptorFromClassName(); + TypeReference tRef = TypeReference.findOrCreate(classLoader, descriptor); + RVMType ans = tRef.resolve(); + Callbacks.notifyForName(ans); + if (initialize && !ans.isInitialized()) { + ans.resolve(); + ans.instantiate(); + ans.initialize(); + } + return ans.getClassForType(); + } catch (NoClassDefFoundError ncdfe) { + Throwable cause2 = ncdfe.getCause(); + ClassNotFoundException cnf; + // If we get a NCDFE that was caused by a CNFE, throw the original CNFE. + if (cause2 instanceof ClassNotFoundException) + cnf = (ClassNotFoundException) cause2; + else + cnf = new ClassNotFoundException(className, ncdfe); + throw cnf; + } } - // TODO: Harmony - ClassLoader getClassLoaderImpl() { + // --- newInstance --- + + @Inline(value=Inline.When.ArgumentsAreConstant, arguments={0}) + public T newInstance() throws IllegalAccessException, + InstantiationException, + ExceptionInInitializerError, + SecurityException { + // Basic checks + checkMemberAccess(Member.PUBLIC); + if (!type.isClassType()) + throw new InstantiationException(); + + RVMClass cls = type.asClass(); + + if (cls.isAbstract() || cls.isInterface()) + throw new InstantiationException(); + + // Ensure that the class is initialized + if (!cls.isInitialized()) { + RuntimeEntrypoints.initializeClassForDynamicLink(cls); + } + + // Find the defaultConstructor + RVMMethod defaultConstructor = getDefaultConstructor(); + if (defaultConstructor == null) + throw new InstantiationException(); + + // Check that caller is allowed to access it + if (!defaultConstructor.isPublic()) { + RVMClass accessingClass = RVMClass.getClassFromStackFrame(1); + VMCommonLibrarySupport.checkAccess(defaultConstructor, accessingClass); + } + + // Allocate an uninitialized instance; + @SuppressWarnings("unchecked") // yes, we're giving an anonymous object a type. + T obj = (T)RuntimeEntrypoints.resolvedNewScalar(cls); + + // Run the default constructor on the it. + Reflection.invoke(defaultConstructor, null, obj, null, true); + + return obj; + } + + // --- Methods --- + + @Pure + private RVMMethod getMethodInternal1(Atom aName, Class<?>... parameterTypes) { + RVMMethod answer = null; + for (RVMClass current = type.asClass(); current != null; current = current.getSuperClass()) { + RVMMethod[] methods = current.getDeclaredMethods(); + for (RVMMethod meth : methods) { + if (meth.getName() == aName && meth.isPublic() && + parametersMatch(meth.getParameterTypes(), parameterTypes)) { + if (answer == null) { + answer = meth; + } else { + RVMMethod m2 = meth; + if (answer.getReturnType().resolve().isAssignableFrom(m2.getReturnType().resolve())) { + answer = m2; + } + } + } + } + } + return answer; + } + + @Pure + private RVMMethod getMethodInternal2(Atom aName, Class<?>... parameterTypes) { + RVMMethod answer = null; + RVMMethod[] methods = type.asClass().getVirtualMethods(); + for (RVMMethod meth : methods) { + if (meth.getName() == aName && meth.isPublic() && + parametersMatch(meth.getParameterTypes(), parameterTypes)) { + if (answer == null) { + answer = meth; + } else { + RVMMethod m2 = meth; + if (answer.getReturnType().resolve().isAssignableFrom(m2.getReturnType().resolve())) { + answer = m2; + } + } + } + } + return answer; + } + + public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException { + checkMemberAccess(Member.PUBLIC); + + if (!type.isClassType()) throwNoSuchMethodException(name, parameterTypes); + + if (name == null) { + throwNoSuchMethodException(name, parameterTypes); + } + Atom aName = Atom.findOrCreateUnicodeAtom(name); + if (aName == RVMClassLoader.StandardClassInitializerMethodName || + aName == RVMClassLoader.StandardObjectInitializerMethodName) { + // <init> and <clinit> are not methods. + throwNoSuchMethodException(name, parameterTypes); + } + + // (1) Scan the declared public methods of this class and each of its superclasses + RVMMethod answer = getMethodInternal1(aName, parameterTypes); + if (answer == null) { + // (2) Now we need to consider methods inherited from interfaces. + // Because we inject the requisite Miranda methods, we can do this simply + // by looking at this class's virtual methods instead of searching interface hierarchies. + answer = getMethodInternal2(aName, parameterTypes); + } + if (answer == null) { + throwNoSuchMethodException(name, parameterTypes); + } + return JikesRVMSupport.createMethod(answer); + } + + public Method getDeclaredMethod(String name, Class<?>... parameterTypes) + throws NoSuchMethodException, SecurityException { + checkMemberAccess(Member.DECLARED); + + if (!type.isClassType()) throwNoSuchMethodException(name, parameterTypes); + + if (name == null) { + throwNoSuchMethodException(name, parameterTypes); + } + Atom aName = Atom.findOrCreateUnicodeAtom(name); + if (aName == RVMClassLoader.StandardClassInitializerMethodName || + aName == RVMClassLoader.StandardObjectInitializerMethodName) { + // <init> and <clinit> are not methods. + throwNoSuchMethodException(name, parameterTypes); + } + + RVMMethod[] methods = type.asClass().getDeclaredMethods(); + RVMMethod answer = null; + for (RVMMethod meth : methods) { + if (meth.getName() == aName && + parametersMatch(meth.getParameterTypes(), parameterTypes)) { + if (answer == null) { + answer = meth; + } else { + RVMMethod m2 = meth; + if (answer.getReturnType().resolve().isAssignableFrom(m2.getReturnType().resolve())) { + answer = m2; + } + } + } + } + if (answer == null) { + throwNoSuchMethodException(name, parameterTypes); + } + return JikesRVMSupport.createMethod(answer); + } + + public Method[] getDeclaredMethods() throws SecurityException { + checkMemberAccess(Member.DECLARED); + if (!type.isClassType()) return new Method[0]; + + RVMMethod[] methods = type.asClass().getDeclaredMethods(); + ArrayList<Method> coll = new ArrayList<Method>(methods.length); + for (RVMMethod meth : methods) { + if (!meth.isClassInitializer() && !meth.isObjectInitializer()) { + coll.add(JikesRVMSupport.createMethod(meth)); + } + } + return coll.toArray(new Method[coll.size()]); + } + + public Method[] getMethods() throws SecurityException { + checkMemberAccess(Member.PUBLIC); + + RVMMethod[] static_methods = type.getStaticMethods(); + RVMMethod[] virtual_methods = type.getVirtualMethods(); + ArrayList<Method> coll = new ArrayList<Method>(static_methods.length + virtual_methods.length); + for (RVMMethod meth : static_methods) { + if (meth.isPublic()) { + coll.add(JikesRVMSupport.createMethod(meth)); + } + } + for (RVMMethod meth : virtual_methods) { + if (meth.isPublic()) { + coll.add(JikesRVMSupport.createMethod(meth)); + } + } + return coll.toArray(new Method[coll.size()]); + } + + // --- Fields --- + + @Pure + private RVMField getFieldInternal(Atom name) { + RVMClass ctype = type.asClass(); + // (1) Check my public declared fields + RVMField[] fields = ctype.getDeclaredFields(); + for (RVMField field : fields) { + if (field.isPublic() && field.getName() == name) { + return field; + } + } + + // (2) Check superinterfaces + RVMClass[] interfaces = ctype.getDeclaredInterfaces(); + for (RVMClass anInterface : interfaces) { + RVMField ans = anInterface.getClassForType().getFieldInternal(name); + if (ans != null) return ans; + } + + // (3) Check superclass (if I have one). + if (ctype.getSuperClass() != null) { + return ctype.getSuperClass().getClassForType().getFieldInternal(name); + } + return null; } - // TODO: Harmony - static Class<?>[] getStackClasses(int maxDepth, boolean stopAtPrivileged) { - StackBrowser browser = new StackBrowser(); - if (maxDepth == -1) { - browser.init(); - maxDepth = 0; - while(browser.hasMoreFrames()) { - maxDepth++; - browser.up(); + public Field getField(String name) throws NoSuchFieldException, SecurityException { + checkMemberAccess(Member.PUBLIC); + if (!type.isClassType()) throw new NoSuchFieldException(); + + Atom aName = Atom.findUnicodeAtom(name); + if (aName == null) throwNoSuchFieldException(name); + + RVMField answer = getFieldInternal(aName); + + if (answer == null) { + throwNoSuchFieldException(name); + } + return JikesRVMSupport.createField(answer); + } + + public Field getDeclaredField(String name) + throws NoSuchFieldException, SecurityException { + checkMemberAccess(Member.DECLARED); + if (!type.isClassType() || name == null) throwNoSuchFieldException(name); + + Atom aName = Atom.findOrCreateUnicodeAtom(name); + RVMField answer = type.asClass().findDeclaredField(aName); + if (answer == null) { + throwNoSuchFieldException(name); + } + return JikesRVMSupport.createField(answer); + } + + public Field[] getFields() throws SecurityException { + checkMemberAccess(Member.PUBLIC); + + RVMField[] static_fields = type.getStaticFields(); + RVMField[] instance_fields = type.getInstanceFields(); + ArrayList<Field> coll = new ArrayList<Field>(static_fields.length + instance_fields.length); + for (RVMField field : static_fields) { + if (field.isPublic()) { + coll.add(JikesRVMSupport.createField(field)); } } - if (maxDepth == 0) return new Class[0]; - else if (maxDepth < 0) { - throw new Error("Unexpected negative call stack size" + maxDepth); + for (RVMField field : instance_fields) { + if (field.isPublic()) { + coll.add(JikesRVMSupport.createField(field)); + } } - Class<?>[] result = new Class[maxDepth]; - browser.init(); - for (int i=0; i < maxDepth; i++) { - result[i] = browser.getCurrentClass().getClassForType(); - browser.up(); + + return coll.toArray(new Field[coll.size()]); + } + + public Field[] getDeclaredFields() throws SecurityException { + checkMemberAccess(Member.DECLARED); + if (!type.isClassType()) return new Field[0]; + + RVMField[] fields = type.asClass().getDeclaredFields(); + Field[] ans = new Field[fields.length]; + for (int i = 0; i < fields.length; i++) { + ans[i] = JikesRVMSupport.createField(fields[i]); } - return result; + return ans; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |