package net.minecraftforkage.instsetup;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
class Utils {
public static void copyStream(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[32768];
while(true) {
int read = in.read(buffer);
if(read <= 0)
break;
out.write(buffer, 0, read);
}
}
public static byte[] readStream(InputStream in) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
copyStream(in, baos);
return baos.toByteArray();
}
/**
* Runs mainTask. If it has not completed after timeoutMS milliseconds (approximately),
* run timeoutTask on a new thread.
*/
public static void runWithTimeout(Runnable mainTask, long timeoutMS, final Runnable timeoutTask) {
final Object monitor = new Object();
final AtomicBoolean hasFinished = new AtomicBoolean();
final long timeoutTime = System.nanoTime() + timeoutMS * 1000000L;
hasFinished.set(false);
new Thread() {
@Override
public void run() {
synchronized(monitor) {
while(!hasFinished.get()) {
int remaining = (int)((timeoutTime - System.nanoTime()) / 1000000);
if(remaining <= 0)
break;
try {
monitor.wait(remaining);
} catch(InterruptedException e) {
e.printStackTrace();
return;
}
}
}
if(!hasFinished.get())
timeoutTask.run();
}
}.start();
try {
mainTask.run();
} finally {
hasFinished.set(true);
synchronized(monitor) {
monitor.notifyAll();
}
}
}
}