Mercurial > hg > Members > shoshi > distributedalgorithm
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); } } } } }