Compare commits

...

1 Commits

Author SHA1 Message Date
Bartosz Podrygajlo
8a6545c62a Add context to DL actor 2026-02-16 09:32:05 +01:00
4 changed files with 20 additions and 5 deletions

View File

@@ -29,6 +29,8 @@
#define SHUTDOWN_ACTOR(ptr) shutdown_actor((Actor_t *)ptr);
#define FLUSH_ACTOR(ptr) flush_actor((Actor_t *)ptr);
typedef struct Actor_t {
notifiedFIFO_t fifo;
bool terminate;

View File

@@ -511,7 +511,7 @@ static int handle_sync_req_from_mac(PHY_VARS_NR_UE *UE)
/* 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 < get_nrUE_params()->num_dl_actors; i++) {
flush_actor(UE->dl_actors + i);
FLUSH_ACTOR(UE->dl_actors + i);
}
for (int i = 0; i < get_nrUE_params()->num_ul_actors; i++) {
flush_actor(UE->ul_actors + i);
@@ -612,6 +612,8 @@ void UE_dl_processing(void *arg) {
UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
PHY_VARS_NR_UE *UE = rxtxD->UE;
nr_phy_data_t *phy_data = &rxtxD->phy_data;
void *workspace_buffer = rxtxD->workspace_buffer;
(void)workspace_buffer;
if (!UE->sl_mode)
pdsch_processing(UE, proc, phy_data);
@@ -1025,8 +1027,11 @@ void *UE_thread(void *arg)
if (ret != INT_MAX)
shiftForNextFrame = ret;
if (get_nrUE_params()->num_dl_actors > 0) {
pushNotifiedFIFO(&UE->dl_actors[curMsg.proc.nr_slot_rx % get_nrUE_params()->num_dl_actors].fifo, newRx);
int actor_index = (curMsg.proc.nr_slot_rx % get_nrUE_params()->num_dl_actors);
curMsgRx->workspace_buffer = UE->dl_actors[actor_index].workspace_buffer;
pushNotifiedFIFO(&UE->dl_actors[actor_index].actor.fifo, newRx);
} else {
curMsgRx->workspace_buffer = NULL; // This is a single threaded case, possibly just allocate the buffers
newRx->processingFunc(curMsgRx);
}

View File

@@ -20,6 +20,7 @@
*/
#include "platform_types.h"
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <sched.h>
#include <stdbool.h>
@@ -404,7 +405,8 @@ int main(int argc, char **argv)
if (get_nrUE_params()->num_dl_actors > 0) {
UE_CC->dl_actors = calloc_or_fail(get_nrUE_params()->num_dl_actors, sizeof(*UE_CC->dl_actors));
for (int i = 0; i < get_nrUE_params()->num_dl_actors; i++) {
init_actor(&UE_CC->dl_actors[i], "DL_", -1);
INIT_ACTOR(&UE_CC->dl_actors[i], "DL_", -1);
UE_CC->dl_actors[i].workspace_buffer = malloc(sizeof(c16_t) * 1000);
}
}
if (get_nrUE_params()->num_ul_actors > 0) {
@@ -481,7 +483,7 @@ int main(int argc, char **argv)
shutdown_actor(&phy_vars->ul_actors[i]);
}
for (int i = 0; i < get_nrUE_params()->num_dl_actors; i++) {
shutdown_actor(&phy_vars->dl_actors[i]);
SHUTDOWN_ACTOR(&phy_vars->dl_actors[i]);
}
int ret = pthread_join(phy_vars->main_thread, NULL);
AssertFatal(ret == 0, "pthread_join error %d, errno %d (%s)\n", ret, errno, strerror(errno));

View File

@@ -359,6 +359,11 @@ typedef struct {
int used_by_ue;
} nrUE_cell_params_t;
typedef struct {
Actor_t actor;
void *workspace_buffer;
} dl_actor_t;
/// Top-level PHY Data Structure for UE
typedef struct PHY_VARS_NR_UE_s {
/// \brief Module ID indicator for this instance
@@ -546,7 +551,7 @@ typedef struct PHY_VARS_NR_UE_s {
sl_nr_sidelink_mode_t sl_mode;
sl_nr_ue_phy_params_t SL_UE_PHY_PARAMS;
Actor_t sync_actor;
Actor_t *dl_actors;
dl_actor_t *dl_actors;
Actor_t *ul_actors;
pthread_t main_thread;
pthread_t stat_thread;
@@ -654,6 +659,7 @@ typedef struct nr_rxtx_thread_data_s {
nr_phy_data_t phy_data;
dynamic_barrier_t* next_barrier;
uint64_t absolute_deadline_us;
void *workspace_buffer;
} nr_rxtx_thread_data_t;
typedef struct LDPCDecode_ue_s {