📨 chic 0.0.0
Realtime-safe channels in C
Loading...
Searching...
No Matches
spsc.h
Go to the documentation of this file.
1// This Source Code Form is subject to the terms of the Mozilla Public
2// License, v. 2.0. If a copy of the MPL was not distributed with this
3// file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
9
10#pragma once
11#include "claim.h"
12#include "err.h"
13
14#ifdef __cplusplus
15 #if defined(__clang__) || defined(__GNUG__) || defined(_MSC_VER)
16 #define restrict __restrict
17 #else
18 #define restrict
19 #endif
20 extern "C" {
21#endif
22
28struct spsc;
29
34#define make_spsc(N, T) spsc_alloc((N), sizeof(T))
35
41#define sizeof_spsc(N, T) spsc_open(NULL, (N), sizeof(T))
42
45#define spsc_send1(C, SRC) spsc_send((C), 1, (SRC))
46
49#define spsc_nbsend1(C, SRC) spsc_nbsend((C), 1, (SRC))
50
53#define spsc_recv1(C, DST) spsc_recv((C), 1, (DST))
54
57#define spsc_nbrecv1(C, DST) spsc_nbrecv((C), 1, (DST))
58
70size_t spsc_open(void *c, size_t nel, size_t elsize);
71
81struct spsc *spsc_alloc(size_t nel, size_t elsize);
82
89enum chic_err spsc_close(struct spsc *c);
90
95size_t spsc_nel(struct spsc *c);
96
120enum chic_err spsc_send_init(struct spsc *c, size_t n, struct claim *s);
121
148enum chic_err spsc_send_nbinit(struct spsc *c, size_t n, struct claim *s);
149
159void spsc_send_fini(struct spsc *c, struct claim *s);
160
174enum chic_err spsc_send(struct spsc *restrict c, size_t n, void *restrict src);
175
193enum chic_err spsc_nbsend(struct spsc *restrict c, size_t n, size_t *restrict n2, void *restrict src);
194
208enum chic_err spsc_sendv(struct spsc *restrict c, size_t n, ...);
209
227enum chic_err spsc_nbsendv(struct spsc *restrict c, size_t n, size_t *restrict n2, ...);
228
252enum chic_err spsc_recv_init(struct spsc *c, size_t n, struct claim *r);
253
276enum chic_err spsc_recv_nbinit(struct spsc *c, size_t n, struct claim *r);
277
289void spsc_recv_fini(struct spsc *c, struct claim *r);
290
304enum chic_err spsc_recv(struct spsc *restrict c, size_t n, void *restrict dst);
305
320enum chic_err spsc_nbrecv(struct spsc *restrict c, size_t n, size_t *restrict n2, void *restrict dst);
321
335enum chic_err spsc_recvv(struct spsc *restrict c, size_t n, ...);
336
351enum chic_err spsc_nbrecvv(struct spsc *restrict c, size_t n, size_t *restrict n2, ...);
352
353#ifdef __cplusplus
354 }
355 #undef restrict
356#endif
Exclusive claims for directly reading/writing into channels.
Error enumeration definition.
chic_err
Identifiers for channel states and errors.
Definition err.h:14
enum chic_err spsc_recv_nbinit(struct spsc *c, size_t n, struct claim *r)
Claims up to an amount of space in the channel to be manually read from.
enum chic_err spsc_recv_init(struct spsc *c, size_t n, struct claim *r)
Claims space in the channel to be manually read from.
enum chic_err spsc_send_init(struct spsc *c, size_t n, struct claim *s)
Claims space in the channel to be manually written into.
enum chic_err spsc_send_nbinit(struct spsc *c, size_t n, struct claim *s)
Claims up to an amount of space in the channel to be manually written into.
void spsc_recv_fini(struct spsc *c, struct claim *r)
Commits a claim, indicating the item slots within have been read from and are safe to be overwritten.
void spsc_send_fini(struct spsc *c, struct claim *s)
Commits a claim, indicating the item slots within have been written to and are ready to be received.
enum chic_err spsc_send(struct spsc *restrict c, size_t n, void *restrict src)
Sends items to a channel.
enum chic_err spsc_recvv(struct spsc *restrict c, size_t n,...)
Receives items from a channel.
enum chic_err spsc_nbrecv(struct spsc *restrict c, size_t n, size_t *restrict n2, void *restrict dst)
Receives whatever items are available from a channel.
size_t spsc_nel(struct spsc *c)
Gets the maximim number of elements a channel is capable of holding at once.
struct spsc * spsc_alloc(size_t nel, size_t elsize)
Allocates a new spsc using malloc() and opens it.
enum chic_err spsc_sendv(struct spsc *restrict c, size_t n,...)
Sends items to a channel.
enum chic_err spsc_close(struct spsc *c)
Closes a channel, forbidding any future send operations on it.
enum chic_err spsc_nbsendv(struct spsc *restrict c, size_t n, size_t *restrict n2,...)
Sends whatever items will fit to a channel.
enum chic_err spsc_recv(struct spsc *restrict c, size_t n, void *restrict dst)
Receives items from a channel.
enum chic_err spsc_nbsend(struct spsc *restrict c, size_t n, size_t *restrict n2, void *restrict src)
Sends whatever items will fit to a channel.
enum chic_err spsc_nbrecvv(struct spsc *restrict c, size_t n, size_t *restrict n2,...)
Receives whatever items are available from a channel.
size_t spsc_open(void *c, size_t nel, size_t elsize)
Constructs a spsc in-place, or calculates the needed allocation size for one.
Claimed space for reading or writing directly into the internal ringbuffer of a channel.
Definition claim.h:66
Single-producer, single-consumer channel.