memblockq: move minreq handling in to memblockq
authorPierre Ossman <ossman@cendio.se>
Thu, 19 May 2016 13:26:08 +0000 (15:26 +0200)
committerArun Raghavan <arun@arunraghavan.net>
Fri, 22 Jul 2016 09:14:35 +0000 (14:44 +0530)
Having it handled in the callers proved to be a poor fit as it
became difficult to handle a shrinking minreq sanely. It could end
up in a state where the request was never sent downstream to the
client.

src/pulsecore/memblockq.c
src/pulsecore/protocol-native.c

index d283ed2..f660ffa 100644 (file)
@@ -840,6 +840,10 @@ size_t pa_memblockq_pop_missing(pa_memblockq *bq) {
     if (bq->missing <= 0)
         return 0;
 
+    if (((size_t) bq->missing < bq->minreq) &&
+        !pa_memblockq_prebuf_active(bq))
+        return 0;
+
     l = (size_t) bq->missing;
 
     bq->requested += bq->missing;
index c468edc..0f86bd2 100644 (file)
@@ -1111,8 +1111,7 @@ out:
 
 /* Called from IO context */
 static void playback_stream_request_bytes(playback_stream *s) {
-    size_t m, minreq;
-    int previous_missing;
+    size_t m;
 
     playback_stream_assert_ref(s);
 
@@ -1132,11 +1131,7 @@ static void playback_stream_request_bytes(playback_stream *s) {
     pa_log("request_bytes(%lu)", (unsigned long) m);
 #endif
 
-    previous_missing = pa_atomic_add(&s->missing, (int) m);
-    minreq = pa_memblockq_get_minreq(s->memblockq);
-
-    if (pa_memblockq_prebuf_active(s->memblockq) ||
-        (previous_missing < (int) minreq && previous_missing + (int) m >= (int) minreq))
+    if (pa_atomic_add(&s->missing, (int) m) <= 0)
         pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(s), PLAYBACK_STREAM_MESSAGE_REQUEST_DATA, NULL, 0, NULL, NULL);
 }