001: /*-
002: * See the file LICENSE for redistribution information.
003: *
004: * Copyright (c) 2002,2008 Oracle. All rights reserved.
005: *
006: * $Id: LockInfo.java,v 1.28.2.4 2008/01/07 15:14:17 cwl Exp $
007: */
008:
009: package com.sleepycat.je.txn;
010:
011: import java.util.Collections;
012: import java.util.Map;
013: import java.util.WeakHashMap;
014:
015: import com.sleepycat.je.utilint.Tracer;
016:
017: /**
018: * LockInfo is a class that embodies information about a lock instance. The
019: * holding thread and the locktype are all contained in the object.
020: *
021: * This class is public for unit tests.
022: */
023: public class LockInfo implements Cloneable {
024: private Locker locker;
025: private LockType lockType;
026:
027: private static boolean deadlockStackTrace = false;
028: private static Map traceExceptionMap = Collections
029: .synchronizedMap(new WeakHashMap());
030:
031: private static class StackTraceAtLockTime extends Exception {
032: }
033:
034: /**
035: * Called when the je.txn.deadlockStackTrace property is changed.
036: */
037: static void setDeadlockStackTrace(boolean enable) {
038: deadlockStackTrace = enable;
039: }
040:
041: /**
042: * For unit testing only.
043: */
044: public static boolean getDeadlockStackTrace() {
045: return deadlockStackTrace;
046: }
047:
048: /**
049: * Construct a new LockInfo. public for Sizeof program.
050: */
051: public LockInfo(Locker locker, LockType lockType) {
052: this .locker = locker;
053: this .lockType = lockType;
054:
055: if (deadlockStackTrace) {
056: traceExceptionMap.put(this , new StackTraceAtLockTime());
057: }
058: }
059:
060: /**
061: * Change this lockInfo over to the prescribed locker.
062: */
063: void setLocker(Locker locker) {
064: this .locker = locker;
065: }
066:
067: /**
068: * @return The transaction associated with this Lock.
069: */
070: Locker getLocker() {
071: return locker;
072: }
073:
074: /**
075: * @return The LockType associated with this Lock.
076: */
077: void setLockType(LockType lockType) {
078: this .lockType = lockType;
079: }
080:
081: /**
082: * @return The LockType associated with this Lock.
083: */
084: LockType getLockType() {
085: return lockType;
086: }
087:
088: public Object clone() throws CloneNotSupportedException {
089:
090: return super .clone();
091: }
092:
093: /**
094: * Debugging
095: */
096: public void dump() {
097: System.out.println(this );
098: }
099:
100: public String toString() {
101: StringBuffer buf = new StringBuffer(500);
102:
103: buf.append("<LockInfo locker=\"");
104: buf.append(locker);
105: buf.append("\" type=\"");
106: buf.append(lockType);
107: buf.append("\"/>");
108:
109: if (deadlockStackTrace) {
110: Exception traceException = (Exception) traceExceptionMap
111: .get(this );
112: if (traceException != null) {
113: buf.append(" lock taken at: ");
114: buf.append(Tracer.getStackTrace(traceException));
115: }
116: }
117:
118: return buf.toString();
119: }
120: }
|