/*
* Copyright (c) 2011-2015 The original author or authors
* ------------------------------------------------------
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* The Apache License v2.0 is available at
* http://www.opensource.org/licenses/apache2.0.php
*
* You may elect to redistribute this code under either of these licenses.
*/
package io.vertx.test.fakemetrics;
import io.vertx.core.spi.metrics.PoolMetrics;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
/**
* A fake implementation of the {@link PoolMetrics} SPI.
*
* @author <a href="http://escoffier.me">Clement Escoffier</a>
*/
public class FakePoolMetrics implements PoolMetrics<Void> {
private final static Map<String, PoolMetrics> METRICS = new ConcurrentHashMap<>();
private final int poolSize;
private final AtomicInteger submitted = new AtomicInteger();
private final AtomicInteger completed = new AtomicInteger();
private final AtomicInteger idle = new AtomicInteger();
private final AtomicInteger waiting = new AtomicInteger();
private final AtomicInteger running = new AtomicInteger();
private final String name;
private final AtomicBoolean closed = new AtomicBoolean();
public FakePoolMetrics(String name, int poolSize) {
this.poolSize = poolSize;
this.name = name;
this.idle.set(this.poolSize);
METRICS.put(name, this);
}
public int getPoolSize() {
return poolSize;
}
public String getName() {
return name;
}
public synchronized Void submitted() {
submitted.incrementAndGet();
waiting.incrementAndGet();
return null;
}
@Override
public void rejected(Void t) {
waiting.decrementAndGet();
}
@Override
public Void begin(Void t) {
waiting.decrementAndGet();
idle.decrementAndGet();
running.incrementAndGet();
return null;
}
public void end(Void t, boolean succeeded) {
running.decrementAndGet();
idle.incrementAndGet();
completed.incrementAndGet();
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public void close() {
closed.set(true);
METRICS.remove(name);
}
public boolean isClosed() {
return closed.get();
}
public int numberOfSubmittedTask() {
return submitted.get();
}
public int numberOfCompletedTasks() {
return completed.get();
}
public int numberOfWaitingTasks() {
return waiting.get();
}
public int numberOfIdleThreads() {
return idle.get();
}
public int numberOfRunningTasks() {
return running.get();
}
public static Map<String, PoolMetrics> getPoolMetrics() {
return METRICS;
}
}