From 9eb924f64a56918536d310dd89698aa7e148c727 Mon Sep 17 00:00:00 2001
From: lichao <lichao@aiotlink.com>
Date: 星期四, 06 五月 2021 09:41:26 +0800
Subject: [PATCH] refactor atomic queue.

---
 src/robust.h |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/robust.h b/src/robust.h
index b7459ad..aa54c2f 100644
--- a/src/robust.h
+++ b/src/robust.h
@@ -312,9 +312,10 @@
 		size_type i = 0;
 		do {
 			auto pos = tail();
-			auto cur = buf[pos].load();
-			r = Empty(cur) && buf[pos].compare_exchange_strong(cur, Enc(d));
-			tail_.compare_exchange_strong(pos, Next(pos));
+			if (tail_.compare_exchange_strong(pos, Next(pos))) {
+				auto cur = buf[pos].load();
+				r = Empty(cur) && buf[pos].compare_exchange_strong(cur, Enc(d));
+			}
 		} while (try_more && !r && ++i < capacity);
 		return r;
 	}
@@ -325,9 +326,10 @@
 		size_type i = 0;
 		do {
 			auto pos = head();
-			cur = buf[pos].load();
-			r = !Empty(cur) && buf[pos].compare_exchange_strong(cur, 0);
-			head_.compare_exchange_strong(pos, Next(pos));
+			if (head_.compare_exchange_strong(pos, Next(pos))) {
+				cur = buf[pos].load();
+				r = !Empty(cur) && buf[pos].compare_exchange_strong(cur, 0);
+			}
 		} while (try_more && !r && ++i < capacity);
 		if (r) { d = Dec(cur); }
 		return r;

--
Gitblit v1.8.0