From 98b86af48848dc7f10106c9a972c22d22c12fbac Mon Sep 17 00:00:00 2001 From: Ryan Ward Date: Sun, 2 Jul 2023 10:52:10 -0400 Subject: [PATCH] Add peek to channels --- src/cpp/channel.cpp | 28 ++++++++++++++++++++++++++++ src/cpp/channel.h | 3 +++ 2 files changed, 31 insertions(+) diff --git a/src/cpp/channel.cpp b/src/cpp/channel.cpp index 781b6fb..5ae69ba 100644 --- a/src/cpp/channel.cpp +++ b/src/cpp/channel.cpp @@ -8,6 +8,7 @@ void Channel::exportAPI(sol::state_view& lua) { sol::usertype type("new", sol::no_constructor, "push", &Channel::push, "pop", &Channel::pop, + "peek", &Channel::peek, "size", &Channel::size ); sol::stack::push(lua, type); @@ -84,6 +85,33 @@ StoredArray Channel::pop(const sol::optional& duration, return ret; } +StoredArray Channel::peek(const sol::optional& duration, + const sol::optional& period) { + this_thread::cancellationPoint(); + std::unique_lock lock(ctx_->lock_); + { + this_thread::ScopedSetInterruptable interruptable(this); + + Timer timer(duration ? fromLuaTime(duration.value(), period) : + std::chrono::milliseconds()); + while (ctx_->channel_.empty()) { + if (duration) { + if (timer.isFinished() || + ctx_->cv_.wait_for(lock, timer.left()) == + std::cv_status::timeout) { + return StoredArray(); + } + } + else { // No time limit + ctx_->cv_.wait(lock); + } + this_thread::cancellationPoint(); + } + } + + return ctx_->channel_.front(); +} + size_t Channel::size() { std::lock_guard lock(ctx_->lock_); return ctx_->channel_.size(); diff --git a/src/cpp/channel.h b/src/cpp/channel.h index 18c6893..4336dcf 100644 --- a/src/cpp/channel.h +++ b/src/cpp/channel.h @@ -24,6 +24,9 @@ public: bool push(const sol::variadic_args& args); StoredArray pop(const sol::optional& duration, const sol::optional& period); + + StoredArray peek(const sol::optional& duration, + const sol::optional& period); size_t size();