Program: 76365
Project: 76365
Buggy source:
/** 
 * Do a blocking write on the queue. If at any point during this method this receiver is scheduled for termination, then throw a TerminateProcessException which will cease activity for the actor that contains this receiver. If the specified time stamp of the token is greater than the completionTime of this receiver, then set the time stamp to INACTIVE. If the queue is full, then inform the director that this receiver is blocking on a write and wait until room becomes available. When room becomes available, put the token and time stamp in the queue and inform the director that the block no longer exists.
 * @param token The token to put on the queue.
 * @param time The time stamp associated with the token.
 */
public void put(Token token,double time){
  IOPort port=(IOPort)getContainer();
  String portName=((Nameable)port).getName();
  if (portName.equals("String_Node_Str")) {
    System.out.println(portName + "String_Node_Str" + time);
  }
  Workspace workspace=getContainer().workspace();
  DDEDirector director=null;
  if (isOutsideBoundary()) {
    director=(DDEDirector)((Actor)getContainer().getContainer()).getExecutiveDirector();
  }
 else {
    director=(DDEDirector)((Actor)getContainer().getContainer()).getDirector();
  }
  _put(token,time,workspace,director);
}

Fixed version (ground truth):
/** 
 * Do a blocking write on the queue. If at any point during this method this receiver is scheduled for termination, then throw a TerminateProcessException which will cease activity for the actor that contains this receiver. If the specified time stamp of the token is greater than the completionTime of this receiver, then set the time stamp to INACTIVE. If the queue is full, then inform the director that this receiver is blocking on a write and wait until room becomes available. When room becomes available, put the token and time stamp in the queue and inform the director that the block no longer exists.
 * @param token The token to put on the queue.
 * @param time The time stamp associated with the token.
 */
public void put(Token token,double time){
  IOPort port=(IOPort)getContainer();
  String portName=((Nameable)port).getName();
  String actorName=((Nameable)port.getContainer()).getName();
  boolean realToken=false;
  boolean nullToken=false;
  if (token instanceof NullToken) {
    nullToken=true;
  }
 else {
    realToken=true;
  }
  Thread thread=Thread.currentThread();
  if (thread instanceof DDEThread) {
    String callingActor=((Nameable)((DDEThread)thread).getActor()).getName();
    if (realToken) {
      System.out.println("String_Node_Str" + portName + "String_Node_Str"+ actorName+ "String_Node_Str"+ time+ "String_Node_Str"+ callingActor+ "String_Node_Str");
    }
 else {
      System.out.println("String_Node_Str" + portName + "String_Node_Str"+ actorName+ "String_Node_Str"+ time+ "String_Node_Str"+ callingActor+ "String_Node_Str");
    }
  }
  Workspace workspace=getContainer().workspace();
  DDEDirector director=null;
  if (isOutsideBoundary()) {
    director=(DDEDirector)((Actor)getContainer().getContainer()).getExecutiveDirector();
  }
 else {
    director=(DDEDirector)((Actor)getContainer().getContainer()).getDirector();
  }
  _put(token,time,workspace,director);
}