diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c index 54345dc6b022cf4555dd81a49cdbe64c55831dee..3a47a6bc795be0353e488be6b22d7bb23a553309 100644 --- a/executables/nr-softmodem.c +++ b/executables/nr-softmodem.c @@ -833,16 +833,14 @@ int main( int argc, char **argv ) { /* release memory used by the RU/gNB threads (incomplete), after all * threads have been stopped (they partially use the same memory) */ - for (int inst = 0; inst < NB_gNB_INST; inst++) { - //free_transport(RC.gNB[inst]); - phy_free_nr_gNB(RC.gNB[inst]); - } - for (int inst = 0; inst < NB_RU; inst++) { - kill_NR_RU_proc(inst); nr_phy_free_RU(RC.ru[inst]); } + for (int inst = 0; inst < NB_gNB_INST; inst++) { + phy_free_nr_gNB(RC.gNB[inst]); + } + pthread_cond_destroy(&sync_cond); pthread_mutex_destroy(&sync_mutex); pthread_cond_destroy(&nfapi_sync_cond); diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index c3baa06da64d3e469e22fafc32611bef59c0beca..fec343ccfb00d3a4dd623f69fabcdfbb54cfaec1 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -625,7 +625,6 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, gNB->first_run_I0_measurements = 1; - common_vars->rxdata = (int32_t **)malloc16(Prx*sizeof(int32_t*)); common_vars->txdataF = (int32_t **)malloc16(Ptx*sizeof(int32_t*)); common_vars->rxdataF = (int32_t **)malloc16(Prx*sizeof(int32_t*)); common_vars->beam_id = (uint8_t **)malloc16(Ptx*sizeof(uint8_t*)); @@ -640,7 +639,6 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, } for (i=0;i<Prx;i++){ common_vars->rxdataF[i] = (int32_t*)malloc16_clear(fp->samples_per_frame_wCP*sizeof(int32_t)); - common_vars->rxdata[i] = (int32_t*)malloc16_clear(fp->samples_per_frame*sizeof(int32_t)); } common_vars->debugBuff = (int32_t*)malloc16_clear(fp->samples_per_frame*sizeof(int32_t)*100); common_vars->debugBuff_sample_offset = 0; @@ -786,11 +784,9 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB) for (int i = 0; i < Prx; ++i) { free_and_zero(common_vars->rxdataF[i]); - free_and_zero(common_vars->rxdata[i]); } free_and_zero(common_vars->txdataF); - free_and_zero(common_vars->rxdata); free_and_zero(common_vars->rxdataF); free_and_zero(common_vars->beam_id); diff --git a/openair1/PHY/INIT/nr_init_ru.c b/openair1/PHY/INIT/nr_init_ru.c index 75d78738fc6fa74f9d3e821087ea5479a43654ea..d12834d620bcb9031fbdf794ad0b469ad22440af 100644 --- a/openair1/PHY/INIT/nr_init_ru.c +++ b/openair1/PHY/INIT/nr_init_ru.c @@ -176,8 +176,11 @@ void nr_phy_free_RU(RU_t *ru) LOG_I(PHY, "Feeing RU signal buffers (if_south %s) nb_tx %d\n", ru_if_types[ru->if_south], ru->nb_tx); if (ru->if_south <= REMOTE_IF5) { // this means REMOTE_IF5 or LOCAL_RF, so free memory for time-domain signals - for (i = 0; i < ru->nb_tx; i++) - free_and_zero(ru->common.txdata[i]); + // Hack: undo what is done at allocation + for (i = 0; i < ru->nb_tx; i++) { + int32_t *p = &ru->common.txdata[i][-ru->sf_extension]; + free_and_zero(p); + } free_and_zero(ru->common.txdata); for (i = 0; i < ru->nb_rx; i++) @@ -198,8 +201,10 @@ void nr_phy_free_RU(RU_t *ru) free_and_zero(ru->common.txdataF_BF); // free FFT output buffers (RX) - for (i = 0; i < ru->nb_rx; i++) free_and_zero(ru->common.rxdataF[i]); - free_and_zero(ru->common.rxdataF); + // HACK: cannot free here, or the gNB code in phy_free_nr_gNB() will + // segfault. The rxdataF memory between RU and gNB is not properly handled! + //for (i = 0; i < ru->nb_rx; i++) free_and_zero(ru->common.rxdataF[i]); + //free_and_zero(ru->common.rxdataF); for (j=0;j<NUMBER_OF_NR_RU_PRACH_OCCASIONS_MAX;j++) { for (i = 0; i < ru->nb_rx; i++)