private void allCorrect() {
    int reg;
    for (reg = 0; reg < NUM_REGISTERS; reg++) {

      boolean allAcks = true;
      int i;
      for (i = 0; (i < correct.getSize()) && allAcks; i++) {
        SampleProcess p = correct.getProcess(i);
        if (p.isCorrect() && !writeSet.get(reg).contains(p)) allAcks = false;
      }
      if (allAcks) {
        writeSet.get(reg).clear();

        try {
          SharedWriteReturn ev = new SharedWriteReturn(mainchannel, Direction.UP, this);
          ev.reg = reg;
          ev.go();

          debug("Sent WriteReturn");
        } catch (AppiaEventException ex) {
          ex.printStackTrace();
        }
      }
    }
  }
  private void handleAckEvent(AckEvent event) {
    SampleProcess p_j = correct.getProcess((SocketAddress) event.source);
    int reg = event.getMessage().popInt();

    writeSet.get(reg).add(p_j);

    debugAll("handleAck");

    allCorrect();
  }
  private void handleCrash(Crash event) {
    correct.setCorrect(event.getCrashedProcess(), false);

    try {
      event.go();
    } catch (AppiaEventException ex) {
      ex.printStackTrace();
    }

    allCorrect();
  }
  private void debugAll(String s) {
    if ((debug == null) || !debugFull) return;
    int i;
    debug.println("DEBUG ALL - " + s);

    for (i = 0; i < NUM_REGISTERS; i++) {
      debug.println("\tvalue[" + i + "]=" + value[i]);
      debug.print("\twriteSet[" + i + "]=");

      for (SampleProcess p : writeSet.get(i)) debug.print(p.getProcessNumber() + ",");
      debug.println();
    }

    debug.print("\tcorrect=");
    for (i = 0; i < correct.getSize(); i++) {
      SampleProcess p = correct.getProcess(i);
      debug.print(
          "[" + p.getProcessNumber() + ";" + p.getSocketAddress() + ";" + p.isCorrect() + "],");
    }
    debug.println();

    debug.println();
  }