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    
014    package org.jikesrvm.mm.mmtk;
015    
016    import org.jikesrvm.scheduler.RVMThread;
017    import org.jikesrvm.tuningfork.TraceEngine;
018    import org.mmtk.policy.Space;
019    import org.vmmagic.pragma.Uninterruptible;
020    import org.vmmagic.unboxed.Address;
021    import org.vmmagic.unboxed.Extent;
022    
023    import com.ibm.tuningfork.tracegen.types.EventAttribute;
024    import com.ibm.tuningfork.tracegen.types.EventType;
025    import com.ibm.tuningfork.tracegen.types.ScalarType;
026    
027    /**
028     * Implementation of simple MMTK event generation hooks
029     * to allow MMTk to generate TuningFork events.
030     */
031    @Uninterruptible
032    public class MMTk_Events extends org.mmtk.vm.MMTk_Events {
033      public static MMTk_Events events;
034    
035      public final EventType gcStart;
036      public final EventType gcStop;
037      public final EventType pageAction;
038      public final EventType heapSizeChanged;
039    
040      private final TraceEngine engine;
041    
042      public MMTk_Events(TraceEngine engine) {
043        this.engine = engine;
044    
045        /* Define events used by the MMTk subsystem */
046        gcStart = engine.defineEvent("GC Start", "Start of a GC cycle", new EventAttribute("Reason","Encoded reason for GC",ScalarType.INT));
047        gcStop = engine.defineEvent("GC Stop", "End of a GC Cycle");
048        pageAction = engine.defineEvent("Page Action", "A space has acquired or released one or more pages",
049                                  new EventAttribute[] {
050                                      new EventAttribute("Space", "Space ID", ScalarType.INT),
051                                      new EventAttribute("Start Address", "Start address of range of released pages", ScalarType.INT),
052                                      new EventAttribute("Num Pages", "Number of pages released", ScalarType.INT),
053                                      new EventAttribute("Acquire/Release", "0 for acquire, 1 for release", ScalarType.INT)});
054        heapSizeChanged = engine.defineEvent("Heapsize", "Current heapsize ceiling", new EventAttribute("Heapsize", "Heapsize in bytes", ScalarType.INT));
055        events = this;
056      }
057    
058      @Override
059      public void tracePageAcquired(Space space, Address startAddress, int numPages) {
060        RVMThread.getCurrentFeedlet().addEvent(pageAction, space.getIndex(), startAddress.toInt(), numPages, 0);
061      }
062    
063      @Override
064      public void tracePageReleased(Space space, Address startAddress, int numPages) {
065        RVMThread.getCurrentFeedlet().addEvent(pageAction, space.getIndex(), startAddress.toInt(), numPages, 1);
066      }
067    
068      @Override
069      public void heapSizeChanged(Extent heapSize) {
070        RVMThread.getCurrentFeedlet().addEvent(heapSizeChanged, heapSize.toInt());
071      }
072    }