Changeset: 0d1a20f520da for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0d1a20f520da
Modified Files:
        gdk/gdk.h
        monetdb5/modules/atoms/json.c
Branch: resource_management
Log Message:

use tls allocator for json parsing


diffs (truncated from 378 to 300 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1765,7 +1765,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_close_to(ma, state) sa_close_to(ma, state)
 #define ma_free(ma, obj)       sa_free(ma, obj)
 #define ma_reset(ma)           sa_reset(ma)
 
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
@@ -466,15 +466,17 @@ static str
 JSONdump(Client ctx, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
        (void) mb;
-       allocator *ma = ctx->curprg->def->ma;
+       allocator *ta = MT_thread_getallocator();
+       allocator_state *ta_state = ma_open(ta);
 
        bat *ret = getArgReference_bat(stk, pci, 0);
        const json *val = (json *) getArgReference(stk, pci, 1);
-       JSON *jt = JSONparse(ma, *val);
+       JSON *jt = JSONparse(ta, *val);
 
        CHECK_JSON(jt);
        BAT *bn = JSONdumpInternal(ctx, jt, 0);
        JSONfree(jt);
+       ma_close_to(ta, ta_state);
        if (bn == NULL)
                throw(MAL, "json.dump", SQLSTATE(HY013) MAL_MALLOC_FAIL);
        *ret = bn->batCacheid;
@@ -517,7 +519,7 @@ 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);
+       allocator *ta = MT_thread_getallocator();
        allocator_state *ta_state = ma_open(ta);
 
        JSON *jt = NULL;
@@ -570,15 +572,20 @@ JSONstr2json(Client ctx, json *ret, cons
 static str
 JSONisvalid(Client ctx, bit *ret, const char *const *j)
 {
-       allocator *ma = ctx->curprg->def->ma;
+       (void) ctx;
+       allocator *ta = MT_thread_getallocator();
        if (strNil(*j)) {
                *ret = bit_nil;
        } else {
-               JSON *jt = JSONparse(ma, *j);
-               if (jt == NULL)
+               allocator_state *ta_state = ma_open(ta);
+               JSON *jt = JSONparse(ta, *j);
+               if (jt == NULL) {
+                       ma_close_to(ta, ta_state);
                        throw(MAL, "json.isvalid", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               }
                *ret = jt->error == MAL_SUCCEED;
                JSONfree(jt);
+               ma_close_to(ta, ta_state);
        }
        return MAL_SUCCEED;
 }
@@ -988,6 +995,8 @@ static str
 JSONfilterInternal(Client ctx, json *ret, const json *js, const char *const 
*expr, const char *other)
 {
        allocator *ma = ctx->curprg->def->ma;
+       allocator *ta = MT_thread_getallocator();
+       assert(ta);
        pattern terms[MAXTERMS];
        int tidx = 0;
        JSON *jt;
@@ -1002,7 +1011,8 @@ JSONfilterInternal(Client ctx, json *ret
                        throw(MAL, "JSONfilterInternal", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                return MAL_SUCCEED;
        }
-       jt = JSONparse(ma, j);
+       allocator_state *ta_state = ma_open(ta);
+       jt = JSONparse(ta, j);
        CHECK_JSON(jt);
        memset(terms, 0, sizeof(terms));
        msg = JSONcompile(ctx, *expr, terms);
@@ -1088,6 +1098,7 @@ JSONfilterInternal(Client ctx, json *ret
        //      if (terms[l].name)
        //              GDKfree(terms[l].name);
        JSONfree(jt);
+       ma_close_to(ta, ta_state);
        return msg;
 }
 
@@ -1527,7 +1538,8 @@ JSONparse(allocator *ma, const char *j)
 static str
 JSONlength(Client ctx, int *ret, const json *j)
 {
-       allocator *ma = ctx->curprg->def->ma;
+       (void) ctx;
+       allocator *ta = MT_thread_getallocator();
        int i, cnt = 0;
        JSON *jt;
 
@@ -1535,13 +1547,14 @@ JSONlength(Client ctx, int *ret, const j
                *ret = int_nil;
                return MAL_SUCCEED;
        }
-
-       jt = JSONparse(ma, *j);
+       allocator_state *ta_state = ma_open(ta);
+       jt = JSONparse(ta, *j);
        CHECK_JSON(jt);
        for (i = jt->elm[0].next; i; i = jt->elm[i].next)
                cnt++;
        *ret = cnt;
        JSONfree(jt);
+       ma_close_to(ta, ta_state);
        return MAL_SUCCEED;
 }
 
@@ -1858,6 +1871,8 @@ static str
 JSONjson2textSeparator(Client ctx, str *ret, const json *js, const char *const 
*sep)
 {
        allocator *ma = ctx->curprg->def->ma;
+       allocator *ta = MT_thread_getallocator();
+       assert(ta);
        size_t l, ilen, sep_len;
        str s, msg;
        JSON *jt;
@@ -1867,17 +1882,19 @@ JSONjson2textSeparator(Client ctx, str *
                        throw(MAL, "json2txt", SQLSTATE(HY013) MAL_MALLOC_FAIL);
                return MAL_SUCCEED;
        }
-
-       jt = JSONparse(ma, *js);
+       allocator_state *ta_state = ma_open(ta);
+       jt = JSONparse(ta, *js);
        CHECK_JSON(jt);
        sep_len = strlen(*sep);
        ilen = l = strlen(*js) + 1;
        if (!(s = ma_alloc(ma, l))) {
                JSONfree(jt);
+               ma_close_to(ta, ta_state);
                throw(MAL, "json2txt", SQLSTATE(HY013) MAL_MALLOC_FAIL);
        }
        msg = JSONplaintext(ctx, &s, &l, &ilen, jt, 0, *sep, sep_len);
        JSONfree(jt);
+       ma_close_to(ta, ta_state);
        if (msg) {
                //GDKfree(s);
                return msg;
@@ -1903,10 +1920,11 @@ JSONjson2numberInternal(Client ctx, void
                                                void (*str2num)(void **ret, 
const char *nptr,
                                                                                
size_t len))
 {
-       allocator *ma = ctx->curprg->def->ma;
+       (void) ctx;
+       allocator *ta = MT_thread_getallocator();
        JSON *jt;
-
-       jt = JSONparse(ma, *js);
+       allocator_state *ta_state = ma_open(ta);
+       jt = JSONparse(ta, *js);
        CHECK_JSON(jt);
        switch (jt->elm[0].kind) {
        case JSON_NUMBER:
@@ -1930,6 +1948,7 @@ JSONjson2numberInternal(Client ctx, void
                *ret = NULL;
        }
        JSONfree(jt);
+       ma_close_to(ta, ta_state);
 
        return MAL_SUCCEED;
 }
@@ -2072,17 +2091,20 @@ JSONunfoldContainer(Client ctx, JSON *jt
 static str
 JSONunfoldInternal(Client ctx, bat *od, bat *key, bat *val, const json *js)
 {
-       allocator *ma = ctx->curprg->def->ma;
+       (void) ctx;
+       allocator *ta = MT_thread_getallocator();
        BAT *bo = NULL, *bk, *bv;
        oid o = 0;
        str msg = MAL_SUCCEED;
 
-       JSON *jt = JSONparse(ma, *js);
+       allocator_state *ta_state = ma_open(ta);
+       JSON *jt = JSONparse(ta, *js);
 
        CHECK_JSON(jt);
        bk = COLnew(0, TYPE_str, 64, TRANSIENT);
        if (bk == NULL) {
                JSONfree(jt);
+               ma_close_to(ta, ta_state);
                throw(MAL, "json.unfold", SQLSTATE(HY013) MAL_MALLOC_FAIL);
        }
 
@@ -2091,6 +2113,7 @@ JSONunfoldInternal(Client ctx, bat *od, 
                if (bo == NULL) {
                        BBPreclaim(bk);
                        JSONfree(jt);
+                       ma_close_to(ta, ta_state);
                        throw(MAL, "json.unfold", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                }
        }
@@ -2098,6 +2121,7 @@ JSONunfoldInternal(Client ctx, bat *od, 
        bv = COLnew(0, TYPE_json, 64, TRANSIENT);
        if (bv == NULL) {
                JSONfree(jt);
+               ma_close_to(ta, ta_state);
                BBPreclaim(bo);
                BBPreclaim(bk);
                throw(MAL, "json.unfold", SQLSTATE(HY013) MAL_MALLOC_FAIL);
@@ -2109,6 +2133,7 @@ JSONunfoldInternal(Client ctx, bat *od, 
                msg = createException(MAL, "json.unfold",
                                                          "JSON object or array 
expected");
        JSONfree(jt);
+       ma_close_to(ta, ta_state);
        if (msg) {
                BBPreclaim(bk);
                BBPreclaim(bo);
@@ -2131,17 +2156,21 @@ JSONunfoldInternal(Client ctx, bat *od, 
 static str
 JSONkeyTable(Client ctx, bat *ret, const json *js)
 {
-       allocator *ma = ctx->curprg->def->ma;
+       (void) ctx;
+       allocator *ta = MT_thread_getallocator();
+       assert(ta);
        BAT *bn;
        char *r;
        int i;
        JSON *jt;
 
-       jt = JSONparse(ma, *js);                // already validated
+       allocator_state *ta_state = ma_open(ta);
+       jt = JSONparse(ta, *js);                // already validated
        CHECK_JSON(jt);
        bn = COLnew(0, TYPE_str, 64, TRANSIENT);
        if (bn == NULL) {
                JSONfree(jt);
+               ma_close_to(ta, ta_state);
                throw(MAL, "json.keys", SQLSTATE(HY013) MAL_MALLOC_FAIL);
        }
 
@@ -2150,12 +2179,14 @@ JSONkeyTable(Client ctx, bat *ret, const
                if (r == NULL || BUNappend(bn, r, false) != GDK_SUCCEED) {
                        //GDKfree(r);
                        JSONfree(jt);
+                       ma_close_to(ta, ta_state);
                        BBPreclaim(bn);
                        throw(MAL, "json.keys", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                }
                //GDKfree(r);
        }
        JSONfree(jt);
+       ma_close_to(ta, ta_state);
        *ret = bn->batCacheid;
        BBPkeepref(bn);
        return MAL_SUCCEED;
@@ -2165,6 +2196,8 @@ static str
 JSONkeyArray(Client ctx, json *ret, const json *js)
 {
        allocator *ma = ctx->curprg->def->ma;
+       allocator *ta = MT_thread_getallocator();
+       assert(ta);
        char *result = NULL;
        str r;
        int i;
@@ -2176,7 +2209,8 @@ JSONkeyArray(Client ctx, json *ret, cons
                return MAL_SUCCEED;
        }
 
-       jt = JSONparse(ma, *js);                // already validated
+       allocator_state *ta_state = ma_open(ta);
+       jt = JSONparse(ta, *js);                // already validated
 
        CHECK_JSON(jt);
        if (jt->elm[0].kind == JSON_OBJECT) {
@@ -2185,6 +2219,7 @@ JSONkeyArray(Client ctx, json *ret, cons
                                r = ma_alloc(ma, jt->elm[i].valuelen + 3);
                                if (r == NULL) {
                                        JSONfree(jt);
+                                       ma_close_to(ta, ta_state);
                                        goto memfail;
                                }
                                strcpy_len(r, jt->elm[i].value - 1, 
jt->elm[i].valuelen + 3);
@@ -2192,18 +2227,22 @@ JSONkeyArray(Client ctx, json *ret, cons
                                r = MA_STRDUP(ma, "\"\"");
                                if (r == NULL) {
                                        JSONfree(jt);
+                                       ma_close_to(ta, ta_state);
                                        goto memfail;
                                }
                        }
                        result = JSONglue(ctx, result, r, ',');
                        if (result == NULL) {
                                JSONfree(jt);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to