Changeset: cb66a80e0f04 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/cb66a80e0f04
Modified Files:
        clients/Tests/exports.stable.out
        gdk/gdk.h
        gdk/gdk_private.h
        gdk/gdk_utils.c
        monetdb5/modules/atoms/json.c
        monetdb5/optimizer/opt_evaluate.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_bincopyconvert.c
Branch: resource_management
Log Message:

stacking temp allocators


diffs (truncated from 384 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -460,8 +460,6 @@ size_t _MT_npages;
 size_t _MT_pagesize;
 const union _dbl_nil_t _dbl_nil_;
 const union _flt_nil_t _flt_nil_;
-allocator *allocator_get_parent(const allocator *alloc);
-bool allocator_tmp_active(const allocator *alloc);
 char *asctime_r(const struct tm *restrict, char *restrict);
 ssize_t bitFromStr(allocator *ma, const char *src, size_t *len, bit **dst, 
bool external);
 ssize_t bitToStr(allocator *ma, str *dst, size_t *len, const bit *src, bool 
external);
@@ -578,12 +576,14 @@ ssize_t ptrToStr(allocator *ma, str *dst
 const ptr ptr_nil;
 void *sa_alloc(allocator *sa, size_t sz);
 void sa_close(allocator *sa);
+void sa_close_to(allocator *sa, uint64_t);
 void sa_destroy(allocator *sa);
 void sa_free(allocator *sa, void *);
 exception_buffer *sa_get_eb(allocator *sa) __attribute__((__pure__));
+allocator *sa_get_parent(const allocator *sa);
 allocator *sa_get_ta(allocator *sa);
 const char *sa_name(allocator *sa);
-void sa_open(allocator *sa);
+uint64_t sa_open(allocator *sa);
 void *sa_realloc(allocator *sa, void *ptr, size_t sz, size_t osz);
 allocator *sa_reset(allocator *sa);
 void sa_set_ta(allocator *sa, allocator *ta);
@@ -591,6 +591,7 @@ size_t sa_size(allocator *sa);
 char *sa_strconcat(allocator *sa, const char *s1, const char *s2);
 char *sa_strdup(allocator *sa, const char *s);
 char *sa_strndup(allocator *sa, const char *s, size_t l);
+bool sa_tmp_active(const allocator *sa);
 void *sa_zalloc(allocator *sa, size_t sz);
 ssize_t shtFromStr(allocator *ma, const char *src, size_t *len, sht **dst, 
bool external);
 ssize_t shtToStr(allocator *ma, str *dst, size_t *len, const sht *src, bool 
external);
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1734,8 +1734,8 @@ gdk_export ValPtr VALinit(allocator *va,
        __attribute__((__access__(write_only, 1)));
 
 gdk_export allocator *create_allocator(allocator *pa, const char *, bool 
use_lock);
-gdk_export allocator *allocator_get_parent(const allocator *alloc);
-gdk_export bool allocator_tmp_active(const allocator *alloc);
+gdk_export allocator *sa_get_parent(const allocator *sa);
+gdk_export bool sa_tmp_active(const allocator *sa);
 gdk_export allocator *sa_reset(allocator *sa);
 gdk_export void *sa_alloc(allocator *sa,  size_t sz);
 gdk_export void *sa_zalloc(allocator *sa,  size_t sz);
@@ -1746,8 +1746,9 @@ gdk_export char *sa_strdup(allocator *sa
 gdk_export char *sa_strconcat(allocator *sa, const char *s1, const char *s2);
 gdk_export size_t sa_size(allocator *sa);
 gdk_export const char* sa_name(allocator *sa);
-gdk_export void sa_open(allocator *sa);  /* open new frame of tempory 
allocations */
-gdk_export void sa_close(allocator *sa); /* close temporary frame, reset to 
old state */
+gdk_export uint64_t sa_open(allocator *sa);  /* open new frame of tempory 
allocations */
+gdk_export void sa_close(allocator *sa); /* close temporary frame, reset to 
initial state */
+gdk_export void sa_close_to(allocator *sa, uint64_t); /* close temporary 
frame, reset to old state */
 gdk_export void sa_free(allocator *sa, void *);
 gdk_export exception_buffer *sa_get_eb(allocator *sa)
        __attribute__((__pure__));
@@ -1763,6 +1764,7 @@ gdk_export allocator *sa_get_ta(allocato
 #define ma_realloc(ma, obj, sz, osz) (void *) sa_realloc(ma, obj, sz, osz)
 #define ma_open(ma)            sa_open(ma)
 #define ma_close(ma)           sa_close(ma)
+#define ma_close_to(ma, offset)        sa_close_to(ma, offset)
 #define ma_free(ma, obj)       sa_free(ma, obj)
 #define ma_reset(ma)           sa_reset(ma)
 
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -58,8 +58,7 @@ struct allocator {
        size_t frees;
        size_t free_blk_hits;
 
-       size_t tmp_used; /* keeps total of tmp allocated bytes */
-       bool tmp_active; /* currently only one level of temp usage */
+       size_t tmp_used; /* keeps track of temp usage via sa_open/sa_close */
        exception_buffer eb;
        MT_Lock lock;    /* lock for thread-safe allocations */
        bool use_lock;
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -2283,7 +2283,7 @@ static int sa_double_num_blks(allocator 
 
 
 /*
- * Free blocks are maintain at top level
+ * Free blocks are maintained at top level
  */
 static void *
 sa_use_freed_blk(allocator *sa, size_t sz)
@@ -2325,34 +2325,52 @@ sa_use_freed(allocator *sa, size_t sz)
        return NULL;
 }
 
+static inline bool
+sa_reallocated(allocator *sa)
+{
+       return sa->blks != (char **)sa->first_blk;
+}
+
+
+static inline void
+_sa_free_blks(allocator *sa, size_t start_idx)
+{
+       size_t n_blks = sa->nr;
+       char **blks = sa->blks;
+
+       for (size_t i = start_idx; i < n_blks; i++) {
+               char *next = blks[i];
+               sa_free_blk(sa, next);
+               sa->blks[i] = NULL;
+       }
+}
+
 
 /*
  * Reset allocator to initial state
  */
 allocator *sa_reset(allocator *sa)
 {
-       size_t i;
-       size_t n_blks = sa->nr;
-       char **blks = sa->blks;
-
-       // only child allocators
-       //assert(sa->pa);
+       //size_t i;
+       //size_t n_blks = sa->nr;
+       //char **blks = sa->blks;
 
        // free all but 1st
-       for (i = 1; i < n_blks; i++) {
-               char *next = blks[i];
-               sa_free_blk(sa, next);
-               sa->blks[i] = NULL;
-       }
-
-       sa->size = SA_NUM_BLOCKS;
-       sa->blks = (char **)sa->first_blk;
-       sa->blks[0] = sa->first_blk;
+       _sa_free_blks(sa, 1);
+       //for (i = 1; i < n_blks; i++) {
+       //      char *next = blks[i];
+       //      sa_free_blk(sa, next);
+       //      sa->blks[i] = NULL;
+       //}
 
        // compute start offset
        size_t offset = round16(sizeof(char*) * SA_NUM_BLOCKS) +
                round16(sizeof(allocator));
 
+       COND_LOCK_ALLOCATOR(sa);
+       sa->size = SA_NUM_BLOCKS;
+       sa->blks = (char **)sa->first_blk;
+       sa->blks[0] = sa->first_blk;
        sa->used = offset;
        sa->frees = 0;
        sa->nr = 1;
@@ -2362,6 +2380,8 @@ allocator *sa_reset(allocator *sa)
        sa->blk_size = SA_BLOCK_SIZE;
        sa->objects = 0;
        sa->inuse = 0;
+       sa->tmp_used = 0;
+       COND_UNLOCK_ALLOCATOR(sa);
        return sa;
 }
 
@@ -2375,7 +2395,7 @@ sa_realloc(allocator *sa, void *p, size_
 
        if (r)
                memcpy(r, p, oldsz);
-       if (oldsz >= sa->blk_size && !sa->tmp_active) {
+       if (oldsz >= sa->blk_size && !sa_tmp_active(sa)) {
                char* ptr = (char *) p - SA_HEADER_SIZE;
                size_t i;
                for (i = 1; i < sa->nr; i++)
@@ -2422,10 +2442,10 @@ sa_double_num_blks(allocator *sa)
                sa->usedmem += bytes;
        }
        if (tmp) {
-               bool reallocated = sa->blks != (char **)sa->first_blk;
+               //bool reallocated = sa->blks != (char **)sa->first_blk;
                size_t bytes = sizeof(char*) * osz;
                memcpy(tmp, sa->blks, bytes);
-               if (!sa->pa && reallocated) {
+               if (!sa->pa && sa_reallocated(sa)) {
                        GDKfree(sa->blks);
                        sa->usedmem -= bytes;
                }
@@ -2583,7 +2603,6 @@ create_allocator(allocator *pa, const ch
        sa->inuse = 0;
        sa->free_obj_hits = 0;
        sa->free_blk_hits = 0;
-       sa->tmp_active = 0;
        sa->tmp_used = 0;
        sa->use_lock = use_lock;
        MT_lock_init(&sa->lock, "allocator_lock");
@@ -2685,33 +2704,63 @@ sa_name(allocator *sa)
        return sa->name;
 }
 
-
 exception_buffer *
 sa_get_eb(allocator *sa)
 {
        return &sa->eb;
 }
 
-void
+#define SA_PACK_INT32(hi, lo)\
+    ((((uint64_t)(hi)) << 32) | ((uint64_t)(lo)))
+#define SA_UNPACK_HI(v)\
+       ((uint32_t)((uint64_t)(v) >> 32))
+#define SA_UNPACK_LO(v)\
+               ((int32_t)((uint64_t)(v) & 0xFFFFFFFFULL))
+
+uint64_t
 sa_open(allocator *sa)
 {
-       assert(!sa->tmp_active);
-       sa->tmp_active = 1;
-       sa->tmp_used = 0;
+       assert(sa->pa); // only child allocators are tmp used
+       sa->tmp_used += 1;
+       return SA_PACK_INT32(sa->nr, sa->used);
 }
 
 void
 sa_close(allocator *sa)
 {
-       assert(sa->tmp_active);
+       assert(sa_tmp_active(sa));
        sa_reset(sa);
-       sa->tmp_active = 0;
+       sa->tmp_used = 0;
+}
+
+void
+sa_close_to(allocator *sa, uint64_t offset)
+{
+       assert(sa_tmp_active(sa));
+       assert(offset);
+       if (offset && !sa_reallocated(sa)) {
+               size_t blk_idx = SA_UNPACK_HI(offset);
+               size_t blk_offset = SA_UNPACK_LO(offset);
+               assert((blk_idx > 0) && (blk_idx <= sa->nr));
+               assert(blk_offset > 0 && blk_offset < SA_BLOCK_SIZE);
+               _sa_free_blks(sa, blk_idx);
+               sa->nr = blk_idx;
+               sa->used = blk_offset;
+       }
+       if (sa->tmp_used > 0)
+               sa->tmp_used -= 1;
+}
+
+bool
+sa_tmp_active(const allocator *a)
+{
+    return a && (a->tmp_used > 0);
 }
 
 void
 sa_free(allocator *sa, void *obj)
 {
-       if (!obj) return; // nothing to do
+       if (!obj || sa_tmp_active(sa)) return; // nothing to do
        // retrieve size from header
        char* ptr = (char *) obj - SA_HEADER_SIZE;
        size_t sz = *((size_t *) ptr);
@@ -2724,14 +2773,9 @@ sa_free(allocator *sa, void *obj)
                sa_free_obj(sa, ptr, sz);
 }
 
-bool
-allocator_tmp_active(const allocator *a)
-{
-    return a && a->tmp_active;
-}
 
 allocator *
-allocator_get_parent(const allocator *a)
+sa_get_parent(const allocator *a)
 {
     return a ? a->pa : NULL;
 }
diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c
--- a/monetdb5/modules/atoms/json.c
+++ b/monetdb5/modules/atoms/json.c
@@ -517,6 +517,8 @@ JSONstr2json_intern(allocator *ma, json 
        json buf = *ret;
        size_t ln = strlen(*j)+1;
        size_t out_size = 0;
+       allocator *ta = sa_get_ta(ma);
+       uint64_t ta_offset = ma_open(ta);
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to