Changeset: 249a62de0e9e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/249a62de0e9e
Modified Files:
clients/Tests/exports.stable.out
Branch: groupjoin
Log Message:
Merge with default branch.
diffs (truncated from 1440 to 300 lines):
diff --git a/buildtools/coverity_model.c b/buildtools/coverity_model.c
--- a/buildtools/coverity_model.c
+++ b/buildtools/coverity_model.c
@@ -126,7 +126,7 @@ GDKmmap(const char *path, int mode, size
}
gdk_return
-GDKmunmap(void *p, size_t size)
+GDKmunmap(void *p, int mode, size_t size)
{
int failed;
__coverity_free__(p);
@@ -139,7 +139,7 @@ GDKmremap(const char *path, int mode, vo
{
void *p = GDKmmap(path, mode, new_size);
if (p) {
- (void) GDKmunmap(old_address, old_size);
+ (void) GDKmunmap(old_address, mode, old_size);
}
return p;
}
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
@@ -300,7 +300,7 @@ size_t GDKmem_cursize(void);
gdk_return GDKmergeidx(BAT *b, BAT **a, int n_ar);
void *GDKmmap(const char *path, int mode, size_t len)
__attribute__((__warn_unused_result__));
int GDKms(void);
-gdk_return GDKmunmap(void *addr, size_t len);
+gdk_return GDKmunmap(void *addr, int mode, size_t len);
int GDKnr_threads;
void GDKprepareExit(void);
void GDKprintinfo(void);
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1468,10 +1468,11 @@ movestrbats(void)
}
#endif
-static void
+static bool
BBPtrim(bool aggressive)
{
int n = 0;
+ bool changed = false;
unsigned flag = BBPUNLOADING | BBPSYNCING | BBPSAVING;
if (!aggressive)
flag |= BBPHOT;
@@ -1502,19 +1503,23 @@ BBPtrim(bool aggressive)
if (BBPfree(b) != GDK_SUCCEED)
GDKerror("unload failed for bat %d", bid);
n++;
+ changed = true;
}
BBPtmunlock();
}
TRC_DEBUG(BAT_, "unloaded %d bats%s\n", n, aggressive ? " (also hot)" :
"");
+ return changed;
}
static void
BBPmanager(void *dummy)
{
(void) dummy;
+ bool changed = true;
for (;;) {
int n = 0;
+ MT_thread_setworking("clearing HOT bits");
for (bat bid = 1, nbat = (bat) ATOMIC_GET(&BBPsize); bid <
nbat; bid++) {
MT_lock_set(&GDKswapLock(bid));
if (BBP_refs(bid) == 0 && BBP_lrefs(bid) != 0) {
@@ -1525,12 +1530,15 @@ BBPmanager(void *dummy)
}
TRC_DEBUG(BAT_, "cleared HOT bit from %d bats\n", n);
size_t cur = GDKvm_cursize();
- for (int i = 0, n = cur > GDK_vm_maxsize / 2 ? 1 : cur >
GDK_vm_maxsize / 4 ? 10 : 100; i < n; i++) {
+ MT_thread_setworking("sleeping");
+ for (int i = 0, n = changed && cur > GDK_vm_maxsize / 2 ? 1 :
cur > GDK_vm_maxsize / 4 ? 10 : 100; i < n; i++) {
MT_sleep_ms(100);
if (GDKexiting())
return;
}
- BBPtrim(false);
+ MT_thread_setworking("BBPtrim");
+ changed = BBPtrim(false);
+ MT_thread_setworking("BBPcallbacks");
BBPcallbacks();
if (GDKexiting())
return;
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -687,7 +687,11 @@ HEAPfree(Heap *h, bool rmheap)
//heap is stored in regular C memory rather than GDK
memory,so we call free()
free(h->base);
} else if (h->storage != STORE_NOWN) { /* mapped file, or
STORE_PRIV */
- gdk_return ret = GDKmunmap(h->base, h->size);
+ gdk_return ret = GDKmunmap(h->base,
+ h->storage == STORE_PRIV ?
+ MMAP_COPY | MMAP_READ |
MMAP_WRITE :
+ MMAP_READ | MMAP_WRITE,
+ h->size);
if (ret != GDK_SUCCEED) {
GDKsyserror("HEAPfree: %s was not mapped\n",
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -301,11 +301,13 @@ nomatch(BAT **r1p, BAT **r2p, BAT *l, BA
static gdk_return
selectjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r,
struct canditer *lci, struct canditer *rci,
- bool nil_matches, lng t0, bool swapped, const char *reason)
+ bool nil_matches, bool nil_on_miss, bool semi, bool max_one, bool
min_one,
+ lng t0, bool swapped, const char *reason)
{
BATiter li = bat_iterator(l);
const void *v;
BAT *bn = NULL;
+ BUN bncount;
assert(lci->ncand > 0);
assert(lci->ncand == 1 || (li.sorted && li.revsorted));
@@ -325,7 +327,7 @@ selectjoin(BAT **r1p, BAT **r2p, BAT *l,
(*ATOMcompare(li.type))(v, ATOMnilptr(li.type)) == 0) {
/* NIL doesn't match anything */
bat_iterator_end(&li);
- return nomatch(r1p, r2p, l, r, lci, false, false,
+ return nomatch(r1p, r2p, l, r, lci, nil_on_miss, false,
reason, t0);
}
@@ -334,42 +336,77 @@ selectjoin(BAT **r1p, BAT **r2p, BAT *l,
if (bn == NULL) {
return GDK_FAIL;
}
- if (BATcount(bn) == 0) {
- BBPunfix(bn->batCacheid);
- return nomatch(r1p, r2p, l, r, lci, false, false,
- reason, t0);
+ bncount = BATcount(bn);
+ if (bncount == 0) {
+ BBPreclaim(bn);
+ if (min_one) {
+ GDKerror("not enough matches");
+ return GDK_FAIL;
+ }
+ if (!nil_on_miss)
+ return nomatch(r1p, r2p, l, r, lci, nil_on_miss, false,
+ reason, t0);
+ /* special case: return nil on RHS */
+ bncount = 1;
+ bn = NULL;
}
- BAT *r1 = COLnew(0, TYPE_oid, lci->ncand * BATcount(bn), TRANSIENT);
+ if (bncount > 1) {
+ if (semi)
+ bncount = 1;
+ if (max_one) {
+ BBPreclaim(bn);
+ GDKerror("more than one match");
+ return GDK_FAIL;
+ }
+ }
+ BAT *r1 = COLnew(0, TYPE_oid, lci->ncand * bncount, TRANSIENT);
if (r1 == NULL) {
- BBPunfix(bn->batCacheid);
+ BBPreclaim(bn);
return GDK_FAIL;
}
r1->tsorted = true;
r1->trevsorted = lci->ncand == 1;
- r1->tseqbase = BATcount(bn) == 1 && lci->tpe == cand_dense ? o :
oid_nil;
- r1->tkey = BATcount(bn) == 1;
+ r1->tseqbase = bncount == 1 && lci->tpe == cand_dense ? o : oid_nil;
+ r1->tkey = bncount == 1;
r1->tnil = false;
r1->tnonil = true;
BAT *r2 = NULL;
if (r2p) {
- r2 = COLnew(0, TYPE_oid, lci->ncand * BATcount(bn), TRANSIENT);
+ if (bn)
+ r2 = COLnew(0, TYPE_oid, lci->ncand * bncount,
TRANSIENT);
+ else
+ r2 = BATconstant(0, TYPE_void, &oid_nil, lci->ncand *
bncount, TRANSIENT);
if (r2 == NULL) {
- BBPunfix(bn->batCacheid);
+ BBPreclaim(bn);
BBPreclaim(r1);
return GDK_FAIL;
}
- r2->tsorted = lci->ncand == 1 || BATcount(bn) == 1;
- r2->trevsorted = BATcount(bn) == 1;
- r2->tseqbase = lci->ncand == 1 && BATtdense(bn) ? bn->tseqbase
: oid_nil;
- r2->tkey = lci->ncand == 1;
- r2->tnil = false;
- r2->tnonil = true;
+ if (bn) {
+ r2->tsorted = lci->ncand == 1 || bncount == 1;
+ r2->trevsorted = bncount == 1;
+ r2->tseqbase = lci->ncand == 1 && BATtdense(bn) ?
bn->tseqbase : oid_nil;
+ r2->tkey = lci->ncand == 1;
+ r2->tnil = false;
+ r2->tnonil = true;
+ }
}
- if (BATtdense(bn)) {
+ if (bn == NULL) {
+ oid *o1p = (oid *) Tloc(r1, 0);
+ BUN p, q = bncount;
+
+ do {
+ GDK_CHECK_TIMEOUT(timeoffset, counter,
+ GOTO_LABEL_TIMEOUT_HANDLER(bailout));
+ for (p = 0; p < q; p++) {
+ *o1p++ = o;
+ }
+ o = canditer_next(lci);
+ } while (!is_oid_nil(o));
+ } else if (BATtdense(bn)) {
oid *o1p = (oid *) Tloc(r1, 0);
oid *o2p = r2 ? (oid *) Tloc(r2, 0) : NULL;
oid bno = bn->tseqbase;
- BUN p, q = BATcount(bn);
+ BUN p, q = bncount;
do {
GDK_CHECK_TIMEOUT(timeoffset, counter,
@@ -388,7 +425,7 @@ selectjoin(BAT **r1p, BAT **r2p, BAT *l,
oid *o1p = (oid *) Tloc(r1, 0);
oid *o2p = r2 ? (oid *) Tloc(r2, 0) : NULL;
const oid *bnp = (const oid *) Tloc(bn, 0);
- BUN p, q = BATcount(bn);
+ BUN p, q = bncount;
do {
GDK_CHECK_TIMEOUT(timeoffset, counter,
@@ -404,13 +441,13 @@ selectjoin(BAT **r1p, BAT **r2p, BAT *l,
o = canditer_next(lci);
} while (!is_oid_nil(o));
}
- BATsetcount(r1, lci->ncand * BATcount(bn));
+ BATsetcount(r1, lci->ncand * bncount);
*r1p = r1;
- if (r2p) {
- BATsetcount(r2, lci->ncand * BATcount(bn));
+ if (bn && r2p) {
+ BATsetcount(r2, lci->ncand * bncount);
*r2p = r2;
}
- BBPunfix(bn->batCacheid);
+ BBPreclaim(bn);
TRC_DEBUG(ALGO, "l=" ALGOBATFMT ","
"r=" ALGOBATFMT ",sl=" ALGOOPTBATFMT ","
"sr=" ALGOOPTBATFMT ",nil_matches=%s;%s %s "
@@ -3865,12 +3902,13 @@ leftjoin(BAT **r1p, BAT **r2p, BAT *l, B
goto doreturn;
}
- if (!nil_on_miss && !semi && !max_one && !min_one && !only_misses &&
!not_in &&
+ if (!nil_on_miss && !only_misses && !not_in &&
(lci.ncand == 1 || (BATordered(l) && BATordered_rev(l)) ||
(l->ttype == TYPE_void && is_oid_nil(l->tseqbase)))) {
/* single value to join, use select */
rc = selectjoin(r1p, r2p, l, r, &lci, &rci,
- nil_matches, t0, false, func);
+ nil_matches, nil_on_miss, semi, max_one,
min_one,
+ t0, false, func);
goto doreturn;
} else if (BATtdense(r) && rci.tpe == cand_dense) {
/* use special implementation for dense right-hand side */
@@ -4239,12 +4277,14 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA
if (lci.ncand == 1 || (BATordered(l) && BATordered_rev(l)) || (l->ttype
== TYPE_void && is_oid_nil(l->tseqbase))) {
/* single value to join, use select */
rc = selectjoin(r1p, r2p, l, r, &lci, &rci,
- nil_matches, t0, false, __func__);
+ nil_matches, false, false, false, false,
+ t0, false, __func__);
goto doreturn;
} else if (rci.ncand == 1 || (BATordered(r) && BATordered_rev(r)) ||
(r->ttype == TYPE_void && is_oid_nil(r->tseqbase))) {
/* single value to join, use select */
rc = selectjoin(r2p ? r2p : &r2, r1p, r, l, &rci, &lci,
- nil_matches, t0, true, __func__);
+ nil_matches, false, false, false, false,
+ t0, true, __func__);
if (rc == GDK_SUCCEED && r2p == NULL)
BBPunfix(r2->batCacheid);
goto doreturn;
diff --git a/gdk/gdk_posix.h b/gdk/gdk_posix.h
--- a/gdk/gdk_posix.h
+++ b/gdk/gdk_posix.h
@@ -35,12 +35,6 @@
#include <direct.h>
#endif
-/*
- * @- virtual memory
- */
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]