package im.actor.runtime.threading;
import java.util.ArrayList;
import im.actor.runtime.Runtime;
public class ThreadDispatcher {
private static final ThreadLocalCompat<ArrayList<SimpleDispatcher>> currentDispatcher = Runtime.createThreadLocal();
public static void pushDispatcher(SimpleDispatcher dispatcher) {
if (currentDispatcher.get() == null) {
ArrayList<SimpleDispatcher> dispatchers = new ArrayList<>();
dispatchers.add(dispatcher);
currentDispatcher.set(dispatchers);
} else {
currentDispatcher.get().add(dispatcher);
}
}
public static void popDispatcher() {
ArrayList<SimpleDispatcher> dispatchers = currentDispatcher.get();
if (dispatchers == null || dispatchers.size() == 0) {
throw new RuntimeException("Current Thread doesn't have Active Dispatchers");
} else {
dispatchers.remove(dispatchers.size() - 1);
}
}
public static SimpleDispatcher peekDispatcher() {
ArrayList<SimpleDispatcher> dispatchers = currentDispatcher.get();
if (dispatchers == null || dispatchers.size() == 0) {
throw new RuntimeException("Current Thread doesn't have Active Dispatchers");
} else {
return dispatchers.get(dispatchers.size() - 1);
}
}
public static void dispatchOnCurrentThread(Runnable runnable) {
peekDispatcher().dispatch(runnable);
}
}