package net.i2p.router.tasks; import java.io.File; import net.i2p.I2PAppContext; import net.i2p.util.ShellCommand; import net.i2p.util.Log; import net.i2p.util.SystemVersion; /** * Only works with wrapper on non-windows platforms * * @since 0.9.3 moved from RouterWatchdog */ abstract class ThreadDump { /** * Signal the wrapper to asynchronously dump threads to wrapper.log. * It waits for the signal to complete (which should be fast) * but does not wait for the dump itself. * * @param secondsToWait if <= 0, don't wait * @return success, false if windows or no wrapper, true if secondsToWait <= 0, false if timed out, dump result otherwise */ public static boolean dump(I2PAppContext context, int secondsToWait) { if (SystemVersion.isWindows() || !context.hasWrapper()) return false; ShellCommand sc = new ShellCommand(); File i2pr = new File(context.getBaseDir(), "i2prouter"); String[] args = new String[2]; args[0] = i2pr.getAbsolutePath(); args[1] = "dump"; boolean success = sc.executeSilentAndWaitTimed(args, secondsToWait); if (secondsToWait <= 0) success = true; if (success) { Log log = context.logManager().getLog(ThreadDump.class); File f = new File(context.getConfigDir(), "wrapper.log"); String loc = f.exists() ? f.getAbsolutePath() : "wrapper.log"; log.log(Log.CRIT, "Threads dumped to " + loc); } return success; } }