Mercurial > hg > Gears > Gears
changeset 904:4ca02394a09c
...
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 27 Jan 2021 19:01:14 +0900 |
parents | c9bd13e2ac59 |
children | 840458851072 |
files | src/parallel_execution/MCWorker.h src/parallel_execution/ModelChecking/MCWorker.cbc src/parallel_execution/SingleLinkedQueue.cbc src/parallel_execution/lib/Gears/Template/Context.pm |
diffstat | 4 files changed, 60 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/src/parallel_execution/MCWorker.h Wed Jan 27 17:06:14 2021 +0900 +++ b/src/parallel_execution/MCWorker.h Wed Jan 27 19:01:14 2021 +0900 @@ -1,15 +1,19 @@ #include "ModelChecking/state_db.h" #include "ModelChecking/memory.h" +#include "ModelChecking/TaskIterator.h" typedef struct MCWorker <> { pthread_mutex_t mutex; pthread_cond_t cond; - struct Context* context; + struct Context* context; //simulated task + struct Context* mcContext; // context for mcWorker + struct Context* masterContext; // context for McTaskManager (singleton) int id; int loopCounter; - struct Queue* mcQueue; + struct Queue* mcQueue; // simulated task queue par thread enum Code nextStep; - struct Context* mcContext; - StateDB state; StateNode st; + TaskIterator* task_iter; + int depth; + int count; } MCWorker;
--- a/src/parallel_execution/ModelChecking/MCWorker.cbc Wed Jan 27 17:06:14 2021 +0900 +++ b/src/parallel_execution/ModelChecking/MCWorker.cbc Wed Jan 27 19:01:14 2021 +0900 @@ -22,8 +22,10 @@ worker->worker = (union Data*)mcWorker; worker->tasks = queue; mcWorker->id = id; + mcWorker->depth = 0; + mcWorker->count = 0; mcWorker->mcContext = NULL; - mcWorker->state = NULL; + mcWorker->masterContext = context; //singleton mcWorker->loopCounter = 0; mcWorker->nextStep = C_startModelChecker; worker->taskReceive = C_taskReceiveMCWorker; @@ -65,14 +67,49 @@ goto meta(ncontext, ncontext->next); } +extern TaskIterator* createQueueIterator(Element* elements, StateDB s, TaskIterator* prev); +extern Element* takeNextIterator(TaskIterator* iterator); +extern void freeIterator(TaskIterator* iterator); + __ncode mcMeta(struct Context* context, enum Code next) { - StateDB out; + context->next = next; // remember next Code Gear struct MCWorker* mcworker = (struct MCWorker*) context->worker->worker; - if (lookup_StateDB(&mcworker->st, &mcworker->state, &out)) { + StateDB out = NULL; + struct Context* list = NULL; + + mcworker->st.hash = get_memory_hash(context->mem,0); + if (lookup_StateDB(&mcworker->st, &mcworker->masterContext->state_db, &out)) { + // found in the state database + //printf("found %d\n",count); + while(!(list = (struct Context*)takeNextIterator(task_iter))) { + // no more branch, go back to the previous one + TaskIterator* prev_iter = task_iter->prev; + if (!prev_iter) { + printf("All done count %d\n",mcworker->count); + memory_usage(); + exit(0); + } + //printf("no more branch %d\n",count); + mcworker->depth--; + freeIterator(task_iter); + mcworker->task_iter = prev_iter; + } + // return to previous state + // here we assume task list is fixed, we don't have to + // recover task list itself + restore_memory(task_iter->state->memory); + //printf("restore list %x next %x\n",(int)list,(int)(list->next)); + } else { + // one step further + mcworker->depth++; + struct SingleLinkedQueue* mcSingleQueue = (struct SingleLinkedQueue*)mcworker->mcQueue->queue; + mcworker->task_iter = createQueueIterator(mcSingleQueue->top->next,out,task_iter); } - context->next = next; - goto meta(mcworker->context, mcworker->nextStep); + //printf("depth %d count %d\n", depth, count++); + mcworker->count++; + //goto list->phils->next(list->phils,list); + goto meta(context, next); } __code getTaskMCWorker(struct MCWorker* mcWorker, struct Context* task, struct Worker* worker) {
--- a/src/parallel_execution/SingleLinkedQueue.cbc Wed Jan 27 17:06:14 2021 +0900 +++ b/src/parallel_execution/SingleLinkedQueue.cbc Wed Jan 27 19:01:14 2021 +0900 @@ -95,25 +95,17 @@ } -typedef struct task_iterator { - Element* prev; - StateDB state; - Element* list; - Element* last; -} TaskIterator, *TaskIteratorPtr; - -TaskIteratorPtr createQueueIterator(struct SingleLinkedQueue* queue, StateDB s, struct Element* prev) { - TaskIteratorPtr new = (TaskIteratorPtr)calloc(1, sizeof(TaskIterator)); +TaskIterator* createQueueIterator(Element* elements, StateDB s, TaskIterator* prev) { + TaskIterator* new = (TaskIterator*)calloc(1, sizeof(TaskIterator)); if (!new) exit(1); new->prev = prev; new->state = s; // - new->list = queue->top; - new->last = queue->last; + new->list = elements; return new; } -Element* takeNextIterator(struct SingleLinkedQueue* queue, TaskIteratorPtr iterator) { +Element* takeNextIterator(TaskIterator* iterator) { struct Element* elem = iterator->list; if (!elem) { return NULL; @@ -124,10 +116,11 @@ return NULL; } - if (next == iterator->last) { - return NULL; - } iterator->list = next; return next; } + +void freeIterator(TaskIterator* iterator) { + free(iterator); +}
--- a/src/parallel_execution/lib/Gears/Template/Context.pm Wed Jan 27 17:06:14 2021 +0900 +++ b/src/parallel_execution/lib/Gears/Template/Context.pm Wed Jan 27 19:01:14 2021 +0900 @@ -109,6 +109,7 @@ #include "c/enumCode.h" #include "ModelChecking/memory.h" +#include "ModelChecking/state_db.h" enum Relational { EQ, @@ -156,6 +157,7 @@ int iterate; struct Iterator* iterator; MemoryPtr mem; + StateDB state_db; }; typedef int Int;