1 #ifndef RESERVOIR_H_MZSA8WJ3
2 #define RESERVOIR_H_MZSA8WJ3
13 A size-limited pool of buf_t entries. When the reservoir is filled with
14 more entries than there is room for, some spill away and are lost.
17 typedef struct reservoir_
{
18 size_t reservoir_sz
; /* allocated slots */
19 size_t reservoir_used
; /* slots filled */
20 unsigned long reservoir_tally
; /* total number of items remembered */
25 /* For debugging, dump an entire reservoir's contents. */
26 #define D_RESERVOIR(__r__) do {\
28 NOTIFY_DEBUG("reservoir:%p sz: %zu used:%zu tally:%zu", (__r__), (__r__)->reservoir_sz, (__r__)->reservoir_used, (__r__)->reservoir_tally);\
29 for (i = 0; i < (__r__)->reservoir_sz; i++) {\
30 D_BUF("reservoir[%zu] ", (__r__)->reservoir[i], i);\
34 #define D_RESERVOIR(...)
38 Allocate and return a new reservoir capable of holding #sz buf_t
41 reservoir_t
reservoir_new(size_t sz
);
44 Deallocate the reservoir pointed to by #preservoir.
46 void reservoir_del(reservoir_t
*preservoir
);
49 Increase the storage capacity of the reservoir pointed to by
50 #preservoir by #growby entries.
52 int reservoir_grow(reservoir_t
*preservoir
, size_t growby
);
55 Remember #buf, forgetting (and freeing) another buf_t chosen at random
56 if the reservoir pointed to by #preservoir is already full to capacity.
58 void reservoir_remember(reservoir_t reservoir
, buf_t buf
);
61 Write the contents of the buf_t entries within #reservoir to #fd, each
62 with a trailing #delim character.
64 int reservoir_write(int fd
, reservoir_t reservoir
, char delim
);
66 /* reservoir_write_meta
67 Write metadata about #reservoir and #samples to fd.
69 int reservoir_write_meta(int fd
, reservoir_t reservoir
, unsigned long samples
, char delim
);
71 #endif /* RESERVOIR_H_MZSA8WJ3 */