/** * Copyright (c) 2009-2011, The HATS Consortium. All rights reserved. * This file is licensed under the terms of the Modified BSD License. */ package abs.backend.java.lib.net; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import abs.backend.java.lib.net.msg.CallMsg; import abs.backend.java.lib.net.msg.Msg; import abs.backend.java.lib.net.msg.PromiseMsg; import abs.backend.java.lib.runtime.ABSFut; import abs.backend.java.lib.runtime.ABSObject; import abs.backend.java.lib.runtime.ABSRuntime; import abs.backend.java.lib.runtime.COG; import abs.backend.java.lib.runtime.Task; import abs.backend.java.lib.types.ABSValue; /** * A NET-aware COG * */ public class NetCOG extends COG { private NetNode node; private final Map<Promise, ABSValue> promises = new HashMap<Promise, ABSValue>(); private final Map<Promise, ABSFut<? super ABSValue>> futureMap = new HashMap<Promise, ABSFut<? super ABSValue>>(); public NetCOG(NetNode node, ABSNetRuntime runtime, Class<?> clazz) { super(runtime, clazz, null); this.node = node; } synchronized void processMsg(Msg msg) { if (msg instanceof CallMsg) { CallMsg cm = (CallMsg) msg; // FIXME: create task and replace promises with futures Task<?> task = new Task(cm.call); addTask(task); } else { PromiseMsg pm = (PromiseMsg) msg; promises.put(pm.promise, pm.value); ABSFut<? super ABSValue> f = futureMap.get(pm.promise); if (f != null) { f.resolve(pm.value); } } } public synchronized void setNode(NetNode node) { this.node = node; } public synchronized NetNode getNode() { return node; } public synchronized void registerFuture(NetFut<? super ABSValue> fut) { if (futureMap.containsKey(fut.getPromise())) throw new IllegalStateException("Future for promises already existed"); futureMap.put(fut.getPromise(), fut); ABSValue v = promises.get(fut.getPromise()); if (v != null) { fut.resolve(v); return; } } @Override public void register(ABSObject absObject) { getNode().registerObject(absObject); } }