From 6c4ffcffaf20df129df44543bc38bfd257df253f Mon Sep 17 00:00:00 2001
From: Lionel Gauthier <lionel.gauthier@eurecom.fr>
Date: Wed, 26 Nov 2014 11:28:43 +0000
Subject: [PATCH] mutex inside

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@6108 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c         | 2 ++
 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h  | 3 +++
 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c    | 2 ++
 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c | 3 +++
 4 files changed, 10 insertions(+)

diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c
index 4422788c81..5e0381c636 100755
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c
@@ -950,6 +950,7 @@ rlc_am_data_req (void *rlc_pP, frame_t frameP, mem_block_t * sdu_pP)
   int                  octet_index, index;
 #endif
 
+  pthread_mutex_lock(&l_rlc_p->lock_input_sdus);
   if ((l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].mem_block == NULL) &&
       (l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].flags.segmented == 0) &&
       (((l_rlc_p->next_sdu_index + 1) % RLC_AM_SDU_CONTROL_BUFFER_SIZE) != l_rlc_p->current_sdu_index)) {
@@ -1076,4 +1077,5 @@ rlc_am_data_req (void *rlc_pP, frame_t frameP, mem_block_t * sdu_pP)
           l_rlc_p->next_sdu_index);
 #endif
   }
+  pthread_mutex_unlock(&l_rlc_p->lock_input_sdus);
 }
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h
index d43fdb99b3..8977072ff4 100755
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h
@@ -43,6 +43,7 @@
 #    ifndef __RLC_AM_ENTITY_H__
 #        define __RLC_AM_ENTITY_H__
 //-----------------------------------------------------------------------------
+#        include <pthread.h>
 #        include "platform_types.h"
 #        include "platform_constants.h"
 #        include "list.h"
@@ -70,6 +71,8 @@ typedef struct rlc_am_entity_s {
   //---------------------------------------------------------------------
   // TX BUFFERS
   //---------------------------------------------------------------------
+  //pthread_spinlock_t lock_input_sdus;
+  pthread_mutex_t      lock_input_sdus;
   rlc_am_tx_sdu_management_t   *input_sdus;           /*!< \brief Input SDU buffer (for SDUs coming from upper layers). */
   signed int      nb_sdu;                             /*!< \brief Total number of valid rlc_am_tx_sdu_management_t in input_sdus[]. */
   signed int      nb_sdu_no_segmented;                /*!< \brief Total number of SDUs not segmented and partially segmented. */
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c
index 12d0dd9036..4da8be7c9c 100755
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c
@@ -51,6 +51,7 @@ void rlc_am_init(rlc_am_entity_t *rlc_pP, frame_t frameP)
         list_init(&rlc_pP->segmentation_pdu_list, "SEGMENTATION PDU LIST");
         //LOG_D(RLC,"RLC_AM_SDU_CONTROL_BUFFER_SIZE %d sizeof(rlc_am_tx_sdu_management_t) %d \n",  RLC_AM_SDU_CONTROL_BUFFER_SIZE, sizeof(rlc_am_tx_sdu_management_t));
 
+        pthread_mutex_init(&rlc_pP->lock_input_sdus, NULL);
         rlc_pP->input_sdus               = calloc(1, RLC_AM_SDU_CONTROL_BUFFER_SIZE*sizeof(rlc_am_tx_sdu_management_t));
 #warning "cast the rlc retrans buffer to uint32"
 	//        rlc_pP->pdu_retrans_buffer       = calloc(1, (uint16_t)((unsigned int)RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE*(unsigned int)sizeof(rlc_am_tx_data_pdu_management_t)));
@@ -162,6 +163,7 @@ void rlc_am_cleanup(rlc_am_entity_t *rlc_pP)
         free(rlc_pP->input_sdus);
         rlc_pP->input_sdus       = NULL;
     }
+    pthread_mutex_destroy(&rlc_pP->lock_input_sdus);
     if (rlc_pP->pdu_retrans_buffer != NULL) {
         for (i=0; i < RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE; i++) {
             if (rlc_pP->pdu_retrans_buffer[i].mem_block != NULL) {
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c
index 48d2c9dacc..d14d6ad740 100755
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c
@@ -189,6 +189,7 @@ void rlc_am_segment_10 (
     pdu_mem_p = NULL;
 
 
+    pthread_mutex_lock(&rlc_pP->lock_input_sdus);
     while ((rlc_pP->input_sdus[rlc_pP->current_sdu_index].mem_block) && (nb_bytes_to_transmit > 0) ) {
         LOG_T(RLC, "[FRAME %05d][%s][RLC_AM][MOD %u/%u][RB %u][SEGMENT] nb_bytes_to_transmit %d BO %d\n",
               frameP,
@@ -238,6 +239,7 @@ void rlc_am_segment_10 (
                 rlc_pP->enb_module_id,
                 rlc_pP->ue_module_id,
                 rlc_pP->rb_id);
+                pthread_mutex_unlock(&rlc_pP->lock_input_sdus);
                 return;
             }
             LOG_T(RLC, "[FRAME %05d][%s][RLC_AM][MOD %u/%u][RB %u][SEGMENT] get new PDU %d bytes\n",
@@ -611,4 +613,5 @@ void rlc_am_segment_10 (
         list_add_tail_eurecom (copy, &rlc_pP->segmentation_pdu_list);
 
     }
+    pthread_mutex_unlock(&rlc_pP->lock_input_sdus);
 }
-- 
GitLab