Commit 73921dfa authored by Sakthivel Velumani's avatar Sakthivel Velumani

Prevent race condition when sync req received

Added a flush mechanism to actor thread. This is used to wait for all
waiting jobs in the queue to be completed.
parent e5814cd6
...@@ -50,7 +50,8 @@ void *actor_thread(void *arg) ...@@ -50,7 +50,8 @@ void *actor_thread(void *arg)
break; break;
} }
elt->processingFunc(NotifiedFifoData(elt)); if (elt->processingFunc) // processing function can be NULL
elt->processingFunc(NotifiedFifoData(elt));
if (elt->reponseFifo) { if (elt->reponseFifo) {
pushNotifiedFIFO(elt->reponseFifo, elt); pushNotifiedFIFO(elt->reponseFifo, elt);
} else } else
...@@ -85,3 +86,14 @@ void shutdown_actor(Actor_t *actor) ...@@ -85,3 +86,14 @@ void shutdown_actor(Actor_t *actor)
abortNotifiedFIFO(&response_fifo); abortNotifiedFIFO(&response_fifo);
pthread_join(actor->thread, NULL); pthread_join(actor->thread, NULL);
} }
void flush_actor(Actor_t *actor)
{
notifiedFIFO_t response_fifo;
initNotifiedFIFO(&response_fifo);
notifiedFIFO_elt_t *elt = newNotifiedFIFO_elt(0, 0, &response_fifo, NULL);
pushNotifiedFIFO(&actor->fifo, elt);
elt = pullNotifiedFIFO(&response_fifo);
delNotifiedFIFO_elt(elt);
abortNotifiedFIFO(&response_fifo);
}
...@@ -49,4 +49,9 @@ void destroy_actor(Actor_t *actor); ...@@ -49,4 +49,9 @@ void destroy_actor(Actor_t *actor);
/// @param actor /// @param actor
void shutdown_actor(Actor_t *actor); void shutdown_actor(Actor_t *actor);
/// @brief This function will return when all current jobs in the queue are finished.
/// The caller should make sure no new jobs are added to the queue between this function call and return.
/// @param actor
void flush_actor(Actor_t *actor);
#endif #endif
...@@ -570,7 +570,6 @@ static int handle_sync_req_from_mac(PHY_VARS_NR_UE *UE) ...@@ -570,7 +570,6 @@ static int handle_sync_req_from_mac(PHY_VARS_NR_UE *UE)
NR_DL_FRAME_PARMS *fp = &UE->frame_parms; NR_DL_FRAME_PARMS *fp = &UE->frame_parms;
// Start synchronization with a target gNB // Start synchronization with a target gNB
if (UE->synch_request.received_synch_request == 1) { if (UE->synch_request.received_synch_request == 1) {
UE->is_synchronized = 0;
// if upper layers signal BW scan we do as instructed by command line parameter // if upper layers signal BW scan we do as instructed by command line parameter
// if upper layers disable BW scan we set it to false // if upper layers disable BW scan we set it to false
if (UE->synch_request.synch_req.ssb_bw_scan) if (UE->synch_request.synch_req.ssb_bw_scan)
...@@ -590,7 +589,15 @@ static int handle_sync_req_from_mac(PHY_VARS_NR_UE *UE) ...@@ -590,7 +589,15 @@ static int handle_sync_req_from_mac(PHY_VARS_NR_UE *UE)
init_symbol_rotation(fp); init_symbol_rotation(fp);
} }
/* Clearing UE harq while DL actors are active causes race condition.
So we let the current execution to complete here.*/
for (int i = 0; i < NUM_DL_ACTORS; i++) {
flush_actor(UE->dl_actors + i);
}
/*TODO: Flush UL jobs */
clean_UE_harq(UE); clean_UE_harq(UE);
UE->is_synchronized = 0;
UE->synch_request.received_synch_request = 0; UE->synch_request.received_synch_request = 0;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment