blob: 0c97a1450a5695c2f68ea71b1edbb84753dafdb4 [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.Set;
import org.eclipse.epsilon.common.concurrent.ConcurrencyUtils;
import org.eclipse.epsilon.common.module.IModule;
import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
import org.eclipse.epsilon.eol.exceptions.concurrent.EolNestedParallelismException;
import org.eclipse.epsilon.eol.execute.context.concurrent.IEolContextParallel;
import org.eclipse.epsilon.erl.execute.context.concurrent.ErlContextParallel;
import org.eclipse.epsilon.evl.concurrent.EvlModuleParallel;
import org.eclipse.epsilon.evl.dom.Constraint;
import org.eclipse.epsilon.evl.execute.UnsatisfiedConstraint;
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 Set<UnsatisfiedConstraint> unsatisfiedConstraints;
protected ConstraintTrace constraintTrace;
protected boolean optimizeConstraintTrace = false;
protected boolean shortCircuit = false;
protected /*volatile*/ boolean terminate = false;
public EvlContextParallel() {
this(0);
}
public EvlContextParallel(IEvlContext other) {
super(other, true);
}
/**
* @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, true);
}
@Override
protected void initMainThreadStructures() {
super.initMainThreadStructures();
constraintTrace = new ConstraintTrace(true);
unsatisfiedConstraints = ConcurrencyUtils.concurrentSet(64, numThreads);
}
@Override
public void setModule(IModule module) {
if (module instanceof EvlModuleParallel) {
super.setModule(module);
}
}
@Override
public EvlModuleParallel getModule() {
return (EvlModuleParallel) super.getModule();
}
@Override
public Set<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;
}
public static IEvlContextParallel convertToParallel(IEvlContext context) throws EolNestedParallelismException {
if (context instanceof IEvlContextParallel) {
IEvlContextParallel pContext = (IEvlContextParallel) context;
if (!pContext.isParallel()) pContext.goParallel();
return pContext;
}
return IEolContextParallel.copyToParallel(context, EvlContextParallel::new);
}
@Override
public boolean isShortCircuiting() {
return shortCircuit;
}
@Override
public void setShortCircuit(boolean shortCircuit) {
this.shortCircuit = shortCircuit;
}
@Override
public boolean shouldShortCircuit(Constraint constraint) throws EolRuntimeException {
if (!terminate) {
terminate = IEvlContextParallel.super.shouldShortCircuit(constraint);
}
return terminate;
}
}