view src/main/java/suikwasha/distributedalgorithm/algorithms/cr/ChangRobertsAlgorithm.java @ 1:d24bcb819032

trying to add Selector
author suikwasha
date Fri, 19 Oct 2012 23:48:11 +0900
parents 38a110b13db1
children
line wrap: on
line source

package suikwasha.distributedalgorithm.algorithms.cr;

import java.nio.ByteBuffer;
import java.util.Iterator;

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

public class ChangRobertsAlgorithm implements Algorithm
{
	private final long num;
	private long max;
	
	public ChangRobertsAlgorithm(long _num)
	{
		max = -1;
		num = _num;
	}
	
	public static ByteBuffer toByteBuffer(boolean _max,long _value)
	{
		ByteBuffer b = ByteBuffer.allocate(9); // size of (flagbit + long)
		if(_max){
			b.put((byte)1);
		}else{
			b.put((byte)0);
		}
		
		b.putLong(_value);
		b.rewind(); // do not forget rewind() after reading/writing
		return b.asReadOnlyBuffer(); // message is read-only
	}

	public void execute(Context _c)
	{
		Iterator<Port> ports = _c.getPorts().iterator();
		Port in = ports.next();
		Port out = ports.next();
		
		max = num;
		Message newMessage = new Message(toByteBuffer(false,max));
		out.send(newMessage);
		
		while(true){
			Message receivedMessage = null;
			try{
				receivedMessage = in.blockingReceive();
			}catch(InterruptedException _e){
				_e.printStackTrace();
			}
			
			ByteBuffer b = receivedMessage.getMessage();
			byte flagMax = b.get();
			long value = b.getLong();
			if(flagMax == (byte)1){
				// maximum value detected.
				newMessage = receivedMessage.newMessage(toByteBuffer(true,value));
				out.send(newMessage);
				//stop
				return;
			}else{
				if(value == max){
					newMessage = receivedMessage.newMessage(toByteBuffer(true,max));
					out.send(newMessage);
					//stop
					return;
				}
				if(value > max){
					max = value;
					newMessage = receivedMessage.newMessage(toByteBuffer(false,max));
					out.send(newMessage);
				}
			}
		}
	}

}