diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 96d15918397d59f27375c167de891f7c3fbeee96..1f70b588b14af2bdf79ecdac4d7894bd9162f5f5 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -155,6 +155,12 @@ NR_gNB_ULSCH_t new_gNB_ulsch(uint8_t max_ldpc_iterations, uint16_t N_RB_UL) void nr_processULSegment(void *arg) { ldpcDecode_t *rdata = (ldpcDecode_t *)arg; + +#ifdef TASK_MANAGER + if(*rdata->cancel == true); + return; +#endif + PHY_VARS_gNB *phy_vars_gNB = rdata->gNB; NR_UL_gNB_HARQ_t *ulsch_harq = rdata->ulsch_harq; t_nrLDPC_dec_params *p_decoderParms = &rdata->decoderParms; @@ -610,6 +616,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, #ifdef TASK_MANAGER ldpcDecode_t* arr = calloc(harq_process->C, sizeof(ldpcDecode_t)); + _Atomic bool cancel = false; int idx_arr = 0; #endif @@ -617,6 +624,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, int E = nr_get_E(G, harq_process->C, Qm, n_layers, r); #ifdef TASK_MANAGER ldpcDecode_t* rdata = &arr[idx_arr]; + rdata->cancel = &cancel; ++idx_arr; #else union ldpcReqUnion id = {.s = {ulsch->rnti, frame, nr_tti_rx, 0, 0}}; diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index e52eba620cb462f805bccbc48c87eb00d1ac6ce9..58a435da334794c679294ec6786f3e6322d70a6d 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -810,6 +810,9 @@ typedef struct LDPCDecode_s { int offset; int decodeIterations; uint32_t tbslbrm; +#ifdef TASK_MANAGER + _Atomic bool* cancel; +#endif } ldpcDecode_t; struct ldpcReqId { diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 7e06c02424f4507b42204426b925c16ff6626a23..77a1001553a69571c3b7eb628cac37f29d87c204 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -262,11 +262,11 @@ void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) rdata->Kr_bytes - (ulsch_harq->F>>3) -((ulsch_harq->C>1)?3:0)); } else { - if ( rdata->nbSegments != ulsch_harq->processedSegments ) { - // Let's forget about this optimization for now + if (rdata->nbSegments != ulsch_harq->processedSegments){ +#ifdef TASK_MANAGER printf("openair1/SCHED_NR/phy_procedures_nr_gNB.c:267 \n"); - assert(0 != 0); -#ifndef TASK_MANAGER + *rdata->cancel = true; +#else int nb = abortTpoolJob(&gNB->threadPool, req->key); nb += abortNotifiedFIFOJob(&gNB->respDecode, req->key); gNB->nbDecode-=nb;