package org.apache.ode.runtime.core.work;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Semaphore;
import org.apache.ode.spi.work.ExecutionUnit.WorkItem;
public class WorkItemImpl extends ExecutionUnitBuilder implements WorkItem {
ExecutionStage exStage;
WorkItemInput input;
WorkItemOutput output;
public WorkItemImpl(Frame parent, ExecutionStage exStage) {
super(parent);
this.exStage = exStage;
}
@Override
public void submit() throws ExecutionUnitException {
if (frame.workCtx == null) {
throw new ExecutionUnitException("WorkCtx not found");
}
frame.workCtx.executionCount.addAndGet(executionBuildQueue.size());
frame.workCtx.executionQueue.addAll(executionBuildQueue);
executionBuildQueue.clear();
}
@Override
public Semaphore block() throws ExecutionUnitException {
if (exStage.block == null) {
exStage.block = new Semaphore(1);
}
return exStage.block;
}
@Override
public void abort(Throwable t) throws ExecutionUnitException {
// TODO Auto-generated method stub
}
@Override
public <O extends Output> O input() throws ExecutionUnitException {
if (input == null) {
input = new WorkItemInput(exStage.input);
}
return (O) input;
}
@Override
public <I extends Input> I output() throws ExecutionUnitException {
if (output == null) {
output = new WorkItemOutput(exStage);
}
return (I) output;
}
public static class WorkItemInput extends Stage implements Output {
public WorkItemInput(Object[] output) {
super(null, output);
}
}
public static class WorkItemOutput extends Stage implements Input {
public WorkItemOutput(ExecutionStage execStage) {
this(execStage, new Object[execStage.output.length]);
}
public WorkItemOutput(ExecutionStage execStage, Object[] io) {
super(io, io);
if (execStage.outPipes != null) {
for (Pipe p : execStage.outPipes) {
if (p.from != null) {
p.from = this;
} else {
Set current = null;
Set newSet = null;
do {
current = (Set) p.froms.get();
newSet = new HashSet<>(current);
newSet.remove(execStage);
newSet.add(this);
} while (!p.froms.compareAndSet(current, newSet));
}
}
}
}
//public static
}
}