Changeset: 0aa78e5ad0b2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0aa78e5ad0b2
Modified Files:
clients/Tests/exports.stable.out
gdk/gdk_aggr.c
gdk/gdk_calc.h
gdk/gdk_calc_convert.c
gdk/gdk_string.c
monetdb5/modules/atoms/blob.c
monetdb5/modules/atoms/inet-46.c
monetdb5/modules/kernel/aggr.c
monetdb5/modules/mal/batcalc.c
monetdb5/modules/mal/calc.c
monetdb5/modules/mal/txtsim.c
sql/backends/monet5/UDF/pyapi3/conversion.h
sql/backends/monet5/UDF/pyapi3/conversion3.c
sql/backends/monet5/sql_cast_impl_int.h
sql/storage/bat/bat_logger.c
sql/storage/bat/bat_storage.c
sql/storage/store.c
Branch: resource_management
Log Message:
Use TLS allocator for local temp space; no need to pass allocator to many funcs.
diffs (truncated from 3185 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
@@ -113,7 +113,7 @@ bool BATcheckorderidx(BAT *b);
gdk_return BATclear(BAT *b, bool force);
void BATcommit(BAT *b, BUN size);
BAT *BATconstant(oid hseq, int tt, const void *val, BUN cnt, role_t role);
-BAT *BATconvert(allocator *ma, BAT *b, BAT *s, int tp, uint8_t scale1, uint8_t
scale2, uint8_t precision);
+BAT *BATconvert(BAT *b, BAT *s, int tp, uint8_t scale1, uint8_t scale2,
uint8_t precision);
BUN BATcount_no_nil(BAT *b, BAT *s);
gdk_return BATdel(BAT *b, BAT *d) __attribute__((__warn_unused_result__));
BAT *BATdense(oid hseq, oid tseq, BUN cnt)
__attribute__((__warn_unused_result__));
@@ -127,27 +127,27 @@ ValPtr BATgetprop(BAT *b, enum prop_t id
ValPtr BATgetprop_nolock(BAT *b, enum prop_t idx);
gdk_return BATgroup(BAT **groups, BAT **extents, BAT **histo, BAT *b, BAT *s,
BAT *g, BAT *e, BAT *h) __attribute__((__access__(write_only, 1)))
__attribute__((__access__(write_only, 2)))
__attribute__((__access__(write_only, 3)))
__attribute__((__warn_unused_result__));
const char *BATgroupaggrinit(BAT *b, BAT *g, BAT *e, BAT *s, oid *minp, oid
*maxp, BUN *ngrpp, struct canditer *ci);
-gdk_return BATgroupavg(allocator *ma, BAT **bnp, BAT **cntsp, BAT *b, BAT *g,
BAT *e, BAT *s, int tp, bool skip_nils, int scale);
-gdk_return BATgroupavg3(allocator *, BAT **avgp, BAT **remp, BAT **cntp, BAT
*b, BAT *g, BAT *e, BAT *s, bool skip_nils);
-BAT *BATgroupavg3combine(allocator *, BAT *avg, BAT *rem, BAT *cnt, BAT *g,
BAT *e, bool skip_nils);
+gdk_return BATgroupavg(BAT **bnp, BAT **cntsp, BAT *b, BAT *g, BAT *e, BAT *s,
int tp, bool skip_nils, int scale);
+gdk_return BATgroupavg3(BAT **avgp, BAT **remp, BAT **cntp, BAT *b, BAT *g,
BAT *e, BAT *s, bool skip_nils);
+BAT *BATgroupavg3combine(BAT *avg, BAT *rem, BAT *cnt, BAT *g, BAT *e, bool
skip_nils);
BAT *BATgroupcorrelation(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s, int tp,
bool skip_nils);
-BAT *BATgroupcount(allocator *ma, BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils);
+BAT *BATgroupcount(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils);
BAT *BATgroupcovariance_population(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s,
int tp, bool skip_nils);
BAT *BATgroupcovariance_sample(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s, int
tp, bool skip_nils);
BAT *BATgroupedfirstn(BUN n, BAT *s, BAT *g, int nbats, BAT **bats, bool *asc,
bool *nilslast) __attribute__((__warn_unused_result__));
-BAT *BATgroupmax(allocator *ma, BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils);
-BAT *BATgroupmedian(allocator *ma, BAT *b, BAT *g, BAT *e, BAT *s, int tp,
bool skip_nils);
-BAT *BATgroupmedian_avg(allocator *ma, BAT *b, BAT *g, BAT *e, BAT *s, int tp,
bool skip_nils);
-BAT *BATgroupmin(allocator *ma, BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils);
-BAT *BATgroupprod(allocator *ma, BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils);
-BAT *BATgroupquantile(allocator *ma, BAT *b, BAT *g, BAT *e, BAT *s, int tp,
double quantile, bool skip_nils);
-BAT *BATgroupquantile_avg(allocator *ma, BAT *b, BAT *g, BAT *e, BAT *s, int
tp, double quantile, bool skip_nils);
-BAT *BATgroupstdev_population(allocator *ma, BAT *b, BAT *g, BAT *e, BAT *s,
int tp, bool skip_nils);
-BAT *BATgroupstdev_sample(allocator *ma, BAT *b, BAT *g, BAT *e, BAT *s, int
tp, bool skip_nils);
-BAT *BATgroupstr_group_concat(allocator *alloc, BAT *b, BAT *g, BAT *e, BAT
*s, BAT *sep, bool skip_nils, const char *restrict separator);
-BAT *BATgroupsum(allocator *ma, BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils);
-BAT *BATgroupvariance_population(allocator *ma, BAT *b, BAT *g, BAT *e, BAT
*s, int tp, bool skip_nils);
-BAT *BATgroupvariance_sample(allocator *ma, BAT *b, BAT *g, BAT *e, BAT *s,
int tp, bool skip_nils);
+BAT *BATgroupmax(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils);
+BAT *BATgroupmedian(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils);
+BAT *BATgroupmedian_avg(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils);
+BAT *BATgroupmin(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils);
+BAT *BATgroupprod(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils);
+BAT *BATgroupquantile(BAT *b, BAT *g, BAT *e, BAT *s, int tp, double quantile,
bool skip_nils);
+BAT *BATgroupquantile_avg(BAT *b, BAT *g, BAT *e, BAT *s, int tp, double
quantile, bool skip_nils);
+BAT *BATgroupstdev_population(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils);
+BAT *BATgroupstdev_sample(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils);
+BAT *BATgroupstr_group_concat(BAT *b, BAT *g, BAT *e, BAT *s, BAT *sep, bool
skip_nils, const char *restrict separator);
+BAT *BATgroupsum(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils);
+BAT *BATgroupvariance_population(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils);
+BAT *BATgroupvariance_sample(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils);
BUN BATgrows(BAT *b);
BUN BATguess_uniques(BAT *b, struct canditer *ci);
gdk_return BAThash(BAT *b);
@@ -197,7 +197,7 @@ ValPtr BATsetprop_nolock(BAT *b, enum pr
gdk_return BATsetstrimps(BAT *b);
BAT *BATslice(BAT *b, BUN low, BUN high);
gdk_return BATsort(BAT **sorted, BAT **order, BAT **groups, BAT *b, BAT *o,
BAT *g, bool reverse, bool nilslast, bool stable)
__attribute__((__access__(write_only, 1)))
__attribute__((__access__(write_only, 2)))
__attribute__((__access__(write_only, 3)))
__attribute__((__warn_unused_result__));
-gdk_return BATstr_group_concat(allocator *alloc, ValPtr res, BAT *b, BAT *s,
BAT *sep, bool skip_nils, bool nil_if_empty, const char *restrict separator);
+gdk_return BATstr_group_concat(allocator *ma, ValPtr res, BAT *b, BAT *s, BAT
*sep, bool skip_nils, bool nil_if_empty, const char *restrict separator);
gdk_return BATsubcross(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr,
bool max_one) __attribute__((__access__(write_only, 1)))
__attribute__((__access__(write_only, 2)))
__attribute__((__warn_unused_result__));
BAT *BATsubexist(BAT *l, BAT *g, BAT *e, BAT *s);
BAT *BATsubnot_exist(BAT *l, BAT *g, BAT *e, BAT *s);
@@ -1378,7 +1378,7 @@ int winerror(int);
char *BatType_Format(int);
int BatType_ToPyType(int);
str ConvertFromSQLType(allocator *, Client ctx, BAT *b, sql_subtype
*sql_subtype, BAT **ret_bat, int *ret_type);
-str ConvertToSQLType(allocator *, Client cntxt, BAT *b, sql_subtype
*sql_subtype, BAT **ret_bat, int *ret_type);
+str ConvertToSQLType(Client cntxt, BAT *b, sql_subtype *sql_subtype, BAT
**ret_bat, int *ret_type);
bit ConvertableSQLType(sql_subtype *sql_subtype);
str FITSattach(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
str FITSdir(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -209,6 +209,9 @@ dofsum(const void *restrict values, oid
QryCtx *qry_ctx = MT_thread_get_qry_ctx();
+ allocator *ma = MT_thread_getallocator();
+ allocator_state ma_state = ma_open(ma);
+
/* we only deal with the two floating point types */
assert(tp1 == TYPE_flt || tp1 == TYPE_dbl);
assert(tp2 == TYPE_flt || tp2 == TYPE_dbl);
@@ -221,18 +224,18 @@ dofsum(const void *restrict values, oid
ngrp = 1;
gids = NULL;
}
- pergroup = GDKmalloc(ngrp * sizeof(*pergroup));
- if (pergroup == NULL)
+ pergroup = ma_alloc(ma, ngrp * sizeof(*pergroup));
+ if (pergroup == NULL) {
+ ma_close(ma, &ma_state);
return BUN_NONE;
+ }
for (grp = 0; grp < ngrp; grp++) {
pergroup[grp] = (struct pergroup) {
.maxpartials = 2,
- .partials = GDKmalloc(2 * sizeof(double)),
+ .partials = ma_alloc(ma, 2 * sizeof(double)),
};
if (pergroup[grp].partials == NULL) {
- while (grp > 0)
- GDKfree(pergroup[--grp].partials);
- GDKfree(pergroup);
+ ma_close(ma, &ma_state);
return BUN_NONE;
}
}
@@ -254,7 +257,6 @@ dofsum(const void *restrict values, oid
((flt *) results)[grp] = flt_nil;
else
((dbl *) results)[grp] = dbl_nil;
- GDKfree(pergroup[grp].partials);
pergroup[grp].partials = NULL;
if (++nils == ngrp)
TIMEOUT_LOOP_BREAK;
@@ -289,12 +291,10 @@ dofsum(const void *restrict values, oid
}
if (x != 0) {
if (i == pergroup[grp].maxpartials) {
- double *temp;
- pergroup[grp].maxpartials +=
pergroup[grp].maxpartials;
- temp = GDKrealloc(pergroup[grp].partials,
pergroup[grp].maxpartials * sizeof(double));
- if (temp == NULL)
+ pergroup[grp].partials = ma_realloc(ma,
pergroup[grp].partials, pergroup[grp].maxpartials * 2 * sizeof(double),
pergroup[grp].maxpartials * sizeof(double));
+ if (pergroup[grp].partials == NULL)
goto bailout;
- pergroup[grp].partials = temp;
+ pergroup[grp].maxpartials *= 2;
}
pergroup[grp].partials[i++] = x;
}
@@ -310,7 +310,6 @@ dofsum(const void *restrict values, oid
else
((dbl *) results)[grp] = nil_if_empty ? dbl_nil
: 0;
nils += nil_if_empty;
- GDKfree(pergroup[grp].partials);
pergroup[grp].partials = NULL;
continue;
}
@@ -331,7 +330,6 @@ dofsum(const void *restrict values, oid
if (x == y &&
pergroup[grp].npartials > 1 &&
samesign(lo,
pergroup[grp].partials[pergroup[grp].npartials - 2])) {
- GDKfree(pergroup[grp].partials);
pergroup[grp].partials = NULL;
x = 2 * (hi + y);
if (tp2 == TYPE_flt) {
@@ -352,13 +350,11 @@ dofsum(const void *restrict values, oid
} else {
if (lo) {
if (pergroup[grp].npartials ==
pergroup[grp].maxpartials) {
- double *temp;
/* we need space for one more */
+ pergroup[grp].partials =
ma_realloc(ma, pergroup[grp].partials, (pergroup[grp].maxpartials + 1) *
sizeof(double), pergroup[grp].maxpartials * sizeof(double));
+ if (pergroup[grp].partials ==
NULL)
+ goto bailout;
pergroup[grp].maxpartials++;
- temp =
GDKrealloc(pergroup[grp].partials, pergroup[grp].maxpartials * sizeof(double));
- if (temp == NULL)
- goto bailout;
- pergroup[grp].partials = temp;
}
pergroup[grp].partials[pergroup[grp].npartials - 1] = 2 * lo;
pergroup[grp].partials[pergroup[grp].npartials++] = 2 * hi;
@@ -373,7 +369,6 @@ dofsum(const void *restrict values, oid
goto overflow;
if (pergroup[grp].npartials == 0) {
- GDKfree(pergroup[grp].partials);
pergroup[grp].partials = NULL;
if (tp2 == TYPE_flt)
((flt *) results)[grp] = 0;
@@ -399,7 +394,6 @@ dofsum(const void *restrict values, oid
pergroup[grp].partials[pergroup[grp].npartials - 1] =
-pergroup[grp].partials[pergroup[grp].npartials - 1];
}
- GDKfree(pergroup[grp].partials);
pergroup[grp].partials = NULL;
if (tp2 == TYPE_flt) {
f = (flt) hi;
@@ -414,15 +408,13 @@ dofsum(const void *restrict values, oid
((dbl *) results)[grp] = hi;
}
}
- GDKfree(pergroup);
+ ma_close(ma, &ma_state);
return nils;
overflow:
GDKerror("22003!overflow in sum aggregate.\n");
bailout:
- for (grp = 0; grp < ngrp; grp++)
- GDKfree(pergroup[grp].partials);
- GDKfree(pergroup);
+ ma_close(ma, &ma_state);
return BUN_NONE;
}
@@ -733,9 +725,13 @@ dosum(const void *restrict values, bool
nil_if_empty);
}
+ allocator *ma = MT_thread_getallocator();
+ allocator_state ma_state = ma_open(ma);
+
/* allocate bitmap for seen group ids */
- seen = GDKzalloc(((ngrp + 31) / 32) * sizeof(int));
+ seen = ma_zalloc(ma, ((ngrp + 31) / 32) * sizeof(int));
if (seen == NULL) {
+ ma_close(ma, &ma_state);
return BUN_NONE;
}
@@ -875,29 +871,29 @@ dosum(const void *restrict values, bool
}
}
}
- GDKfree(seen);
+ ma_close(ma, &ma_state);
return nils;
unsupported:
- GDKfree(seen);
GDKerror("%s: type combination (sum(%s)->%s) not supported.\n",
func, ATOMname(tp1), ATOMname(tp2));
+ ma_close(ma, &ma_state);
return BUN_NONE;
overflow:
- GDKfree(seen);
GDKerror("22003!overflow in sum aggregate.\n");
+ ma_close(ma, &ma_state);
return BUN_NONE;
bailout:
- GDKfree(seen);
+ ma_close(ma, &ma_state);
return BUN_NONE;
}
/* calculate group sums with optional candidates list */
BAT *
-BATgroupsum(allocator *ma, BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils)
+BATgroupsum(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils)
{
const oid *restrict gids;
oid min, max;
@@ -931,7 +927,7 @@ BATgroupsum(allocator *ma, BAT *b, BAT *
(BATtdense(g) || (g->tkey && g->tnonil))) {
/* trivial: singleton groups, so all results are equal
* to the inputs (but possibly a different type) */
- return BATconvert(ma, b, s, tp, 0, 0, 0);
+ return BATconvert(b, s, tp, 0, 0, 0);
}
bn = BATconstant(min, tp, ATOMnilptr(tp), ngrp, TRANSIENT);
@@ -1358,9 +1354,13 @@ doprod(const void *restrict values, oid
QryCtx *qry_ctx = MT_thread_get_qry_ctx();
+ allocator *ma = MT_thread_getallocator();
+ allocator_state ma_state = ma_open(ma);
+
/* allocate bitmap for seen group ids */
- seen = GDKzalloc(((ngrp + 31) / 32) * sizeof(int));
+ seen = ma_zalloc(ma, ((ngrp + 31) / 32) * sizeof(int));
if (seen == NULL) {
+ ma_close(ma, &ma_state);
return BUN_NONE;
}
@@ -1550,29 +1550,29 @@ doprod(const void *restrict values, oid
}
}
}
- GDKfree(seen);
+ ma_close(ma, &ma_state);
return nils;
unsupported:
- GDKfree(seen);
+ ma_close(ma, &ma_state);
GDKerror("%s: type combination (mul(%s)->%s) not supported.\n",
func, ATOMname(tp1), ATOMname(tp2));
return BUN_NONE;
overflow:
- GDKfree(seen);
+ ma_close(ma, &ma_state);
GDKerror("22003!overflow in product aggregate.\n");
return BUN_NONE;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]