But mutex on dar buffer, tested RTAI, but missed slot can occur, because phy rx and tx threads stimulate code with dar buffer, other solutions can be implemented.

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@6146 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
Lionel Gauthier
2014-12-02 10:05:41 +00:00
parent 23db2b5225
commit d2daa68ae0
4 changed files with 14 additions and 4 deletions
@@ -260,7 +260,7 @@ rlc_um_init (rlc_um_entity_t * const rlc_pP)
rlc_pP->tx_sn_length = 10; rlc_pP->tx_sn_length = 10;
rlc_pP->tx_header_min_length_in_bytes = 2; rlc_pP->tx_header_min_length_in_bytes = 2;
pthread_mutex_init(&rlc_pP->lock_dar_buffer, NULL);
if (rlc_pP->dar_buffer == NULL) { if (rlc_pP->dar_buffer == NULL) {
rlc_pP->dar_buffer = calloc (1, 1024 * sizeof (void *)); rlc_pP->dar_buffer = calloc (1, 1024 * sizeof (void *));
} }
@@ -309,6 +309,7 @@ rlc_um_cleanup (rlc_um_entity_t * const rlc_pP)
free (rlc_pP->dar_buffer); free (rlc_pP->dar_buffer);
rlc_pP->dar_buffer = NULL; rlc_pP->dar_buffer = NULL;
} }
pthread_mutex_destroy(&rlc_pP->lock_dar_buffer);
memset(rlc_pP, 0, sizeof(rlc_um_entity_t)); memset(rlc_pP, 0, sizeof(rlc_um_entity_t));
} }
@@ -382,7 +383,7 @@ void rlc_um_configure(
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void rlc_um_set_debug_infos( void rlc_um_set_debug_infos(
rlc_um_entity_t *rlc_pP, rlc_um_entity_t * const rlc_pP,
const module_id_t enb_module_idP, const module_id_t enb_module_idP,
const module_id_t ue_module_idP, const module_id_t ue_module_idP,
const frame_t frameP, const frame_t frameP,
@@ -197,7 +197,7 @@ protected_rlc_um_control_primitives(void rlc_um_configure(
* \param[in] srb_flagP Flag to indicate signalling radio bearer (1) or data radio bearer (0). * \param[in] srb_flagP Flag to indicate signalling radio bearer (1) or data radio bearer (0).
*/ */
protected_rlc_um_control_primitives(void rlc_um_set_debug_infos( protected_rlc_um_control_primitives(void rlc_um_set_debug_infos(
rlc_um_entity_t *rlcP, rlc_um_entity_t * const rlcP,
const module_id_t enb_module_idP, const module_id_t enb_module_idP,
const module_id_t ue_module_idP, const module_id_t ue_module_idP,
const frame_t frameP, const frame_t frameP,
+7 -1
View File
@@ -763,7 +763,7 @@ void rlc_um_check_timer_dar_time_out(rlc_um_entity_t *rlc_pP, frame_t frameP, eN
rlc_pP->rb_id, rlc_pP->rb_id,
rlc_pP->vr_ur); rlc_pP->vr_ur);
#endif #endif
pthread_mutex_lock(&rlc_pP->lock_dar_buffer);
old_vr_ur = rlc_pP->vr_ur; old_vr_ur = rlc_pP->vr_ur;
rlc_pP->vr_ur = rlc_pP->vr_ux; rlc_pP->vr_ur = rlc_pP->vr_ux;
@@ -803,6 +803,7 @@ void rlc_um_check_timer_dar_time_out(rlc_um_entity_t *rlc_pP, frame_t frameP, eN
#endif #endif
rlc_um_stop_and_reset_timer_reordering(rlc_pP, frameP); rlc_um_stop_and_reset_timer_reordering(rlc_pP, frameP);
} }
pthread_mutex_unlock(&rlc_pP->lock_dar_buffer);
} }
} }
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_UM_CHECK_TIMER_DAR_TIME_OUT,VCD_FUNCTION_OUT); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_UM_CHECK_TIMER_DAR_TIME_OUT,VCD_FUNCTION_OUT);
@@ -1055,6 +1056,8 @@ rlc_um_receive_process_dar (rlc_um_entity_t *rlc_pP, frame_t frameP, eNB_flag_t
} else { } else {
free_mem_block(pdu_mem_pP); free_mem_block(pdu_mem_pP);
} }
pthread_mutex_lock(&rlc_pP->lock_dar_buffer);
in_window = rlc_um_in_window(rlc_pP, frameP, rlc_pP->vr_uh - rlc_pP->rx_um_window_size, sn, rlc_pP->vr_ur); in_window = rlc_um_in_window(rlc_pP, frameP, rlc_pP->vr_uh - rlc_pP->rx_um_window_size, sn, rlc_pP->vr_ur);
#if defined(DEBUG_RLC_PAYLOAD) #if defined(DEBUG_RLC_PAYLOAD)
@@ -1082,6 +1085,7 @@ rlc_um_receive_process_dar (rlc_um_entity_t *rlc_pP, frame_t frameP, eNB_flag_t
rlc_pP->stat_rx_data_bytes_out_of_window += tb_sizeP; rlc_pP->stat_rx_data_bytes_out_of_window += tb_sizeP;
free_mem_block(pdu_mem_pP); free_mem_block(pdu_mem_pP);
pdu_mem_pP = NULL; pdu_mem_pP = NULL;
pthread_mutex_unlock(&rlc_pP->lock_dar_buffer);
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_UM_RECEIVE_PROCESS_DAR, VCD_FUNCTION_OUT); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_UM_RECEIVE_PROCESS_DAR, VCD_FUNCTION_OUT);
return; return;
} }
@@ -1103,6 +1107,7 @@ rlc_um_receive_process_dar (rlc_um_entity_t *rlc_pP, frame_t frameP, eNB_flag_t
rlc_pP->stat_rx_data_bytes_duplicate += tb_sizeP; rlc_pP->stat_rx_data_bytes_duplicate += tb_sizeP;
free_mem_block(pdu_mem_pP); free_mem_block(pdu_mem_pP);
pdu_mem_pP = NULL; pdu_mem_pP = NULL;
pthread_mutex_unlock(&rlc_pP->lock_dar_buffer);
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_UM_RECEIVE_PROCESS_DAR, VCD_FUNCTION_OUT); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_UM_RECEIVE_PROCESS_DAR, VCD_FUNCTION_OUT);
return; return;
} }
@@ -1252,5 +1257,6 @@ rlc_um_receive_process_dar (rlc_um_entity_t *rlc_pP, frame_t frameP, eNB_flag_t
#endif #endif
} }
} }
pthread_mutex_unlock(&rlc_pP->lock_dar_buffer);
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_UM_RECEIVE_PROCESS_DAR, VCD_FUNCTION_OUT); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_UM_RECEIVE_PROCESS_DAR, VCD_FUNCTION_OUT);
} }
@@ -106,6 +106,9 @@ typedef struct rlc_um_entity_s {
mem_block_t *output_sdu_in_construction; /*!< \brief Memory area where a complete SDU is reassemblied before being send to upper layers. */ mem_block_t *output_sdu_in_construction; /*!< \brief Memory area where a complete SDU is reassemblied before being send to upper layers. */
sdu_size_t output_sdu_size_to_write; /*!< \brief Size of the reassemblied SDU. */ sdu_size_t output_sdu_size_to_write; /*!< \brief Size of the reassemblied SDU. */
//pthread_spinlock_t lock_dar_buffer;
pthread_mutex_t lock_dar_buffer;
mem_block_t **dar_buffer; /*!< \brief Array of rx PDUs. */ mem_block_t **dar_buffer; /*!< \brief Array of rx PDUs. */
list_t pdus_from_mac_layer; /*!< \brief Not Used. */ list_t pdus_from_mac_layer; /*!< \brief Not Used. */