package com.sleepycat.je.latch;
import com.sleepycat.je.dbi.EnvironmentImpl;
import de.ovgu.cide.jakutil.*;
/**
* Various constructs to support Latches. Switch hitting for 1.4 vs Java 5
* JVM latch implementation (i.e. our's vs the JVM's), and assert-based
* latch counting code.
*/
public class LatchSupport {
private static String DISABLE_JAVA5_LATCHES="je.disable.java5.latches";
private static Class JAVA5_LATCH_CLASS=null;
private static Class JAVA5_SHARED_LATCH_CLASS=null;
static {
try {
if (System.getProperty(DISABLE_JAVA5_LATCHES) == null) {
Class.forName("java.util.concurrent.locks.ReentrantLock");
JAVA5_LATCH_CLASS=Class.forName("com.sleepycat.je.latch.Java5LatchImpl");
}
}
catch ( ClassNotFoundException CNFE) {
}
}
static {
try {
if (System.getProperty(DISABLE_JAVA5_LATCHES) == null) {
Class.forName("java.util.concurrent.locks.ReentrantReadWriteLock");
JAVA5_SHARED_LATCH_CLASS=Class.forName("com.sleepycat.je.latch.Java5SharedLatchImpl");
}
}
catch ( ClassNotFoundException CNFE) {
}
}
public static Class getJava5LatchClass(){
return JAVA5_LATCH_CLASS;
}
public static Latch makeLatch( String name, EnvironmentImpl env){
if (JAVA5_LATCH_CLASS == null) {
return new LatchImpl(name,env);
}
else {
try {
Latch ret=(Latch)JAVA5_LATCH_CLASS.newInstance();
ret.setName(name);
return ret;
}
catch ( InstantiationException IE) {
}
catch ( IllegalAccessException IAE) {
}
JAVA5_LATCH_CLASS=null;
return new LatchImpl(name,env);
}
}
public static Latch makeLatch( EnvironmentImpl env){
if (JAVA5_LATCH_CLASS == null) {
return new LatchImpl(env);
}
else {
try {
return (Latch)JAVA5_LATCH_CLASS.newInstance();
}
catch ( InstantiationException IE) {
}
catch ( IllegalAccessException IAE) {
}
JAVA5_LATCH_CLASS=null;
return new LatchImpl(env);
}
}
public static SharedLatch makeSharedLatch( String name, EnvironmentImpl env){
if (JAVA5_SHARED_LATCH_CLASS == null) {
return new SharedLatchImpl(name,env);
}
else {
try {
SharedLatch ret=(SharedLatch)JAVA5_SHARED_LATCH_CLASS.newInstance();
ret.setName(name);
return ret;
}
catch ( InstantiationException IE) {
}
catch ( IllegalAccessException IAE) {
}
JAVA5_SHARED_LATCH_CLASS=null;
return new SharedLatchImpl(name,env);
}
}
static LatchTable latchTable=new LatchTable("LatchImpl");
/**
* Only call under the assert system. This records and counts held latches.
*/
static public int countLatchesHeld(){
return latchTable.countLatchesHeld();
}
static public void dumpLatchesHeld(){
System.out.println(latchesHeldToString());
}
static public String latchesHeldToString(){
return latchTable.latchesHeldToString();
}
static public void clearNotes(){
latchTable.clearNotes();
}
}