Program: 73051
Project: 73051
Buggy source:
/** 
 * Start a new iteration (at a new time, presumably) and either run the actors to completion in order of creation or wait until a deadlock is detected, depending on activeObjects. Then deal with the deadlock by calling the protected method _resolveDeadlock() and return. This method is synchronized on the director.
 * @exception IllegalActionException If a derived class throws it.
 */
public synchronized void fire() throws IllegalActionException {
  Time currentTime=getModelTime();
  if (_debugging) {
    _debug("String_Node_Str" + currentTime + "String_Node_Str"+ _microstep);
  }
  if (_stopRequested) {
    _debug("String_Node_Str" + currentTime);
    return;
  }
  for (  Advanceable advanceable : _getAdvanceables()) {
    _iterateActorOnce((Actor)advanceable);
  }
  if (_fireAtRequests.size() > 0) {
    RefireRequest request=_fireAtRequests.peek();
    if (currentTime.equals(request.time) && _microstep == request.microstep) {
      while (true) {
        if (_stopRequested) {
          return;
        }
        request=_fireAtRequests.poll();
        if (_debugging) {
          _debug(request.actor.getFullName() + "String_Node_Str");
        }
        _iterateActorOnce(request.actor);
        if (_fireAtRequests.size() > 0) {
          request=_fireAtRequests.peek();
          if (!_schedule(request.actor,getModelTime())) {
            break;
          }
          if (!currentTime.equals(request.time) || _microstep != request.microstep) {
            break;
          }
        }
 else {
          break;
        }
      }
    }
  }
  while (_inputQueue.size() > 0 && !_stopRequested) {
    Input input=_inputQueue.get(0);
    IOPort port=input.receiver.getContainer();
    int channel=port.getChannelForReceiver(input.receiver);
    Actor actor=(Actor)port.getContainer();
    if (!_schedule(actor,getModelTime())) {
      break;
    }
    input=_inputQueue.remove(0);
    _clearReceivers(actor);
    if (!input.isChangeEvent) {
      input.receiver.reallyPut(input.token);
      if (_debugging) {
        _debug(actor.getFullName() + "String_Node_Str" + port.getName()+ "String_Node_Str"+ channel+ "String_Node_Str"+ input.token);
      }
    }
 else     if (_debugging) {
      _debug(actor.getFullName() + "String_Node_Str" + port.getName()+ "String_Node_Str"+ channel);
    }
    if (actor != getContainer()) {
      _iterateActorOnce(actor);
    }
 else {
      _transferOutputs(port);
    }
  }
}

Fixed version (ground truth):
/** 
 * Start a new iteration (at a new time, presumably) and either run the actors to completion in order of creation or wait until a deadlock is detected, depending on activeObjects. Then deal with the deadlock by calling the protected method _resolveDeadlock() and return. This method is synchronized on the director.
 * @exception IllegalActionException If a derived class throws it.
 */
public synchronized void fire() throws IllegalActionException {
  Time currentTime=getModelTime();
  if (_debugging) {
    _debug("String_Node_Str" + currentTime + "String_Node_Str"+ _microstep);
  }
  if (_stopRequested) {
    _debug("String_Node_Str" + currentTime);
    return;
  }
  for (  Advanceable advanceable : _getAdvanceables()) {
    _iterateActorOnce((Actor)advanceable);
  }
  if (_fireAtRequests.size() > 0) {
    RefireRequest request=_fireAtRequests.peek();
    if (currentTime.equals(request.time) && _microstep == request.microstep) {
      while (true) {
        if (_stopRequested) {
          return;
        }
        request=_fireAtRequests.poll();
        if (_debugging) {
          _debug(request.actor.getFullName() + "String_Node_Str");
        }
        _iterateActorOnce(request.actor);
        if (_fireAtRequests.size() > 0) {
          request=_fireAtRequests.peek();
          if (!_schedule(request.actor,getModelTime())) {
            break;
          }
          if (!currentTime.equals(request.time) || _microstep != request.microstep) {
            break;
          }
        }
 else {
          break;
        }
      }
    }
  }
  while (_inputQueue.size() > 0 && !_stopRequested) {
    Input input=_inputQueue.get(0);
    IOPort port=input.receiver.getContainer();
    int channel=port.getChannelForReceiver(input.receiver);
    Actor actor=(Actor)port.getContainer();
    input=_inputQueue.remove(0);
    _clearReceivers(actor);
    if (!input.isChangeEvent) {
      input.receiver.reallyPut(input.token);
      if (_debugging) {
        _debug(actor.getFullName() + "String_Node_Str" + port.getName()+ "String_Node_Str"+ channel+ "String_Node_Str"+ input.token);
      }
    }
 else     if (_debugging) {
      _debug(actor.getFullName() + "String_Node_Str" + port.getName()+ "String_Node_Str"+ channel);
    }
    if (actor != getContainer()) {
      if (!_schedule(actor,getModelTime())) {
        break;
      }
      _iterateActorOnce(actor);
    }
 else {
      _transferOutputs(port);
    }
  }
}