GBuffer#
The gbuffer_t structure is a flexible, dynamic buffer designed to handle data efficiently. It supports reading, writing, serialization, and other utility operations. gbuffer_t is commonly used in Yuneta to manage data streams, encode/decode information, and store dynamic content.
Source code in:
Structure Overview#
The gbuffer_t structure includes the following key fields:
Field |
Description |
|---|---|
|
Reference counter for memory management. |
|
A user-defined label for identifying the buffer. |
|
A user-defined marker for specific positions in the buffer. |
|
The size of the allocated memory for the buffer. |
|
The maximum size the buffer can grow to in memory. |
|
Write pointer indicating the end of the written data. |
|
Read pointer indicating the current read position. |
|
Dynamically allocated memory containing the buffer’s data. |
Key Features#
1. Reference Counting#
The buffer uses a reference counter (
refcount) to manage memory safely.Functions like
gbuffer_increfandgbuffer_decrefensure that the buffer is only freed when no references remain.
2. Dynamic Memory Management#
The buffer dynamically allocates and grows its memory up to
max_memory_size.The
data_sizefield tracks the currently allocated size.
3. Reading and Writing#
Separate read (
curp) and write (tail) pointers allow for efficient reading and writing without interfering with each other.Functions like
gbuffer_getandgbuffer_appendprovide convenient access to manipulate data.
4. Serialization and Encoding#
Supports serialization to and from JSON objects.
Provides Base64 encoding and decoding for binary data.
5. Utility Functions#
Functions for setting markers (
mark) and labels (label).Utility functions for resetting, clearing, or calculating free and used space.
Core Operations#
Reading#
Retrieve Data: Access data from the current read pointer using functions like
gbuffer_getandgbuffer_getchar.Reset Pointer: Reset the read pointer to the start of the buffer with
gbuffer_reset_rd.
Writing#
Append Data: Add data to the buffer using
gbuffer_appendorgbuffer_append_string.Reset Pointer: Clear written data by resetting the write pointer with
gbuffer_reset_wr.
Utility#
Memory Info: Retrieve statistics like free space (
gbuffer_freebytes) or total bytes (gbuffer_totalbytes).Markers and Labels: Set or get markers (
gbuffer_setmark,gbuffer_getmark) and labels (gbuffer_setlabel,gbuffer_getlabel).
Serialization and Encoding#
JSON Serialization: Convert the buffer to and from JSON objects using
gbuffer_serializeandgbuffer_deserialize.Base64 Encoding/Decoding: Encode or decode data in Base64 format with
gbuffer_string_to_base64,gbuffer_base64_to_stringandgbuffer_encode_base64.
Benefits of gbuffer_t#
Efficiency: Separate read and write pointers allow simultaneous operations without reallocations.
Flexibility: Support for dynamic memory allocation and customizable markers or labels.
Extensibility: Serialization and encoding functions make it versatile for different use cases.
Safety: Reference counting ensures proper memory management and prevents premature deallocation.
Practical Applications#
Data Streams:
Manage incoming or outgoing data streams efficiently with dynamic resizing and memory tracking.
Serialization:
Convert structured data to JSON or Base64 for storage or transmission.
Buffering:
Temporarily store data for asynchronous processing or delayed reading.