private long ticklessTimer() { // Calculate tickless timer, up to 1 hour long tickless = System.currentTimeMillis() + 1000 * 3600; for (STimer timer : timers) { if (timer.when == -1) { timer.when = timer.delay + System.currentTimeMillis(); } if (tickless > timer.when) { tickless = timer.when; } } long timeout = tickless - System.currentTimeMillis(); if (timeout < 0) { timeout = 0; } if (verbose) { System.out.printf("I: zloop: polling for %d msec\n", timeout); } return timeout; }
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 signalled 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 signalled 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(); } } } zombies.clear(); // Now handle any new timers added inside the loop timers.addAll(newTimers); newTimers.clear(); if (rc == -1) { break; } } return rc; }