Changeset: e08b1857aa87 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/e08b1857aa87 Modified Files: clients/Tests/exports.stable.out gdk/gdk.h gdk/gdk_private.h monetdb5/optimizer/opt_pipes.c sql/test/emptydb/Tests/check.stable.out sql/test/emptydb/Tests/check.stable.out.32bit sql/test/emptydb/Tests/check.stable.out.int128 Branch: string_imprints Log Message:
Merge with default diffs (truncated from 8929 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 @@ -233,6 +233,7 @@ gdk_return BUNreplacemulti(BAT *b, const gdk_return BUNreplacemultiincr(BAT *b, oid position, const void *values, BUN count, bool force) __attribute__((__warn_unused_result__)); BAT *COLcopy(BAT *b, int tt, bool writable, role_t role); BAT *COLnew(oid hseq, int tltype, BUN capacity, role_t role) __attribute__((__warn_unused_result__)); +BAT *COLnew2(oid hseq, int tt, BUN cap, role_t role, uint16_t width) __attribute__((__warn_unused_result__)); size_t GDK_mem_maxsize; size_t GDK_vm_maxsize; gdk_return GDKanalytical_correlation(BAT *r, BAT *p, BAT *o, BAT *b1, BAT *b2, BAT *s, BAT *e, int tpe, int frame_type); diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -1063,6 +1063,8 @@ gdk_export void HEAP_free(Heap *heap, va */ gdk_export BAT *COLnew(oid hseq, int tltype, BUN capacity, role_t role) __attribute__((__warn_unused_result__)); +gdk_export BAT *COLnew2(oid hseq, int tt, BUN cap, role_t role, uint16_t width) + __attribute__((__warn_unused_result__)); gdk_export BAT *BATdense(oid hseq, oid tseq, BUN cnt) __attribute__((__warn_unused_result__)); gdk_export gdk_return BATextend(BAT *b, BUN newcap) diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c --- a/gdk/gdk_align.c +++ b/gdk/gdk_align.c @@ -255,7 +255,7 @@ BATmaterialize(BAT *b) b->tunique_est = is_oid_nil(t) ? 1.0 : (double) b->batCount; MT_lock_unset(&b->theaplock); b->ttype = TYPE_oid; - BATsetdims(b); + BATsetdims(b, 0); b->batDirtydesc = true; BATsetcount(b, b->batCount); diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c --- a/gdk/gdk_bat.c +++ b/gdk/gdk_bat.c @@ -171,9 +171,9 @@ ATOMelmshift(int sz) void -BATsetdims(BAT *b) +BATsetdims(BAT *b, uint16_t width) { - b->twidth = b->ttype == TYPE_str ? 1 : ATOMsize(b->ttype); + b->twidth = b->ttype == TYPE_str ? width > 0 ? width : 1 : ATOMsize(b->ttype); b->tshift = ATOMelmshift(b->twidth); assert_shift_width(b->tshift, b->twidth); b->tvarsized = b->ttype == TYPE_void || BATatoms[b->ttype].atomPut != NULL; @@ -204,6 +204,7 @@ settailname(Heap *restrict tail, const c { if (tt == TYPE_str) { switch (width) { + case 0: case 1: strconcat_len(tail->filename, sizeof(tail->filename), physnme, @@ -241,7 +242,7 @@ settailname(Heap *restrict tail, const c * filenames. */ BAT * -COLnew_intern(oid hseq, int tt, BUN cap, role_t role, uint16_t width) +COLnew2(oid hseq, int tt, BUN cap, role_t role, uint16_t width) { BAT *bn; @@ -268,20 +269,11 @@ COLnew_intern(oid hseq, int tt, BUN cap, if (bn == NULL) return NULL; - BATsetdims(bn); + BATsetdims(bn, width); bn->batCapacity = cap; if (ATOMstorage(tt) == TYPE_msk) cap /= 8; /* 8 values per byte */ - else if (tt == TYPE_str) { - if (width != 0) { - /* power of two and not too large */ - assert((width & (width - 1)) == 0); - assert(width <= sizeof(var_t)); - bn->twidth = width; - } - settailname(bn->theap, BBP_physical(bn->batCacheid), tt, bn->twidth); - } /* alloc the main heaps */ if (tt && HEAPalloc(bn->theap, cap, bn->twidth, ATOMsize(bn->ttype)) != GDK_SUCCEED) { @@ -313,7 +305,7 @@ COLnew_intern(oid hseq, int tt, BUN cap, BAT * COLnew(oid hseq, int tt, BUN cap, role_t role) { - return COLnew_intern(hseq, tt, cap, role, 0); + return COLnew2(hseq, tt, cap, role, 0); } BAT * @@ -835,16 +827,15 @@ COLcopy(BAT *b, int tt, bool writable, r slowcopy = true; } - bn = COLnew_intern(b->hseqbase, tt, bi.count, role, bi.width); + bn = COLnew2(b->hseqbase, tt, bi.count, role, bi.width); if (bn == NULL) { bat_iterator_end(&bi); return NULL; } if (bn->tvheap != NULL && bn->tvheap->base == NULL) { /* this combination can happen since the last - * argument of COLnew_intern not being zero - * triggers a skip in the allocation of the - * tvheap */ + * argument of COLnew2 not being zero triggers a + * skip in the allocation of the tvheap */ if (ATOMheap(bn->ttype, bn->tvheap, bn->batCapacity) != GDK_SUCCEED) { bat_iterator_end(&bi); BBPreclaim(bn); @@ -2787,4 +2778,3 @@ BATassertProps(BAT *b) } MT_lock_unset(&b->theaplock); } - diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h --- a/gdk/gdk_private.h +++ b/gdk/gdk_private.h @@ -87,7 +87,7 @@ void BATrmprop_nolock(BAT *b, enum prop_ __attribute__((__visibility__("hidden"))); gdk_return BATsave_locked(BAT *bd, BATiter *bi, BUN size) __attribute__((__visibility__("hidden"))); -void BATsetdims(BAT *b) +void BATsetdims(BAT *b, uint16_t width) __attribute__((__visibility__("hidden"))); ValPtr BATsetprop(BAT *b, enum prop_t idx, int type, const void *v) __attribute__((__visibility__("hidden"))); @@ -129,9 +129,6 @@ BUN binsearch_flt(const oid *restrict in __attribute__((__visibility__("hidden"))); BUN binsearch_dbl(const oid *restrict indir, oid offset, const dbl *restrict vals, BUN lo, BUN hi, dbl v, int ordering, int last) __attribute__((__visibility__("hidden"))); -BAT *COLnew_intern(oid hseq, int tt, BUN cap, role_t role, uint16_t width) - __attribute__((__warn_unused_result__)) - __attribute__((__visibility__("hidden"))); Heap *createOIDXheap(BAT *b, bool stable) __attribute__((__visibility__("hidden"))); void doHASHdestroy(BAT *b, Hash *hs) diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c --- a/gdk/gdk_project.c +++ b/gdk/gdk_project.c @@ -710,7 +710,7 @@ BATproject2(BAT *restrict l, BAT *restri r1i = bat_iterator(r1); r2i = bat_iterator(r2); } - bn = COLnew_intern(l->hseqbase, ATOMtype(r1->ttype), lcount, TRANSIENT, stringtrick ? r1i.width : 0); + bn = COLnew2(l->hseqbase, ATOMtype(r1->ttype), lcount, TRANSIENT, stringtrick ? r1i.width : 0); if (bn == NULL) { goto doreturn; } @@ -776,7 +776,7 @@ BATproject2(BAT *restrict l, BAT *restri /* handle string trick */ if (stringtrick) { assert(r1i.vh); - if (r1->batRestricted == BAT_READ) { + if (r1->batRestricted == BAT_READ || VIEWvtparent(r1)) { /* really share string heap */ assert(r1i.vh->parentid > 0); BBPshare(r1i.vh->parentid); @@ -965,7 +965,7 @@ BATprojectchain(BAT **bats) bi = bat_iterator(b); if (nonil && ATOMstorage(tpe) == TYPE_str && b->batRestricted == BAT_READ) { stringtrick = true; - bn = COLnew_intern(ba[0].hlo, tpe, ba[0].cnt, TRANSIENT, bi.width); + bn = COLnew2(ba[0].hlo, tpe, ba[0].cnt, TRANSIENT, bi.width); if (bn && bn->tvheap) { /* no need to remove any files since they were * never created for this bat */ diff --git a/monetdb5/mal/mal_profiler.c b/monetdb5/mal/mal_profiler.c --- a/monetdb5/mal/mal_profiler.c +++ b/monetdb5/mal/mal_profiler.c @@ -60,18 +60,17 @@ static struct rusage prevUsage; #define LOGLEN 8192 // The heart beat events should be sent to all outstanding channels. -static void logjsonInternal(char *logbuffer) +static void logjsonInternal(char *logbuffer, bool flush) { size_t len; len = strlen(logbuffer); - MT_lock_set(&mal_profileLock); if (maleventstream) { // upon request the log record is sent over the profile stream (void) mnstr_write(maleventstream, logbuffer, 1, len); - (void) mnstr_flush(maleventstream, MNSTR_FLUSH_DATA); + if (flush) + (void) mnstr_flush(maleventstream, MNSTR_FLUSH_DATA); } - MT_lock_unset(&mal_profileLock); } /* @@ -141,7 +140,7 @@ logadd(struct logbuf *logbuf, const char /* includes first time when logbuffer == NULL and logcap = 0 */ char *alloc_buff; if (logbuf->loglen > 0) - logjsonInternal(logbuf->logbuffer); + logjsonInternal(logbuf->logbuffer, false); logbuf->logcap = (size_t) tmp_len + (size_t) tmp_len/2; if (logbuf->logcap < LOGLEN) logbuf->logcap = LOGLEN; @@ -156,7 +155,7 @@ logadd(struct logbuf *logbuf, const char logbuf->logbuffer = alloc_buff; lognew(logbuf); } else { - logjsonInternal(logbuf->logbuffer); + logjsonInternal(logbuf->logbuffer, false); lognew(logbuf); } } @@ -474,11 +473,13 @@ static void renderProfilerEvent(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, int start) { str ev; + MT_lock_set(&mal_profileLock); ev = prepareProfilerEvent(cntxt, mb, stk, pci, start); if( ev ){ - logjsonInternal(ev); + logjsonInternal(ev, true); free(ev); } + MT_lock_unset(&mal_profileLock); } /* the OS details on cpu load are read from /proc/stat @@ -614,7 +615,7 @@ profilerHeartbeatEvent(char *alter) "}\n", // end marker alter, cpuload)) return; - logjsonInternal(logbuf.logbuffer); + logjsonInternal(logbuf.logbuffer, true); logdel(&logbuf); } @@ -647,16 +648,19 @@ openProfilerStream(Client cntxt) getrusage(RUSAGE_SELF, &infoUsage); prevUsage = infoUsage; #endif + MT_lock_set(&mal_profileLock); if (myname == 0){ myname = putName("profiler"); - logjsonInternal(monet_characteristics); + logjsonInternal(monet_characteristics, true); } if(maleventstream){ /* The DBA can always grab the stream, others have to wait */ - if (cntxt->user == MAL_ADMIN) + if (cntxt->user == MAL_ADMIN) { closeProfilerStream(cntxt); - else + } else { + MT_lock_unset(&mal_profileLock); throw(MAL,"profiler.start","Profiler already running, stream not available"); + } } malProfileMode = -1; maleventstream = cntxt->fdout; @@ -670,7 +674,6 @@ openProfilerStream(Client cntxt) MT_sleep_ms(200); - MT_lock_set(&mal_profileLock); for(j = 0; j <THREADS; j++){ Client c = 0; MalBlkPtr m=0; MalStkPtr s = 0; InstrPtr p = 0; c = workingset[j].cntxt; @@ -718,8 +721,8 @@ startProfiler(Client cntxt) myname = putName("profiler"); } malProfileMode = 1; + logjsonInternal(monet_characteristics, true); MT_lock_unset(&mal_profileLock); - logjsonInternal(monet_characteristics); // reset the trace table clearTrace(cntxt); diff --git a/monetdb5/modules/mal/remote.c b/monetdb5/modules/mal/remote.c --- a/monetdb5/modules/mal/remote.c +++ b/monetdb5/modules/mal/remote.c @@ -726,17 +726,10 @@ RMTinternalcopyfrom(BAT **ret, char *hdr hdr++; } - b = COLnew(0, bb.Ttype, bb.size, TRANSIENT); + b = COLnew2(bb.Hseqbase, bb.Ttype, bb.size, TRANSIENT, bb.size > 0 ? (uint16_t) (bb.tailsize / bb.size) : 0); if (b == NULL) throw(MAL, "remote.get", SQLSTATE(HY013) MAL_MALLOC_FAIL); - /* for strings, the width may not match, fix it to match what we - * retrieved */ - if (bb.Ttype == TYPE_str && bb.size) { - b->twidth = (unsigned short) (bb.tailsize / bb.size); - b->tshift = ATOMelmshift(Tsize(b)); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list