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]