OSDN Git Service

Fix TX queue overflow detection
authorAndre Eisenbach <eisenbach@google.com>
Wed, 22 Jul 2015 20:47:28 +0000 (13:47 -0700)
committerAndre Eisenbach <eisenbach@google.com>
Fri, 24 Jul 2015 18:33:58 +0000 (11:33 -0700)
- Prevent possible endless loop if |nb_frame| is too high
- Remove off-by-one calculation before sending frames
- Remove log spam and add better debug info

Bug: 22658329
Change-Id: I374ee980aec48763beb49b4f6f8b076124cadf40

btif/src/btif_media_task.c

index eab3685..1f5f9c7 100644 (file)
@@ -2599,14 +2599,21 @@ static void btif_media_aa_prep_sbc_2_send(UINT8 nb_frame)
 
 static void btif_media_aa_prep_2_send(UINT8 nb_frame)
 {
-    while (GKI_queue_length(&btif_media_cb.TxAaQ) >= (MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ-nb_frame))
+    // Check for TX queue overflow
+
+    if (nb_frame > MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ)
+        nb_frame = MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ;
+
+    if (GKI_queue_length(&btif_media_cb.TxAaQ) > (MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ - nb_frame))
     {
-        APPL_TRACE_WARNING("%s() - TX queue buffer count %d",
-            __FUNCTION__, GKI_queue_length(&btif_media_cb.TxAaQ));
-        GKI_freebuf(GKI_dequeue(&(btif_media_cb.TxAaQ)));
+        APPL_TRACE_WARNING("%s() - TX queue buffer count %d/%d", __func__,
+            GKI_queue_length(&btif_media_cb.TxAaQ), MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ - nb_frame);
     }
 
-    if (GKI_queue_length(&btif_media_cb.TxAaQ)) --nb_frame;
+    while (GKI_queue_length(&btif_media_cb.TxAaQ) > (MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ - nb_frame))
+        GKI_freebuf(GKI_dequeue(&(btif_media_cb.TxAaQ)));
+
+    // Transcode frame
 
     switch (btif_media_cb.TxTranscoding)
     {
@@ -2614,9 +2621,8 @@ static void btif_media_aa_prep_2_send(UINT8 nb_frame)
         btif_media_aa_prep_sbc_2_send(nb_frame);
         break;
 
-
     default:
-        APPL_TRACE_ERROR("ERROR btif_media_aa_prep_2_send unsupported transcoding format 0x%x",btif_media_cb.TxTranscoding);
+        APPL_TRACE_ERROR("%s unsupported transcoding format 0x%x", __func__, btif_media_cb.TxTranscoding);
         break;
     }
 }