Skip to content

Commit

Permalink
[DROOLS-751] turn halt invocation into a propagation entry
Browse files Browse the repository at this point in the history
  • Loading branch information
mariofusco committed Nov 17, 2015
1 parent b9f1bb9 commit 83a501c
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1261,9 +1261,6 @@ public void fireUntilHalt(final AgendaFilter agendaFilter) {
PropagationEntry head = tryHalt();
while (head != null) {
workingMemory.flushPropagationsOnFireUntilHalt( fireNextItem( agendaFilter, 0, -1 ) > 0, head );
if (currentState == ExecutionState.FORCE_HALTING) {
break;
}
head = workingMemory.takeAllPropagations();
}

Expand Down Expand Up @@ -1300,6 +1297,9 @@ public int fireAllRules(AgendaFilter agendaFilter,
while (head != null) {
fireCount += fireNextItem( agendaFilter, fireCount, fireLimit );
SynchronizedPropagationList.flush(workingMemory, head);
if (currentState == ExecutionState.FORCE_HALTING) {
break;
}
head = workingMemory.takeAllPropagations();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1252,8 +1252,21 @@ public InternalKnowledgeBase getKnowledgeBase() {
}

public void halt() {
this.agenda.halt();
notifyHalt();
propagationList.addEntryToTop( new Halt() );
}

private static class Halt extends PropagationEntry.AbstractPropagationEntry {

@Override
public void execute( InternalWorkingMemory wm ) {
wm.getAgenda().halt();
wm.notifyHalt();
}

@Override
public String toString() {
return "Halt";
}
}

public int fireAllRules() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

public interface PropagationList {
void addEntry(PropagationEntry propagationEntry);
void addEntryToTop(PropagationEntry propagationEntry);

PropagationEntry takeAll();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ public SynchronizedBypassPropagationList(InternalWorkingMemory workingMemory) {

@Override
public void addEntry(final PropagationEntry propagationEntry) {
doAddEntry( propagationEntry, false );
}

private void doAddEntry( final PropagationEntry propagationEntry, final boolean addToTop ) {
workingMemory.getAgenda().executeTask( new ExecutableEntry() {
@Override
public void execute() {
Expand All @@ -40,18 +44,31 @@ public void execute() {
flush();
}
} else {
internalAddEntry( propagationEntry );
doAdd();
}
}

@Override
public void enqueue() {
internalAddEntry( propagationEntry );
doAdd();
}

private void doAdd() {
if (addToTop) {
SynchronizedBypassPropagationList.super.addEntryToTop( propagationEntry );
} else {
internalAddEntry( propagationEntry );
}
}
});
notifyHalt();
}

@Override
public void addEntryToTop(PropagationEntry propagationEntry ) {
doAddEntry( propagationEntry, true );
}

@Override
public void flush() {
if (!executing.get()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,20 @@ public void enqueue() {
}
}

@Override
public synchronized void addEntryToTop(final PropagationEntry entry) {
boolean wasEmpty = head == null;
if ( !wasEmpty ) {
entry.setNext( head );
tail = head;
}
head = entry;

if ( wasEmpty ) {
notifyHalt();
}
}

protected synchronized void internalAddEntry( PropagationEntry entry ) {
boolean wasEmpty = head == null;
if ( wasEmpty ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ public void addEntry(PropagationEntry propagationEntry) {
propagationEntry.execute(workingMemory);
}

@Override
public void addEntryToTop(PropagationEntry propagationEntry) {
addEntry(propagationEntry);
}

@Override
public PropagationEntry takeAll() {
return null;
Expand Down

0 comments on commit 83a501c

Please sign in to comment.