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]