view src/alice/topology/manager/keeparive/PingScheduler.java @ 303:6e0a909b4b12

add PingScheduler
author sugi
date Tue, 19 Nov 2013 14:04:57 +0900
parents
children 366742c2b07d
line wrap: on
line source

package alice.topology.manager.keeparive;

import java.util.LinkedList;
import java.util.List;

import alice.codesegment.CodeSegment;

public class PingScheduler extends CodeSegment{
	private LinkedList<TaskInfo> list = new LinkedList<TaskInfo>();
	private long INTERVAL = 60 * 1000;

	public boolean updateFlag = false;
	private boolean interruptFlag = false;

	private long time = 0;
	public TaskInfo nowTask;
	private long totalTime = 0;
	private long postponeTime = 0;

	public long getTotalTime(){
		return totalTime;
	}

	public List<TaskInfo> getTaskList(){
		return list;
	}

	public synchronized void postpone(String name){
		long elapsedTime = System.currentTimeMillis() - time;
		totalTime += elapsedTime;
		postponeTime = nowTask.getSleepTime() - elapsedTime;
		if (name.equals(nowTask.getManagerKey())){
			TaskInfo nextTask = list.get(0);
			nextTask.setSleepTime(postponeTime + nextTask.getSleepTime());
			nowTask.setSleepTime(INTERVAL);
			addTask(nowTask);

		} else {
			int cnt = 0;
			nowTask.setSleepTime(postponeTime);
			list.add(cnt, nowTask);	
			for (TaskInfo info : list){
				if (name.equals(info.getManagerKey())){
					if (info != list.getLast()){ 
						TaskInfo nextInfo = list.get(cnt+1);
						nextInfo.setSleepTime(nextInfo.getSleepTime() + info.getSleepTime());
					} 
					list.remove(info);
					info.setSleepTime(INTERVAL);
					addTask(info);
					break;
				}
				cnt++;
			}
		}
		interruptFlag = true;
		notify();
	}


	public synchronized void addTask(TaskInfo newInfo){
		if (list.isEmpty()) {
			list.add(newInfo);
		} else {
			int cnt = 0;
			for (TaskInfo info : list){
				if (info.getSleepTime() < newInfo.getSleepTime()){
					newInfo.setSleepTime(newInfo.getSleepTime() - info.getSleepTime());	
				} else if (info.getSleepTime() == newInfo.getSleepTime()){
					newInfo.setSleepTime(newInfo.getSleepTime() - info.getSleepTime());
					cnt++;
					break;
				} else if (info.getSleepTime() > newInfo.getSleepTime()){
					info.setSleepTime(info.getSleepTime() - newInfo.getSleepTime());
					break;
				}
				cnt++;
			}
			list.add(cnt, newInfo);
		}
		updateFlag = true;
	}

	@Override
	public synchronized void run() {
		try {
			while(true){
				nowTask = list.poll();
				time = System.currentTimeMillis();
				if (nowTask.getSleepTime()!=0)
					this.wait(nowTask.getSleepTime());
				if (interruptFlag){				
					interruptFlag = false;				
				} else {
					ods.put("_SENDPING", nowTask);
					totalTime +=nowTask.getSleepTime();					
				}
			}
		} catch (InterruptedException e) {
		}
	}
}