From 18e2926a39f3a02533b37795c6a170d8fe35b1d4 Mon Sep 17 00:00:00 2001
From: Daniela Genius <genius@debussy.soc.lip6.fr>
Date: Wed, 8 Feb 2017 18:02:38 +0100
Subject: [PATCH] bugfix syncchannel (continued)

---
 MPSoC/src/request.c         |  2 ++
 MPSoC/src/request_manager.c | 63 ++++++++++++++++++++++++++-----------
 MPSoC/src/syncchannel.c     | 37 ++++++++++++----------
 3 files changed, 67 insertions(+), 35 deletions(-)

diff --git a/MPSoC/src/request.c b/MPSoC/src/request.c
index 2cb2339a5b..cbae04a3de 100755
--- a/MPSoC/src/request.c
+++ b/MPSoC/src/request.c
@@ -100,10 +100,12 @@ request *getRequestAtIndex(setOfRequests *list, int index) {
 
 request * addToRequestQueue(request *list, request *requestToAdd) {
   request *origin = list;
+  debugMsg("addToRequestQueue");
 
   if (list == NULL) {
     return requestToAdd;
   }
+debugMsg("addToRequestQueue1");
 
   while(list->next != NULL) {
     list = list->next;
diff --git a/MPSoC/src/request_manager.c b/MPSoC/src/request_manager.c
index 1086b91e4e..7988a3f862 100755
--- a/MPSoC/src/request_manager.c
+++ b/MPSoC/src/request_manager.c
@@ -23,7 +23,7 @@ void executeSendSyncTransaction(request *req) {
 
   cpt = 0;
   request* currentReq = req->syncChannel->inWaitQueue;
-  debugMsg("*****Execute send sync tr");
+  //debugMsg("*****Execute send sync transaction");
 
   while(currentReq != NULL) {
     cpt ++;
@@ -52,10 +52,18 @@ void executeSendSyncTransaction(request *req) {
   copyParameters(req, selectedReq);
 
   debugInt("syncchannel address \n", req->syncChannel->mwmr_fifo);
+  debugInt("***syncchannel nbOfParams \n", req->nbOfParams);
   //DG 7.2. req->params
   //sync_write(req->syncChannel->mwmr_fifo, selectedReq->ID, 1 );// transmit ID
-  sync_write(req->syncChannel->mwmr_fifo, selectedReq->ID,  req->params );
-  // debugMsg("after sync write\n");
+  //sync_write(req->syncChannel->mwmr_fifo, selectedReq->ID,  req->params );
+  sync_write(req->syncChannel->mwmr_fifo, req->params,  req->nbOfParams*sizeof(req->params));
+
+  sync_read(req->syncChannel->mwmr_fifo, req->params,  req->nbOfParams*sizeof(req->params));
+
+  //DG 8.2. a-t-on besoin de ID?
+  debugInt("***** req->params", req->params);
+  debugMsg("\n");
+// debugMsg("after sync write\n");
  
   debugMsg("Signaling");
   
@@ -67,7 +75,7 @@ void executeSendSyncTransaction(request *req) {
 void executeReceiveSyncTransaction(request *req) {
   int cpt;
   request *selectedReq;
-  
+  //debugMsg("*****Execute receive sync transaction");
   // At least one transaction available -> must select one randomly
   // First: count how many of them are available
   // Then, select one
@@ -75,7 +83,7 @@ void executeReceiveSyncTransaction(request *req) {
 
   request* currentReq = req->syncChannel->outWaitQueue;
   cpt = 0;
-  debugMsg("Execute receive sync tr");
+  debugMsg("*****Execute receive sync tr");
 
   while(currentReq != NULL) {
     cpt ++;
@@ -104,11 +112,17 @@ void executeReceiveSyncTransaction(request *req) {
   pthread_cond_signal(selectedReq->listOfRequests->wakeupCondition);
 
   debugInt("syncchannel read: address \n",selectedReq->syncChannel->mwmr_fifo);  
+debugInt("syncchannel read: nbOfParams \n",selectedReq->nbOfParams);  
   //sync_read(selectedReq->syncChannel->mwmr_fifo, selectedReq->ID, 1);
   //transmit ID
-  //DG 7.2. params
-  sync_read(selectedReq->syncChannel->mwmr_fifo, selectedReq->ID, &req->params);
+  //DG 8.2. params
+sync_write(selectedReq->syncChannel->mwmr_fifo, selectedReq->params,  selectedReq->nbOfParams*sizeof(selectedReq->params) );
+
+sync_read(selectedReq->syncChannel->mwmr_fifo, selectedReq->params,  selectedReq->nbOfParams*sizeof(selectedReq->params) );
+ //DG 7.2. params
+  //sync_read(selectedReq->syncChannel->mwmr_fifo, selectedReq->ID, &req->params);
   debugMsg("after syncchannel read");
+  debugInt("***** req->params \n", req->params);
   traceSynchroRequest(selectedReq, req);
 }
 
@@ -271,24 +285,31 @@ int executable(setOfRequests *list, int nb) {
     req->executable = 0;
     if (req->delayElapsed) {
       if (req->type == SEND_SYNC_REQUEST) {
+	//DG 8.2. ici le probleme! wait queue empty pour B0 :(
 	debugMsg("Send sync");
-
-	if (req->syncChannel->inWaitQueue != NULL) {
+	debugInt("req->syncChannel->inWaitQueue ",req->syncChannel->inWaitQueue);
+	if (req->syncChannel->inWaitQueue != NULL) {// DG 8.2. non c'est correct: il faut un rendez-vous synchrone entre inqueue et outqueue
+        //if (req->syncChannel->outWaitQueue != NULL) {//DG 8.2.??
 	  debugMsg("Send sync executable");
 	  req->executable = 1;
 	  cpt ++;
-	}  else {
+	  }  else {
 	  debugMsg("Send sync not executable");
-	}
-	//index ++;
+	  }
+	  ////index ++;
       }
 
       if (req->type == RECEIVE_SYNC_REQUEST) {
 	debugMsg("receive sync");
-	if (req->syncChannel->outWaitQueue != NULL) {
+	if (req->syncChannel->outWaitQueue != NULL) {// DG 8.2. non c'est correct: il faut un rendez-vous synchrone entre inqueue et outqueue
+        //if (req->syncChannel->inWaitQueue != NULL) {//DG 8.2.??
 	  req->executable = 1;
+	  debugMsg("Receive sync executable");
 	  cpt ++;
 	}
+ else {
+	  debugMsg("Receive sync not executable");
+	  }
 	//index ++;
       }
 
@@ -362,8 +383,9 @@ void private__makeRequestPending(setOfRequests *list) {
   while(req != NULL) {
     if ((req->delayElapsed) && (!(req->alreadyPending))) {
       if (req->type == SEND_SYNC_REQUEST) {
-	debugMsg("Adding pending request in outWaitqueue");
+	debug2Msg(list->owner,"Adding pending sync request in outWaitqueue");
 	req->syncChannel->outWaitQueue = addToRequestQueue(req->syncChannel->outWaitQueue, req);
+
 	req->alreadyPending = 1;
       }
 
@@ -374,7 +396,7 @@ void private__makeRequestPending(setOfRequests *list) {
       }
 
       if (req->type == SEND_ASYNC_REQUEST) {
-	debugMsg("Adding pending request in outWaitqueue");
+	debugMsg("Adding pending async request in outWaitqueue");
 	req->asyncChannel->outWaitQueue = addToRequestQueue(req->asyncChannel->outWaitQueue, req);
 	req->alreadyPending = 1;
       }
@@ -405,10 +427,12 @@ void private__makeRequestPending(setOfRequests *list) {
 
 void private__makeRequest(request *req) {
   if (req->type == SEND_SYNC_REQUEST) {
+  debugMsg("@@@@@@@@@@@@@@@@@@@@@@@@@@@send");
     executeSendSyncTransaction(req);
   }
 
   if (req->type == RECEIVE_SYNC_REQUEST) {
+debugMsg("##########################receive");
     executeReceiveSyncTransaction(req);
   }
 
@@ -454,11 +478,11 @@ request *private__executeRequests0(setOfRequests *list, int nb) {
   request *req;
   
   // Compute which requests can be executed
-  debugMsg("Counting requests");
+ 
   howMany = executable(list, nb);
-
+ 
   debugInt("Counting requests=", howMany);
-
+ 
   if (howMany == 0) {
     debugMsg("**No pending requests");
     // Must make them pending
@@ -473,6 +497,7 @@ request *private__executeRequests0(setOfRequests *list, int nb) {
   
   // Select a request
   req = list->head;
+
   selectedIndex = (rand() % howMany)+1;
   debugInt("selectedIndex=", selectedIndex);
   realIndex = 0;
@@ -509,7 +534,7 @@ request *private__executeRequests(setOfRequests *list) {
     return list->selectedRequest;
   }
 
-  debugMsg("No request selected -> looking for one!");
+  debug2Msg(list->owner,"No request selected -> looking for one!");
 
   return private__executeRequests0(list, nbOfRequests(list));
 }
diff --git a/MPSoC/src/syncchannel.c b/MPSoC/src/syncchannel.c
index 422e6dafb5..d43a6c892a 100755
--- a/MPSoC/src/syncchannel.c
+++ b/MPSoC/src/syncchannel.c
@@ -28,12 +28,22 @@ void mwmr_sync_flush(struct mwmr_s *fifo){
     }
   return;
   }*/
-//DG 7.2.2017
+//DG 8.2.2017
 int sync_read( struct mwmr_s *fifo, void *_ptr, int lensw ){
-  int i;
-  i = mwmr_try_read(fifo,_ptr,lensw);
-  return i;
+  // debugMsg("###before write ");
+  mwmr_write(fifo,_ptr,1);
+  debugMsg("###before read ");
+  mwmr_read(fifo,_ptr,1);
+  debugMsg("###after read ");
 }
+//DG 7.2.2017
+/*int sync_read( struct mwmr_s *fifo, void *_ptr, int lensw ){
+  int in;
+debugMsg("###before try read \n");
+  in = mwmr_try_read(fifo,_ptr,lensw);
+debugInt("###after try read: %x \n",in);
+  return in;
+  }*/
 
 /* in the case of multi_writer one channel per writer */
 /* we choose ramdomly one of the channels */
@@ -45,7 +55,10 @@ void sync_read_random( struct mwmr_s *fifo[], void *_ptr, int nb_writers){
   while(1){
     /* loop until one single message has been read successfully */  
     rand = computeRandom(0, nb_writers-1); 
+debugMsg("####mwmr channel before try readn");
     if(!(in=mwmr_try_read(fifo[rand],_ptr,1))) continue;   
+ debugInt("####mwmr channel after try read: ",in);
+debugMsg("\n");
     }
   return;
 }
@@ -59,19 +72,11 @@ void sync_read_random( struct mwmr_s *fifo[], void *_ptr, int nb_writers){
     }  
    return; 
    }*/
-//DG 7.2.2017
+//DG 8.2.2017
 int sync_write( struct mwmr_s *fifo, void *_ptr, int lensw ){
-  int i; 
-  i = mwmr_try_write(fifo,_ptr,lensw);
-  if (i<lensw){
-    /* the data item is thrown away */
-    //debugInt("data thrown away");
-    return i;
-  }
-  else{
-    //debugInt("data transmitted");
-  }
-  return i;
+  debugMsg("###mwmr channel before write ");
+  mwmr_write(fifo,_ptr,1);
+  debugMsg("####mwmr channel  after write: "); 
 }
 
 /* the task issueing the message does not continue until THIS PARTICULAR message has been successfully taken by another task; an additional empty sync message is issued for that purpose, in a busy waiting loop; once synchronization has been achieved, this message is flushed and a blocking write initiated */
-- 
GitLab