void trimFinal() { long limit = scheduler.now(unit) - maxAge; TimedNode<Object> h = head; for (;;) { TimedNode<Object> next = h.get(); if (next.get() == null) { if (h.value != null) { TimedNode<Object> lasth = new TimedNode<Object>(null, 0L); lasth.lazySet(h.get()); head = lasth; } else { head = h; } break; } if (next.time > limit) { if (h.value != null) { TimedNode<Object> lasth = new TimedNode<Object>(null, 0L); lasth.lazySet(h.get()); head = lasth; } else { head = h; } break; } h = next; } }
/** * Replace a non-empty head node with an empty one to * allow the GC of the inaccessible old value. */ @Override public void trimHead() { TimedNode<Object> h = head; if (h.value != null) { TimedNode<Object> n = new TimedNode<Object>(null, 0); n.lazySet(h.get()); head = n; } }
void trimFinal() { long limit = scheduler.now(unit) - maxAge; TimedNode<Object> h = head; for (;;) { TimedNode<Object> next = h.get(); if (next.get() == null) { if (h.value != null) { TimedNode<Object> lasth = new TimedNode<Object>(null, 0L); lasth.lazySet(h.get()); head = lasth; } else { head = h; } break; } if (next.time > limit) { if (h.value != null) { TimedNode<Object> lasth = new TimedNode<Object>(null, 0L); lasth.lazySet(h.get()); head = lasth; } else { head = h; } break; } h = next; } }
@Override public void addFinal(Object notificationLite) { TimedNode<Object> n = new TimedNode<Object>(notificationLite, Long.MAX_VALUE); TimedNode<Object> t = tail; tail = n; size++; t.lazySet(n); // releases both the tail and size trimFinal(); done = true; }
@Override public void add(T value) { TimedNode<Object> n = new TimedNode<Object>(value, scheduler.now(unit)); TimedNode<Object> t = tail; tail = n; size++; t.set(n); // releases both the tail and size trim(); }
SizeAndTimeBoundReplayBuffer(int maxSize, long maxAge, TimeUnit unit, Scheduler scheduler) { this.maxSize = ObjectHelper.verifyPositive(maxSize, "maxSize"); this.maxAge = ObjectHelper.verifyPositive(maxAge, "maxAge"); this.unit = ObjectHelper.requireNonNull(unit, "unit is null"); this.scheduler = ObjectHelper.requireNonNull(scheduler, "scheduler is null"); TimedNode<Object> h = new TimedNode<Object>(null, 0L); this.tail = h; this.head = h; }
SizeAndTimeBoundReplayBuffer(int maxSize, long maxAge, TimeUnit unit, Scheduler scheduler) { this.maxSize = ObjectHelper.verifyPositive(maxSize, "maxSize"); this.maxAge = ObjectHelper.verifyPositive(maxAge, "maxAge"); this.unit = ObjectHelper.requireNonNull(unit, "unit is null"); this.scheduler = ObjectHelper.requireNonNull(scheduler, "scheduler is null"); TimedNode<Object> h = new TimedNode<Object>(null, 0L); this.tail = h; this.head = h; }
@Override public void add(T value) { TimedNode<Object> n = new TimedNode<Object>(value, scheduler.now(unit)); TimedNode<Object> t = tail; tail = n; size++; t.set(n); // releases both the tail and size trim(); }
/** * Replace a non-empty head node with an empty one to * allow the GC of the inaccessible old value. */ @Override public void trimHead() { TimedNode<Object> h = head; if (h.value != null) { TimedNode<Object> n = new TimedNode<Object>(null, 0); n.lazySet(h.get()); head = n; } }
@Override public void addFinal(Object notificationLite) { TimedNode<Object> n = new TimedNode<Object>(notificationLite, Long.MAX_VALUE); TimedNode<Object> t = tail; tail = n; size++; t.lazySet(n); // releases both the tail and size trimFinal(); done = true; }