Skip to content

Latest commit

 

History

History
108 lines (87 loc) · 3.16 KB

ibuf.md

File metadata and controls

108 lines (87 loc) · 3.16 KB

ibuf

ibuf

ibuf - input buffer

struct ibuf
{
	struct slab_cache *slabc;
	char *buf;
	/** Start of input. */
	char *rpos;
	/** End of useful input */
	char *wpos;
	/** End of buffer. */
	char *end;
	size_t start_capacity;
};

char *ibuf::buf - начало буффера

char *ibuf::rpos - прочитанный префикс

char *ibuf::wpos - конец участка данных

char *ibuf::end - конец буффера

buf <consumed> rpos <unconsumed (used)> wpos <unallocated (unused)> end

void
ibuf_create(struct ibuf *ibuf, struct slab_cache *slabc, size_t start_capacity)

- инициализирует ibuf, но не аллоцирует в нем память под буффер

void
ibuf_destroy(struct ibuf *ibuf);

- освобождает память под буффером

void
ibuf_reinit(struct ibuf *ibuf)

- ibuf_destroy + ibuf_create

static inline size_t
ibuf_used(struct ibuf *ibuf)

- wpos - rpos (записано, но пока не прочитано)

static inline size_t
ibuf_unused(struct ibuf *ibuf)

- end - wpos (сколько ещё можно записать)

static inline size_t
ibuf_capacity(struct ibuf *ibuf)

- end - buf

void *
ibuf_reserve_slow(struct ibuf *ibuf, size_t size)

- вызывается только если на суффиксе не хватает места (unallocated < size), при этом если можно сдвинуть все в начало (выкинув consumed) так, чтобы после этого в конце оказалось достаточно свободного места, то обходимся этим, иначе переаллоцируем в 2 раза больший кусок памяти, и переносим всё туда. (для аллокаций используется slab аллокатор)

void
ibuf_shrink(struct ibuf *ibuf);

- shrink_to_fit в std::vector

static inline void *
ibuf_reserve(struct ibuf *ibuf, size_t size)

- проверяет достаточно ли свободного места в конце, если нет вызывает ibuf_reserve_slow.

static inline void *
ibuf_alloc(struct ibuf *ibuf, size_t size)

- продвинуть wpos вперед на size, т.е. чтобы что-то положить в ibuf, сначала зовется ibuf_alloc, затем руками в конец кладется то, что хочется.

static inline void
ibuf_discard(struct ibuf *ibuf, size_t size)

- выкинуть size байт с конца. Важно чтобы это была не обработанная (unconsumed) память.

static inline void
ibuf_truncate(struct ibuf *ibuf, size_t used)

- выкинуть все, что еще не было прочитано.

static inline void
ibuf_consume(struct ibuf *ibuf, size_t size)

- прочитать size байт с конца (сдвинуть rpos вперед на size байт)