114typedef struct StreamBuffer StreamBuffer;
133 _Out_writes_bytes_(sz) uint8* buf,
size_t sz);
145 _In_reads_bytes_(sz)
const uint8* buf,
size_t sz);
158typedef bool (*sbufSendCB)(_Pre_valid_ StreamBuffer* sb, _In_reads_bytes_(sz)
const uint8* buf,
159 size_t off,
size_t sz, _Pre_opt_valid_
void* ctx);
193enum STREAM_BUFFER_FLAGS_ENUM {
196 SBUF_Direct = 0x0010,
198 SBUF_Closed = 0x1000,
216enum STREAM_BUFFER_STATE_ENUM {
218 SBUF_PResumeOwed = 0x0040,
222typedef struct StreamBuffer {
226 closure producerPull;
227 struct SbufResume* producerResume;
229 closure consumerNotify;
230 closure consumerPush;
243 atomic(intptr) owner;
251 atomic(uint32) flags;
256_Ret_valid_ StreamBuffer* _sbufCreate(
size_t targetsz, flags_t flags);
275#define sbufCreate(targetsz, ...) _sbufCreate(targetsz, opt_flags(__VA_ARGS__))
298_At_(*sb, _Pre_maybenull_ _Post_null_)
void sbufRelease(_Inout_ StreamBuffer** sb);
327_At_(*sb, _Pre_maybenull_ _Post_null_)
void sbufFinish(_Inout_ StreamBuffer** sb);
389 return (atomicLoad(uint32, &sb->flags, Relaxed) & SBUF_Pull) != 0;
400 return (atomicLoad(uint32, &sb->flags, Relaxed) & SBUF_Push) != 0;
411 return (atomicLoad(uint32, &sb->flags, Relaxed) & SBUF_Error) != 0;
424 return (atomicLoad(uint32, &sb->flags, Relaxed) & SBUF_Closed) != 0;
523bool _sbufPWrite(_Inout_ StreamBuffer* sb, _In_reads_bytes_(sz)
const uint8* buf,
size_t sz,
541#define sbufPWrite(sb, buf, sz, ...) _sbufPWrite(sb, buf, sz, opt_flags(__VA_ARGS__))
544bool _sbufPWriteStr(_Inout_ StreamBuffer* sb, _In_opt_ strref str, flags_t flags);
554#define sbufPWriteStr(sb, str, ...) _sbufPWriteStr(sb, str, opt_flags(__VA_ARGS__))
557bool _sbufPWriteLine(_Inout_ StreamBuffer* sb, _In_opt_ strref str, flags_t flags);
569#define sbufPWriteLine(sb, str, ...) _sbufPWriteLine(sb, str, opt_flags(__VA_ARGS__))
572bool _sbufPWriteEOL(_Inout_ StreamBuffer* sb, flags_t flags);
583#define sbufPWriteEOL(sb, ...) _sbufPWriteEOL(sb, opt_flags(__VA_ARGS__))
686_Success_(
return)
bool
687sbufCRead(_Inout_ StreamBuffer* sb, _Out_writes_bytes_to_(sz, *bytesread) uint8* buf,
size_t sz,
688 _Out_ _Deref_out_range_(0, sz)
size_t* bytesread);
704_Success_(
return > 0) bool
705sbufCPeek(_Inout_ StreamBuffer* sb, _Out_writes_bytes_(sz) uint8* buf,
size_t off,
size_t sz);
737bool sbufCSend(_Inout_ StreamBuffer* sb, _In_ sbufSendCB func,
size_t sz, _Inout_opt_
void* ctx);
Ring buffer implementation for efficient streaming I/O.
Basic closure functionality.
Condition variable synchronization primitive.
bool sbufCFeed(StreamBuffer *sb, size_t minsz)
bool sbufCPeek(StreamBuffer *sb, uint8 *buf, size_t off, size_t sz)
bool sbufCAttached(StreamBuffer *sb)
void sbufCUnregister(StreamBuffer *sb)
size_t sbufCAvail(StreamBuffer *sb)
bool sbufCSkip(StreamBuffer *sb, size_t bytes)
bool sbufCSend(StreamBuffer *sb, sbufSendCB func, size_t sz, void *ctx)
bool sbufCRegisterPushDirect(StreamBuffer *sb, closure cpush)
bool sbufCRead(StreamBuffer *sb, uint8 *buf, size_t sz, size_t *bytesread)
bool sbufCRegisterPush(StreamBuffer *sb, closure cnotify)
STREAM_BUFFER_OPT_FLAGS
Optional flags for sbufCreate() and the sbufPWrite() family.
void sbufClose(StreamBuffer *sb)
void sbufError(StreamBuffer *sb)
void sbufFinish(StreamBuffer **sb)
bool sbufIsLocked(StreamBuffer *sb)
bool sbufIsClosed(StreamBuffer *sb)
void sbufClearError(StreamBuffer *sb)
void sbufSetWatermark(StreamBuffer *sb, size_t high, size_t low)
bool sbufIsPush(StreamBuffer *sb)
StreamBuffer * sbufAcquire(StreamBuffer *sb)
void sbufRelease(StreamBuffer **sb)
bool sbufIsPull(StreamBuffer *sb)
bool sbufCMore(StreamBuffer *sb)
bool sbufIsError(StreamBuffer *sb)
void sbufPUnregister(StreamBuffer *sb)
size_t sbufPAvail(StreamBuffer *sb)
bool sbufPAttached(StreamBuffer *sb)
void sbufPSetResume(StreamBuffer *sb, closure resume)
bool sbufPIsHeld(StreamBuffer *sb)
bool sbufPFlush(StreamBuffer *sb)
bool sbufPRegisterPull(StreamBuffer *sb, closure ppull)
size_t(* sbufPullCB)(stvlist *cvars, StreamBuffer *sb, uint8 *buf, size_t sz)
void(* sbufResumeCB)(stvlist *cvars, StreamBuffer *sb)
void(* sbufNotifyCB)(stvlist *cvars, StreamBuffer *sb, size_t sz)
void(* sbufPushCB)(stvlist *cvars, StreamBuffer *sb, const uint8 *buf, size_t sz)
Mutex synchronization primitive.
Runtime type system and type descriptor infrastructure.