package org.openpixi.pixi.distributed.ibis; import ibis.ipl.*; import org.openpixi.pixi.distributed.util.IncomingResultHandler; import org.openpixi.pixi.physics.particles.Particle; import org.openpixi.pixi.physics.grid.Cell; import org.openpixi.pixi.physics.util.IntBox; import java.io.IOException; import java.util.List; /** * Handles the communication connected with problem distribution and results collection * on the side of the Master. */ public class MasterToWorkers { private IbisRegistry registry; private ReceivePort recvResultsPort; private IncomingResultHandler resultHandler; public MasterToWorkers(IbisRegistry registry, IncomingResultHandler resultHandler) throws Exception { this.registry = registry; this.resultHandler = resultHandler; // Initialize ports recvResultsPort = registry.getIbis().createReceivePort( PixiPorts.GATHER_PORT, PixiPorts.GATHER_PORT_ID, new IncomingResults()); recvResultsPort.enableConnections(); recvResultsPort.enableMessageUpcalls(); } /** * The ports for problem distribution are closed right after they are used to minimize * number of open connections. */ public void sendProblem(int workerID, IntBox[] partitions, List<Particle> particles, Cell[][] cells) throws IOException { SendPort sendPort = registry.getIbis().createSendPort(PixiPorts.ONE_TO_ONE_PORT); sendPort.connect( registry.convertWorkerIDToIbisID(workerID), PixiPorts.DISTRIBUTE_PORT_ID); WriteMessage wm = sendPort.newMessage(); wm.writeObject(partitions); wm.writeObject(particles); wm.writeObject(cells); wm.finish(); sendPort.close(); } public void close() { try { recvResultsPort.close(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } } private class IncomingResults implements MessageUpcall { public void upcall(ReadMessage readMessage) throws IOException, ClassNotFoundException { int workerID = readMessage.readInt(); List<Particle> particles = (List<Particle>)readMessage.readObject(); Cell[][] cells = (Cell[][])readMessage.readObject(); resultHandler.handle(workerID, particles, cells); } } }