package co.paralleluniverse.fibers.dynamic;
import co.paralleluniverse.common.test.TestInterface;
import co.paralleluniverse.common.test.TestInterface2;
import co.paralleluniverse.fibers.Fiber;
import co.paralleluniverse.fibers.SuspendExecution;
import co.paralleluniverse.fibers.Suspendable;
import java.util.ArrayList;
public class DynamicallyLoadedSuspendable implements TestInterface {
@Suspendable
public void test(ArrayList<String> results) {
results.add("a");
TestInterface referencedSuspend = new ReferencedSuspendable();
TestInterface2 indirectSuspend = new IndirectSuspendable();
results.add("b");
try {
results.add("c");
Fiber.park();
results.add("d");
} catch (SuspendExecution ex) {
}
results.add("e");
referencedSuspend.test(results);
results.add("f");
indirectSuspend.test(results, referencedSuspend);
results.add("g");
while (true) {
results.add("h");
indirectSuspend.test(results, referencedSuspend);
results.add("i");
}
}
private static class BaseSuspendable {
@Suspendable
public void baseTest(ArrayList<String> results) {
try {
results.add("b1");
Fiber.park();
results.add("b2");
} catch (SuspendExecution ex) {
}
}
}
private static class ReferencedSuspendable extends BaseSuspendable implements TestInterface {
@Override
@Suspendable
public void test(ArrayList<String> results) {
try {
results.add("d1");
Fiber.park();
results.add("d2");
} catch (SuspendExecution ex) {
}
baseTest(results);
}
}
private static class IndirectSuspendable extends BaseSuspendable implements TestInterface2 {
@Override
@Suspendable
public void test(ArrayList<String> results, TestInterface target) {
results.add("o1");
target.test(results);
results.add("o2");
baseTest(results);
}
}
}