Example #1
0
 /** Removes the SimpleTimer. */
 public void removeSimpleTimer() {
   synchronized (_events) {
     runn.setAnswer(false);
     _events.clear();
     _eventTimes.clear();
     _events.notifyAll();
   }
   synchronized (_readyEvents) {
     _readyEvents.clear();
     _readyEvents.notifyAll();
   }
 }
Example #2
0
  /**
   * @param event
   * @param timeoutMs
   * @param useEarliestTime if its already scheduled, use the earlier of the two timeouts, else use
   *     the later
   */
  public void addEvent(TimedEvent event, long timeoutMs, boolean useEarliestTime) {
    int totalEvents = 0;
    long now = System.currentTimeMillis();
    long eventTime = now + timeoutMs;
    Long time = Long.valueOf(eventTime);
    synchronized (_events) {
      // remove the old scheduled position, then reinsert it
      Long oldTime = _eventTimes.get(event);
      if (oldTime != null) {
        if (useEarliestTime) {
          if (oldTime.longValue() < eventTime) {
            _events.notifyAll();
            return; // already scheduled for sooner than requested
          } else {
            _events.remove(oldTime);
          }
        } else {
          if (oldTime.longValue() > eventTime) {
            _events.notifyAll();
            return; // already scheduled for later than the given period
          } else {
            _events.remove(oldTime);
          }
        }
      }
      // FIXME if you plan to use this class again
      while (_events.containsKey(time)) time = Long.valueOf(time.longValue() + 1);
      _events.put(time, event);
      _eventTimes.put(event, time);

      if ((_events.size() != _eventTimes.size())) {
        _log.error("Skewed events: " + _events.size() + " for " + _eventTimes.size());
        for (TimedEvent evt : _eventTimes.keySet()) {
          Long when = _eventTimes.get(evt);
          TimedEvent cur = _events.get(when);
          if (cur != evt) {
            _log.error("event " + evt + " @ " + when + ": " + cur);
          }
        }
      }

      totalEvents = _events.size();
      _events.notifyAll();
    }
    if (time.longValue() > eventTime + 100) {
      if (_log.shouldLog(Log.WARN))
        _log.warn(
            "Lots of timer congestion, had to push "
                + event
                + " back "
                + (time.longValue() - eventTime)
                + "ms (# events: "
                + totalEvents
                + ")");
    }
    long timeToAdd = System.currentTimeMillis() - now;
    if (timeToAdd > 50) {
      if (_log.shouldLog(Log.WARN))
        _log.warn(
            "timer contention: took "
                + timeToAdd
                + "ms to add a job with "
                + totalEvents
                + " queued");
    }
  }