aboutsummaryrefslogtreecommitdiff
path: root/builtins
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-08-18 23:31:36 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-08-18 23:31:36 -0400
commit9e07c6adc7a0616eec40e78024a8501ec7d96559 (patch)
tree92542ba27e13152a8305deb6f0cda3a952ac8835 /builtins
parent1f16d63ac783d9b1bb1d4a65676476d14f0af713 (diff)
Add Channel:peek()
Diffstat (limited to 'builtins')
-rw-r--r--builtins/channel.c10
-rw-r--r--builtins/channel.h2
2 files changed, 12 insertions, 0 deletions
diff --git a/builtins/channel.c b/builtins/channel.c
index f47a0b11..9360bcfc 100644
--- a/builtins/channel.c
+++ b/builtins/channel.c
@@ -68,6 +68,16 @@ public void Channel$get(channel_t *channel, void *out, int64_t item_size, int64_
(void)pthread_cond_signal(&channel->cond);
}
+public void Channel$peek(channel_t *channel, void *out, int64_t item_size)
+{
+ (void)pthread_mutex_lock(&channel->mutex);
+ while (channel->items.length == 0)
+ pthread_cond_wait(&channel->cond, &channel->mutex);
+ memcpy(out, channel->items.data, item_size);
+ (void)pthread_mutex_unlock(&channel->mutex);
+ (void)pthread_cond_signal(&channel->cond);
+}
+
public array_t Channel$view(channel_t *channel)
{
(void)pthread_mutex_lock(&channel->mutex);
diff --git a/builtins/channel.h b/builtins/channel.h
index 3b2d2c16..b8282374 100644
--- a/builtins/channel.h
+++ b/builtins/channel.h
@@ -15,6 +15,8 @@ void Channel$give(channel_t *channel, const void *item, int64_t padded_item_size
void Channel$give_all(channel_t *channel, array_t to_give, int64_t padded_item_size);
void Channel$get(channel_t *channel, void *out, int64_t item_size, int64_t padded_item_size);
#define Channel$get_value(channel, t, padded_item_size) ({ t _val; Channel$get(channel, &_val, sizeof(t), padded_item_size); _val; })
+void Channel$peek(channel_t *channel, void *out, int64_t item_size);
+#define Channel$peek_value(channel, t) ({ t _val; Channel$peek(channel, &_val, sizeof(t)); _val; })
void Channel$clear(channel_t *channel);
array_t Channel$view(channel_t *channel);
uint32_t Channel$hash(const channel_t **channel, const TypeInfo *type);