diff src/alice/topology/manager/keeparive/TaskExecuter.java @ 323:d746c4486287

work
author one
date Mon, 23 Dec 2013 17:13:16 +0900
parents 4b5bf9cf1505
children 806cc010a5bd
line wrap: on
line diff
--- a/src/alice/topology/manager/keeparive/TaskExecuter.java	Tue Dec 17 19:46:29 2013 +0900
+++ b/src/alice/topology/manager/keeparive/TaskExecuter.java	Mon Dec 23 17:13:16 2013 +0900
@@ -8,8 +8,9 @@
 public class TaskExecuter extends CodeSegment{
 	private Receiver info = ids.create(CommandType.TAKE);
 	private TaskInfo nowTask;
-	private boolean interruptFlag = false;
-	private long time = 0;
+	private boolean skipFlag = false;
+	private long startTime = 0;
+	private long remainingTime = 0;
 	private static TaskExecuter instance = new TaskExecuter();
 
 	private TaskExecuter(){}
@@ -26,21 +27,23 @@
 	public synchronized void run(){
 		ListManager list = info.asClass(ListManager.class);
 		if (list.getTaskList().size() == 0){
+			remainingTime = 0;
 			ods.update("_WAITINGLIST", list);
 			setKey();
 			return;
 		}
 		nowTask = list.getTaskList().poll();
 		ods.update("_WAITINGLIST", list);
-		time = System.currentTimeMillis();
+		if (skipFlag){
+			nowTask.setSleepTime(nowTask.getSleepTime() + remainingTime);
+		}
+		startTime = System.currentTimeMillis();
 		if (nowTask.getSleepTime()!=0){
 			try {
 				this.wait(nowTask.getSleepTime());
 			} catch (InterruptedException e){}
 		}
-		if (interruptFlag){				
-			interruptFlag = false;
-		} else {
+		if (!skipFlag){
 			if (nowTask.getType() == TaskType.PING){
 				ods.ping(nowTask.getManagerKey(), nowTask.getReturnKey());
 				TaskInfo task = new TaskInfo(TaskType.CLOSE);
@@ -48,15 +51,18 @@
 				ods.put("_TASKINFO", task);
 				new RespondPing(nowTask.getReturnKey());
 			} else {
+				// no response from the Remote DataSegment. So close this connection.
 				DataSegment.get(nowTask.getManagerKey()).close();
-			}
-			
+			}		
 		}
 		nowTask = null;
 		setKey();
 	}
-	public synchronized void interrupt(){
-		interruptFlag = true;
+	
+	public synchronized void skip(){
+		skipFlag = true;
+		remainingTime = nowTask.getSleepTime() - (System.currentTimeMillis() - startTime);
+		nowTask = null;
 		notify();
 	}
 
@@ -65,7 +71,17 @@
 	}
 
 	public long getTime(){
-		return time;
+		return startTime;
 	}
-}
+	
+	public boolean compareNowTask(TaskInfo task){
+		if (nowTask != null){
+			if (nowTask.getType().equals(task.getType())
+					&& nowTask.getManagerKey().equals(task.getManagerKey())){
+				return true;
+			} 
+		}
+		return false;
+	}
 
+}
\ No newline at end of file