/* CpuMetrics.java (c) 2011-2013 Edward Swartz All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html */ package v9t9.common.cpu; import java.util.ArrayList; import java.util.List; import ejs.base.utils.ListenerList; import ejs.base.utils.ListenerList.IFire; /** * Track the metrics of the CPU * @author Ed * */ public class CpuMetrics implements ICpuMetrics { public interface IMetricsListener { void metricsChanged(); } private ListenerList<IMetricsListener> metricsListeners; private ArrayList<MetricEntry> entries; public CpuMetrics() { entries = new ArrayList<MetricEntry>(); metricsListeners = new ListenerList<IMetricsListener>(); } /* (non-Javadoc) * @see v9t9.emulator.runtime.cpu.ICpuMetrics#addListener(v9t9.emulator.runtime.cpu.CpuMetrics.IMetricsListener) */ @Override public void addListener(IMetricsListener listener) { metricsListeners.add(listener); } /* (non-Javadoc) * @see v9t9.emulator.runtime.cpu.ICpuMetrics#removeListener(v9t9.emulator.runtime.cpu.CpuMetrics.IMetricsListener) */ @Override public void removeListener(IMetricsListener listener) { metricsListeners.remove(listener); } /* (non-Javadoc) * @see v9t9.emulator.runtime.cpu.ICpuMetrics#log(long, long, int, int, int, long, long, long) */ @Override public void log(MetricEntry entry) { if (entry.getCycles() == 0) { return; } //System.out.println(entry.toSummary()); synchronized (entries) { if (entries.size() >= 1024) entries.subList(0, entries.size() - 512).clear(); //entries = new ArrayList<MetricEntry>(entries.subList(entries.size() - 512, entries.size())); entries.add(entry); } //nLastCycleCount = totalCycles; fireListeners(); } private void fireListeners() { metricsListeners.fire(new IFire<CpuMetrics.IMetricsListener>() { @Override public void fire(IMetricsListener listener) { try { listener.metricsChanged(); } catch (Throwable t) { t.printStackTrace(); } } }); } /* (non-Javadoc) * @see v9t9.emulator.runtime.cpu.ICpuMetrics#getLastEntries(int) */ @Override public MetricEntry[] getLastEntries(int x) { synchronized (entries) { int idx = Math.max(0, entries.size() - x); List<MetricEntry> subList = entries.subList(idx, entries.size()); return subList.toArray(new MetricEntry[subList.size()]); } } /* (non-Javadoc) * @see v9t9.emulator.runtime.cpu.ICpuMetrics#getEntry(int, int) */ @Override public MetricEntry getEntry(int i, int of) { synchronized (entries) { int idx = Math.max(0, entries.size() - of); if (idx + i >= 0 && idx + i < entries.size()) return entries.get(idx + i); } return null; } /* (non-Javadoc) * @see v9t9.emulator.runtime.cpu.ICpuMetrics#resetLastCycleCount() */ //@Override //public void resetLastCycleCount() { // nLastCycleCount = 0; //} }