docs: public int start()
      {
          int rc = 0;
  
          timers.addAll(newTimers);
          newTimers.clear();
  
          //  Recalculate all timers now
          for (STimer timer : timers) {
              timer.when = timer.delay + System.currentTimeMillis();
          }
  
          //  Main reactor loop
          while (!Thread.currentThread().isInterrupted()) {
              if (dirty) {
                  // If s_rebuild_pollset() fails, break out of the loop and
                  // return its error
                  rebuild();
              }
              long wait = ticklessTimer();
  
              rc = pollset.poll(wait);
  
              if (rc == -1) {
                  if (verbose) {
                      System.out.printf("I: zloop: interrupted (%d)\n", rc);
                  }
                  rc = 0;
                  break; //  Context has been shut down
              }
              //  Handle any timers that have now expired
              Iterator<STimer> it = timers.iterator();
              while (it.hasNext()) {
                  STimer timer = it.next();
                  if (System.currentTimeMillis() >= timer.when && timer.when != -1) {
                      if (verbose) {
                          System.out.println("I: zloop: call timer handler");
                      }
                      rc = timer.handler.handle(this, null, timer.arg);
                      if (rc == -1) {
                          break; //  Timer handler signaled break
                      }
                      if (timer.times != 0 && --timer.times == 0) {
                          it.remove();
                      }
                      else {
                          timer.when = timer.delay + System.currentTimeMillis();
                      }
                  }
              }
              if (rc == -1) {
                  break; // Some timer signalled break from the reactor loop
              }
  
              //  Handle any pollers that are ready
              for (int itemNbr = 0; itemNbr < pollSize; itemNbr++) {
                  SPoller poller = pollact[itemNbr];
                  if (pollset.getItem(itemNbr).isError()) {
                      if (verbose) {
                          System.out.printf(
                                            "I: zloop: can't poll %s socket (%s, %s)\n",
                                            poller.item.getSocket() != null ? poller.item.getSocket().getType() : "RAW",
                                                    poller.item.getSocket(),
                                                    poller.item.getRawSocket());
                      }
                      //  Give handler one chance to handle error, then kill
                      //  poller because it'll disrupt the reactor otherwise.
                      if (poller.errors++ > 0) {
                          removePoller(poller.item);
                      }
                  }
                  else {
                      poller.errors = 0; //  A non-error happened
                  }
  
                  if (pollset.getItem(itemNbr).readyOps() > 0) {
                      if (verbose) {
                          System.out.printf(
                                            "I: zloop: call %s socket handler (%s, %s)\n",
                                            poller.item.getSocket() != null ? poller.item.getSocket().getType() : "RAW",
                                                    poller.item.getSocket(),
                                                    poller.item.getRawSocket());
                      }
                      rc = poller.handler.handle(this, poller.item, poller.arg);
                      if (rc == -1) {
                          break; //  Poller handler signaled break
                      }
                  }
              }
  
              //  Now handle any timer zombies
              //  This is going to be slow if we have many zombies
              for (Object arg : zombies) {
                  it = timers.iterator();
                  while (it.hasNext()) {
                      STimer timer = it.next();
                      if (timer.arg == arg) {
                          it.remove();
                      }
                  }
              }
              //  Now handle any new timers added inside the loop
              timers.addAll(newTimers);
              newTimers.clear();
  
              if (rc == -1) {
                  break;
              }
          }
  
          return rc;
      }