diff --git a/README.md b/README.md
index 3f07fee1..f47fe1b0 100644
--- a/README.md
+++ b/README.md
@@ -44,14 +44,21 @@ a link to this page somewhere in the documentation/system about section.
## Change Log for the BPjs Library.
+### 2019-02-04
+* :arrow_up: :tada: Event selection strategies now accept `BProgramSyncSnapshot`, rather than a set of sync statements and external events.
+
+### 2019-02-04
+* :sparkles: Testing infrastructure for execution traces.
+* :arrow_up: More terminology cleanups in the api (e.g. "bsync" converted to "sync")
+
+### 2019-02-03
+* :arrow_up: `VisitedStateStore` now stores *states*, not DFS nodes. So it's more reusable that way.
+
### 2019-01-19
* :sparkles: More tests.
* :arrow_up: `BriefPrintDfsVerifierListener` => `PrintDfsVerifierListener`, so that it's consistent with `PrintBProgramRunnerListener`.
* :arrow_up: Incorporated the "BPjs Tips" file to the central documentation.
-### 2019-02-03
-* :arrow_up: `VisitedStateStore` now stores *states*, not DFS nodes. So it's more reusable that way.
-
### 2019-01-18
* :bug: Fixed a that cause equality tests of JS event sets to return false negatives.
* :bug: The `bp` object no longer collected by the state comparators.
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/analysis/DfsCycleInspection.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/analysis/DfsCycleInspection.java
index 760cca8c..66ec4856 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/analysis/DfsCycleInspection.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/analysis/DfsCycleInspection.java
@@ -42,7 +42,7 @@ public interface DfsCycleInspection {
*
* [a]-[b]-[c]-[d]--...
* \ |
- * +-----+
+ * +-----+ (going from d back to b)
*
*
* This methods will be called with trace={@code [a][b][c][d]} and
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/analysis/DfsInspections.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/analysis/DfsInspections.java
index cc6a0695..f18ba4a6 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/analysis/DfsInspections.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/analysis/DfsInspections.java
@@ -81,7 +81,7 @@ public final class DfsInspections {
if ( curNode.getSystemState().isHot() &&
curNode.getSelectableEvents().isEmpty() ) {
Set hotlyTerminated = curNode.getSystemState().getBThreadSnapshots().stream()
- .filter( s -> s.getBSyncStatement().isHot() ).map( s->s.getName() ).collect( toSet() );
+ .filter( s -> s.getSyncStatement().isHot() ).map( s->s.getName() ).collect( toSet() );
return Optional.of( new HotTerminationViolation(hotlyTerminated, trace) );
} else return Optional.empty();
};
@@ -123,7 +123,7 @@ public Optional inspectCycle(List currentTrace, int
}
private Set getHotThreadNames( Set bts ) {
- return bts.stream().filter( bt -> bt.getBSyncStatement().isHot() )
+ return bts.stream().filter( bt -> bt.getSyncStatement().isHot() )
.map( bt -> bt.getName() )
.collect( toSet() );
}
@@ -139,7 +139,7 @@ private Set getHotThreadNames( Set bts ) {
// Utility methods.
private static boolean hasRequestedEvents(BProgramSyncSnapshot bpss) {
- return bpss.getBThreadSnapshots().stream().anyMatch(btss -> (!btss.getBSyncStatement().getRequest().isEmpty()));
+ return bpss.getBThreadSnapshots().stream().anyMatch(btss -> (!btss.getSyncStatement().getRequest().isEmpty()));
}
private static DfsTraversalNode peek(List trace) {
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/analysis/DfsTraversalNode.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/analysis/DfsTraversalNode.java
index e2188306..bcdbefbd 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/analysis/DfsTraversalNode.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/analysis/DfsTraversalNode.java
@@ -48,8 +48,7 @@ protected DfsTraversalNode(BProgram bp, BProgramSyncSnapshot systemState, BEvent
this.lastEvent = e;
if (bp != null) {
- selectableEvents = bp.getEventSelectionStrategy().selectableEvents(systemState.getStatements(),
- systemState.getExternalEvents());
+ selectableEvents = bp.getEventSelectionStrategy().selectableEvents(systemState);
ArrayList eventOrdered = new ArrayList<>(selectableEvents);
Collections.shuffle(eventOrdered);
iterator = eventOrdered.iterator();
@@ -64,7 +63,7 @@ private String stateString() {
StringBuilder str = new StringBuilder();
systemState.getBThreadSnapshots().forEach(
- s -> str.append("\t").append(s.toString()).append(" {").append(s.getBSyncStatement()).append("} \n"));
+ s -> str.append("\t").append(s.toString()).append(" {").append(s.getSyncStatement()).append("} \n"));
return str.toString();
}
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/bprogramio/BProgramSyncSnapshotIO.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/bprogramio/BProgramSyncSnapshotIO.java
index fe36ed2a..5ff25aa6 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/bprogramio/BProgramSyncSnapshotIO.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/bprogramio/BProgramSyncSnapshotIO.java
@@ -181,7 +181,7 @@ private void writeBThreadSnapshot(BThreadSyncSnapshot bss, ObjectOutputStream ou
try (BThreadSyncSnapshotOutputStream btos = new BThreadSyncSnapshotOutputStream(bthreadBytes, scope)) {
btos.writeObject(bss.getEntryPoint());
btos.writeObject(bss.getInterrupt().orElse(null));
- btos.writeObject(bss.getBSyncStatement());
+ btos.writeObject(bss.getSyncStatement());
btos.writeObject(bss.getContinuation());
btos.flush();
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/execution/BProgramRunner.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/execution/BProgramRunner.java
index 4bd4d1ef..030f988a 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/execution/BProgramRunner.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/execution/BProgramRunner.java
@@ -94,7 +94,7 @@ public void run() {
while ( (!cur.noBThreadsLeft()) && go.get() ) {
// see which events are selectable
- Set possibleEvents = bprog.getEventSelectionStrategy().selectableEvents(cur.getStatements(), cur.getExternalEvents());
+ Set possibleEvents = bprog.getEventSelectionStrategy().selectableEvents(cur);
if ( possibleEvents.isEmpty() ) {
// Superstep done: No events available for selection.
@@ -115,7 +115,7 @@ public void run() {
} else {
// we can select some events - select one and advance.
- Optional res = bprog.getEventSelectionStrategy().select(cur.getStatements(), cur.getExternalEvents(), possibleEvents);
+ Optional res = bprog.getEventSelectionStrategy().select(cur, possibleEvents);
if ( res.isPresent() ) {
EventSelectionResult esr = res.get();
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/BProgramSyncSnapshot.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/BProgramSyncSnapshot.java
index 18750ac9..89a43237 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/BProgramSyncSnapshot.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/BProgramSyncSnapshot.java
@@ -142,7 +142,7 @@ public BProgramSyncSnapshot triggerEvent(BEvent anEvent, ExecutorService exSvc,
// Split threads to those that advance this round and those that sleep.
threadSnapshots.forEach( snapshot -> {
- (snapshot.getBSyncStatement().shouldWakeFor(anEvent) ? resumingThisRound : sleepingThisRound).add(snapshot);
+ (snapshot.getSyncStatement().shouldWakeFor(anEvent) ? resumingThisRound : sleepingThisRound).add(snapshot);
});
} finally {
Context.exit();
@@ -183,7 +183,7 @@ public BProgramSyncSnapshot triggerEvent(BEvent anEvent, ExecutorService exSvc,
private void handleInterrupts(BEvent anEvent, Iterable listeners, BProgram bprog, Context ctxt) {
Set interrupted = threadSnapshots.stream()
- .filter(bt -> bt.getBSyncStatement().getInterrupt().contains(anEvent))
+ .filter(bt -> bt.getSyncStatement().getInterrupt().contains(anEvent))
.collect(toSet());
if (!interrupted.isEmpty()) {
threadSnapshots.removeAll(interrupted);
@@ -211,7 +211,7 @@ public Set getBThreadSnapshots() {
}
public Set getStatements() {
- return getBThreadSnapshots().stream().map(BThreadSyncSnapshot::getBSyncStatement)
+ return getBThreadSnapshots().stream().map(BThreadSyncSnapshot::getSyncStatement)
.collect(toSet());
}
@@ -256,7 +256,7 @@ public FailedAssertion getFailedAssertion() {
*/
public boolean isHot() {
return getBThreadSnapshots().stream()
- .map(BThreadSyncSnapshot::getBSyncStatement)
+ .map(BThreadSyncSnapshot::getSyncStatement)
.filter(SyncStatement::isHot)
.findAny().isPresent();
}
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/BThreadSyncSnapshot.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/BThreadSyncSnapshot.java
index 7cefd4a4..73a2594a 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/BThreadSyncSnapshot.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/BThreadSyncSnapshot.java
@@ -88,11 +88,11 @@ public BThreadSyncSnapshot copyWith(Object aContinuation, SyncStatement aStateme
return retVal;
}
- public SyncStatement getBSyncStatement() {
+ public SyncStatement getSyncStatement() {
return bSyncStatement;
}
- public void setBSyncStatement(SyncStatement stmt) {
+ public void setSyncStatement(SyncStatement stmt) {
bSyncStatement = stmt;
if (bSyncStatement.getBthread() != this) {
bSyncStatement.setBthread(this);
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/AbstractEventSelectionStrategy.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/AbstractEventSelectionStrategy.java
index ec677b46..2c3f2717 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/AbstractEventSelectionStrategy.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/AbstractEventSelectionStrategy.java
@@ -25,6 +25,7 @@
import il.ac.bgu.cs.bp.bpjs.model.SyncStatement;
import il.ac.bgu.cs.bp.bpjs.model.BEvent;
+import il.ac.bgu.cs.bp.bpjs.model.BProgramSyncSnapshot;
import il.ac.bgu.cs.bp.bpjs.model.eventsets.EventSet;
import java.util.ArrayList;
import static java.util.Collections.singleton;
@@ -65,18 +66,17 @@ public long getSeed() {
/**
* Randomly select an event from {@code selectableEvents}, or a non-blocked event from {@code externalEvents}, in case {@code selectableEvents} is empty.
*
- * @param statements Statements at the current {@code bsync}.
- * @param externalEvents List of events that are not requested by b-threads (at least, not directly).
+ * @param bpss a b-program at synchronization point.
* @param selectableEvents Set of events that can be selected.
* @return An optional event selection result.
*/
@Override
- public Optional select(Set statements, List externalEvents, Set selectableEvents) {
+ public Optional select(BProgramSyncSnapshot bpss, Set selectableEvents) {
if (selectableEvents.isEmpty()) {
return Optional.empty();
}
BEvent chosen = new ArrayList<>(selectableEvents).get(rnd.nextInt(selectableEvents.size()));
- Set requested = statements.stream()
+ Set requested = bpss.getStatements().stream()
.filter((SyncStatement stmt) -> stmt != null)
.flatMap((SyncStatement stmt) -> stmt.getRequest().stream())
.collect(Collectors.toSet());
@@ -85,7 +85,7 @@ public Optional select(Set statements, List
return Optional.of(new EventSelectionResult(chosen));
} else {
// that was an external event, need to find the first index
- return Optional.of(new EventSelectionResult(chosen, singleton(externalEvents.indexOf(chosen))));
+ return Optional.of(new EventSelectionResult(chosen, singleton(bpss.getExternalEvents().indexOf(chosen))));
}
}
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/AbstractEventSelectionStrategyDecorator.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/AbstractEventSelectionStrategyDecorator.java
index fecfbd4f..c34b4f0c 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/AbstractEventSelectionStrategyDecorator.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/AbstractEventSelectionStrategyDecorator.java
@@ -24,8 +24,7 @@
package il.ac.bgu.cs.bp.bpjs.model.eventselection;
import il.ac.bgu.cs.bp.bpjs.model.BEvent;
-import il.ac.bgu.cs.bp.bpjs.model.SyncStatement;
-import java.util.List;
+import il.ac.bgu.cs.bp.bpjs.model.BProgramSyncSnapshot;
import java.util.Optional;
import java.util.Set;
@@ -50,13 +49,13 @@ public ESS getDecorated() {
}
@Override
- public Set selectableEvents(Set statements, List externalEvents) {
- return getDecorated().selectableEvents(statements, externalEvents);
+ public Set selectableEvents(BProgramSyncSnapshot bpss) {
+ return getDecorated().selectableEvents(bpss);
}
@Override
- public Optional select(Set statements, List externalEvents, Set selectableEvents) {
- return getDecorated().select(statements, externalEvents, selectableEvents);
+ public Optional select(BProgramSyncSnapshot bpss, Set selectableEvents) {
+ return getDecorated().select(bpss, selectableEvents);
}
}
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/EventSelectionStrategy.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/EventSelectionStrategy.java
index e3178c7d..5eadc761 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/EventSelectionStrategy.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/EventSelectionStrategy.java
@@ -2,6 +2,7 @@
import il.ac.bgu.cs.bp.bpjs.model.SyncStatement;
import il.ac.bgu.cs.bp.bpjs.model.BEvent;
+import il.ac.bgu.cs.bp.bpjs.model.BProgramSyncSnapshot;
import java.util.List;
import java.util.Optional;
import java.util.Set;
@@ -19,25 +20,32 @@
public interface EventSelectionStrategy {
/**
- * Creates the set of selectable events, given the {@link SyncStatement}s from
- * all participating BThreads.
- * @param statements statements of all participating BThreads.
- * @param externalEvents events queued by external processes.
+ * Creates the set of selectable events, given a b-program's
+ * synchronization point.
+ *
+ * @param bpss a {@link BProgram} at a synchronization point.
* @return A set of events that may be selected for execution.
*/
- Set selectableEvents(Set statements, List externalEvents);
+ Set selectableEvents(BProgramSyncSnapshot bpss);
/**
* Selects an event for execution from the parameter {@code selectableEvents},
* or returns {@link Optional#empty()} in case no suitable event is found.
*
- * @param statements statements of all participating BThreads.
- * @param externalEvents events queued by external processes.
- * @param selectableEvents A set of events to select from
+ * The {@code selectableEvents} set is Normally the set of
+ * events returned by {@code this}' {@link #selectableEvents(il.ac.bgu.cs.bp.bpjs.model.BProgramSyncSnapshot)}
+ * method on the previous call on the same synchronization point. This is
+ * an optimization that allows most strategies to select events only once
+ * per synchronization point.
+ *
+ * In normal BP, the selected event (if any) has
+ * to be a member of {@code selectableEvents}.
+ *
+ * @param bpss a {@link BProgram} at a synchronization point.
+ * @param selectableEvents A set of events to select from.
* @return An event selection result, or no result.
*/
- Optional select(Set statements,
- List externalEvents,
+ Optional select(BProgramSyncSnapshot bpss,
Set selectableEvents );
}
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/LoggingEventSelectionStrategyDecorator.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/LoggingEventSelectionStrategyDecorator.java
index afb3eb4b..aca90629 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/LoggingEventSelectionStrategyDecorator.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/LoggingEventSelectionStrategyDecorator.java
@@ -23,11 +23,10 @@
*/
package il.ac.bgu.cs.bp.bpjs.model.eventselection;
-import il.ac.bgu.cs.bp.bpjs.model.SyncStatement;
import il.ac.bgu.cs.bp.bpjs.model.BEvent;
+import il.ac.bgu.cs.bp.bpjs.model.BProgramSyncSnapshot;
import java.io.PrintStream;
import java.io.PrintWriter;
-import java.util.List;
import java.util.Optional;
import java.util.Set;
@@ -53,19 +52,19 @@ public LoggingEventSelectionStrategyDecorator(ESS decorated) {
}
@Override
- public Set selectableEvents(Set statements, List externalEvents) {
- final Set selectableEvents = getDecorated().selectableEvents(statements, externalEvents);
+ public Set selectableEvents(BProgramSyncSnapshot bpss) {
+ final Set selectableEvents = getDecorated().selectableEvents(bpss);
out.println("== Choosing Selectable Events ==");
out.println("BThread Sync Statements:");
- statements.forEach( stmt -> {
+ bpss.getStatements().forEach( stmt -> {
out.println("+ " + stmt.getBthread().getName() + ":" + (stmt.isHot()?" HOT":""));
out.println(" Request: " + stmt.getRequest());
out.println(" WaitFor: " + stmt.getWaitFor());
out.println(" Block: " + stmt.getBlock());
out.println(" Interrupt: " + stmt.getInterrupt());
});
- out.println("+ ExternalEvents: " + externalEvents);
+ out.println("+ ExternalEvents: " + bpss.getExternalEvents());
out.println("-- Selectable Events -----------");
if ( selectableEvents.isEmpty() ){
@@ -80,8 +79,8 @@ public Set selectableEvents(Set statements, List
}
@Override
- public Optional select(Set statements, List externalEvents, Set selectableEvents) {
- Optional selectedEvent = getDecorated().select(statements, externalEvents, selectableEvents);
+ public Optional select(BProgramSyncSnapshot bpss, Set selectableEvents) {
+ Optional selectedEvent = getDecorated().select(bpss, selectableEvents);
out.println("== Actual Event Selection ======");
out.println( selectedEvent.toString() );
out.println("================================");
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/OrderedEventSelectionStrategy.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/OrderedEventSelectionStrategy.java
index 32a0ce7b..107b7efa 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/OrderedEventSelectionStrategy.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/OrderedEventSelectionStrategy.java
@@ -25,6 +25,7 @@
import il.ac.bgu.cs.bp.bpjs.model.SyncStatement;
import il.ac.bgu.cs.bp.bpjs.model.BEvent;
+import il.ac.bgu.cs.bp.bpjs.model.BProgramSyncSnapshot;
import il.ac.bgu.cs.bp.bpjs.model.eventsets.ComposableEventSet;
import il.ac.bgu.cs.bp.bpjs.model.eventsets.EventSet;
import il.ac.bgu.cs.bp.bpjs.model.eventsets.EventSets;
@@ -50,7 +51,10 @@
public class OrderedEventSelectionStrategy extends AbstractEventSelectionStrategy {
@Override
- public Set selectableEvents(Set statements, List externalEvents) {
+ public Set selectableEvents(BProgramSyncSnapshot bpss) {
+ Set statements = bpss.getStatements();
+ List externalEvents = bpss.getExternalEvents();
+
if ( statements.isEmpty() ) {
// Corner case, not sure this is even possible.
return externalEvents.isEmpty() ? emptySet() : singleton(externalEvents.get(0));
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/PausingEventSelectionStrategyDecorator.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/PausingEventSelectionStrategyDecorator.java
index 7a75a699..af3584ca 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/PausingEventSelectionStrategyDecorator.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/PausingEventSelectionStrategyDecorator.java
@@ -25,8 +25,7 @@
import il.ac.bgu.cs.bp.bpjs.model.BEvent;
import il.ac.bgu.cs.bp.bpjs.model.BProgram;
-import il.ac.bgu.cs.bp.bpjs.model.SyncStatement;
-import java.util.List;
+import il.ac.bgu.cs.bp.bpjs.model.BProgramSyncSnapshot;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.locks.ReadWriteLock;
@@ -61,8 +60,8 @@ public PausingEventSelectionStrategyDecorator(ESS decorated) {
}
@Override
- public Optional select(Set statements, List externalEvents, Set selectableEvents) {
- Optional res = getDecorated().select(statements, externalEvents, selectableEvents);
+ public Optional select(BProgramSyncSnapshot bpss, Set selectableEvents) {
+ Optional res = getDecorated().select(bpss, selectableEvents);
lock.readLock().lock();
listener.eventSelectionPaused(this);
lock.writeLock().lock(); // blocks while the read lock is locked.
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/PrioritizedBSyncEventSelectionStrategy.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/PrioritizedBSyncEventSelectionStrategy.java
index 5de024b0..498cd662 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/PrioritizedBSyncEventSelectionStrategy.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/PrioritizedBSyncEventSelectionStrategy.java
@@ -25,6 +25,7 @@
import il.ac.bgu.cs.bp.bpjs.model.SyncStatement;
import il.ac.bgu.cs.bp.bpjs.model.BEvent;
+import il.ac.bgu.cs.bp.bpjs.model.BProgramSyncSnapshot;
import il.ac.bgu.cs.bp.bpjs.model.eventsets.ComposableEventSet;
import il.ac.bgu.cs.bp.bpjs.model.eventsets.EventSet;
import il.ac.bgu.cs.bp.bpjs.model.eventsets.EventSets;
@@ -57,7 +58,10 @@ public PrioritizedBSyncEventSelectionStrategy() {
}
@Override
- public Set selectableEvents(Set statements, List externalEvents) {
+ public Set selectableEvents(BProgramSyncSnapshot bpss) {
+
+ Set statements = bpss.getStatements();
+ List externalEvents = bpss.getExternalEvents();
EventSet blocked = ComposableEventSet.anyOf(statements.stream()
.filter( stmt -> stmt!=null )
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/PrioritizedBThreadsEventSelectionStrategy.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/PrioritizedBThreadsEventSelectionStrategy.java
index 22316ac5..5afde4ed 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/PrioritizedBThreadsEventSelectionStrategy.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/PrioritizedBThreadsEventSelectionStrategy.java
@@ -6,7 +6,6 @@
import static java.util.stream.Collectors.toSet;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@@ -15,12 +14,14 @@
import il.ac.bgu.cs.bp.bpjs.model.SyncStatement;
import il.ac.bgu.cs.bp.bpjs.model.BEvent;
+import il.ac.bgu.cs.bp.bpjs.model.BProgramSyncSnapshot;
import il.ac.bgu.cs.bp.bpjs.model.eventsets.ComposableEventSet;
import il.ac.bgu.cs.bp.bpjs.model.eventsets.EventSet;
import il.ac.bgu.cs.bp.bpjs.model.eventsets.EventSets;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
+import java.util.List;
import java.util.stream.Stream;
/**
@@ -46,7 +47,10 @@ public PrioritizedBThreadsEventSelectionStrategy() {
}
@Override
- public Set selectableEvents(Set statements, List externalEvents) {
+ public Set selectableEvents(BProgramSyncSnapshot bpss) {
+ Set statements = bpss.getStatements();
+ List externalEvents = bpss.getExternalEvents();
+
if ( statements.isEmpty() ) {
// Corner case, not sure this is even possible.
return externalEvents.isEmpty() ? emptySet() : singleton(externalEvents.get(0));
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/SimpleEventSelectionStrategy.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/SimpleEventSelectionStrategy.java
index c4128c97..e90212d7 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/SimpleEventSelectionStrategy.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/SimpleEventSelectionStrategy.java
@@ -2,6 +2,7 @@
import il.ac.bgu.cs.bp.bpjs.model.SyncStatement;
import il.ac.bgu.cs.bp.bpjs.model.BEvent;
+import il.ac.bgu.cs.bp.bpjs.model.BProgramSyncSnapshot;
import il.ac.bgu.cs.bp.bpjs.model.eventsets.ComposableEventSet;
import il.ac.bgu.cs.bp.bpjs.model.eventsets.EventSet;
import il.ac.bgu.cs.bp.bpjs.model.eventsets.EventSets;
@@ -36,7 +37,9 @@ public SimpleEventSelectionStrategy() {}
@Override
- public Set selectableEvents(Set statements, List externalEvents) {
+ public Set selectableEvents(BProgramSyncSnapshot bpss) {
+ Set statements = bpss.getStatements();
+ List externalEvents = bpss.getExternalEvents();
if ( statements.isEmpty() ) {
// Corner case, not sure this is even possible.
return externalEvents.isEmpty() ? emptySet() : singleton(externalEvents.get(0));
diff --git a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/internal/ContinuationProgramState.java b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/internal/ContinuationProgramState.java
index d0355380..ef63b432 100644
--- a/src/main/java/il/ac/bgu/cs/bp/bpjs/model/internal/ContinuationProgramState.java
+++ b/src/main/java/il/ac/bgu/cs/bp/bpjs/model/internal/ContinuationProgramState.java
@@ -56,15 +56,19 @@
* @author michael
*/
public class ContinuationProgramState {
- private final Map