From 46587eb9376fc324f8ff755cbe51b7864f7167de Mon Sep 17 00:00:00 2001 From: Keshava Munegowda Date: Fri, 31 May 2024 23:59:21 +0530 Subject: [PATCH] Improve the performance of CQueue Signed-off-by: Keshava Munegowda --- .../main/java/io/perl/api/impl/CQueue.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/perl/src/main/java/io/perl/api/impl/CQueue.java b/perl/src/main/java/io/perl/api/impl/CQueue.java index 26f2a7dfd..6883e2eda 100644 --- a/perl/src/main/java/io/perl/api/impl/CQueue.java +++ b/perl/src/main/java/io/perl/api/impl/CQueue.java @@ -58,8 +58,7 @@ public CQueue() { this.tail = firstNode; } - @Override - public T poll() { + public T pollOnce() { final Object cur = NEXT.getAndSet(head, null); if (cur == null) { return null; @@ -68,6 +67,23 @@ public T poll() { return (T) ITEM.getAndSet(cur, null); } + @Override + public T poll() { + Object curHead = HEAD.get(this); + Object nxt = NEXT.get(curHead); + + while (nxt != null && !HEAD.compareAndSet(this, curHead, nxt)) { + curHead = HEAD.get(this); + nxt = NEXT.get(curHead); + } + + if (nxt == null) { + return null; + } + NEXT.set(curHead, null); + return (T) ITEM.getAndSet(nxt, null); + } + @Override public boolean add(T data) { final Node node = new Node<>(data); @@ -78,6 +94,7 @@ public boolean add(T data) { @Override public void clear() { + NEXT.set(firstNode, null); Object first = HEAD.getAndSet(this, firstNode); TAIL.set(this, firstNode); /*