/*
 * ThreadID.java
 *
 * Created on November 7, 2006, 5:27 PM
 *
 * From "The Art of Multiprocessor Programming",
 * by Maurice Herlihy and Nir Shavit.
 * Copyright 2006 Elsevier Inc. All rights reserved.
 */

package monitor;
/**
 * Returns current thread ID
 * @author Maurice Herlihy
 */
public class ThreadID {
  /**
   * The next thread ID to be assigned
   **/
  private static volatile int nextID = 0;
  /**
   * My thread-local ID.
   **/
  private static ThreadLocalID threadID = new ThreadLocalID();
  public static int get() {
    return threadID.get();
  }
  /**
   * When running multiple tests, reset thread id state
   **/
  public static void reset() {
    nextID = 0;
  }
  public static void set(int value) {
    threadID.set(value);
  }

  public static int getCluster() {
    return threadID.get() / 2;
  }
  private static class ThreadLocalID extends ThreadLocal<Integer> {
    protected synchronized Integer initialValue() {
      return nextID++;
    }
  }
}