001: /*-
002: * See the file LICENSE for redistribution information.
003: *
004: * Copyright (c) 2002,2008 Oracle. All rights reserved.
005: *
006: * $Id: LatchSupport.java,v 1.9.2.2 2008/01/07 15:14:12 cwl Exp $
007: */
008:
009: package com.sleepycat.je.latch;
010:
011: import com.sleepycat.je.dbi.EnvironmentImpl;
012:
013: /**
014: * Various constructs to support Latches. Switch hitting for 1.4 vs Java 5
015: * JVM latch implementation (i.e. our's vs the JVM's), and assert-based
016: * latch counting code.
017: */
018: public class LatchSupport {
019:
020: private static String DISABLE_JAVA5_LATCHES = "je.disable.java5.latches";
021:
022: private static Class JAVA5_LATCH_CLASS = null;
023:
024: private static Class JAVA5_SHARED_LATCH_CLASS = null;
025:
026: static {
027: try {
028: if (System.getProperty(DISABLE_JAVA5_LATCHES) == null) {
029: Class
030: .forName("java.util.concurrent.locks.ReentrantLock");
031: JAVA5_LATCH_CLASS = Class
032: .forName("com.sleepycat.je.latch.Java5LatchImpl");
033: }
034: } catch (ClassNotFoundException CNFE) {
035: }
036: }
037:
038: static {
039: try {
040: if (System.getProperty(DISABLE_JAVA5_LATCHES) == null) {
041: Class
042: .forName("java.util.concurrent.locks.ReentrantReadWriteLock");
043: JAVA5_SHARED_LATCH_CLASS = Class
044: .forName("com.sleepycat.je.latch.Java5SharedLatchImpl");
045: }
046: } catch (ClassNotFoundException CNFE) {
047: }
048: }
049:
050: public static Class getJava5LatchClass() {
051: return JAVA5_LATCH_CLASS;
052: }
053:
054: public static Latch makeLatch(String name, EnvironmentImpl env) {
055: if (JAVA5_LATCH_CLASS == null) {
056: return new LatchImpl(name, env);
057: } else {
058: try {
059: Latch ret = (Latch) JAVA5_LATCH_CLASS.newInstance();
060: ret.setName(name);
061: return ret;
062: } catch (InstantiationException IE) {
063: } catch (IllegalAccessException IAE) {
064: }
065:
066: /* Something bad happened. Revert back to our 1.4 latches. */
067: JAVA5_LATCH_CLASS = null;
068: return new LatchImpl(name, env);
069: }
070: }
071:
072: public static Latch makeLatch(EnvironmentImpl env) {
073: if (JAVA5_LATCH_CLASS == null) {
074: return new LatchImpl(env);
075: } else {
076: try {
077: return (Latch) JAVA5_LATCH_CLASS.newInstance();
078: } catch (InstantiationException IE) {
079: } catch (IllegalAccessException IAE) {
080: }
081:
082: /* Something bad happened. Revert back to our 1.4 latches. */
083: JAVA5_LATCH_CLASS = null;
084: return new LatchImpl(env);
085: }
086: }
087:
088: public static SharedLatch makeSharedLatch(String name,
089: EnvironmentImpl env) {
090: if (JAVA5_SHARED_LATCH_CLASS == null) {
091: return new SharedLatchImpl(name, env);
092: } else {
093: try {
094: SharedLatch ret = (SharedLatch) JAVA5_SHARED_LATCH_CLASS
095: .newInstance();
096: ret.setName(name);
097: return ret;
098: } catch (InstantiationException IE) {
099: } catch (IllegalAccessException IAE) {
100: }
101:
102: /* Something bad happened. Revert back to our 1.4 latches. */
103: JAVA5_SHARED_LATCH_CLASS = null;
104: return new SharedLatchImpl(name, env);
105: }
106: }
107:
108: /* Used for debugging */
109: static LatchTable latchTable = new LatchTable("LatchImpl");
110:
111: /**
112: * Only call under the assert system. This records and counts held latches.
113: */
114: static public int countLatchesHeld() {
115:
116: return latchTable.countLatchesHeld();
117: }
118:
119: static public void dumpLatchesHeld() {
120:
121: System.out.println(latchesHeldToString());
122: }
123:
124: static public String latchesHeldToString() {
125:
126: return latchTable.latchesHeldToString();
127: }
128:
129: static public void clearNotes() {
130:
131: latchTable.clearNotes();
132: }
133: }
|