view src/alice/topology/manager/keeparive/PingScheduler.java @ 299:48de3510fb00

Scheduler has bug
author sugi
date Mon, 04 Nov 2013 13:09:14 +0900
parents
children
line wrap: on
line source

package alice.topology.manager.keeparive;

import java.util.ArrayList;
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 ArrayList<TaskInfo> regist = new ArrayList<TaskInfo>();
	public boolean updateFlag = false;
	public long time = 0;
	public int taskNum = 0;
	public TaskInfo nowTask;
	
	public List<TaskInfo> nameList(){
		return regist;
	}
	
	public List<TaskInfo> getTaskList(){
		return list;
	}
	
	public synchronized void wake(){
		long t = System.currentTimeMillis();
		long addTime = nowTask.getTime() - (t - time);
		TaskInfo ti = list.get(0);
		ti.setTime(ti.getTime() + addTime);
		this.notify();
	}
	
	public synchronized void addTask(TaskInfo newInfo){
		boolean newTaskFlag = true;
		for (TaskInfo t : regist){
			if(newInfo.getName().equals(t.getName())){
				newInfo.setTaskNum(t.getTaskNum());
				newTaskFlag = false;
				break;
			}
		}
		if (newTaskFlag){
			taskNum +=10;
			newInfo.setTaskNum(taskNum);
		}
		boolean addFlag = true;
		for (int i = 0;i< list.size(); i++){
			TaskInfo info = list.get(i);
			Long t = info.getTime();
			if (newInfo.getTime() > t ){
				newInfo.setTime(newInfo.getTime() -t);
			} else {
				list.add(i, newInfo);
				if (i != list.size() -1 ){
					TaskInfo nextInfo = list.get(i+1);
					newInfo.setTime(nextInfo.getTime() - newInfo.getTime());
				}
				addFlag = false;
				break;
			}
		}
		if (addFlag)
			list.add(newInfo);
		
		this.updateFlag = true;
	}

	@Override
	public synchronized void run() {
		try {
			while(true){
				if(list.size()== 0)System.exit(0);
				nowTask = list.poll();
				time = System.currentTimeMillis();
				this.wait(nowTask.getTime());
			}
		} catch (InterruptedException e) {
		}
	}
}