From fdd0c896cb4e88ee571856b71b3af2a8270f11f3 Mon Sep 17 00:00:00 2001
From: chihebabid <chiheb.abid@fst.utm.tn>
Date: Sun, 3 Jul 2022 17:19:33 +0100
Subject: [PATCH] Fix NDFS initialization

---
 src/algorithm/CNDFS.cpp | 22 +++++++++-------------
 src/algorithm/CNDFS.h   | 15 +++++++--------
 2 files changed, 16 insertions(+), 21 deletions(-)

diff --git a/src/algorithm/CNDFS.cpp b/src/algorithm/CNDFS.cpp
index f05c86b..6786df6 100644
--- a/src/algorithm/CNDFS.cpp
+++ b/src/algorithm/CNDFS.cpp
@@ -22,6 +22,7 @@ using namespace std;
 
 CNDFS::CNDFS(ModelCheckBaseMT *mcl, const spot::twa_graph_ptr &af, const uint16_t &nbTh) : mMcl(mcl), mAa(af), mNbTh(nbTh)
 {
+    getInitialState();
     spawnThreads();
 }
 
@@ -43,22 +44,17 @@ void CNDFS::spawnThreads() {
 }
 
 void CNDFS::threadHandler(void *context) {
-    _state* state = ((CNDFS *) context)->getInitialState();
-    ((CNDFS *) context)->dfsBlue(state);
+    ((CNDFS *) context)->dfsBlue(((CNDFS *) context)->mInitStatePtr);
 }
 
 //get initial state of the product automata
-_state* CNDFS::getInitialState(){
-    mMutex.lock();
-    _state * initStatePtr  = static_cast<_state *>(malloc(sizeof(_state)));
-    initStatePtr->left = mMcl->getInitialMetaState();
-    initStatePtr->right = mAa->get_init_state();
-    initStatePtr->new_successors =  static_cast<vector<pair<_state *, int>>>(NULL);
-    initStatePtr->isAcceptance = mAa->state_is_accepting(mAa->get_init_state());
-    initStatePtr->isConstructed = true;
-    mMutex.unlock();
-//    sharedPool.push_back(make_pair(initStatePtr->left,initStatePtr->right));
-    return initStatePtr;
+void CNDFS::getInitialState(){
+    mInitStatePtr  = new _state; //static_cast<_state *>(malloc(sizeof(_state)));
+    mInitStatePtr->left = mMcl->getInitialMetaState();
+    mInitStatePtr->right = mAa->get_init_state();
+    //mInitStatePtr->new_successors = nullptr;
+    mInitStatePtr->isAcceptance = mAa->state_is_accepting(mAa->get_init_state());
+    mInitStatePtr->isConstructed = true;
 }
 
 
diff --git a/src/algorithm/CNDFS.h b/src/algorithm/CNDFS.h
index 5859d35..f4b189c 100644
--- a/src/algorithm/CNDFS.h
+++ b/src/algorithm/CNDFS.h
@@ -20,28 +20,28 @@ struct myState{
     LDDState *left;
     const spot::twa_graph_state* right;
     vector<pair<struct myState*, int>> new_successors;
-    atomic_bool isAcceptance {false};
-    atomic_bool isConstructed {false};
+    atomic<bool> isAcceptance {false};
+    atomic<bool> isConstructed {false};
     bool cyan {false};
-    atomic_bool blue {false};
-    atomic_bool red {false};
+    atomic<bool> blue {false};
+    atomic<bool> red {false};
 };
 typedef struct myState _state; // @alias
 
 class CNDFS {
-
 private:
     static constexpr uint8_t MAX_THREADS=64;
     ModelCheckBaseMT * mMcl;
     spot::twa_graph_ptr mAa;
     uint16_t mNbTh;
     atomic<uint8_t> mIdThread;
-    static void threadHandler(void *context);
     std::thread* mlThread[MAX_THREADS];
     mutex mMutex;
     condition_variable cv;
     void spawnThreads();
-
+    _state * mInitStatePtr;
+    void getInitialState();
+    static void threadHandler(void *context);
 public:
 
 //    typedef myState _state;
@@ -53,7 +53,6 @@ public:
     virtual ~CNDFS();
     void computeSuccessors(_state *state);
     void dfsBlue(_state *state);
-    _state* getInitialState();
     void dfsRed(_state* state, deque<_state*> mydeque);
     void WaitForTestCompleted(_state* state);
     atomic_bool awaitCondition(_state* state,deque<_state*> mydeque);
-- 
GitLab