1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.cts; 18 19 import java.util.Timer; 20 import java.util.TimerTask; 21 22 /** 23 * Host timer. 24 * Generally, there are two use cases of this general host timer: 25 * <ul> 26 * <li> Use it as general timer to guard host from running for 27 * too long under some situations. 28 * <li> Use it as special timer where host needs to run very 29 * long to communicate with device to fetch result section 30 * by section which requires restarting the timer. 31 * </ul> 32 */ 33 public class HostTimer { 34 private final static int INIT = 0; 35 private final static int RUNNING = 1; 36 private final static int CANCELLED = 2; 37 private final static int TIMEOUT = 3; 38 39 private boolean mIsNotified; 40 private int mStatus; 41 private int mDelay; 42 private TimerTask mTimerTask; 43 private Timer mTimer; 44 45 public HostTimer(TimerTask task, int delay) { 46 mDelay = delay; 47 mTimerTask = task; 48 mStatus = INIT; 49 mIsNotified = false; 50 mTimer = null; 51 } 52 53 /** 54 * Mark notified. 55 */ 56 public void setNotified() { 57 mIsNotified = true; 58 } 59 60 /** 61 * Get the notification status. 62 * 63 * @return The notification status. 64 */ 65 public boolean isNotified() { 66 return mIsNotified; 67 } 68 69 /** 70 * Clear the status of notification. 71 */ 72 public void resetNotified() { 73 mIsNotified = false; 74 } 75 76 /** 77 * Wait on. 78 */ 79 public void waitOn() throws InterruptedException { 80 Log.d("HostTimer.waitOn(): mIsNotified=" + mIsNotified + ", this=" + this); 81 if (!mIsNotified) { 82 wait(); 83 } 84 mIsNotified = false; 85 } 86 87 /** 88 * Set the time to delay. 89 * 90 * @param delay The time to delay. 91 */ 92 public void setDelay(int delay) { 93 mDelay = delay; 94 } 95 96 /** 97 * Set the timer task. 98 * 99 * @param task The timer task. 100 */ 101 public void setTimerTask(TimerTask task) { 102 mTimerTask = task; 103 } 104 105 /** 106 * Check if the watch dog timer timed out. 107 * 108 * @return If timeout, return true; else return false. 109 */ 110 public boolean isTimeOut() { 111 return (mStatus == TIMEOUT); 112 } 113 114 /** 115 * Start the watch dog timer. 116 */ 117 public void start() { 118 mTimer = new Timer(); 119 mTimer.schedule(mTimerTask, mDelay); 120 mStatus = RUNNING; 121 } 122 123 /** 124 * Restart the watch dog timer. 125 */ 126 public void restart(TimerTask task, int delay) { 127 mTimer.cancel(); 128 mTimerTask = task; 129 mDelay = delay; 130 start(); 131 } 132 133 /** 134 * Send notify to thread waiting on this object. 135 */ 136 public void sendNotify() { 137 Log.d("HostTimer.sendNotify(): mIsNotified=" + mIsNotified + ", this=" + this); 138 mIsNotified = true; 139 notify(); 140 } 141 142 /** 143 * Cancel the timer. To keep the status info, call this 144 * cancel in stead of the one inherited from parent. 145 * 146 * @param timeout If true, the cancellation is caused by timer timing out; 147 * If false, the cancellation is no caused by timer timing out. 148 */ 149 public void cancel(boolean timeout) { 150 if (mTimer != null) { 151 mTimer.cancel(); 152 } 153 if (mStatus == RUNNING) { 154 if (timeout) { 155 mStatus = TIMEOUT; 156 } else { 157 mStatus = CANCELLED; 158 } 159 } 160 } 161 } 162