package org.limewire.ui.support;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.limewire.concurrent.ThreadExecutor;
import org.limewire.util.ThreadUtils;
/** Simple class to help monitor deadlocking. */
public class DeadlockSupport {
private static Log LOG = LogFactory.getLog(DeadlockSupport.class);
/**
* How often to check for deadlocks.
*
* This class doubles as a workaround for bug_id=6435126,
* so it doesn't use a multiple of 10 for the sleep interval.
*/
private static final int DEADLOCK_CHECK_INTERVAL = 3001;
public static void startDeadlockMonitoring() {
Thread t = ThreadExecutor.newManagedThread(new Runnable() {
public void run() {
while(true) {
try {
Thread.sleep(DEADLOCK_CHECK_INTERVAL);
} catch (InterruptedException ignored) {}
LOG.trace("deadlock check start");
long [] ids = ThreadUtils.findDeadlockedThreads();
if (ids == null) {
LOG.trace("no deadlocks found");
continue;
}
StringBuilder sb = new StringBuilder("Deadlock Report:\n");
StackTraceElement[] firstStackTrace = ThreadUtils.buildStackTraces(ids, sb);
DeadlockException deadlock = new DeadlockException();
// Redirect the stack trace to separate deadlock reports.
if(firstStackTrace != null)
deadlock.setStackTrace(firstStackTrace);
DeadlockBugManager.handleDeadlock(deadlock, Thread.currentThread().getName(), sb.toString());
return;
}
}
});
t.setDaemon(true);
t.setName("Deadlock Detection Thread");
t.start();
}
}