Search in sources :

Example 31 with BEvent

use of il.ac.bgu.cs.bp.bpjs.model.BEvent in project BPjs by bThink-BGU.

the class AddingBthreadsTest method superStepTest.

@Test
public void superStepTest() throws InterruptedException {
    final BEvent parentDone = new BEvent("parentDone");
    final BEvent kidADone = new BEvent("kidADone");
    final BEvent kidBDone = new BEvent("kidBDone");
    BProgramRunner sut = new BProgramRunner(new SingleResourceBProgram("AddingBthreads.js"));
    sut.addListener(new PrintBProgramRunnerListener());
    InMemoryEventLoggingListener eventLogger = sut.addListener(new InMemoryEventLoggingListener());
    sut.run();
    EventSet kiddies = il.ac.bgu.cs.bp.bpjs.model.eventsets.ComposableEventSet.anyOf(kidADone, kidBDone);
    EventPattern expected = new EventPattern().append(kiddies).append(kiddies).append(parentDone).append(kiddies).append(kiddies).append(parentDone);
    System.out.println("Actual events:");
    eventLogger.getEvents().forEach(System.out::println);
    System.out.println("/Actual events");
    assertTrue(expected.matches(eventLogger.getEvents()));
}
Also used : PrintBProgramRunnerListener(il.ac.bgu.cs.bp.bpjs.execution.listeners.PrintBProgramRunnerListener) EventPattern(il.ac.bgu.cs.bp.bpjs.analysis.eventpattern.EventPattern) BProgramRunner(il.ac.bgu.cs.bp.bpjs.execution.BProgramRunner) EventSet(il.ac.bgu.cs.bp.bpjs.model.eventsets.EventSet) SingleResourceBProgram(il.ac.bgu.cs.bp.bpjs.model.SingleResourceBProgram) InMemoryEventLoggingListener(il.ac.bgu.cs.bp.bpjs.execution.listeners.InMemoryEventLoggingListener) BEvent(il.ac.bgu.cs.bp.bpjs.model.BEvent) Test(org.junit.Test)

Example 32 with BEvent

use of il.ac.bgu.cs.bp.bpjs.model.BEvent in project BPjs by bThink-BGU.

the class InterruptHandlerTest method echoEventTest.

@Test
public void echoEventTest() throws InterruptedException {
    BProgramRunner sut = new BProgramRunner(new SingleResourceBProgram("InterruptHandler.js"));
    sut.addListener(new PrintBProgramRunnerListener());
    InMemoryEventLoggingListener eventLogger = sut.addListener(new InMemoryEventLoggingListener());
    sut.run();
    eventLogger.getEvents().forEach(e -> System.out.println(e));
    EventPattern expected = new EventPattern().append(new BEvent("boom")).append(new BEvent("boom")).append(new BEvent("internalValue"));
    assertTrue(expected.matches(eventLogger.getEvents()));
}
Also used : PrintBProgramRunnerListener(il.ac.bgu.cs.bp.bpjs.execution.listeners.PrintBProgramRunnerListener) EventPattern(il.ac.bgu.cs.bp.bpjs.analysis.eventpattern.EventPattern) BProgramRunner(il.ac.bgu.cs.bp.bpjs.execution.BProgramRunner) SingleResourceBProgram(il.ac.bgu.cs.bp.bpjs.model.SingleResourceBProgram) InMemoryEventLoggingListener(il.ac.bgu.cs.bp.bpjs.execution.listeners.InMemoryEventLoggingListener) BEvent(il.ac.bgu.cs.bp.bpjs.model.BEvent) Test(org.junit.Test)

Example 33 with BEvent

use of il.ac.bgu.cs.bp.bpjs.model.BEvent in project BPjs by bThink-BGU.

the class BProgramRunner method run.

@Override
public void run() {
    try {
        // setup bprogram and runtime parts.
        execSvc = ExecutorServiceMaker.makeWithName("BProgramRunner-" + instanceNum);
        failedAssertion = null;
        listeners.forEach(l -> l.starting(bprog));
        BProgramSyncSnapshot cur = bprog.setup();
        cur.getBThreadSnapshots().forEach(sn -> listeners.forEach(l -> l.bthreadAdded(bprog, sn)));
        // start it
        listeners.forEach(l -> l.started(bprog));
        cur = cur.start(execSvc);
        boolean go = true;
        if (!cur.isStateValid()) {
            failedAssertion = cur.getFailedAssertion();
            listeners.forEach(l -> l.assertionFailed(bprog, failedAssertion));
            go = false;
        }
        // while snapshot not empty, select an event and get the next snapshot.
        while ((!cur.noBThreadsLeft()) && go) {
            // see which events are selectable
            Set<BEvent> possibleEvents = bprog.getEventSelectionStrategy().selectableEvents(cur.getStatements(), cur.getExternalEvents());
            if (possibleEvents.isEmpty()) {
                // No events available or selection. Terminate or wait for external one (in daemon mode).
                if (bprog.isDaemonMode()) {
                    listeners.forEach(l -> l.superstepDone(bprog));
                    // and now we wait.
                    BEvent next = bprog.takeExternalEvent();
                    if (next == null) {
                        // program is not a daemon anymore.
                        go = false;
                    } else {
                        cur.getExternalEvents().add(next);
                    }
                } else {
                    // Ending the program - no selectable event.
                    listeners.forEach(l -> l.superstepDone(bprog));
                    go = false;
                }
            } else {
                // we can select some events - select one and advance.
                Optional<EventSelectionResult> res = bprog.getEventSelectionStrategy().select(cur.getStatements(), cur.getExternalEvents(), possibleEvents);
                if (res.isPresent()) {
                    EventSelectionResult esr = res.get();
                    if (!esr.getIndicesToRemove().isEmpty()) {
                        // the event selection affcted the external event queue.
                        List<BEvent> updatedExternals = new ArrayList<>(cur.getExternalEvents());
                        esr.getIndicesToRemove().stream().sorted(reverseOrder()).forEach(idxObj -> updatedExternals.remove(idxObj.intValue()));
                        cur = cur.copyWith(updatedExternals);
                    }
                    listeners.forEach(l -> l.eventSelected(bprog, esr.getEvent()));
                    cur = cur.triggerEvent(esr.getEvent(), execSvc, listeners);
                    if (!cur.isStateValid()) {
                        failedAssertion = cur.getFailedAssertion();
                        listeners.forEach(l -> l.assertionFailed(bprog, failedAssertion));
                        go = false;
                    }
                } else {
                    // edge case: we can select events, but we didn't. Might be a bug in the EventSelectionStrategy.
                    go = false;
                }
            }
        }
        listeners.forEach(l -> l.ended(bprog));
    } catch (InterruptedException itr) {
        System.err.println("BProgramRunner interrupted: " + itr.getMessage());
    } finally {
        execSvc.shutdown();
    }
}
Also used : BProgram(il.ac.bgu.cs.bp.bpjs.model.BProgram) BProgramSyncSnapshot(il.ac.bgu.cs.bp.bpjs.model.BProgramSyncSnapshot) EventSelectionStrategy(il.ac.bgu.cs.bp.bpjs.model.eventselection.EventSelectionStrategy) Set(java.util.Set) ArrayList(java.util.ArrayList) List(java.util.List) FailedAssertion(il.ac.bgu.cs.bp.bpjs.model.FailedAssertion) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Collections.reverseOrder(java.util.Collections.reverseOrder) Optional(java.util.Optional) BEvent(il.ac.bgu.cs.bp.bpjs.model.BEvent) BProgramRunnerListener(il.ac.bgu.cs.bp.bpjs.execution.listeners.BProgramRunnerListener) EventSelectionResult(il.ac.bgu.cs.bp.bpjs.model.eventselection.EventSelectionResult) ExecutorService(java.util.concurrent.ExecutorService) ExecutorServiceMaker(il.ac.bgu.cs.bp.bpjs.internal.ExecutorServiceMaker) EventSelectionResult(il.ac.bgu.cs.bp.bpjs.model.eventselection.EventSelectionResult) ArrayList(java.util.ArrayList) BProgramSyncSnapshot(il.ac.bgu.cs.bp.bpjs.model.BProgramSyncSnapshot) BEvent(il.ac.bgu.cs.bp.bpjs.model.BEvent)

Example 34 with BEvent

use of il.ac.bgu.cs.bp.bpjs.model.BEvent in project BPjs by bThink-BGU.

the class BThreadJsProxy method bsync.

@Deprecated
public void bsync(NativeObject jsRWB, Object data) {
    if (!deprecationWarningPrinted) {
        deprecationWarningPrinted = true;
        System.err.println("Warning: bsync is deprecated and will be removed shortly. Please use bp.sync instead.");
    }
    Map<String, Object> jRWB = (Map) Context.jsToJava(jsRWB, Map.class);
    BSyncStatement stmt = BSyncStatement.make();
    Object req = jRWB.get("request");
    if (req != null) {
        if (req instanceof BEvent) {
            stmt = stmt.request((BEvent) req);
        } else if (req instanceof NativeArray) {
            NativeArray arr = (NativeArray) req;
            stmt = stmt.request(Arrays.asList(arr.getIndexIds()).stream().map(i -> (BEvent) arr.get(i)).collect(toList()));
        }
    }
    stmt = stmt.waitFor(convertToEventSet(jRWB.get("waitFor"))).block(convertToEventSet(jRWB.get("block"))).interrupt(convertToEventSet(jRWB.get("interrupt"))).data(data);
    captureBThreadState(stmt);
}
Also used : NativeArray(org.mozilla.javascript.NativeArray) BSyncStatement(il.ac.bgu.cs.bp.bpjs.model.BSyncStatement) NativeObject(org.mozilla.javascript.NativeObject) BEvent(il.ac.bgu.cs.bp.bpjs.model.BEvent) Map(java.util.Map)

Example 35 with BEvent

use of il.ac.bgu.cs.bp.bpjs.model.BEvent in project BPjs by bThink-BGU.

the class DfsBProgramVerifier method getUnvisitedNextNode.

protected Node getUnvisitedNextNode(Node src, ExecutorService execSvc) throws Exception {
    while (src.getEventIterator().hasNext()) {
        final BEvent nextEvent = src.getEventIterator().next();
        Node possibleNextNode = src.getNextNode(nextEvent, execSvc);
        if (!visited.isVisited(possibleNextNode)) {
            return possibleNextNode;
        }
    }
    return null;
}
Also used : BEvent(il.ac.bgu.cs.bp.bpjs.model.BEvent)

Aggregations

BEvent (il.ac.bgu.cs.bp.bpjs.model.BEvent)37 Test (org.junit.Test)25 SingleResourceBProgram (il.ac.bgu.cs.bp.bpjs.model.SingleResourceBProgram)16 BProgramRunner (il.ac.bgu.cs.bp.bpjs.execution.BProgramRunner)13 InMemoryEventLoggingListener (il.ac.bgu.cs.bp.bpjs.execution.listeners.InMemoryEventLoggingListener)13 PrintBProgramRunnerListener (il.ac.bgu.cs.bp.bpjs.execution.listeners.PrintBProgramRunnerListener)13 BSyncStatement (il.ac.bgu.cs.bp.bpjs.model.BSyncStatement)9 EventPattern (il.ac.bgu.cs.bp.bpjs.analysis.eventpattern.EventPattern)8 BProgram (il.ac.bgu.cs.bp.bpjs.model.BProgram)8 BThreadSyncSnapshot (il.ac.bgu.cs.bp.bpjs.model.BThreadSyncSnapshot)7 StringBProgram (il.ac.bgu.cs.bp.bpjs.model.StringBProgram)6 Context (org.mozilla.javascript.Context)6 BProgramSyncSnapshot (il.ac.bgu.cs.bp.bpjs.model.BProgramSyncSnapshot)5 EventSet (il.ac.bgu.cs.bp.bpjs.model.eventsets.EventSet)5 HashSet (java.util.HashSet)5 List (java.util.List)5 Set (java.util.Set)5 ComposableEventSet (il.ac.bgu.cs.bp.bpjs.model.eventsets.ComposableEventSet)4 EventSets (il.ac.bgu.cs.bp.bpjs.model.eventsets.EventSets)4 Collections.emptySet (java.util.Collections.emptySet)4