view src/main/java/suikwasha/distributedalgorithm/algorithms/naive/NaiveStandbyAlgorithm.java @ 0:38a110b13db1

added SimpleDistributedAlgorithmFramework. added NaiveAlgorithm added ChangRobertsAlgorithm added PertersonAlgorithm
author suikwasha
date Fri, 19 Oct 2012 00:05:41 +0900
parents
children
line wrap: on
line source

package suikwasha.distributedalgorithm.algorithms.naive;

import java.util.Iterator;

import suikwasha.distributedalgorithm.framework.Algorithm;
import suikwasha.distributedalgorithm.framework.Context;
import suikwasha.distributedalgorithm.framework.Message;
import suikwasha.distributedalgorithm.framework.Port;

import static suikwasha.distributedalgorithm.algorithms.naive.NaiveStartAlgorithm.toByteBuffer;

/*
 * this standby algorithm for NAIVE using UnidirectedRing
 * Port1 : receiving only
 * Port2 : sending only
 */
public class NaiveStandbyAlgorithm implements Algorithm
{
	private long max;
	private final long num;
	
	public NaiveStandbyAlgorithm(long _num)
	{
		max = -1;
		num = _num;
	}
	
	public long getValue()
	{
		return max;
	}

	public void execute(Context _c)
	{
		Iterator<Port> ports = _c.getPorts().iterator();
		Port receiving = ports.next();
		Port sending = ports.next();
		
		Message receivedMessage = null;
		try{
			receivedMessage = receiving.blockingReceive();
		}catch(InterruptedException _e){
			Thread.currentThread().interrupt();
			_e.printStackTrace();
		}
		
		long value = receivedMessage.getMessage().getLong();
		max = Math.max(num,max);
		
		Message m1 = receivedMessage.newMessage(toByteBuffer(num));
		Message m2 = receivedMessage.newMessage(toByteBuffer(value));
		
		sending.send(m1);
		sending.send(m2);
		
		while(true){
			try{
				receivedMessage = receiving.blockingReceive();
			}catch(InterruptedException _e){
				_e.printStackTrace();
				Thread.currentThread().interrupt();
				return;
			}
			
			value = receivedMessage.getMessage().getLong();
			if(max == value){
				Message newMessage = receivedMessage.newMessage(toByteBuffer(max));
				sending.send(newMessage);
				return;
			}
			
			max = Math.max(max,value);
			Message newMessage = receivedMessage.newMessage(toByteBuffer(value));
			sending.send(newMessage);
		}
	}

}