package com.sleepycat.je.txn;
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
import com.sleepycat.je.utilint.Tracer;
import de.ovgu.cide.jakutil.*;
/**
* LockInfo is a class that embodies information about a lock instance. The
* holding thread and the locktype are all contained in the object.
*/
public class LockInfo implements Cloneable {
private Locker locker;
private LockType lockType;
private static boolean deadlockStackTrace=false;
private static Map traceExceptionMap=Collections.synchronizedMap(new WeakHashMap());
private static class StackTraceAtLockTime extends Exception {
}
/**
* Called when the je.txn.deadlockStackTrace property is changed.
*/
static void setDeadlockStackTrace( boolean enable){
deadlockStackTrace=enable;
}
/**
* For unit testing only.
*/
public static boolean getDeadlockStackTrace(){
return deadlockStackTrace;
}
/**
* Construct a new LockInfo. public for Sizeof program.
*/
public LockInfo( Locker locker, LockType lockType){
this.locker=locker;
this.lockType=lockType;
if (deadlockStackTrace) {
traceExceptionMap.put(this,new StackTraceAtLockTime());
}
}
/**
* Change this lockInfo over to the prescribed locker.
*/
void setLocker( Locker locker){
this.locker=locker;
}
/**
* @return The transaction associated with this Lock.
*/
Locker getLocker(){
return locker;
}
/**
* @return The LockType associated with this Lock.
*/
void setLockType( LockType lockType){
this.lockType=lockType;
}
/**
* @return The LockType associated with this Lock.
*/
LockType getLockType(){
return lockType;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
/**
* Debugging
*/
public void dump(){
System.out.println(this);
}
public String toString(){
StringBuffer buf=new StringBuffer(500);
buf.append("<LockInfo locker=\"");
buf.append(locker);
buf.append("\" type=\"");
buf.append(lockType);
buf.append("\"/>");
if (deadlockStackTrace) {
Exception traceException=(Exception)traceExceptionMap.get(this);
if (traceException != null) {
buf.append(" lock taken at: ");
buf.append(Tracer.getStackTrace(traceException));
}
}
return buf.toString();
}
}