Added the option to execute on the local thread.

Change-Id: I168eafb2eb57387a7ce5861ff6b8f2b89afd81dd
This commit is contained in:
Aaron Kruglikov 2015-10-27 15:06:29 -07:00 committed by Gerrit Code Review
parent 584107a683
commit f27dba65f5
3 changed files with 24 additions and 6 deletions

View File

@ -31,7 +31,7 @@ import static org.onlab.junit.TestTools.assertAfter;
public class AbstractAccumulatorTest { public class AbstractAccumulatorTest {
private final ManuallyAdvancingTimer timer = new ManuallyAdvancingTimer(); private final ManuallyAdvancingTimer timer = new ManuallyAdvancingTimer(true);
private static final int LONG_REAL_TIME_DELAY = 30; private static final int LONG_REAL_TIME_DELAY = 30;
private static final int SHORT_REAL_TIME_DELAY = 5; private static final int SHORT_REAL_TIME_DELAY = 5;

View File

@ -65,6 +65,14 @@ public class ManuallyAdvancingTimer extends java.util.Timer {
/* Data structure for tracking tasks */ /* Data structure for tracking tasks */
private final TaskQueue queue = new TaskQueue(); private final TaskQueue queue = new TaskQueue();
/* Whether execution should execute on the executor thread or the calling thread. */
private final boolean runLocally;
public ManuallyAdvancingTimer(boolean runLocally) {
this.runLocally = runLocally;
}
@Override @Override
public void schedule(TimerTask task, long delay) { public void schedule(TimerTask task, long delay) {
if (!staticsPopulated) { if (!staticsPopulated) {
@ -165,14 +173,16 @@ public class ManuallyAdvancingTimer extends java.util.Timer {
/** /**
* Advances the virtual time a certain number of millis triggers execution delays a certain amount to * Advances the virtual time a certain number of millis triggers execution delays a certain amount to
* allow time for execution. * allow time for execution. If runLocally is true then all real time delays are ignored.
* *
* @param virtualTimeAdvance the time to be advances in millis of simulated time. * @param virtualTimeAdvance the time to be advances in millis of simulated time.
* @param realTimeDelay the time to delay in real time to allow for processing. * @param realTimeDelay the time to delay in real time to allow for processing.
*/ */
public void advanceTimeMillis(long virtualTimeAdvance, int realTimeDelay) { public void advanceTimeMillis(long virtualTimeAdvance, int realTimeDelay) {
timerKeeper.advanceTimeMillis(virtualTimeAdvance); timerKeeper.advanceTimeMillis(virtualTimeAdvance);
delay(realTimeDelay); if (!runLocally) {
delay(realTimeDelay);
}
} }
/** /**
@ -238,7 +248,11 @@ public class ManuallyAdvancingTimer extends java.util.Timer {
e.printStackTrace(); e.printStackTrace();
return false; return false;
} }
executorService.execute(task); if (runLocally) {
task.run();
} else {
executorService.execute(task);
}
return true; return true;
} else { } else {
//Calculate next execution time, using absolute value of period //Calculate next execution time, using absolute value of period
@ -253,7 +267,11 @@ public class ManuallyAdvancingTimer extends java.util.Timer {
} }
//Schedule next execution //Schedule next execution
queue.insertOrdered(task); queue.insertOrdered(task);
executorService.execute(task); if (runLocally) {
task.run();
} else {
executorService.execute(task);
}
return true; return true;
} }
} }

View File

@ -54,7 +54,7 @@ public class ManuallyAdvancingTimerTest {
*/ */
@Before @Before
public void setup() { public void setup() {
timer = new ManuallyAdvancingTimer(); timer = new ManuallyAdvancingTimer(true);
idGenerator = new AtomicInteger(1); idGenerator = new AtomicInteger(1);
tasksRunCount = new AtomicInteger(0); tasksRunCount = new AtomicInteger(0);
taskList = Lists.newArrayList(); taskList = Lists.newArrayList();