package delight.nashornsandbox.internal;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.eclipse.xtext.xbase.lib.InputOutput;
@SuppressWarnings("all")
public class MonitorThread extends Thread {
private final long maxCPUTime;
private final AtomicBoolean stop;
private final AtomicBoolean operationInterrupted;
private Thread threadToMonitor;
private Runnable onInvalid;
private final AtomicBoolean cpuLimitExceeded;
@Override
public void run() {
try {
final ThreadMXBean bean = ManagementFactory.getThreadMXBean();
long _id = this.threadToMonitor.getId();
final long startCPUTime = bean.getThreadCpuTime(_id);
while ((!this.stop.get())) {
{
long _id_1 = this.threadToMonitor.getId();
final long threadCPUTime = bean.getThreadCpuTime(_id_1);
final long runtime = (threadCPUTime - startCPUTime);
if ((runtime > this.maxCPUTime)) {
this.cpuLimitExceeded.set(true);
this.stop.set(true);
this.onInvalid.run();
Thread.sleep(50);
boolean _get = this.operationInterrupted.get();
boolean _equals = (_get == false);
if (_equals) {
String _plus = (this + ": Thread hard shutdown!");
InputOutput.<String>println(_plus);
this.threadToMonitor.stop();
}
return;
}
Thread.sleep(5);
}
}
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
public void stopMonitor() {
this.stop.set(true);
}
public void setThreadToMonitor(final Thread t) {
this.threadToMonitor = t;
}
public void setOnInvalidHandler(final Runnable r) {
this.onInvalid = r;
}
public void notifyOperationInterrupted() {
this.operationInterrupted.set(true);
}
public boolean isCPULimitExceeded() {
return this.cpuLimitExceeded.get();
}
public boolean gracefullyInterrputed() {
return this.operationInterrupted.get();
}
public MonitorThread(final long maxCPUTimne) {
this.maxCPUTime = maxCPUTimne;
AtomicBoolean _atomicBoolean = new AtomicBoolean(false);
this.stop = _atomicBoolean;
AtomicBoolean _atomicBoolean_1 = new AtomicBoolean(false);
this.operationInterrupted = _atomicBoolean_1;
AtomicBoolean _atomicBoolean_2 = new AtomicBoolean(false);
this.cpuLimitExceeded = _atomicBoolean_2;
}
}