001 /* 002 Galois, a framework to exploit amorphous data-parallelism in irregular 003 programs. 004 005 Copyright (C) 2010, The University of Texas at Austin. All rights reserved. 006 UNIVERSITY EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES CONCERNING THIS SOFTWARE 007 AND DOCUMENTATION, INCLUDING ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR ANY 008 PARTICULAR PURPOSE, NON-INFRINGEMENT AND WARRANTIES OF PERFORMANCE, AND ANY 009 WARRANTY THAT MIGHT OTHERWISE ARISE FROM COURSE OF DEALING OR USAGE OF TRADE. 010 NO WARRANTY IS EITHER EXPRESS OR IMPLIED WITH RESPECT TO THE USE OF THE 011 SOFTWARE OR DOCUMENTATION. Under no circumstances shall University be liable 012 for incidental, special, indirect, direct or consequential damages or loss of 013 profits, interruption of business, or related expenses which may arise from use 014 of Software or Documentation, including but not limited to those resulting from 015 defects in Software and/or Documentation, or loss or inaccuracy of data of any 016 kind. 017 018 File: Launcher.java 019 020 */ 021 022 023 024 package util; 025 026 import java.util.Random; 027 028 import java.util.ArrayList; 029 import java.util.List; 030 031 import util.ThreadTimer.Tick; 032 033 /** 034 * Resets state when multiple runs of the same piece of code are executed. 035 * 036 * 037 */ 038 public class Launcher { 039 private static Launcher instance; 040 private boolean isFirstRun; 041 private Tick start; 042 private Tick stop; 043 private final List<Statistics> stats; 044 private final List<Runnable> callbacks; 045 private final Random random; 046 047 private Launcher() { 048 isFirstRun = true; 049 stats = new ArrayList<Statistics>(); 050 callbacks = new ArrayList<Runnable>(); 051 052 random = new Random(); 053 } 054 055 /** 056 * Marks beginning of timed section. If there are multiple calls to this 057 * method within the same run, honor the latest call. This method also 058 * performs a full garbage collection. 059 */ 060 public void startTiming() { 061 System.gc(); 062 if (stop == null) 063 start = ThreadTimer.tick(); 064 } 065 066 /** 067 * Marks end of timed section. If there are multiple calls to this method 068 * within the same run, honor the earliest call. 069 */ 070 public void stopTiming() { 071 if (stop == null) 072 stop = ThreadTimer.tick(); 073 } 074 075 /** 076 * 077 * @return true if this is the first run 078 */ 079 public boolean isFirstRun() { 080 return isFirstRun; 081 } 082 083 /** 084 * Returns the wall-time of the most recently completed run with or without 085 * garbage collection time included 086 * 087 * @param withoutGc true if garbage collection time should be excluded from result 088 * @return wall-time in milliseconds of the run 089 */ 090 public long elapsedTime(boolean withoutGc) { 091 return start.elapsedTime(withoutGc, stop); 092 } 093 094 /** 095 * Resets the launcher to its initial configuration in preparation for the 096 * next run. All previously accumulated statistics will be cleared. 097 */ 098 public void reset() { 099 stop = null; 100 start = null; 101 isFirstRun = false; 102 for (Runnable r : callbacks) { 103 r.run(); 104 } 105 callbacks.clear(); 106 stats.clear(); 107 } 108 109 /** 110 * @return the accumulated statistics for the most recently completed run 111 */ 112 public List<Statistics> getStatistics() { 113 return stats; 114 } 115 116 /** 117 * Adds a callback to be called when launcher is reset. 118 * 119 * @param callback callback to called on reset 120 */ 121 public void onRestart(Runnable callback) { 122 callbacks.add(callback); 123 } 124 125 /** 126 * Adds statistics to current run 127 * 128 * @param stat the statistics to add 129 */ 130 public void addStats(Statistics stat) { 131 if (stat != null) 132 stats.add(stat); 133 } 134 135 /** 136 * Returns the random number generator for this run 137 * 138 * @param seed the random number generator seed 139 * @return a random number generator 140 */ 141 public Random getRandom(int seed) { 142 random.setSeed(seed); 143 return random; 144 } 145 146 /** 147 * @return an instance of the launcher 148 */ 149 public static Launcher getLauncher() { 150 if (instance == null) 151 instance = new Launcher(); 152 return instance; 153 } 154 }