Пример #1
0
  /**
   * propogate the next signal from self to all instances. Callers must be synchronized on 'this'
   * object.
   */
  public synchronized boolean propogateNextSignalSelf(Debug debugObject)
      throws LemRuntimeException {
    /*
     * First propogate any elapsed delayed signals to self
     * into the signalSelfQueue.
     */
    while (delayedSignalSelfQueue.size() > 0) {
      DelayedSignal s;
      s = (DelayedSignal) delayedSignalSelfQueue.get(0);
      if (s.getDeliveryTime() <= context.getTimeObject().getTimeMs()) {
        delayedSignalSelfQueue.remove(s);
        addSignalSelf(s);
      } else break;
    }

    if (signalSelfQueue.size() > 0) {
      Signal s = (Signal) signalSelfQueue.remove(0);
      for (Iterator i = instances.iterator(); i.hasNext(); ) {
        Instance in = (Instance) i.next();
        if (in.isActive) {
          in.addSignalSelf(s);
          debugObject.addEntity();
        }
      }
      debugObject.delEntity();
      return true;
    }

    return false;
  }
Пример #2
0
  public DelayedSignal getNextDelayedSignal() {
    synchronized (delayedSignalQueue) {
      while (true) {
        try {
          if (delayedSignalQueue.size() > 0) {
            DelayedSignal sig;
            long delay;
            sig = (DelayedSignal) delayedSignalQueue.get(0);
            delay = sig.getDeliveryTime() - context.getTimeObject().getTimeMs();
            if (delay <= 0) {
              delayedSignalQueue.remove(sig);
              return sig;
            }

            System.out.println("Next delayed signal in " + delay);

            context.getTimeObject().wait(delayedSignalQueue, delay);
          } else {
            if (!isActive()) return null;
            delayedSignalQueue.wait();
          }
        } catch (InterruptedException e) {
          /*
           * InterruptedException is OK.
           */
        }
      }
    }
  }
Пример #3
0
  public synchronized long getNextDelayedSignalSelfDelay() {
    if (delayedSignalSelfQueue.size() > 0) {
      DelayedSignal sig;
      long delay;
      sig = (DelayedSignal) delayedSignalSelfQueue.get(0);
      delay = sig.getDeliveryTime() - context.getTimeObject().getTimeMs();

      if (delay > 0) return delay;
      return 0;
    } else return -1;
  }
Пример #4
0
  public synchronized void drainSignals(Debug debug) {
    while (signalQueue.size() > 0) {
      signalQueue.remove(0);
      debug.delEntity();
    }

    while (signalSelfQueue.size() > 0) {
      signalSelfQueue.remove(0);
      debug.delEntity();
    }

    while (delayedSignalSelfQueue.size() > 0) {
      delayedSignalSelfQueue.remove(0);
      debug.delEntity();
    }

    synchronized (delayedSignalQueue) {
      while (delayedSignalQueue.size() > 0) {
        delayedSignalQueue.remove(0);
        debug.delEntity();
      }
    }
  }