From 586805319ff5f45229eaca06d7a2475e79cf8528 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Wed, 11 Jan 2023 11:21:41 +0000 Subject: [PATCH] Add new methods to tizen_base::SharedQueue Adds: - TryAndPop() - WaitAndPopFor() Change-Id: I4bdbdcd146340708d9409ad381585e8ff43a0cd3 Signed-off-by: Hwankyu Jhun --- .../test_shared_queue.cc | 30 ++++++++++++++++++++++ tizen-shared-queue/shared-queue.hpp | 27 +++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/tests/tizen-shared-queue_unittests/test_shared_queue.cc b/tests/tizen-shared-queue_unittests/test_shared_queue.cc index a20c398..d41ca40 100644 --- a/tests/tizen-shared-queue_unittests/test_shared_queue.cc +++ b/tests/tizen-shared-queue_unittests/test_shared_queue.cc @@ -14,6 +14,7 @@ * limitations under the License. */ +#include #include #include @@ -52,6 +53,35 @@ TEST(SharedQueueTest, PushAndWaitAndPop) { EXPECT_TRUE(job.Done()); } +TEST(SharedQueueTest, TryAndPop) { + tizen_base::SharedQueue queue; + Job job; + EXPECT_FALSE(queue.TryAndPop(job)); + queue.Push(Job()); + EXPECT_TRUE(queue.TryAndPop(job)); +} + +TEST(SharedQueueTest, WaitAndPopFor) { + tizen_base::SharedQueue queue; + Job job; + std::chrono::steady_clock::time_point begin = + std::chrono::steady_clock::now(); + EXPECT_FALSE(queue.WaitAndPopFor(job, 110)); + std::chrono::steady_clock::time_point end = + std::chrono::steady_clock::now(); + auto elapsed_time = std::chrono::duration_cast( + end - begin).count(); + EXPECT_TRUE(elapsed_time > 100); + + queue.Push(Job()); + begin = std::chrono::steady_clock::now(); + EXPECT_TRUE(queue.WaitAndPopFor(job, 100)); + end = std::chrono::steady_clock::now(); + elapsed_time = std::chrono::duration_cast( + end - begin).count(); + EXPECT_TRUE(elapsed_time < 100); +} + TEST(SharedQueueTest, IsEmpty) { tizen_base::SharedQueue queue; EXPECT_TRUE(queue.IsEmpty()); diff --git a/tizen-shared-queue/shared-queue.hpp b/tizen-shared-queue/shared-queue.hpp index 648d31d..f73552d 100644 --- a/tizen-shared-queue/shared-queue.hpp +++ b/tizen-shared-queue/shared-queue.hpp @@ -38,6 +38,16 @@ class SharedQueue { cond_var_.notify_one(); } + bool TryAndPop(T& item) { + std::lock_guard lock(mutex_); + if (queue_.empty()) + return false; + + item = queue_.front(); + queue_.pop(); + return true; + } + T WaitAndPop() { std::unique_lock lock(mutex_); while (queue_.empty()) @@ -48,6 +58,23 @@ class SharedQueue { return item; } + bool WaitAndPopFor(T& item, int timeout) { + std::unique_lock lock(mutex_); + if (!queue_.empty()) { + item = queue_.front(); + queue_.pop(); + return true; + } + + std::chrono::milliseconds duration(timeout); + if (cond_var_.wait_for(lock, duration) == std::cv_status::timeout) + return false; + + item = queue_.front(); + queue_.pop(); + return true; + } + bool IsEmpty() const { std::lock_guard lock(mutex_); return queue_.empty(); -- 2.7.4