changeset 889:ece1428e8a27

random selection all Philosopher
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 25 Jan 2021 20:44:24 +0900
parents ebe90be297a4
children 1caa59b7f228
files src/parallel_execution/ModelChecking/MCWorker.cbc src/parallel_execution/SingleLinkedQueue.cbc
diffstat 2 files changed, 37 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/ModelChecking/MCWorker.cbc	Mon Jan 25 20:12:04 2021 +0900
+++ b/src/parallel_execution/ModelChecking/MCWorker.cbc	Mon Jan 25 20:44:24 2021 +0900
@@ -1,5 +1,8 @@
 #include "../../context.h"
 #include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
 #interface "TaskManager.h"
 #interface "Worker.h"
 #interface "Iterator.h"
@@ -7,6 +10,8 @@
 #interface "SingleLinkedQueue.h"
 
 static void startWorker(Worker* worker);
+extern int lengthSingleLinkedQueue(struct SingleLinkedQueue* queue);
+extern Element* getElementByIdx(struct SingleLinkedQueue* queue, int idx);
 
 Worker* createMCWorker(struct Context* context, int id, Queue* queue) {
     struct Worker* worker = new Worker();
@@ -18,6 +23,7 @@
     mcWorker->loopCounter = 0;
     worker->taskReceive = C_taskReceiveMCWorker;
     worker->shutdown = C_shutdownMCWorker;
+    srandom(time(NULL));
     pthread_create(&worker->thread, NULL, (void*)&startWorker, worker);
     return worker;
 }
@@ -36,10 +42,14 @@
     goto tasks->take(getTaskMCWorker);
 }
 
+
 __code startModelChecker(struct MCWorker* worker) {
     struct SingleLinkedQueue* mcQueue =  (struct SingleLinkedQueue*)worker->mcQueue->queue;
     struct Element* elem = mcQueue->top;
     elem = elem->next;
+    int length = lengthSingleLinkedQueue(mcQueue);
+    int idx = random()%(length+1); // incase of multithread use random_r
+    elem = getElementByIdx(mcQueue, idx);
     struct Context* ncontext = (struct Context*)elem->data;
     goto meta(ncontext, ncontext->next);
 }
--- a/src/parallel_execution/SingleLinkedQueue.cbc	Mon Jan 25 20:12:04 2021 +0900
+++ b/src/parallel_execution/SingleLinkedQueue.cbc	Mon Jan 25 20:44:24 2021 +0900
@@ -33,7 +33,8 @@
 }
 
 __code clearSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(...)) {
-    queue->top = NULL;
+    queue->top->next = NULL;
+    queue->last = queue->top;
     goto next(...);
 }
 
@@ -66,3 +67,28 @@
     }
 }
 
+
+int lengthSingleLinkedQueue(struct SingleLinkedQueue* queue) {
+    int length = 0;
+    struct Element* current = queue->top;
+
+    while (current->next != NULL) {
+      length++;
+      current = current->next;
+    }
+
+    return length - 1; // top is dummy
+}
+
+
+Element* getElementByIdx(struct SingleLinkedQueue* queue, int idx) {
+    struct Element* current = queue->top;
+
+    while (current->next != NULL){
+      if (idx-- == 0 ) {
+        return current->next;
+      }
+      current = current->next;
+    }
+    return queue->top;
+}