/**
* Copyright 2011, Big Switch Networks, Inc.
* Originally created by David Erickson, Stanford University
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
**/
package net.floodlightcontroller.storage;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class SynchronousExecutorService implements ExecutorService {
class SynchronousFuture<T> implements Future<T> {
T result;
Exception exc;
public SynchronousFuture() {
}
public SynchronousFuture(T result) {
this.result = result;
}
public SynchronousFuture(Exception exc) {
this.exc = exc;
}
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
return false;
}
@Override
public boolean isCancelled() {
return false;
}
@Override
public boolean isDone() {
return true;
}
@Override
public T get() throws InterruptedException, ExecutionException {
if (exc != null)
throw new ExecutionException(exc);
return result;
}
@Override
public T get(long timeout, TimeUnit unit) throws InterruptedException,
ExecutionException, TimeoutException {
return get();
}
}
@Override
public void shutdown() {
}
@Override
public List<Runnable> shutdownNow() {
return null;
}
@Override
public boolean isShutdown() {
return false;
}
@Override
public boolean isTerminated() {
return false;
}
@Override
public boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException {
return false;
}
@Override
public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException {
List<Future<T>> l = new ArrayList<Future<T>>();
for (Callable<T> task : tasks) {
Future<T> future = submit(task);
l.add(future);
}
return l;
}
@Override
public <T> List<Future<T>> invokeAll(
Collection<? extends Callable<T>> tasks, long timeout, TimeUnit units)
throws InterruptedException {
return invokeAll(tasks);
}
@Override
public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
throws InterruptedException, ExecutionException {
for (Callable<T> task : tasks) {
try {
task.call();
} catch (Exception e) {
}
}
throw new ExecutionException(new Exception("no task completed successfully"));
}
@Override
public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout,
TimeUnit units) throws InterruptedException, ExecutionException,
TimeoutException {
return invokeAny(tasks);
}
@Override
public <T> Future<T> submit(Callable<T> callable) {
try {
T result = callable.call();
return new SynchronousFuture<T>(result);
}
catch (Exception exc) {
return new SynchronousFuture<T>(exc);
}
}
@Override
public Future<?> submit(Runnable runnable) {
try {
runnable.run();
return new SynchronousFuture<Void>();
}
catch (Exception exc) {
return new SynchronousFuture<Void>(exc);
}
}
@Override
public <T> Future<T> submit(Runnable runnable, T result) {
try {
runnable.run();
return new SynchronousFuture<T>(result);
}
catch (Exception exc) {
return new SynchronousFuture<T>(exc);
}
}
@Override
public void execute(Runnable command) {
command.run();
}
}