001: /*
002: * Copyright (c) 2001 by Matt Welsh and The Regents of the University of
003: * California. All rights reserved.
004: *
005: * Permission to use, copy, modify, and distribute this software and its
006: * documentation for any purpose, without fee, and without written agreement is
007: * hereby granted, provided that the above copyright notice and the following
008: * two paragraphs appear in all copies of this software.
009: *
010: * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
011: * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
012: * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
013: * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
014: *
015: * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
016: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
017: * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
018: * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
019: * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
020: *
021: * Author: Matt Welsh <mdw@cs.berkeley.edu>
022: *
023: */
024:
025: package seda.sandStorm.internal;
026:
027: import seda.sandStorm.api.*;
028: import seda.sandStorm.main.*;
029: import java.io.*;
030: import java.util.*;
031:
032: /**
033: * sandStormProfiler is an implementation of the ProfilerIF interface
034: * for Sandstorm. It is implemented using a thread that periodically
035: * samples the set of ProfilableIF's registered with it, and outputs
036: * the profile to a file.
037: *
038: * @author Matt Welsh
039: * @see ProfilerIF
040: * @see ProfilableIF
041: */
042: class sandStormProfiler extends Thread implements sandStormConst,
043: ProfilerIF {
044:
045: private int delay;
046: private PrintWriter pw;
047: private Vector profilables;
048: private boolean started = false;
049: private StageGraph graphProfiler;
050:
051: sandStormProfiler(ManagerIF mgr) throws IOException {
052: graphProfiler = new StageGraph(mgr);
053: SandstormConfig config = mgr.getConfig();
054: delay = config.getInt("global.profile.delay");
055: String filename = config.getString("global.profile.filename");
056: if (config.getBoolean("global.profile.enable")) {
057: pw = new PrintWriter(new FileWriter(filename, true));
058: }
059: profilables = new Vector(1);
060: }
061:
062: /**
063: * Returns true if the profiler is enabled.
064: */
065: public boolean enabled() {
066: return started;
067: }
068:
069: /**
070: * Add a class to this profiler.
071: */
072: public void add(String name, ProfilableIF pr) {
073: if (pr == null)
074: return;
075: if (pw == null)
076: return;
077: synchronized (profilables) {
078: pw.println("# Registered " + profilables.size() + " "
079: + name);
080: profilables.addElement(new profile(name, pr));
081: }
082: }
083:
084: public void run() {
085:
086: if (pw == null)
087: return;
088: started = true;
089: pw.println("##### Profile started at "
090: + (new Date()).toString());
091: pw.println("##### Sample delay " + delay + " msec");
092: Runtime r = Runtime.getRuntime();
093:
094: while (true) {
095:
096: long totalmem = r.totalMemory() / 1024;
097: long freemem = r.freeMemory() / 1024;
098:
099: pw.print("totalmem(kb) " + totalmem + " freemem(kb) "
100: + freemem + " ");
101:
102: synchronized (profilables) {
103: if (profilables.size() > 0) {
104: for (int i = 0; i < profilables.size(); i++) {
105: profile p = (profile) profilables.elementAt(i);
106: pw.print("pr" + i + " " + p.pr.profileSize()
107: + " ");
108: }
109: }
110: }
111: pw.println("");
112: pw.flush();
113:
114: try {
115: Thread.currentThread().sleep(delay);
116: } catch (InterruptedException ie) {
117: }
118: }
119: }
120:
121: public StageGraph getGraphProfiler() {
122: return graphProfiler;
123: }
124:
125: class profile {
126: String name;
127: ProfilableIF pr;
128:
129: profile(String name, ProfilableIF pr) {
130: this.name = name;
131: this.pr = pr;
132: }
133: }
134:
135: }
|