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.mmtk.plan.TraceLocal;
016    import org.vmmagic.pragma.Uninterruptible;
017    import org.vmmagic.unboxed.Address;
018    import org.vmmagic.unboxed.ObjectReference;
019    
020    /**
021     *
022     */
023    @Uninterruptible
024    public abstract class Debug {
025      /**
026       * Global switch for debugging - if {@code false} the other methods of this
027       * class are never called.
028       * @return Whether debugging is enabled
029       */
030      public abstract boolean isEnabled();
031    
032      /**
033       * A modbuf (object remembering barrier) entry has been
034       * traced during collection.
035       * @param object The modbuf entry
036       */
037      public void modbufEntry(ObjectReference object) { }
038    
039      /**
040       * A remset (slot remembering barrier) entry has been
041       * traced during collection.
042       * @param slot The remset entry
043       */
044      public void remsetEntry(Address slot) { }
045    
046      /**
047       * An array remset entry has been traced during collection.  Implicitly
048       * the slots from start (inclusive) through to guard (non-inclusive)
049       * are traced as remset entries
050       * @param start The entry start address
051       * @param guard The guard
052       */
053      public void arrayRemsetEntry(Address start, Address guard) { }
054    
055      /**
056       * A global GC collection phase
057       * @param phaseId The phase ID
058       * @param before true at the start of the phase, false at the end
059       */
060      public void globalPhase(short phaseId, boolean before) { }
061    
062      /**
063       * A per-collector GC collection phase
064       * @param phaseId The phase ID
065       * @param ordinal The collector ID (within this collection)
066       * @param before true at the start of the phase, false at the end
067       */
068      public void collectorPhase(short phaseId, int ordinal, boolean before) { }
069    
070      /**
071       * A per-mutator GC collection phase
072       * @param phaseId The phase ID
073       * @param ordinal The mutator ID
074       * @param before true at the start of the phase, false at the end
075       */
076      public void mutatorPhase(short phaseId, int ordinal, boolean before) { }
077    
078      /**
079       * Trace an object during GC
080       *
081       * *** Non-standard, requires plumbing into a collector during debugging ***
082       *
083       * @param trace The trace being performed
084       * @param object The object
085       */
086      public void traceObject(TraceLocal trace, ObjectReference object) { }
087    
088      /**
089       * An entry has been inserted at the head of a queue
090       *
091       * *** Non-standard, requires plumbing into a collector during debugging ***
092       *
093       * @param queueName The name of the queue
094       * @param value The value
095       */
096      public void queueHeadInsert(String queueName, Address value) {
097      }
098    
099      /**
100       * An entry has been inserted at the head of a queue
101       *
102       * *** Non-standard, requires plumbing into a collector during debugging ***
103       *
104       * @param queueName The name of the queue
105       * @param value The value
106       */
107      public void queueTailInsert(String queueName, Address value) {
108      }
109    
110      /**
111       * An entry has been inserted at the head of a queue
112       *
113       * *** Non-standard, requires plumbing into a collector during debugging ***
114       *
115       * @param queueName The name of the queue
116       * @param value The value
117       */
118      public void queueHeadRemove(String queueName, Address value) { }
119    
120      /**
121       * An entry has been inserted at the head of a queue
122       *
123       * *** Non-standard, requires plumbing into a collector during debugging ***
124       *
125       * @param queueName The name of the queue
126       * @param value The value
127       */
128      public void queueTailRemove(String queueName, Address value) { }
129    
130      /*
131       * NOTE: These methods should not be called by anything other than the
132       * reflective mechanisms in org.mmtk.vm.VM, and are not implemented by
133       * subclasses.
134       *
135       * This hack exists only to allow us to declare the respective
136       * methods as protected.
137       */
138      static final boolean isEnabledTrapdoor(Debug d) {
139        return d.isEnabled();
140      }
141    
142    }