All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.opentelemetry.contrib.metrics.micrometer.internal.instruments.AtomicDoubleCounter Maven / Gradle / Ivy

/*
 * Copyright The OpenTelemetry Authors
 * SPDX-License-Identifier: Apache-2.0
 */

package io.opentelemetry.contrib.metrics.micrometer.internal.instruments;

import java.util.concurrent.atomic.AtomicLongFieldUpdater;

final class AtomicDoubleCounter {
  private static final AtomicLongFieldUpdater BITS_UPDATER =
      AtomicLongFieldUpdater.newUpdater(AtomicDoubleCounter.class, "doubleBits");

  @SuppressWarnings("UnusedVariable")
  private volatile long doubleBits;

  double current() {
    return Double.longBitsToDouble(doubleBits);
  }

  boolean increment(double increment) {
    while (true) {
      double current = current();
      double update = current + increment;
      if (compareAndSet(current, update)) {
        return true;
      }
    }
  }

  boolean set(double value) {
    BITS_UPDATER.set(this, Double.doubleToRawLongBits(value));
    return true;
  }

  boolean setMonotonically(double value) {
    while (true) {
      double current = current();
      if (current > value) {
        return false;
      }
      if (compareAndSet(current, value)) {
        return true;
      }
    }
  }

  boolean compareAndSet(double expected, double update) {
    long expectedBits = Double.doubleToRawLongBits(expected);
    long updateBits = Double.doubleToRawLongBits(update);
    return BITS_UPDATER.compareAndSet(this, expectedBits, updateBits);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy