package com.sleepycat.je.latch;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.WeakHashMap;
import de.ovgu.cide.jakutil.*;
/**
* Table of latches by thread for debugging.
*/
class LatchTable {
private String tableName;
private Map latchesByThread;
LatchTable( String tableName){
this.tableName=tableName;
latchesByThread=Collections.synchronizedMap(new WeakHashMap());
}
/**
* Only call under the assert system. This records latching by thread.
*/
boolean noteLatch( Object latch) throws LatchException {
Thread cur=Thread.currentThread();
Set threadLatches=(Set)latchesByThread.get(cur);
if (threadLatches == null) {
threadLatches=new HashSet();
latchesByThread.put(cur,threadLatches);
}
threadLatches.add(latch);
return true;
}
/**
* Only call under the assert system. This records latching by thread.
* @return true if unnoted successfully.
*/
boolean unNoteLatch( Object latch, String name){
Thread cur=Thread.currentThread();
Set threadLatches=(Set)latchesByThread.get(cur);
if (threadLatches == null) {
return false;
}
else {
return threadLatches.remove(latch);
}
}
/**
* Only call under the assert system. This counts held latches.
*/
int countLatchesHeld(){
Thread cur=Thread.currentThread();
Set threadLatches=(Set)latchesByThread.get(cur);
if (threadLatches != null) {
return threadLatches.size();
}
else {
return 0;
}
}
String latchesHeldToString(){
Thread cur=Thread.currentThread();
Set threadLatches=(Set)latchesByThread.get(cur);
StringBuffer sb=new StringBuffer();
if (threadLatches != null) {
Iterator i=threadLatches.iterator();
while (i.hasNext()) {
sb.append(i.next()).append('\n');
}
}
return sb.toString();
}
void clearNotes(){
latchesByThread.clear();
}
/**
* For concocting exception messages.
*/
String getNameString( String name){
StringBuffer sb=new StringBuffer(tableName);
if (name != null) {
sb.append("(").append(name).append(")");
}
return sb.toString();
}
/**
* Formats a latch owner and waiters.
*/
String toString( String name, Object owner, List waiters, int startIndex){
StringBuffer sb=new StringBuffer();
sb.append("<LATCH ");
if (name != null) {
sb.append("[name: ").append(name).append("] ");
}
sb.append("[owner: ").append(owner).append("]");
if (waiters != null && waiters.size() > startIndex) {
sb.append(" [waiters: ");
for (int i=startIndex; i < waiters.size(); i++) {
sb.append(waiters.get(i)).append(" ");
}
sb.append("]");
}
sb.append(">");
return sb.toString();
}
}