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

com.bazaarvoice.ostrich.metrics.InstanceGauge Maven / Gradle / Ivy

package com.bazaarvoice.ostrich.metrics;

import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.yammer.metrics.core.Gauge;

import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.Set;

class InstanceGauge extends Gauge {
    private final Set> _instances = Sets.newSetFromMap(Maps., Boolean>newConcurrentMap());
    private final ReferenceQueue _referenceQueue = new ReferenceQueue();

    @Override
    public Integer value() {
        cleanup();
        return _instances.size();
    }

    Reference add(Object object) {
        Reference reference = new WeakReference(object, _referenceQueue);
        _instances.add(reference);
        return reference;
    }

    void remove(Reference reference) {
        _instances.remove(reference);
    }

    private void cleanup() {
        Reference reference = _referenceQueue.poll();
        while (reference != null) {
            _instances.remove(reference);
            reference = _referenceQueue.poll();
        }
    }
}