package org.openpixi.pixi.distributed.ibis; import ibis.ipl.*; import org.openpixi.pixi.distributed.util.IncomingProblemHandler; 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 worker. */ public class WorkerToMaster { private IbisRegistry registry; private ReceivePort recvProblemPort; private SendPort sendResultPort; private IncomingProblemHandler problemHandler; public IbisRegistry getRegistry() { return registry; } public WorkerToMaster(IbisRegistry registry, IncomingProblemHandler problemHandler) throws Exception { this.registry = registry; this.problemHandler = problemHandler; recvProblemPort = registry.getIbis().createReceivePort( PixiPorts.ONE_TO_ONE_PORT, PixiPorts.DISTRIBUTE_PORT_ID, new IncomingProblem()); recvProblemPort.enableConnections(); recvProblemPort.enableMessageUpcalls(); sendResultPort = registry.getIbis().createSendPort(PixiPorts.GATHER_PORT); } public void sendResults(int workerID, List<Particle> particles, Cell[][] cells) throws IOException { if (sendResultPort.connectedTo().length == 0) { sendResultPort.connect(registry.getMaster(), PixiPorts.GATHER_PORT_ID); } WriteMessage wm = sendResultPort.newMessage(); wm.writeInt(workerID); wm.writeObject(particles); wm.writeObject(cells); wm.finish(); } public void close() { try { sendResultPort.close(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } } private class IncomingProblem implements MessageUpcall { public void upcall(ReadMessage readMessage) throws IOException, ClassNotFoundException { IntBox[] partitions = (IntBox[])readMessage.readObject(); List<Particle> particles = (List<Particle>)readMessage.readObject(); Cell[][] cells = (Cell[][])readMessage.readObject(); problemHandler.handle(partitions, particles, cells); readMessage.finish(); recvProblemPort.close(); } } }