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();