package edu.uw.zookeeper.protocol.client; import static com.google.common.base.Preconditions.checkArgument; import java.util.concurrent.atomic.AtomicInteger; import com.google.common.base.MoreObjects; /** * Generates increasing xid starting with 1. * * Threadsafe */ public class XidIncrementer implements XidGenerator { public static XidIncrementer fromZero() { return of(new AtomicInteger(0)); } public static XidIncrementer of(AtomicInteger lastXid) { // some xid < 0 are reserved checkArgument(lastXid.get() >= 0); return new XidIncrementer(lastXid); } protected final AtomicInteger lastXid; protected XidIncrementer(AtomicInteger lastXid) { super(); this.lastXid = lastXid; } @Override public int get() { return lastXid.get(); } @Override public int next() { return lastXid.incrementAndGet(); } public int setIfGreater(int value) { Integer current = lastXid.get(); if (current.compareTo(value) < 0) { if (lastXid.compareAndSet(current, value)) { return value; } else { return setIfGreater(value); } } else { return current; } } @Override public String toString() { return MoreObjects.toStringHelper(this) .addValue(String.format("0x%s", Integer.toHexString(get()))) .toString(); } }