Changeset: c36d3edd1570 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c36d3edd1570 Added Files: sql/backends/monet5/Tests/pyapi30.sql sql/backends/monet5/Tests/pyapi30.stable.err sql/backends/monet5/Tests/pyapi30.stable.out Modified Files: clients/mapiclient/mclient.c gdk/gdk.h monetdb5/extras/pyapi/pyapi.c monetdb5/mal/mal_factory.c monetdb5/mal/mal_instruction.c monetdb5/mal/mal_interpreter.c monetdb5/mal/mal_profiler.c monetdb5/mal/mal_recycle.c monetdb5/modules/mal/pcre.c monetdb5/optimizer/opt_mergetable.c monetdb5/optimizer/opt_pipes.c monetdb5/optimizer/optimizer.c monetdb5/optimizer/optimizer_private.h sql/server/rel_select.c sql/server/rel_select.h sql/server/rel_semantic.c sql/server/rel_updates.c sql/server/sql_mvc.c sql/server/sql_parser.y sql/storage/bat/bat_storage.c sql/test/leaks/Tests/check1.stable.out sql/test/leaks/Tests/check1.stable.out.int128 sql/test/leaks/Tests/check2.stable.out sql/test/leaks/Tests/check2.stable.out.int128 sql/test/leaks/Tests/check3.stable.out sql/test/leaks/Tests/check3.stable.out.int128 sql/test/leaks/Tests/check4.stable.out sql/test/leaks/Tests/check4.stable.out.int128 sql/test/leaks/Tests/check5.stable.out sql/test/leaks/Tests/check5.stable.out.int128 Branch: jit Log Message:
Merge with default diffs (truncated from 1294 to 300 lines): diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c --- a/clients/mapiclient/mclient.c +++ b/clients/mapiclient/mclient.c @@ -3322,6 +3322,7 @@ main(int argc, char **argv) if (command != NULL) { #ifdef HAVE_ICONV iconv_t cd_in; + int free_command = 0; if (encoding != NULL && (cd_in = iconv_open("utf-8", encoding)) != (iconv_t) -1) { @@ -3331,6 +3332,7 @@ main(int argc, char **argv) int factor = 4; size_t tolen = factor * fromlen + 1; char *to = malloc(tolen); + free_command = 1; try_again: command = to; @@ -3367,6 +3369,10 @@ main(int argc, char **argv) timerStart(); c = doRequest(mid, command); timerEnd(); +#ifdef HAVE_ICONV + if (free_command) + free(command); +#endif } if (optind < argc) { diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -1293,7 +1293,6 @@ gdk_export bte ATOMelmshift(int sz); #define Treplacevalue(b, p, v) HTreplacevalue(b, p, v, T) #define HTfastins_nocheck(b, p, v, s, HT) \ do { \ - assert((b)->HT->width == (s)); \ (b)->HT->heap.free += (s); \ (b)->HT->heap.dirty |= (s) != 0; \ HTputvalue((b), HT##loc((b), (p)), (v), 0, HT); \ diff --git a/monetdb5/extras/pyapi/pyapi.c b/monetdb5/extras/pyapi/pyapi.c --- a/monetdb5/extras/pyapi/pyapi.c +++ b/monetdb5/extras/pyapi/pyapi.c @@ -150,8 +150,10 @@ static bool enable_zerocopy_output = tru bat->T->nil = 1; \ } \ } \ + bat->T->nonil = 1 - bat->T->nil; \ + } else { \ + bat->T->nil = 0; bat->T->nonil = 0; \ } \ - bat->T->nonil = 1 - bat->T->nil; \ /*When we create a BAT a small part of memory is allocated, free it*/ \ GDKfree(bat->T->heap.base); \ bat->T->heap.base = &data[(index_offset * ret->count) * ret->memory_size]; \ @@ -194,8 +196,10 @@ static bool enable_zerocopy_output = tru bat->T->nil = 1; \ } \ } \ + bat->T->nonil = 1 - bat->T->nil; \ + } else { \ + bat->T->nil = 0; bat->T->nonil = 0; \ } \ - bat->T->nonil = 1 - bat->T->nil; \ /*When we create a BAT a small part of memory is allocated, free it*/ \ GDKfree(bat->T->heap.base); \ bat->T->heap.base = &data[(index_offset * ret->count) * ret->memory_size]; \ @@ -372,7 +376,8 @@ Array of type %s no copying will be need goto wrapup; \ } \ bat->T->nonil = 1 - bat->T->nil; \ - BATsetcount(bat, (BUN) ret->count); \ + if (!mask) { bat->T->nil = 0; bat->T->nonil = 0; } \ + BATsetcount(bat, (BUN) ret->count); \ BATsettrivprop(bat); \ } \ } diff --git a/monetdb5/mal/mal_factory.c b/monetdb5/mal/mal_factory.c --- a/monetdb5/mal/mal_factory.c +++ b/monetdb5/mal/mal_factory.c @@ -382,13 +382,12 @@ void mal_factory_reset(void) /* MSresetVariables(mb, pl->stk, 0);*/ /* freeStack(pl->stk); there may be a reference?*/ /* we are inside the body of the factory and about to return */ - pl->factory = 0; - if (pl->stk) + if (pl->stk) { pl->stk->keepAlive = FALSE; - if ( pl->stk) { - //garbageCollector(cntxt, mb, pl->stk,TRUE); + garbageCollector(NULL, pl->factory, pl->stk,TRUE); GDKfree(pl->stk); } + pl->factory = 0; pl->stk=0; pl->pc = 0; pl->inuse = 0; diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c --- a/monetdb5/mal/mal_interpreter.c +++ b/monetdb5/mal/mal_interpreter.c @@ -724,11 +724,13 @@ str runMALsequence(Client cntxt, MalBlkP nstk->up = stk; if (nstk->calldepth > 256) { ret= createException(MAL, "mal.interpreter", MAL_CALLDEPTH_FAIL); + GDKfree(nstk); break; } if ((unsigned)nstk->stkdepth > THREAD_STACK_SIZE / sizeof(mb->var[0]) / 4 && THRhighwater()){ /* we are running low on stack space */ ret= createException(MAL, "mal.interpreter", MAL_STACK_FAIL); + GDKfree(nstk); break; } @@ -1424,8 +1426,10 @@ void garbageCollector(Client cntxt, MalB ValPtr v; #ifdef STACKTRACE - mnstr_printf(cntxt->fdout, "#--->stack before garbage collector\n"); - printStack(cntxt->fdout, mb, stk, 0); + if (cntxt) { + mnstr_printf(cntxt->fdout, "#--->stack before garbage collector\n"); + printStack(cntxt->fdout, mb, stk, 0); + } #endif for (k = 0; k < mb->vtop; k++) { if (isVarCleanup(mb, k) && (flag || isTmpVar(mb, k))) { @@ -1435,8 +1439,10 @@ void garbageCollector(Client cntxt, MalB } } #ifdef STACKTRACE - mnstr_printf(cntxt->fdout, "#-->stack after garbage collector\n"); - printStack(cntxt->fdout, mb, stk, 0); + if (cntxt) { + mnstr_printf(cntxt->fdout, "#-->stack after garbage collector\n"); + printStack(cntxt->fdout, mb, stk, 0); + } #else (void)cntxt; #endif 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 @@ -626,9 +626,11 @@ static BAT *TRACE_id_stmt = 0; int TRACEtable(BAT **r) { - if (TRACE_init == 0) + MT_lock_set(&mal_profileLock); + if (TRACE_init == 0) { + MT_lock_unset(&mal_profileLock); return -1; /* not initialized */ - MT_lock_set(&mal_profileLock); + } r[0] = COLcopy(TRACE_id_event, TRACE_id_event->ttype, 0, TRANSIENT); r[1] = COLcopy(TRACE_id_time, TRACE_id_time->ttype, 0, TRANSIENT); r[2] = COLcopy(TRACE_id_pc, TRACE_id_pc->ttype, 0, TRANSIENT); @@ -649,35 +651,39 @@ TRACEtable(BAT **r) BAT * getTrace(const char *nme) { - if (TRACE_init == 0) - return NULL; - if (strcmp(nme, "event") == 0) - return COLcopy(TRACE_id_event, TRACE_id_event->ttype, 0, TRANSIENT); - if (strcmp(nme, "time") == 0) - return COLcopy(TRACE_id_time, TRACE_id_time->ttype, 0, TRANSIENT); - if (strcmp(nme, "pc") == 0) - return COLcopy(TRACE_id_pc, TRACE_id_pc->ttype, 0, TRANSIENT); - if (strcmp(nme, "thread") == 0) - return COLcopy(TRACE_id_thread, TRACE_id_thread->ttype, 0, TRANSIENT); - if (strcmp(nme, "usec") == 0) - return COLcopy(TRACE_id_ticks, TRACE_id_ticks->ttype, 0, TRANSIENT); - if (strcmp(nme, "rssMB") == 0) - return COLcopy(TRACE_id_rssMB, TRACE_id_rssMB->ttype, 0, TRANSIENT); - if (strcmp(nme, "tmpspace") == 0) - return COLcopy(TRACE_id_tmpspace, TRACE_id_tmpspace->ttype, 0, TRANSIENT); - if (strcmp(nme, "reads") == 0) - return COLcopy(TRACE_id_inblock, TRACE_id_inblock->ttype, 0, TRANSIENT); - if (strcmp(nme, "writes") == 0) - return COLcopy(TRACE_id_oublock, TRACE_id_oublock->ttype, 0, TRANSIENT); - if (strcmp(nme, "minflt") == 0) - return COLcopy(TRACE_id_minflt, TRACE_id_minflt->ttype, 0, TRANSIENT); - if (strcmp(nme, "majflt") == 0) - return COLcopy(TRACE_id_majflt, TRACE_id_majflt->ttype, 0, TRANSIENT); - if (strcmp(nme, "nvcsw") == 0) - return COLcopy(TRACE_id_nvcsw, TRACE_id_nvcsw->ttype, 0, TRANSIENT); - if (strcmp(nme, "stmt") == 0) - return COLcopy(TRACE_id_stmt, TRACE_id_stmt->ttype, 0, TRANSIENT); - return NULL; + BAT *bn = NULL; + + MT_lock_set(&mal_profileLock); + if (TRACE_init) { + if (strcmp(nme, "event") == 0) + bn = COLcopy(TRACE_id_event, TRACE_id_event->ttype, 0, TRANSIENT); + else if (strcmp(nme, "time") == 0) + bn = COLcopy(TRACE_id_time, TRACE_id_time->ttype, 0, TRANSIENT); + else if (strcmp(nme, "pc") == 0) + bn = COLcopy(TRACE_id_pc, TRACE_id_pc->ttype, 0, TRANSIENT); + else if (strcmp(nme, "thread") == 0) + bn = COLcopy(TRACE_id_thread, TRACE_id_thread->ttype, 0, TRANSIENT); + else if (strcmp(nme, "usec") == 0) + bn = COLcopy(TRACE_id_ticks, TRACE_id_ticks->ttype, 0, TRANSIENT); + else if (strcmp(nme, "rssMB") == 0) + bn = COLcopy(TRACE_id_rssMB, TRACE_id_rssMB->ttype, 0, TRANSIENT); + else if (strcmp(nme, "tmpspace") == 0) + bn = COLcopy(TRACE_id_tmpspace, TRACE_id_tmpspace->ttype, 0, TRANSIENT); + else if (strcmp(nme, "reads") == 0) + bn = COLcopy(TRACE_id_inblock, TRACE_id_inblock->ttype, 0, TRANSIENT); + else if (strcmp(nme, "writes") == 0) + bn = COLcopy(TRACE_id_oublock, TRACE_id_oublock->ttype, 0, TRANSIENT); + else if (strcmp(nme, "minflt") == 0) + bn = COLcopy(TRACE_id_minflt, TRACE_id_minflt->ttype, 0, TRANSIENT); + else if (strcmp(nme, "majflt") == 0) + bn = COLcopy(TRACE_id_majflt, TRACE_id_majflt->ttype, 0, TRANSIENT); + else if (strcmp(nme, "nvcsw") == 0) + bn = COLcopy(TRACE_id_nvcsw, TRACE_id_nvcsw->ttype, 0, TRANSIENT); + else if (strcmp(nme, "stmt") == 0) + bn = COLcopy(TRACE_id_stmt, TRACE_id_stmt->ttype, 0, TRANSIENT); + } + MT_lock_unset(&mal_profileLock); + return bn; } static BAT * @@ -731,9 +737,11 @@ initTrace(void) { int ret = -1; - if (TRACE_init) + MT_lock_set(&mal_contextLock); + if (TRACE_init) { + MT_lock_unset(&mal_contextLock); return 0; /* already initialized */ - MT_lock_set(&mal_contextLock); + } TRACE_id_event = TRACEcreate("id", "event", TYPE_int); TRACE_id_time = TRACEcreate("id", "time", TYPE_str); // TODO split pc into its components fcn,pc,tag @@ -774,23 +782,25 @@ initTrace(void) void clearTrace(void) { - if (TRACE_init == 0) + MT_lock_set(&mal_contextLock); + if (TRACE_init == 0) { + MT_lock_unset(&mal_contextLock); return; /* not initialized */ - MT_lock_set(&mal_contextLock); + } /* drop all trace tables */ - BBPclear(TRACE_id_event->batCacheid); - BBPclear(TRACE_id_time->batCacheid); - BBPclear(TRACE_id_pc->batCacheid); - BBPclear(TRACE_id_thread->batCacheid); - BBPclear(TRACE_id_ticks->batCacheid); - BBPclear(TRACE_id_rssMB->batCacheid); - BBPclear(TRACE_id_tmpspace->batCacheid); - BBPclear(TRACE_id_inblock->batCacheid); - BBPclear(TRACE_id_oublock->batCacheid); - BBPclear(TRACE_id_minflt->batCacheid); - BBPclear(TRACE_id_majflt->batCacheid); - BBPclear(TRACE_id_nvcsw->batCacheid); - BBPclear(TRACE_id_stmt->batCacheid); + BBPunfix(TRACE_id_event->batCacheid); + BBPunfix(TRACE_id_time->batCacheid); + BBPunfix(TRACE_id_pc->batCacheid); + BBPunfix(TRACE_id_thread->batCacheid); + BBPunfix(TRACE_id_ticks->batCacheid); + BBPunfix(TRACE_id_rssMB->batCacheid); + BBPunfix(TRACE_id_tmpspace->batCacheid); + BBPunfix(TRACE_id_inblock->batCacheid); + BBPunfix(TRACE_id_oublock->batCacheid); + BBPunfix(TRACE_id_minflt->batCacheid); + BBPunfix(TRACE_id_majflt->batCacheid); + BBPunfix(TRACE_id_nvcsw->batCacheid); + BBPunfix(TRACE_id_stmt->batCacheid); TRACE_init = 0; MT_lock_unset(&mal_contextLock); initTrace(); @@ -876,6 +886,10 @@ cachedProfilerEvent(MalBlkPtr mb, MalStk // keep it a short transaction MT_lock_set(&mal_profileLock); + if (TRACE_init == 0) { + MT_lock_unset(&mal_profileLock); + return; + } errors += BUNappend(TRACE_id_event, &TRACE_event, FALSE) != GDK_SUCCEED; errors += BUNappend(TRACE_id_time, ct, FALSE) != GDK_SUCCEED; errors += BUNappend(TRACE_id_pc, buf, FALSE) != GDK_SUCCEED; diff --git a/monetdb5/mal/mal_recycle.c b/monetdb5/mal/mal_recycle.c --- a/monetdb5/mal/mal_recycle.c +++ b/monetdb5/mal/mal_recycle.c @@ -424,6 +424,8 @@ RECYCLEkeep(Client cntxt, MalBlkPtr mb, c = fndConstant(recycleBlk, &cst, recycleBlk->vtop); if (c<0) c = defConstant(recycleBlk, v->vtype, &cst); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list