Home
Base module

Stream

Basic stream type for sockets and pipes.

Stream

#include <icy/stream.h>
template<typename T>
class Stream

Defined in src/base/include/icy/stream.h:30

Inherits: Handle< T >

Basic stream type for sockets and pipes.

List of all members

NameKindOwner
ReadvariableDeclared here
StreamfunctionDeclared here
~StreamfunctionDeclared here
closefunctionDeclared here
shutdownfunctionDeclared here
writefunctionDeclared here
writeOwnedfunctionDeclared here
setHighWaterMarkfunctionDeclared here
writefunctionDeclared here
streamfunctionDeclared here
_buffervariableDeclared here
_startedvariableDeclared here
_highWaterMarkvariableDeclared here
_writeReqFreevariableDeclared here
_ownedWriteReqFreevariableDeclared here
readStartfunctionDeclared here
readStopfunctionDeclared here
onReadfunctionDeclared here
allocWriteReqfunctionDeclared here
freeWriteReqfunctionDeclared here
allocOwnedWriteReqfunctionDeclared here
freeOwnedWriteReqfunctionDeclared here
canQueueWritefunctionDeclared here
HandletypedefDeclared here
HandlefunctionInherited from Handle
~HandlefunctionInherited from Handle
initfunctionInherited from Handle
invokefunctionInherited from Handle
invokeOrThrowfunctionInherited from Handle
closefunctionInherited from Handle
reffunctionInherited from Handle
unreffunctionInherited from Handle
initializedfunctionInherited from Handle
activefunctionInherited from Handle
closingfunctionInherited from Handle
closedfunctionInherited from Handle
errorfunctionInherited from Handle
setErrorfunctionInherited from Handle
setUVErrorfunctionInherited from Handle
setAndThrowErrorfunctionInherited from Handle
throwLastErrorfunctionInherited from Handle
loopfunctionInherited from Handle
resetfunctionInherited from Handle
getfunctionInherited from Handle
tidfunctionInherited from Handle
contextfunctionInherited from Handle
setCloseCleanupfunctionInherited from Handle
clearCloseCleanupfunctionInherited from Handle
assertThreadfunctionInherited from Handle
_loopvariableInherited from Handle
_contextvariableInherited from Handle
_tidvariableInherited from Handle
_errorvariableInherited from Handle
onErrorfunctionInherited from Handle
onClosefunctionInherited from Handle
HandlefunctionInherited from Handle
operator=functionInherited from Handle
HandlefunctionInherited from Handle
operator=functionInherited from Handle
TypetypedefInherited from Handle

Inherited from Handle

KindNameDescription
functionHandle inlineConstruct the handle bound to the given event loop.
function~Handle virtual inline
functioninit inlineInitialize the underlying libuv handle by calling f with the loop, the raw handle pointer, and any additional args.
functioninvoke inlineInvoke a libuv function f with args on the initialized handle.
functioninvokeOrThrow inlineInvoke a libuv function f with args, throwing on failure.
functionclose virtual inlineClose and destroy the handle.
functionref inlineRe-reference the handle with the event loop after a previous [unref()](icy-uv-Handle.html#unref).
functionunref inlineUnreference the handle from the event loop.
functioninitialized const inlineReturn true if the handle has been successfully initialized via [init()](icy-uv-Handle.html#init-8).
functionactive virtual const inlineReturn true when the handle is active (libuv uv_is_active).
functionclosing virtual const inlineReturn true if uv_close has been called and the handle is awaiting its close callback (libuv uv_is_closing).
functionclosed virtual const inlineReturn true if the handle has been fully closed (context released).
functionerror const inlineReturn the last error set on this handle, or a default-constructed [Error](icy-Error.html#error) if no error has occurred.
functionsetError virtual inlineSet the error state and invoke [onError()](icy-uv-Handle.html#onerror).
functionsetUVError inlineTranslate a libuv error code into an [Error](icy-Error.html#error) and call [setError()](icy-uv-Handle.html#seterror-1).
functionsetAndThrowError inlineSet the error state from a libuv error code and throw a std::runtime_error.
functionthrowLastError inlineThrow a std::runtime_error if the handle currently holds an error.
functionloop const inlineReturn the event loop this handle is bound to.
functionreset inlineClose the current handle (if open) and allocate a fresh [Context](icy-uv-Context.html#context-2), leaving the handle ready to be re-initialized via [init()](icy-uv-Handle.html#init-8).
functionget const inlineReturn the raw libuv handle pointer cast to [Handle](icy-uv-Handle.html#handle-6).
functiontid const inlineReturn the ID of the thread that constructed this handle.
functioncontext const inlineReturn the raw [Context](icy-uv-Context.html#context-2) that owns the libuv handle memory.
functionsetCloseCleanup inline
functionclearCloseCleanup inline
functionassertThread const inlineThrow std::logic_error if called from any thread other than the thread that constructed this handle.
variable_loop
variable_context
variable_tid
variable_error
functiononError virtual inlineCalled by [setError()](icy-uv-Handle.html#seterror-1) after the error state has been updated.
functiononClose virtual inlineCalled by [close()](icy-uv-Handle.html#close-18) after the context has been released.
functionHandleNonCopyable and NonMovable.
functionoperator=Deleted assignment operator.
functionHandleDeleted constructor.
functionoperator=Deleted assignment operator.
typedefTypeDefine the native handle type.

Public Attributes

ReturnNameDescription
Signal< void(const char *, const int &)>ReadEmitted when data has been received from the peer.

Read

Signal< void(const char *, const int &)> Read

Defined in src/base/include/icy/stream.h:210

Emitted when data has been received from the peer.

Slot signature: void(const char* data, const int& len)

Public Methods

ReturnNameDescription
Stream inlineConstruct the stream bound to loop with a 64 KiB read buffer.
~Stream virtual inlineDestroy the stream, stopping reads and freeing pooled write requests.
voidclose virtual inline overrideCloses and resets the stream handle. This will close the active socket/pipe and destroy the handle.
boolshutdown inlineSend a TCP/pipe shutdown request to the connected peer.
boolwrite inlineWrite len bytes from data to the stream.
boolwriteOwned inlineWrite an owned payload buffer to the stream.
voidsetHighWaterMark inlineSet the high water mark for the write queue (default 16MB). When the write queue exceeds this size, write() returns false.
boolwrite inlineWrite len bytes from data together with a stream handle over an IPC pipe (uses uv_write2).
uv_stream_t *stream inlineReturn the underlying uv_stream_t pointer cast from the native handle.

Stream

inline

inline Stream(uv::Loop * loop = uv::defaultLoop())

Defined in src/base/include/icy/stream.h:47

Construct the stream bound to loop with a 64 KiB read buffer.

Parameters

  • loop Event loop to associate this stream with.

~Stream

virtual inline

virtual inline ~Stream()

Defined in src/base/include/icy/stream.h:54

Destroy the stream, stopping reads and freeing pooled write requests.


close

virtual inline override

virtual inline void close() override

Defined in src/base/include/icy/stream.h:67

Closes and resets the stream handle. This will close the active socket/pipe and destroy the handle.

If the stream is already closed this call will have no side-effects.

Reimplements
Reimplemented by

shutdown

inline

inline bool shutdown()

Defined in src/base/include/icy/stream.h:82

Send a TCP/pipe shutdown request to the connected peer.

Issues a half-close: no further writes will be accepted after this, but the stream remains open for reading until the peer also closes.

Returns

true if the shutdown request was submitted successfully; false if the stream is not active.


write

inline

inline bool write(const char * data, size_t len)

Defined in src/base/include/icy/stream.h:105

Write len bytes from data to the stream.

The write is non-blocking; data is buffered by libuv. Returns false without throwing if the stream is inactive, reads have not started, or the internal write queue exceeds the high-water mark.

Parameters

  • data Pointer to the bytes to send. Must remain valid until the write completion callback fires.

  • len Number of bytes to send.

Returns

true if the write was queued; false on backpressure or if the stream is not in a writable state.


writeOwned

inline

inline bool writeOwned(Buffer && buffer)

Defined in src/base/include/icy/stream.h:140

Write an owned payload buffer to the stream.

The buffer is moved into the queued write request and retained until the libuv completion callback fires. Use this path whenever the caller does not naturally own storage beyond the current stack frame.

Parameters

  • buffer Payload buffer moved into the async write request.

Returns

true if the write was queued; false on backpressure or if the stream is not in a writable state.


setHighWaterMark

inline

inline void setHighWaterMark(size_t bytes)

Defined in src/base/include/icy/stream.h:166

Set the high water mark for the write queue (default 16MB). When the write queue exceeds this size, write() returns false.


write

inline

inline bool write(const char * data, size_t len, uv_stream_t * send)

Defined in src/base/include/icy/stream.h:178

Write len bytes from data together with a stream handle over an IPC pipe (uses uv_write2).

Only valid for named-pipe handles opened with IPC mode enabled. Throws std::logic_error if called on a non-IPC pipe.

Parameters

  • data Bytes to send alongside the handle.

  • len Number of bytes to send.

  • send Stream handle to pass to the receiving process.

Returns

true if the write was queued; false on error.


stream

inline

inline uv_stream_t * stream()

Defined in src/base/include/icy/stream.h:202

Return the underlying uv_stream_t pointer cast from the native handle.

Returns

Pointer to the uv_stream_t, or nullptr if the handle is closed.

Protected Attributes

ReturnNameDescription
Buffer_buffer
bool_started
size_t_highWaterMark16MB default write queue limit
std::vector< uv_write_t * >_writeReqFreeFreelist for write requests.
std::vector< OwnedWriteReq * >_ownedWriteReqFreeFreelist for owned write requests.

_buffer

Buffer _buffer

Defined in src/base/include/icy/stream.h:374


_started

bool _started {false}

Defined in src/base/include/icy/stream.h:375


_highWaterMark

size_t _highWaterMark {16 * 1024 * 1024}

Defined in src/base/include/icy/stream.h:376

16MB default write queue limit


_writeReqFree

std::vector< uv_write_t * > _writeReqFree

Defined in src/base/include/icy/stream.h:377

Freelist for write requests.


_ownedWriteReqFree

std::vector< OwnedWriteReq * > _ownedWriteReqFree

Defined in src/base/include/icy/stream.h:378

Freelist for owned write requests.

Protected Methods

ReturnNameDescription
boolreadStart virtual inlineBegin reading from the stream by registering libuv read callbacks.
boolreadStop virtual inlineStop reading from the stream.
voidonRead virtual inlineCalled by handleRead when len bytes of data arrive.
uv_write_t *allocWriteReq inlineReturn a uv_write_t from the freelist, or allocate a new one if the pool is empty.
voidfreeWriteReq inlineReturn req to the freelist, or delete it if the pool is at capacity.
OwnedWriteReq *allocOwnedWriteReq inline
voidfreeOwnedWriteReq inline
boolcanQueueWrite inline

readStart

virtual inline

virtual inline bool readStart()

Defined in src/base/include/icy/stream.h:219

Begin reading from the stream by registering libuv read callbacks.

Sets the stream's data pointer to this so callbacks can recover the C++ object. Has no effect and returns false if already started.

Returns

true if uv_read_start was called successfully.

Reimplemented by

readStop

virtual inline

virtual inline bool readStop()

Defined in src/base/include/icy/stream.h:236

Stop reading from the stream.

No further read callbacks will fire after this returns. Has no effect and returns false if not currently started.

Returns

true if uv_read_stop was called successfully.


onRead

virtual inline

virtual inline void onRead(const char * data, size_t len)

Defined in src/base/include/icy/stream.h:253

Called by handleRead when len bytes of data arrive.

The default implementation emits the Read signal. Override to intercept data before it reaches signal subscribers.

Parameters

  • data Pointer into the read buffer; valid only for this call.

  • len Number of valid bytes in data.

Reimplemented by

allocWriteReq

inline

inline uv_write_t * allocWriteReq()

Defined in src/base/include/icy/stream.h:318

Return a uv_write_t from the freelist, or allocate a new one if the pool is empty.

Returns

Pointer to an unused uv_write_t.


freeWriteReq

inline

inline void freeWriteReq(uv_write_t * req)

Defined in src/base/include/icy/stream.h:331

Return req to the freelist, or delete it if the pool is at capacity.

Parameters

  • req Write request to recycle or free.

allocOwnedWriteReq

inline

inline OwnedWriteReq * allocOwnedWriteReq()

Defined in src/base/include/icy/stream.h:340


freeOwnedWriteReq

inline

inline void freeOwnedWriteReq(OwnedWriteReq * req)

Defined in src/base/include/icy/stream.h:350


canQueueWrite

inline

inline bool canQueueWrite(size_t len)

Defined in src/base/include/icy/stream.h:361

Public Types

NameDescription
Handle

Handle

using Handle = uv::Handle< T >

Defined in src/base/include/icy/stream.h:33