Changeset: 3e24901859c4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3e24901859c4
Modified Files:
        clients/Tests/exports.stable.out
        gdk/gdk_analytic.h
        gdk/gdk_analytic_func.c
        gdk/gdk_analytic_statistics.c
        sql/backends/monet5/sql_rank.c
Branch: default
Log Message:

Use a Heap instead of a BAT for temporary storage.


diffs (299 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
@@ -295,7 +295,7 @@ bool GDKgetenv_istext(const char *name, 
 bool GDKgetenv_istrue(const char *name);
 bool GDKgetenv_isyes(const char *name);
 gdk_return GDKinit(struct opt *set, int setlen, bool embedded, const char 
*caller_revision);
-BAT *GDKinitialize_segment_tree(void) __attribute__((__warn_unused_result__));
+Heap *GDKinitialize_segment_tree(void) __attribute__((__warn_unused_result__));
 bool GDKinmemory(int farmid);
 const char *GDKlibversion(void) __attribute__((__const__));
 ATOMIC_TYPE GDKlockcnt;
@@ -316,7 +316,7 @@ void GDKprintinfo(void);
 void GDKprintinforegister(void (*func)(void));
 void GDKqsort(void *restrict h, void *restrict t, const void *restrict base, 
size_t n, int hs, int ts, int tpe, bool reverse, bool nilslast);
 void *GDKrealloc(void *pold, size_t size) __attribute__((__alloc_size__(2))) 
__attribute__((__warn_unused_result__));
-gdk_return GDKrebuild_segment_tree(oid ncount, oid data_size, BAT *st, void 
**segment_tree, oid **levels_offset, oid *nlevels);
+gdk_return GDKrebuild_segment_tree(oid ncount, oid data_size, Heap *st, void 
**segment_tree, oid **levels_offset, oid *nlevels);
 void GDKreset(int status);
 void GDKsetdebug(unsigned debug);
 gdk_return GDKsetenv(const char *name, const char *value);
diff --git a/gdk/gdk_analytic.h b/gdk/gdk_analytic.h
--- a/gdk/gdk_analytic.h
+++ b/gdk/gdk_analytic.h
@@ -76,9 +76,9 @@ gdk_export BAT *GDKanalytical_correlatio
    and 'nlevels' is the number of levels on the current segment tree.
    In order to run in out-of-memory situations they are allocated inside a 
BAT. The 'levels_offset' are allocated after
    the segment tree. The beginning pointers for both are returned. */
-gdk_export BAT *GDKinitialize_segment_tree(void)
+gdk_export Heap *GDKinitialize_segment_tree(void)
        __attribute__((__warn_unused_result__));
-gdk_export gdk_return GDKrebuild_segment_tree(oid ncount, oid data_size, BAT 
*st, void **segment_tree, oid **levels_offset, oid *nlevels);
+gdk_export gdk_return GDKrebuild_segment_tree(oid ncount, oid data_size, Heap 
*st, void **segment_tree, oid **levels_offset, oid *nlevels);
 
 /* segment_tree, levels_offset and nlevels must be already defined. ARG1, ARG2 
and ARG3 are to be used by the aggregate */
 #define populate_segment_tree(CAST, COUNT, INIT_AGGREGATE, COMPUTE_LEVEL0, 
COMPUTE_LEVELN, ARG1, ARG2, ARG3) \
diff --git a/gdk/gdk_analytic_func.c b/gdk/gdk_analytic_func.c
--- a/gdk/gdk_analytic_func.c
+++ b/gdk/gdk_analytic_func.c
@@ -12,24 +12,30 @@
 #include "gdk.h"
 #include "gdk_analytic.h"
 #include "gdk_calc_private.h"
+#include "gdk_private.h"
 
-BAT *
+Heap *
 GDKinitialize_segment_tree(void)
 {
-       /* The tree is allocated using raw bytes, so use a GDK type of size 1 */
-       BAT *st = COLnew(0, TYPE_bte, 0, TRANSIENT);
-
-       if (!st)
+       Heap *h = GDKmalloc(sizeof(Heap));
+       if (h == NULL)
                return NULL;
-       assert(st->tshift == 0);
-       BATsetcount(st, 0);
-       st->tsorted = st->trevsorted = st->tkey = st->tnonil = st->tnil = false;
-       st->tnosorted = st->tnorevsorted = 0;
-       return st;
+       *h = (Heap) {
+               .farmid = BBPselectfarm(TRANSIENT, TYPE_bte, dataheap),
+               .dirty = true,
+               .refs = ATOMIC_VAR_INIT(1),
+       };
+       snprintf(h->filename, sizeof(h->filename), "st%zu.tmp",
+                (size_t) MT_getpid());
+       if (h->farmid < 0 || HEAPalloc(h, 1024, 1) != GDK_SUCCEED) {
+               GDKfree(h);
+               return NULL;
+       }
+       return h;
 }
 
 gdk_return
-GDKrebuild_segment_tree(oid ncount, oid data_size, BAT *st, void 
**segment_tree, oid **levels_offset, oid *nlevels)
+GDKrebuild_segment_tree(oid ncount, oid data_size, Heap *st, void 
**segment_tree, oid **levels_offset, oid *nlevels)
 {
        oid total_size, next_tree_size = ncount, counter = ncount, next_levels 
= 1; /* there will be at least one level */
 
@@ -46,14 +52,15 @@ GDKrebuild_segment_tree(oid ncount, oid 
        next_tree_size = ((next_tree_size + SIZEOF_OID - 1) / SIZEOF_OID) * 
SIZEOF_OID;
        total_size = next_tree_size + next_levels * sizeof(oid);
 
-       if (total_size > BATcount(st)) {
+       if (total_size > st->size) {
                total_size = (((total_size) + 1023) & ~1023); /* align to a 
multiple of 1024 bytes */
-               if (BATextend(st, total_size) != GDK_SUCCEED)
+               st->free = st->size;
+               if (HEAPextend(st, total_size, true) != GDK_SUCCEED)
                        return GDK_FAIL;
-               BATsetcount(st, total_size);
-               *segment_tree = (void*)Tloc(st, 0);
-               *levels_offset = (oid*)((bte*)Tloc(st, 0) + next_tree_size); /* 
levels offset will be next to the segment tree */
+               *segment_tree = st->base;
+               *levels_offset = (oid*)(st->base + next_tree_size); /* levels 
offset will be next to the segment tree */
        } else {
+               *segment_tree = st->base;
                *levels_offset = (oid*)(*(bte**)segment_tree + next_tree_size); 
/* no reallocation, just update location of levels offset */
        }
        return GDK_SUCCEED;
@@ -1315,7 +1322,7 @@ GDKanalytical##OP(BAT *p, BAT *o, BAT *b
        gdk_return res = GDK_SUCCEED;                                   \
        uint16_t width = r->twidth;                                     \
        uint8_t *restrict rcast = (uint8_t *) Tloc(r, 0);               \
-       BAT *st = NULL;                                                 \
+       Heap *st = NULL;                                                \
                                                                        \
        assert(np == NULL || cnt == 0 || np[0] == 0);                   \
        if (cnt > 0) {                                                  \
@@ -1351,7 +1358,8 @@ cleanup:                                                  
        \
        bat_iterator_end(&bi);                                          \
        bat_iterator_end(&si);                                          \
        bat_iterator_end(&ei);                                          \
-       BBPreclaim(st);                                                 \
+       if (st)                                                         \
+               HEAPdecref(st, true);                                   \
        if (res != GDK_SUCCEED) {                                       \
                BBPreclaim(r);                                          \
                r = NULL;                                               \
@@ -1685,7 +1693,7 @@ GDKanalyticalcount(BAT *p, BAT *o, BAT *
        bool count_all = !ignore_nils || bi.nonil, last = false;
        void *segment_tree = NULL;
        gdk_return res = GDK_SUCCEED;
-       BAT *st = NULL;
+       Heap *st = NULL;
 
        assert(np == NULL || cnt == 0 || np[0] == 0);
        if (cnt > 0) {
@@ -1721,7 +1729,8 @@ cleanup:
        bat_iterator_end(&bi);
        bat_iterator_end(&si);
        bat_iterator_end(&ei);
-       BBPreclaim(st);
+       if (st)
+               HEAPdecref(st, true);
        if (res != GDK_SUCCEED) {
                BBPreclaim(r);
                r = NULL;
@@ -2022,7 +2031,7 @@ GDKanalyticalsum(BAT *p, BAT *o, BAT *b,
        bit *np = pi.base, *op = oi.base;
        void *segment_tree = NULL;
        gdk_return res = GDK_SUCCEED;
-       BAT *st = NULL;
+       Heap *st = NULL;
 
        assert(np == NULL || cnt == 0 || np[0] == 0);
        if (cnt > 0) {
@@ -2066,7 +2075,8 @@ cleanup:
        bat_iterator_end(&bi);
        bat_iterator_end(&si);
        bat_iterator_end(&ei);
-       BBPreclaim(st);
+       if (st)
+               HEAPdecref(st, true);
        if (res != GDK_SUCCEED) {
                BBPreclaim(r);
                r = NULL;
@@ -2552,7 +2562,7 @@ GDKanalyticalprod(BAT *p, BAT *o, BAT *b
        bit *np = pi.base, *op = oi.base;
        void *segment_tree = NULL;
        gdk_return res = GDK_SUCCEED;
-       BAT *st = NULL;
+       Heap *st = NULL;
 
        assert(np == NULL || cnt == 0 || np[0] == 0);
        if (cnt > 0) {
@@ -2592,7 +2602,8 @@ cleanup:
        bat_iterator_end(&bi);
        bat_iterator_end(&si);
        bat_iterator_end(&ei);
-       BBPreclaim(st);
+       if (st)
+               HEAPdecref(st, true);
        if (res != GDK_SUCCEED) {
                BBPreclaim(r);
                r = NULL;
diff --git a/gdk/gdk_analytic_statistics.c b/gdk/gdk_analytic_statistics.c
--- a/gdk/gdk_analytic_statistics.c
+++ b/gdk/gdk_analytic_statistics.c
@@ -384,7 +384,7 @@ GDKanalyticalavg(BAT *p, BAT *o, BAT *b,
 #else
        lng sum = 0;
 #endif
-       BAT *st = NULL;
+       Heap *st = NULL;
 
        assert(np == NULL || cnt == 0 || np[0] == 0);
        if (cnt > 0) {
@@ -420,7 +420,8 @@ cleanup:
        bat_iterator_end(&bi);
        bat_iterator_end(&si);
        bat_iterator_end(&ei);
-       BBPreclaim(st);
+       if (st)
+               HEAPdecref(st, true);
        if (res != GDK_SUCCEED) {
                BBPreclaim(r);
                r = NULL;
@@ -653,7 +654,7 @@ GDKanalyticalavginteger(BAT *p, BAT *o, 
        bit *np = pi.base, *op = oi.base;
        void *segment_tree = NULL;
        gdk_return res = GDK_SUCCEED;
-       BAT *st = NULL;
+       Heap *st = NULL;
 
        assert(np == NULL || cnt == 0 || np[0] == 0);
        if (cnt > 0) {
@@ -689,7 +690,8 @@ cleanup:
        bat_iterator_end(&bi);
        bat_iterator_end(&si);
        bat_iterator_end(&ei);
-       BBPreclaim(st);
+       if (st)
+               HEAPdecref(st, true);
        if (res != GDK_SUCCEED) {
                BBPreclaim(r);
                r = NULL;
@@ -930,7 +932,7 @@ GDKanalytical_##NAME(BAT *p, BAT *o, BAT
        dbl *rb = (dbl *) Tloc(r, 0), mean = 0, m2 = 0, delta;          \
        void *segment_tree = NULL;                                      \
        gdk_return res = GDK_SUCCEED;                                   \
-       BAT *st = NULL;                                                 \
+       Heap *st = NULL;                                                \
                                                                        \
        assert(np == NULL || cnt == 0 || np[0] == 0);                   \
        if (cnt > 0) {                                                  \
@@ -970,7 +972,8 @@ cleanup:                                                    
        \
        bat_iterator_end(&bi);                                          \
        bat_iterator_end(&si);                                          \
        bat_iterator_end(&ei);                                          \
-       BBPreclaim(st);                                                 \
+       if (st)                                                         \
+               HEAPdecref(st, true);                                   \
        if (res != GDK_SUCCEED) {                                       \
                BBPreclaim(r);                                          \
                r = NULL;                                               \
@@ -1162,7 +1165,7 @@ GDKanalytical_##NAME(BAT *p, BAT *o, BAT
        dbl *rb = (dbl *) Tloc(r, 0), mean1 = 0, mean2 = 0, m2 = 0, delta1, 
delta2; \
        void *segment_tree = NULL;                                      \
        gdk_return res = GDK_SUCCEED;                                   \
-       BAT *st = NULL;                                                 \
+       Heap *st = NULL;                                                \
                                                                        \
        assert(np == NULL || cnt == 0 || np[0] == 0);                   \
        if (cnt > 0) {                                                  \
@@ -1203,7 +1206,8 @@ cleanup:                                                  
        \
        bat_iterator_end(&b2i);                                         \
        bat_iterator_end(&si);                                          \
        bat_iterator_end(&ei);                                          \
-       BBPreclaim(st);                                                 \
+       if (st)                                                         \
+               HEAPdecref(st, true);                                   \
        if (res != GDK_SUCCEED) {                                       \
                BBPreclaim(r);                                          \
                r = NULL;                                               \
@@ -1428,7 +1432,7 @@ GDKanalytical_correlation(BAT *p, BAT *o
        dbl *rb = (dbl *) Tloc(r, 0), mean1 = 0, mean2 = 0, up = 0, down1 = 0, 
down2 = 0, delta1, delta2, aux, rr;
        void *segment_tree = NULL;
        gdk_return res = GDK_SUCCEED;
-       BAT *st = NULL;
+       Heap *st = NULL;
 
        assert(np == NULL || cnt == 0 || np[0] == 0);
        if (cnt > 0) {
@@ -1469,7 +1473,8 @@ cleanup:
        bat_iterator_end(&b2i);
        bat_iterator_end(&si);
        bat_iterator_end(&ei);
-       BBPreclaim(st);
+       if (st)
+               HEAPdecref(st, true);
        if (res != GDK_SUCCEED) {
                BBPreclaim(r);
                r = NULL;
diff --git a/sql/backends/monet5/sql_rank.c b/sql/backends/monet5/sql_rank.c
--- a/sql/backends/monet5/sql_rank.c
+++ b/sql/backends/monet5/sql_rank.c
@@ -1847,7 +1847,8 @@ static str
 do_covariance_and_correlation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci, const char *op,
                                                          BAT *(*func)(BAT *, 
BAT *, BAT *, BAT *, BAT *, BAT *, int, int), lng minimum, dbl defaultv, dbl 
single_case)
 {
-       BAT *r = NULL, *b = NULL, *c = NULL, *p = NULL, *o = NULL, *s = NULL, 
*e = NULL, *st = NULL;
+       BAT *r = NULL, *b = NULL, *c = NULL, *p = NULL, *o = NULL, *s = NULL, 
*e = NULL;
+       Heap *st = NULL;
        int tp1, tp2, frame_type;
        bool is_a_bat1, is_a_bat2;
        str msg = MAL_SUCCEED;
@@ -1988,7 +1989,8 @@ do_covariance_and_correlation(Client cnt
        }
 
 bailout1:
-       BBPreclaim(st);
+       if (st)
+               HEAPdecref(st, true);
        unfix_inputs(6, b, c, p, o, s, e);
        finalize_output(res, r, msg);
        return msg;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to