summaryrefslogtreecommitdiff
path: root/src/runtime/c/gu/seq.c
diff options
context:
space:
mode:
authorkrangelov <kr.angelov@gmail.com>2018-12-16 07:46:14 +0100
committerkrangelov <kr.angelov@gmail.com>2018-12-16 07:46:14 +0100
commiteb2211217858d97256c802739531547c52d328a5 (patch)
tree578060a42d79a4a7c12a60d964b7df7cbb051b02 /src/runtime/c/gu/seq.c
parent083aa96e575554518dee32d03f579ad6cac26722 (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.c27
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)
{