/* * This file is part of the Jikes RVM project (http://jikesrvm.org). * * This file is licensed to You under the Eclipse Public License (EPL); * 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/eclipse-1.0.php * * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. */ package org.jikesrvm.adaptive.measurements.organizers; import org.jikesrvm.VM; import org.jikesrvm.adaptive.controller.Controller; import org.jikesrvm.adaptive.database.methodsamples.MethodCountData; import org.jikesrvm.adaptive.measurements.RuntimeMeasurements; import org.jikesrvm.adaptive.measurements.listeners.MethodListener; import org.jikesrvm.adaptive.util.AOSLogging; import org.jikesrvm.scheduler.RVMThread; import org.vmmagic.pragma.NonMoving; /** * An organizer for method listener information that * simply accumulates the samples into a private * MethodCountData instance. * * This organizer is used to simply gather aggregate sample data and * report it. */ @NonMoving public final class AccumulatingMethodSampleOrganizer extends Organizer { private MethodCountData data; public AccumulatingMethodSampleOrganizer() { makeDaemon(true); } /** * Initialization: set up data structures and sampling objects. */ @Override public void initialize() { data = new MethodCountData(); new AsyncReporter().start(); int numSamples = Controller.options.METHOD_SAMPLE_SIZE * RVMThread.numProcessors; if (Controller.options.mlCBS()) { numSamples *= VM.CBSMethodSamplesPerTick; } MethodListener methodListener = new MethodListener(numSamples); listener = methodListener; listener.setOrganizer(this); if (Controller.options.mlTimer()) { RuntimeMeasurements.installTimerMethodListener(methodListener); } else if (Controller.options.mlCBS()) { RuntimeMeasurements.installCBSMethodListener(methodListener); } else { if (VM.VerifyAssertions) VM._assert(false, "Unexpected value of method_listener_trigger"); } } /** * Method that is called when the sampling threshold is reached */ void thresholdReached() { AOSLogging.logger.organizerThresholdReached(); int numSamples = ((MethodListener) listener).getNumSamples(); int[] samples = ((MethodListener) listener).getSamples(); data.update(samples, numSamples); } public void report() { VM.sysWrite("\nMethod sampler report"); if (data != null) data.report(); } @NonMoving class AsyncReporter extends RVMThread { public AsyncReporter() { super("Async Profile Reporter"); makeDaemon(true); } public void run() { for (;;) { RVMThread.doProfileReport.waitAndCloseWithHandshake(); report(); } } } }