@Override public void calcMeasurements(List<Measurement> measurements, long msNow, long secondInterval) { long currentCount = count.longValue(); long currentTotalTime = totalTime.longValue(); measurements.add(newMeasurement(idCount, msNow, (double) (currentCount - lastCount) / secondInterval)); measurements .add(newMeasurement(idTotalTime, msNow, (currentTotalTime - lastTotalTime) / secondInterval * CNV_SECONDS)); measurements.add(newMeasurement(idMax, msNow, max.get() * CNV_SECONDS)); lastCount = currentCount; lastTotalTime = currentTotalTime; // maybe lost some max value, but not so important? max.set(0); } }
@Test public void getAndAdd() { AtomicDouble v = new AtomicDouble(13.0); Assertions.assertEquals(13.0, v.getAndAdd(42.0), 1e-12); Assertions.assertEquals(55.0, v.get(), 1e-12); }
@Test public void getAndSet() { AtomicDouble v = new AtomicDouble(13.0); Assertions.assertEquals(13.0, v.getAndSet(42.0), 1e-12); Assertions.assertEquals(42.0, v.get(), 1e-12); }
@Override public Iterable<Measurement> measure() { long now = clock.wallTime(); double v = count.get(); return Collections.singleton(new Measurement(id, now, v)); }
/** Set the current value to the maximum of the current value or the provided value. */ public void max(double v) { if (Double.isFinite(v)) { double max = get(); while (isGreaterThan(v, max) && !compareAndSet(max, v)) { max = value.get(); } } }
@Test public void initWithValue() { AtomicDouble v = new AtomicDouble(42.0); Assertions.assertEquals(42.0, v.get(), 1e-12); }
@Test public void maxLt() { AtomicDouble v = new AtomicDouble(2.0); v.max(0.0); Assertions.assertEquals(2.0, v.get(), 1e-12); }
@Test public void maxNegative() { AtomicDouble v = new AtomicDouble(-42.0); v.max(-41.0); Assertions.assertEquals(-41.0, v.get(), 1e-12); }
@Test public void set() { AtomicDouble v = new AtomicDouble(13.0); v.set(42.0); Assertions.assertEquals(42.0, v.get(), 1e-12); }
@Test public void maxNaN() { AtomicDouble v = new AtomicDouble(Double.NaN); v.max(0.0); Assertions.assertEquals(0.0, v.get(), 1e-12); }
@Test public void maxGt() { AtomicDouble v = new AtomicDouble(0.0); v.max(2.0); Assertions.assertEquals(2.0, v.get(), 1e-12); }
@Test public void maxValueNaN() { AtomicDouble v = new AtomicDouble(0.0); v.max(Double.NaN); Assertions.assertEquals(0.0, v.get(), 1e-12); }
@Test public void maxValueInfinity() { AtomicDouble v = new AtomicDouble(0.0); v.max(Double.POSITIVE_INFINITY); Assertions.assertEquals(0.0, v.get(), 1e-12); } }
@Test public void compareAndSet() { AtomicDouble v = new AtomicDouble(13.0); Assertions.assertTrue(v.compareAndSet(13.0, 42.0)); Assertions.assertEquals(42.0, v.get(), 1e-12); }
@Test public void compareAndSetFail() { AtomicDouble v = new AtomicDouble(13.0); Assertions.assertFalse(v.compareAndSet(12.0, 42.0)); Assertions.assertEquals(13.0, v.get(), 1e-12); }
@Test public void addAndGet() { AtomicDouble v = new AtomicDouble(13.0); Assertions.assertEquals(55.0, v.addAndGet(42.0), 1e-12); Assertions.assertEquals(55.0, v.get(), 1e-12); }
@Test public void empty() { StepDouble v = new StepDouble(0.0, clock, 10L); Assertions.assertEquals(0.0, v.getCurrent().get(), 1e-12); Assertions.assertEquals(0.0, v.poll(), 1e-12); }
@Test public void increment() { StepDouble v = new StepDouble(0.0, clock, 10L); v.getCurrent().addAndGet(1.0); Assertions.assertEquals(1.0, v.getCurrent().get(), 1e-12); Assertions.assertEquals(0.0, v.poll(), 1e-12); }
@Test public void missedRead() { StepDouble v = new StepDouble(0.0, clock, 10L); v.getCurrent().addAndGet(1.0); clock.setWallTime(20L); Assertions.assertEquals(0.0, v.getCurrent().get(), 1e-12); Assertions.assertEquals(0.0, v.poll(), 1e-12); } }
@Test public void incrementAndCrossStepBoundary() { StepDouble v = new StepDouble(0.0, clock, 10L); v.getCurrent().addAndGet(1.0); clock.setWallTime(10L); Assertions.assertEquals(0.0, v.getCurrent().get(), 1e-12); Assertions.assertEquals(1.0, v.poll(), 1e-12); }