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.
This commit is contained in:
@@ -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)
|
|||||||
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);
|
|||||||
/// @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
|
||||||
|
|||||||
+8
-1
@@ -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)
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user