/* Size of stack to allocate for a thread. */
#define STACK_SIZE (1024 * 1024)
+/** Dump schedule extracted from SAT Solution */
+//#define DUMP_SAT_SCHEDULE
+
/** Enable debugging assertions (via ASSERT()) */
//#define CONFIG_ASSERT
ExecPoint *yieldep=record->getEP();
EPRecord *prevyield=NULL;
ExecPoint *prevyieldep=NULL;
-
+
for(int i=(int)(yieldlist->size()-1);i>=0;i--) {
EPRecord *tmpyield=(*yieldlist)[i];
ExecPoint *tmpep=tmpyield->getEP();
- //Do we have a previous yield operation
- if (yieldep->compare(tmpep)==CR_BEFORE) {
+ //Do we have a previous yield operation from the same thread
+ if (tmpep->get_tid()==yieldep->get_tid() &&
+ yieldep->compare(tmpep)==CR_BEFORE) {
//Yes
prevyield=tmpyield;
prevyieldep=prevyield->getEP();
break;
}
}
-
+
yieldlist->push_back(record);
ModelVector<Constraint *> * novel_branches=new ModelVector<Constraint *>();
while(sri->hasNext()) {
EPRecord * unexploredbranch=sri->next();
ExecPoint * branchep=unexploredbranch->getEP();
+ if (branchep->get_tid()!=yieldep->get_tid()) {
+ //wrong thread
+ continue;
+ }
+
if (yieldep->compare(branchep)!=CR_BEFORE) {
//Branch does not occur before yield, so skip
continue;
if (prevyield != NULL &&
prevyieldep->compare(branchep)==CR_BEFORE) {
//Branch occurs before previous yield, so we can safely skip this branch
- continue;
+ continue;
}
-
//This is a branch that could prevent this yield from being executed
BranchRecord *br=branchtable->get(unexploredbranch);
Constraint * novel_branch=br->getNewBranch();
EPRecord *next=processRecord(record, satsolution);
#ifdef TSO
if (next != NULL) {
-
if (next->getType()==STORE) {
stores[index]->push_back(next);
next=getNextRecord(next);
}
#endif
if (next!=record) {
+#ifdef DUMP_SAT_SCHEDULE
+ neatPrint(record, cg, satsolution);
+#endif
threads[index]=next;
index=index-1;
}
if (earliest == NULL)
break;
+#ifdef DUMP_SAT_SCHEDULE
+ neatPrint(earliest, cg, satsolution);
+#endif
+
for(uint index=0;index<threads.size();index++) {
EPRecord *record=threads[index];
if (record==earliest) {