/** * 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.runtime; import abs.backend.java.JavaBackendException; import abs.backend.java.lib.types.ABSBool; import abs.backend.java.lib.types.ABSDataType; import abs.backend.java.lib.types.ABSRational; import abs.backend.java.lib.types.ABSRef; public abstract class AbstractAsyncCallRT<T extends ABSRef> extends AbstractAsyncCall<T> implements AsyncCallRTAttributes { private long deadline; //milliseconds private long cost; //milliseconds private boolean critical; public AbstractAsyncCallRT(ABSObject source, T target, ABSDataType dl, ABSDataType co, ABSBool cr) { super(source, target); deadline = convertFromDuration(dl); cost = convertFromDuration(co); critical = cr.toBoolean(); } @Override public long getDeadline() { return deadline; } @Override public long getCost() { return cost; } @Override public boolean isCritical() { return critical; } private long convertFromDuration(ABSDataType duration) { if (duration.getConstructorName().equals("Duration")) { ABSRational rat = (ABSRational)duration.getArg(0); // convert from seconds to milliseconds return rat.multiply(ABSRational.fromInt(1000)).toInt(); } else if (duration.getConstructorName().equals("InfDuration")) { return -1; } else { // should never happen throw new JavaBackendException("Argument is not of type ABS.StdLib.Duration"); } } }