package tc.oc.minecraft.scheduler; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import javax.inject.Singleton; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import com.google.inject.Key; import com.google.inject.Provides; import tc.oc.commons.core.concurrent.Flexecutor; import tc.oc.commons.core.inject.HybridManifest; /** * Platforms must provide these two bindings: * * @Sync(defer=false) ExecutorService * @Sync(defer=true) ExecutorService * * This module binds aliases/decorators with the same annotation: * {@link Executor} * {@link ListeningExecutorService} * {@link Flexecutor} * * It also binds {@link SyncExecutor} and {@link MainThreadExecutor}, * but these are deprecated, because there is no need for them to be * distinct interfaces. */ public class MinecraftExecutorManifest extends HybridManifest { @Override protected void configure() { // Executor -> ExecutorService bind(Key.get(Executor.class, Sync.immediate)) .to(Key.get(ExecutorService.class, Sync.immediate)); bind(Key.get(Executor.class, Sync.deferred)) .to(Key.get(ExecutorService.class, Sync.deferred)); } // ListeningExecutorService -> ExecutorService @Provides @Singleton @Sync(defer=false) ListeningExecutorService immediateListeningExecutor(@Sync(defer=false) ExecutorService executor) { return MoreExecutors.listeningDecorator(executor); } @Provides @Singleton @Sync(defer=true) ListeningExecutorService deferredListeningExecutor(@Sync(defer=true) ExecutorService executor) { return MoreExecutors.listeningDecorator(executor); } // Flexecutor -> ExecutorService @Provides @Singleton @Sync(defer=false) Flexecutor immediateFlexecutor(@Sync(defer=false) ExecutorService executor) { return executor instanceof Flexecutor ? (Flexecutor) executor : new ExecutorServiceWrapper(executor); } @Provides @Singleton @Sync(defer=true) Flexecutor deferredFlexecutor(@Sync(defer=true) ExecutorService executor) { return executor instanceof Flexecutor ? (Flexecutor) executor : new ExecutorServiceWrapper(executor); } // MainThreadExecutor -> ExecutorService @Provides @Singleton MainThreadExecutor mainThreadExecutor(@Sync(defer=false) ExecutorService executor) { return executor instanceof MainThreadExecutor ? (MainThreadExecutor) executor : new ExecutorServiceWrapper(executor); } // SyncExecutor -> ExecutorService @Provides @Singleton SyncExecutor syncExecutor(@Sync(defer=true) ExecutorService executor) { return executor instanceof SyncExecutor ? (SyncExecutor) executor : new ExecutorServiceWrapper(executor); } }