[pulseaudio-discuss] [PATCH 2/2] memblockq-test: fix incorrect assumption of pa_memblockq_pop_missing() behaviour
Ahmed S. Darwish
darwish.07 at gmail.com
Sat Dec 31 16:26:59 UTC 2016
Hi!
On Fri, Dec 30, 2016 at 05:52:36PM +0200, Tanu Kaskinen wrote:
> The intuitive meaning of "missing" would be the difference between
> tlength and the current queue length, and that's how memblockq-test
> assumed pa_memblockq_pop_missing() to define the term "missing", but
> that was an incorrect assumption, causing the last
> pa_memblockq_pop_missing() return value assertion to fail.
>
> This patch fixes the failing assertion and adds some comments about how
> the "missing" and "requested" variables in memblockq work.
> ---
> src/tests/memblockq-test.c | 95 ++++++++++++++++++++++++++++++++++++----------
> 1 file changed, 75 insertions(+), 20 deletions(-)
>
> diff --git a/src/tests/memblockq-test.c b/src/tests/memblockq-test.c
> index fc83d99..2a9b88a 100644
> --- a/src/tests/memblockq-test.c
> +++ b/src/tests/memblockq-test.c
> @@ -421,74 +421,129 @@ START_TEST (memblockq_test_pop_missing) {
> bq = pa_memblockq_new("test memblockq", idx, maxlength, tlength, &ss, prebuf, minreq, maxrewind, &silence);
> fail_unless(bq != NULL);
>
> - /* initially, the whole target length of bytes is missing */
> + /* The following equation regarding the internal variables of a memblockq
> + * is always true:
> + *
> + * length + missing + requested = tlength
> + *
> + * "length" is the current memblockq length (write index minus read index)
> + * and "tlength" is the target length. The intuitive meaning of "missing"
> + * would be the difference between tlength and length, but actually
> + * "missing" and "requested" together constitute the amount that is missing
> + * from the queue. Writing to the queue decrements "requested" and reading
> + * from the queue increments "missing". pa_memblockq_pop_missing() resets
> + * "missing" to zero, returns the old "missing" value and adds the
> + * equivalent amount to "requested".
> + *
> + * This test has comments between each step documenting the assumed state
> + * of those internal variables. */
> +
What really bothers me is that memblockq.requested is actually
referenced in just _one_ place: a MEMBLOCKQ_DEBUG printf()! :-(
So memblockq.requested actually serves no value: it's just used
for debugging statements. That makes my earlier notes of requested
needed to be negative also wrong. And thus there's definitely
another reason why the now-reverted 74251f0 commit triggered a
problem when doing large 64K writes on low-latency streams..
I've verified the statement above. Removed memblockq.requested
completely [1] and everything compiled (and worked) fine as
expected; even in the big stream writes case.
So an ACK of course for this patch; its explanations make things
much more comprehesible! Just a note that the case is still open,
and we still don't know what's actually causing problems in the
memblockq code..
[1]
Remove memblockq.requested; it's only used for debugging statements
and makes an already confusing code harder to deduce.
(I'll send an official submission for this soon)
---
diff --git a/src/pulsecore/memblockq.c b/src/pulsecore/memblockq.c
index f660ffaed..145b7a2e9 100644
--- a/src/pulsecore/memblockq.c
+++ b/src/pulsecore/memblockq.c
@@ -53,7 +53,7 @@ struct pa_memblockq {
bool in_prebuf;
pa_memchunk silence;
pa_mcalign *mcalign;
- int64_t missing, requested;
+ int64_t missing;
char *name;
pa_sample_spec sample_spec;
};
@@ -251,13 +251,11 @@ static void write_index_changed(pa_memblockq *bq, int64_t old_write_index, bool
delta = bq->write_index - old_write_index;
- if (account)
- bq->requested -= delta;
- else
+ if (!account)
bq->missing -= delta;
#ifdef MEMBLOCKQ_DEBUG
- pa_log_debug("[%s] pushed/seeked %lli: requested counter at %lli, account=%i", bq->name, (long long) delta, (long long) bq->requested, account);
+ pa_log_debug("[%s] pushed/seeked %lli", bq->name, (long long) delta);
#endif
}
@@ -846,7 +844,6 @@ size_t pa_memblockq_pop_missing(pa_memblockq *bq) {
l = (size_t) bq->missing;
- bq->requested += bq->missing;
bq->missing = 0;
#ifdef MEMBLOCKQ_DEBUG
--
Darwish
http://darwish.chasingpointers.com
More information about the pulseaudio-discuss
mailing list