blob: 2cd2a290c6bc0fdc4105c18415c6e657a19744f6 [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.cts;
import java.util.Timer;
import java.util.TimerTask;
/**
* Host timer.
* Generally, there are two use cases of this general host timer:
* <ul>
* <li> Use it as general timer to guard host from running for
* too long under some situations.
* <li> Use it as special timer where host needs to run very
* long to communicate with device to fetch result section
* by section which requires restarting the timer.
* </ul>
*/
public class HostTimer {
private final static int INIT = 0;
private final static int RUNNING = 1;
private final static int CANCELLED = 2;
private final static int TIMEOUT = 3;
private boolean mIsNotified;
private int mStatus;
private int mDelay;
private TimerTask mTimerTask;
private Timer mTimer;
public HostTimer(TimerTask task, int delay) {
mDelay = delay;
mTimerTask = task;
mStatus = INIT;
mIsNotified = false;
mTimer = null;
}
/**
* Mark notified.
*/
public void setNotified() {
mIsNotified = true;
}
/**
* Get the notification status.
*
* @return The notification status.
*/
public boolean isNotified() {
return mIsNotified;
}
/**
* Clear the status of notification.
*/
public void resetNotified() {
mIsNotified = false;
}
/**
* Wait on.
*/
public void waitOn() throws InterruptedException {
Log.d("HostTimer.waitOn(): mIsNotified=" + mIsNotified + ", this=" + this);
if (!mIsNotified) {
wait();
}
mIsNotified = false;
}
/**
* Set the time to delay.
*
* @param delay The time to delay.
*/
public void setDelay(int delay) {
mDelay = delay;
}
/**
* Set the timer task.
*
* @param task The timer task.
*/
public void setTimerTask(TimerTask task) {
mTimerTask = task;
}
/**
* Check if the watch dog timer timed out.
*
* @return If timeout, return true; else return false.
*/
public boolean isTimeOut() {
return (mStatus == TIMEOUT);
}
/**
* Start the watch dog timer.
*/
public void start() {
mTimer = new Timer();
mTimer.schedule(mTimerTask, mDelay);
mStatus = RUNNING;
}
/**
* Restart the watch dog timer.
*/
public void restart(TimerTask task, int delay) {
mTimer.cancel();
mTimerTask = task;
mDelay = delay;
start();
}
/**
* Send notify to thread waiting on this object.
*/
public void sendNotify() {
Log.d("HostTimer.sendNotify(): mIsNotified=" + mIsNotified + ", this=" + this);
mIsNotified = true;
notify();
}
/**
* Cancel the timer. To keep the status info, call this
* cancel in stead of the one inherited from parent.
*
* @param timeout If true, the cancellation is caused by timer timing out;
* If false, the cancellation is no caused by timer timing out.
*/
public void cancel(boolean timeout) {
mTimer.cancel();
if (mStatus == RUNNING) {
if (timeout) {
mStatus = TIMEOUT;
} else {
mStatus = CANCELLED;
}
}
}
}