/*- * See the file LICENSE for redistribution information. * * Copyright (c) 2002-2006 * Sleepycat Software. All rights reserved. * * $Id: LatchSupport.java,v 1.1 2006/05/06 09:00:34 ckaestne Exp $ */ package com.sleepycat.je.latch; import com.sleepycat.je.dbi.EnvironmentImpl; /** * 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) { } /* Something bad happened. Revert back to our 1.4 latches. */ 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) { } /* Something bad happened. Revert back to our 1.4 latches. */ 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) { } /* Something bad happened. Revert back to our 1.4 latches. */ JAVA5_SHARED_LATCH_CLASS = null; return new SharedLatchImpl(name, env); } } /* Used for debugging */ 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(); } }