From 264249fb8b3816ed1f0844dd04f8aa363dc981f3 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Fri, 23 Feb 2018 20:13:04 +0100 Subject: [PATCH] Improve queue MPMC contract checking --- m-buffer.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/m-buffer.h b/m-buffer.h index a77da753..0491dc90 100644 --- a/m-buffer.h +++ b/m-buffer.h @@ -403,7 +403,11 @@ M_C(name, _init)(buffer_t v, size_t size) \ #define QUEUEI_MPMC_CONTRACT(v) do { \ assert (v != 0); \ assert (v->Tab != NULL); \ - /* ProdIdx >= ConsoIdx, but due to atomic constraints, we can't check it reliabely */ \ + unsigned long long _r = atomic_load(&v->ConsoIdx); \ + unsigned long long _w = atomic_load(&v->ProdIdx); \ + assert (_r <= _w); \ + _r = atomic_load(&v->ConsoIdx); \ + assert (_r > _w || _w-_r <= v->size); \ assert (M_POWEROF2_P(v->size)); \ } while (0)