Ejemplo n.º 1
0
  /**
   * <b>Callback</b> (called by RequestCorrelator or Transport). Adds a response to the response
   * table. When all responses have been received, <code>execute()</code> returns.
   */
  public void receiveResponse(Object response_value, Address sender) {
    if (done) return;
    Rsp rsp = requests.get(sender);
    if (rsp == null) return;

    RspFilter rsp_filter = options.getRspFilter();
    boolean responseReceived = false;
    if (!rsp.wasReceived()) {
      if ((responseReceived =
          (rsp_filter == null) || rsp_filter.isAcceptable(response_value, sender)))
        rsp.setValue(response_value);
      rsp.setReceived(responseReceived);
    }

    lock.lock();
    try {
      if (responseReceived) num_received++;
      done = rsp_filter == null ? responsesComplete() : !rsp_filter.needMoreResponses();
      if (responseReceived || done) completed.signalAll(); // wakes up execute()
      if (done && corr != null) corr.done(req_id);
    } finally {
      lock.unlock();
    }
    if (responseReceived || done) checkCompletion(this);
  }