Program: 76503
Project: 76503
Buggy source:
/** 
 * Produce the output event according to whether the server is busy or not.
 * @exception IllegalActionException Not thrown in this class.
 */
public void fire() throws IllegalActionException {
  double interruptServiceTime=((DoubleToken)_interruptServiceTime.getToken()).doubleValue();
  double minimumServiceTime=((DoubleToken)_minimumServiceTime.getToken()).doubleValue();
  double currentTime=getCurrentTime();
  boolean busy=_busyUntil > currentTime;
  if (busy) {
    while (interrupt.hasToken(0)) {
      interrupt.get(0);
      _busyUntil+=interruptServiceTime;
      if (DEBUG) {
        System.out.println("String_Node_Str" + "String_Node_Str" + currentTime + "String_Node_Str"+ _busyUntil+ "String_Node_Str");
      }
    }
    fireAt(_busyUntil);
  }
 else {
    if (_tokenBeingServed != null) {
      output.broadcast(_tokenBeingServed);
      _tokenBeingServed=null;
      if (DEBUG) {
        System.out.println("String_Node_Str" + "String_Node_Str" + currentTime + "String_Node_Str");
      }
    }
    if (input.hasToken(0)) {
      _tokenBeingServed=input.get(0);
      _busyUntil=currentTime + minimumServiceTime;
      if (DEBUG) {
        System.out.println("String_Node_Str" + "String_Node_Str" + currentTime + "String_Node_Str");
      }
    }
    while (interrupt.hasToken(0)) {
      interrupt.get(0);
      _busyUntil=currentTime + interruptServiceTime;
      if (DEBUG) {
        System.out.println("String_Node_Str" + "String_Node_Str" + currentTime + "String_Node_Str"+ _busyUntil+ "String_Node_Str");
      }
    }
  }
}

Fixed version (ground truth):
/** 
 * Produce the output event according to whether the server is busy or not.
 * @exception IllegalActionException Not thrown in this class.
 */
public void fire() throws IllegalActionException {
  double interruptServiceTime=((DoubleToken)_interruptServiceTime.getToken()).doubleValue();
  double minimumServiceTime=((DoubleToken)_minimumServiceTime.getToken()).doubleValue();
  double currentTime=getCurrentTime();
  boolean busy=_busyUntil > currentTime;
  if (busy) {
    while (interrupt.hasToken(0)) {
      interrupt.get(0);
      _busyUntil+=interruptServiceTime;
      if (DEBUG) {
        System.out.println("String_Node_Str" + "String_Node_Str" + currentTime + "String_Node_Str"+ _busyUntil+ "String_Node_Str");
      }
    }
    fireAt(_busyUntil);
  }
 else {
    if (_tokenBeingServed != null) {
      output.broadcast(_tokenBeingServed);
      _tokenBeingServed=null;
      if (DEBUG) {
        System.out.println("String_Node_Str" + "String_Node_Str" + currentTime + "String_Node_Str");
      }
    }
    while (interrupt.hasToken(0)) {
      interrupt.get(0);
      if (_busyUntil > currentTime) {
        _busyUntil+=interruptServiceTime;
      }
 else {
        _busyUntil=currentTime + interruptServiceTime;
      }
      if (DEBUG) {
        System.out.println("String_Node_Str" + "String_Node_Str" + currentTime + "String_Node_Str"+ _busyUntil+ "String_Node_Str");
      }
    }
    if (input.hasToken(0)) {
      _tokenBeingServed=input.get(0);
      if (_busyUntil > currentTime) {
        _busyUntil+=minimumServiceTime;
      }
 else {
        _busyUntil=currentTime + minimumServiceTime;
      }
      if (DEBUG) {
        System.out.println("String_Node_Str" + "String_Node_Str" + currentTime + "String_Node_Str");
      }
      fireAt(_busyUntil);
    }
  }
}