blob: ac7dff5817bd6a3b662047d9f74ff9cb5d5ab251 [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2018 The University of York.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.epsilon.evl.execute.context.concurrent;
import java.util.Collection;
import java.util.Set;
import org.eclipse.epsilon.common.concurrent.ConcurrencyUtils;
import org.eclipse.epsilon.common.util.SizeCachingConcurrentQueue;
import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
import org.eclipse.epsilon.erl.execute.context.concurrent.ErlContextParallel;
import org.eclipse.epsilon.evl.IEvlModule;
import org.eclipse.epsilon.evl.dom.Constraint;
import org.eclipse.epsilon.evl.execute.UnsatisfiedConstraint;
import org.eclipse.epsilon.evl.execute.context.EvlContext;
import org.eclipse.epsilon.evl.execute.context.IEvlContext;
import org.eclipse.epsilon.evl.trace.ConstraintTrace;
/**
*
* @author Sina Madani
* @since 1.6
*/
public class EvlContextParallel extends ErlContextParallel implements IEvlContextParallel {
protected Collection<UnsatisfiedConstraint> unsatisfiedConstraints;
protected ConstraintTrace constraintTrace;
protected boolean optimizeConstraintTrace = false;
protected boolean shortCircuiting = false;
protected boolean terminate = false;
public EvlContextParallel() {
this(0);
}
/**
* @param parallelism The number of threads to use.
* @param threadSafeBaseFrames whether the base FrameStack should use a thread-safe collection.
* default is <code>true</code>
*/
public EvlContextParallel(int parallelism) {
super(parallelism);
unsatisfiedConstraints = new SizeCachingConcurrentQueue<>();
constraintTrace = new ConstraintTrace(true);
}
@Override
protected EvlContext createShadowThreadLocalContext() {
return new EvlContext(this);
}
@Override
public IEvlContext getShadow() {
return (IEvlContext) super.getShadow();
}
@Override
public synchronized Set<UnsatisfiedConstraint> uniqueUnsatisfiedConstraints() {
if (!(unsatisfiedConstraints instanceof Set)) {
unsatisfiedConstraints = ConcurrencyUtils.concurrentSet(unsatisfiedConstraints);
}
return (Set<UnsatisfiedConstraint>) unsatisfiedConstraints;
}
@Override
public Collection<UnsatisfiedConstraint> getUnsatisfiedConstraints() {
return unsatisfiedConstraints;
}
@Override
public ConstraintTrace getConstraintTrace() {
return constraintTrace;
}
@Override
public void setOptimizeConstraintTrace(boolean optimize) {
this.optimizeConstraintTrace = optimize;
}
@Override
public boolean isOptimizeConstraintTrace() {
return optimizeConstraintTrace;
}
@Override
public boolean isShortCircuiting() {
return shortCircuiting;
}
@Override
public void setShortCircuit(boolean shortCircuit) {
this.shortCircuiting = shortCircuit;
}
@Override
public boolean shouldShortCircuit(Constraint constraint) throws EolRuntimeException {
if (!terminate) {
terminate = IEvlContextParallel.super.shouldShortCircuit(constraint);
}
return terminate;
}
@Override
public IEvlModule getModule() {
return (IEvlModule) super.getModule();
}
@Override
public synchronized void dispose() {
super.dispose();
if (unsatisfiedConstraints != null)
unsatisfiedConstraints.clear();
if (constraintTrace != null)
constraintTrace.clear();
terminate = false;
}
}