public void pushUpdate(Client.Update obj) { synchronized (lock) { /* Do inside lock - prevent delay between time and actual work */ long now = System.currentTimeMillis(); doAgeOut(now); /* Consider age out */ UpdateRec r = new UpdateRec(); r.u = obj; UpdateRec oldr = updateSet.remove(r); /* Try to remove redundant event */ if (oldr != null) { /* If found, remove from ordered list too */ if (oldr.next == oldr) { /* Only one? */ orderedlist = null; } else { if (orderedlist == oldr) { /* We're oldest? */ orderedlist = oldr.next; } oldr.next.prev = oldr.prev; oldr.prev.next = oldr.next; } oldr.next = oldr.prev = null; } updateSet.put(r, r); /* Add to end of ordered list */ if (orderedlist == null) { orderedlist = r; r.next = r.prev = r; } else { r.next = orderedlist; r.prev = orderedlist.prev; r.next.prev = r.prev.next = r; } } }
private void doAgeOut(long now) { /* If we're due */ if ((now < lastageout) || (now > (lastageout + ageOutPeriod))) { lastageout = now; long deadline = now - maxUpdateAge; while ((orderedlist != null) && (orderedlist.u.timestamp < deadline)) { UpdateRec r = orderedlist; updateSet.remove(r); /* Remove record from set */ if (r.next == r) { orderedlist = null; } else { orderedlist = r.next; r.next.prev = r.prev; r.prev.next = r.next; } r.next = r.prev = null; } } }