diff options
| author | krangelov <kr.angelov@gmail.com> | 2018-12-16 07:46:14 +0100 |
|---|---|---|
| committer | krangelov <kr.angelov@gmail.com> | 2018-12-16 07:46:14 +0100 |
| commit | eb2211217858d97256c802739531547c52d328a5 (patch) | |
| tree | 578060a42d79a4a7c12a60d964b7df7cbb051b02 /src/runtime/c/gu/seq.c | |
| parent | 083aa96e575554518dee32d03f579ad6cac26722 (diff) | |
a pool where the smallest chunks are memory pages
Diffstat (limited to 'src/runtime/c/gu/seq.c')
| -rw-r--r-- | src/runtime/c/gu/seq.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/runtime/c/gu/seq.c b/src/runtime/c/gu/seq.c index 72ccc3fae..33e49066b 100644 --- a/src/runtime/c/gu/seq.c +++ b/src/runtime/c/gu/seq.c @@ -100,6 +100,11 @@ gu_seq_free(GuSeq* seq) gu_mem_buf_free(seq); } +static void +gu_dummy_finalizer(GuFinalizer* self) +{ +} + GU_API void gu_buf_require(GuBuf* buf, size_t req_len) { @@ -109,7 +114,9 @@ gu_buf_require(GuBuf* buf, size_t req_len) size_t req_size = sizeof(GuSeq) + buf->elem_size * req_len; size_t real_size; - + + gu_require(buf->fin.fn != gu_dummy_finalizer); + if (buf->seq == NULL || buf->seq == gu_empty_seq()) { buf->seq = gu_mem_buf_alloc(req_size, &real_size); buf->seq->len = 0; @@ -164,6 +171,24 @@ gu_buf_freeze(GuBuf* buf, GuPool* pool) return seq; } +GU_API void +gu_buf_evacuate(GuBuf* buf, GuPool* pool) +{ + if (buf->seq != gu_empty_seq()) { + size_t len = gu_buf_length(buf); + + GuSeq* seq = gu_make_seq(buf->elem_size, len, pool); + void* bufdata = gu_buf_data(buf); + void* seqdata = gu_seq_data(seq); + memcpy(seqdata, bufdata, buf->elem_size * len); + gu_mem_buf_free(buf->seq); + + buf->seq = seq; + buf->fin.fn = gu_dummy_finalizer; + buf->avail_len = len; + } +} + GU_API void* gu_buf_insert(GuBuf* buf, size_t index) { |
