diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-08-18 23:31:36 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-08-18 23:31:36 -0400 |
| commit | 9e07c6adc7a0616eec40e78024a8501ec7d96559 (patch) | |
| tree | 92542ba27e13152a8305deb6f0cda3a952ac8835 /builtins | |
| parent | 1f16d63ac783d9b1bb1d4a65676476d14f0af713 (diff) | |
Add Channel:peek()
Diffstat (limited to 'builtins')
| -rw-r--r-- | builtins/channel.c | 10 | ||||
| -rw-r--r-- | builtins/channel.h | 2 |
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); |
