001    /*
002     *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003     *
004     *  This file is licensed to You under the Eclipse Public License (EPL);
005     *  You may not use this file except in compliance with the License. You
006     *  may obtain a copy of the License at
007     *
008     *      http://www.opensource.org/licenses/eclipse-1.0.php
009     *
010     *  See the COPYRIGHT.txt file distributed with this work for information
011     *  regarding copyright ownership.
012     */
013    package org.mmtk.vm;
014    
015    import org.vmmagic.unboxed.*;
016    import org.vmmagic.pragma.*;
017    
018    /**
019     * Class that supports scanning Objects or Arrays for references
020     * during tracing, handling those references, and computing death times
021     */
022    @Uninterruptible public abstract class TraceInterface {
023    
024    
025      /***********************************************************************
026       *
027       * Public Methods
028       */
029    
030      /**
031       * Returns {@code true} if the VM is ready for a garbage collection.
032       *
033       * @return {@code true} if the VM is ready for GC, {@code false} otherwise.
034       */
035      public abstract boolean gcEnabled();
036    
037      /**
038       * This adjusts the offset into an object to reflect what it would look like
039       * if the fields were laid out in memory space immediately after the object
040       * pointer.
041       *
042       * @param isScalar If this is a pointer store to a scalar object
043       * @param src The address of the source object
044       * @param slot The address within <code>src</code> into which
045       * the update will be stored
046       * @return The easy to understand offset of the slot
047       */
048      public abstract Offset adjustSlotOffset(boolean isScalar,
049                                                  ObjectReference src,
050                                                  Address slot);
051    
052      /**
053       * This skips over the frames added by the tracing algorithm, outputs
054       * information identifying the method the containts the "new" call triggering
055       * the allocation, and returns the address of the first non-trace, non-alloc
056       * stack frame.
057       *
058       *@param typeRef The type reference (tib) of the object just allocated
059       * @return The frame pointer address for the method that allocated the object
060       */
061      @Interruptible
062      public abstract Address skipOwnFramesAndDump(ObjectReference typeRef);
063    
064      /***********************************************************************
065      *
066      * Wrapper methods
067      */
068    
069      /**
070       * Update an object's death time.
071       * @param obj the object
072       */
073      public abstract void updateDeathTime(ObjectReference obj);
074      public abstract void setDeathTime(ObjectReference ref, Word time_);
075      public abstract void setLink(ObjectReference ref, ObjectReference link);
076      public abstract void updateTime(Word time_);
077      public abstract Word getOID(ObjectReference ref);
078      public abstract Word getDeathTime(ObjectReference ref);
079      public abstract ObjectReference getLink(ObjectReference ref);
080      public abstract Address getBootImageLink();
081      public abstract Word getOID();
082      public abstract void setOID(Word oid);
083      public abstract int getHeaderSize();
084      public abstract int getHeaderEndOffset();
085    }