Changeset: 0e3e2350d316 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0e3e2350d316 Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 clients/Tests/exports.stable.out monetdb5/mal/mal.h monetdb5/mal/mal_builder.c monetdb5/mal/mal_dataflow.c monetdb5/mal/mal_function.c monetdb5/mal/mal_function.h monetdb5/mal/mal_instruction.c monetdb5/mal/mal_instruction.h monetdb5/mal/mal_listing.c monetdb5/mal/mal_parser.c monetdb5/mal/mal_session.c monetdb5/optimizer/opt_garbageCollector.c monetdb5/optimizer/opt_inline.c monetdb5/optimizer/opt_jit.c monetdb5/optimizer/opt_macro.c monetdb5/optimizer/opt_multiplex.c monetdb5/optimizer/opt_profiler.c monetdb5/optimizer/opt_remap.c monetdb5/scheduler/run_adder.c sql/backends/monet5/sql_execute.c sql/backends/monet5/sql_optimizer.c Branch: malupgrade Log Message:
Bulk allocation for variables. The variable structure is now a single big chunk of ValRecords Access to components has been further directed using macros diffs (truncated from 1028 to 300 lines): diff --git a/clients/Tests/MAL-signatures.stable.out b/clients/Tests/MAL-signatures.stable.out --- a/clients/Tests/MAL-signatures.stable.out +++ b/clients/Tests/MAL-signatures.stable.out @@ -7921,7 +7921,6 @@ Ready. [ "mdb", "getStackFrame", "pattern mdb.getStackFrame() (X_0:bat[:str],X_1:bat[:str]) ", "MDBgetStackFrame;", "Collect variable binding of current (n-th) stack frame." ] [ "mdb", "getStackFrame", "pattern mdb.getStackFrame(i:int) (X_0:bat[:str],X_1:bat[:str]) ", "MDBgetStackFrameN;", "" ] [ "mdb", "getStackTrace", "pattern mdb.getStackTrace() (X_0:bat[:int],X_1:bat[:str]) ", "MDBStkTrace;", "" ] -[ "mdb", "grab", "pattern mdb.grab():void ", "mdbGrab;", "Call debugger for a suspended process." ] [ "mdb", "inspect", "pattern mdb.inspect(mod:str,fcn:str):void ", "MDBinspect;", "Run the debugger on a specific function" ] [ "mdb", "list", "pattern mdb.list(M:str,F:str):void ", "MDBlist3;", "Dump the routine M.F on standard out." ] [ "mdb", "list", "pattern mdb.list():void ", "MDBlist;", "Dump the current routine on standard out." ] @@ -7932,14 +7931,11 @@ Ready. [ "mdb", "setDebug", "command mdb.setDebug(flg:str):int ", "MDBsetDebugStr;", "Set the kernel debugging bit-set and return its previous value.\nThe recognized options are: threads, memory, properties,\nio, transactions, modules, algorithms, estimates." ] [ "mdb", "setTrace", "pattern mdb.setTrace(b:bit):void ", "MDBsetTrace;", "Turn on/off tracing of current routine" ] [ "mdb", "setTrace", "pattern mdb.setTrace(b:str):void ", "MDBsetVarTrace;", "Turn on/off tracing of a variable " ] -[ "mdb", "setTrap", "pattern mdb.setTrap(mod:str,fcn:str,b:bit):void ", "MDBtrapFunction;", "Suspend upon a call to the MAL function." ] -[ "mdb", "setTrap", "pattern mdb.setTrap(idx:int):void ", "mdbTrapClient;", "Call debugger for a specific process." ] [ "mdb", "start", "pattern mdb.start():void ", "MDBstart;", "Start interactive debugger" ] [ "mdb", "start", "pattern mdb.start(clientid:int):void ", "MDBstart;", "Start interactive debugger on a client" ] [ "mdb", "start", "pattern mdb.start(mod:str,fcn:str):void ", "MDBstartFactory;", "Start interactive debugger on a running factory" ] [ "mdb", "stop", "pattern mdb.stop():void ", "MDBstop;", "Stop the interactive debugger" ] [ "mdb", "traceOptimizer", "command mdb.traceOptimizer(flg:str):void ", "OPTsetDebugStr;", "Otherwise it is considered a request to trace the optimizers,\nwhich requires a comma separated list or pipeline name." ] -[ "mdb", "trap", "pattern mdb.trap():void ", "mdbTrap;", "A suspended process for debugging." ] [ "mdb", "var", "pattern mdb.var(M:str,F:str):void ", "MDBvar3;", "Dump the symboltable of routine M.F on standard out." ] [ "mdb", "var", "pattern mdb.var():void ", "MDBvar;", "Dump the symboltable of current routine on standard out." ] [ "mkey", "bulk_rotate_xor_hash", "command mkey.bulk_rotate_xor_hash(h:bat[:lng],nbits:int,b:bat[:any_1]):bat[:lng] ", "MKEYbulk_rotate_xor_hash;", "pre: h and b should be synced on head\n post: [:xor=]([:rotate=](h, nbits), [hash](b))" ] @@ -8191,9 +8187,6 @@ Ready. [ "optimizer", "reorder", "pattern optimizer.reorder(mod:str,fcn:str):str ", "OPTwrapper;", "Reorder by dataflow dependencies" ] [ "optimizer", "selcrack", "pattern optimizer.selcrack():str ", "OPTwrapper;", "" ] [ "optimizer", "selcrack", "pattern optimizer.selcrack(mod:str,fcn:str):str ", "OPTwrapper;", "Selection cracking" ] -[ "optimizer", "showFlowGraph", "pattern optimizer.showFlowGraph(M:str,F:str,s:str):void ", "QOTshowFlowGraph;", "Dump the data flow of the function \n\tM.F in a format recognizable by the \n\tcommand 'dot' on the file s" ] -[ "optimizer", "showPlan", "pattern optimizer.showPlan():void ", "QOTshowPlan;", "Illustrate the plan derived so far" ] -[ "optimizer", "showPlan", "pattern optimizer.showPlan(M:str,F:str,s:str):void ", "QOTshowPlan;", "" ] [ "optimizer", "sql_append", "pattern optimizer.sql_append():str ", "OPTsql_append;", "Avoid extra BAT copy with sql.append() whenever possible." ] [ "optimizer", "sql_append", "pattern optimizer.sql_append(mod:str,fcn:str):str ", "OPTsql_append;", "Avoid extra BAT copy with sql.append() whenever possible." ] [ "optimizer", "trace", "pattern optimizer.trace():str ", "OPTwrapper;", "" ] diff --git a/clients/Tests/MAL-signatures.stable.out.int128 b/clients/Tests/MAL-signatures.stable.out.int128 --- a/clients/Tests/MAL-signatures.stable.out.int128 +++ b/clients/Tests/MAL-signatures.stable.out.int128 @@ -10282,7 +10282,6 @@ Ready. [ "mdb", "getStackFrame", "pattern mdb.getStackFrame() (X_0:bat[:str],X_1:bat[:str]) ", "MDBgetStackFrame;", "Collect variable binding of current (n-th) stack frame." ] [ "mdb", "getStackFrame", "pattern mdb.getStackFrame(i:int) (X_0:bat[:str],X_1:bat[:str]) ", "MDBgetStackFrameN;", "" ] [ "mdb", "getStackTrace", "pattern mdb.getStackTrace() (X_0:bat[:int],X_1:bat[:str]) ", "MDBStkTrace;", "" ] -[ "mdb", "grab", "pattern mdb.grab():void ", "mdbGrab;", "Call debugger for a suspended process." ] [ "mdb", "inspect", "pattern mdb.inspect(mod:str,fcn:str):void ", "MDBinspect;", "Run the debugger on a specific function" ] [ "mdb", "list", "pattern mdb.list(M:str,F:str):void ", "MDBlist3;", "Dump the routine M.F on standard out." ] [ "mdb", "list", "pattern mdb.list():void ", "MDBlist;", "Dump the current routine on standard out." ] @@ -10293,14 +10292,11 @@ Ready. [ "mdb", "setDebug", "command mdb.setDebug(flg:str):int ", "MDBsetDebugStr;", "Set the kernel debugging bit-set and return its previous value.\nThe recognized options are: threads, memory, properties,\nio, transactions, modules, algorithms, estimates." ] [ "mdb", "setTrace", "pattern mdb.setTrace(b:bit):void ", "MDBsetTrace;", "Turn on/off tracing of current routine" ] [ "mdb", "setTrace", "pattern mdb.setTrace(b:str):void ", "MDBsetVarTrace;", "Turn on/off tracing of a variable " ] -[ "mdb", "setTrap", "pattern mdb.setTrap(mod:str,fcn:str,b:bit):void ", "MDBtrapFunction;", "Suspend upon a call to the MAL function." ] -[ "mdb", "setTrap", "pattern mdb.setTrap(idx:int):void ", "mdbTrapClient;", "Call debugger for a specific process." ] [ "mdb", "start", "pattern mdb.start():void ", "MDBstart;", "Start interactive debugger" ] [ "mdb", "start", "pattern mdb.start(clientid:int):void ", "MDBstart;", "Start interactive debugger on a client" ] [ "mdb", "start", "pattern mdb.start(mod:str,fcn:str):void ", "MDBstartFactory;", "Start interactive debugger on a running factory" ] [ "mdb", "stop", "pattern mdb.stop():void ", "MDBstop;", "Stop the interactive debugger" ] [ "mdb", "traceOptimizer", "command mdb.traceOptimizer(flg:str):void ", "OPTsetDebugStr;", "Otherwise it is considered a request to trace the optimizers,\nwhich requires a comma separated list or pipeline name." ] -[ "mdb", "trap", "pattern mdb.trap():void ", "mdbTrap;", "A suspended process for debugging." ] [ "mdb", "var", "pattern mdb.var(M:str,F:str):void ", "MDBvar3;", "Dump the symboltable of routine M.F on standard out." ] [ "mdb", "var", "pattern mdb.var():void ", "MDBvar;", "Dump the symboltable of current routine on standard out." ] [ "mkey", "bulk_rotate_xor_hash", "command mkey.bulk_rotate_xor_hash(h:bat[:lng],nbits:int,b:bat[:any_1]):bat[:lng] ", "MKEYbulk_rotate_xor_hash;", "pre: h and b should be synced on head\n post: [:xor=]([:rotate=](h, nbits), [hash](b))" ] @@ -10553,9 +10549,6 @@ Ready. [ "optimizer", "reorder", "pattern optimizer.reorder(mod:str,fcn:str):str ", "OPTwrapper;", "Reorder by dataflow dependencies" ] [ "optimizer", "selcrack", "pattern optimizer.selcrack():str ", "OPTwrapper;", "" ] [ "optimizer", "selcrack", "pattern optimizer.selcrack(mod:str,fcn:str):str ", "OPTwrapper;", "Selection cracking" ] -[ "optimizer", "showFlowGraph", "pattern optimizer.showFlowGraph(M:str,F:str,s:str):void ", "QOTshowFlowGraph;", "Dump the data flow of the function \n\tM.F in a format recognizable by the \n\tcommand 'dot' on the file s" ] -[ "optimizer", "showPlan", "pattern optimizer.showPlan():void ", "QOTshowPlan;", "Illustrate the plan derived so far" ] -[ "optimizer", "showPlan", "pattern optimizer.showPlan(M:str,F:str,s:str):void ", "QOTshowPlan;", "" ] [ "optimizer", "sql_append", "pattern optimizer.sql_append():str ", "OPTsql_append;", "Avoid extra BAT copy with sql.append() whenever possible." ] [ "optimizer", "sql_append", "pattern optimizer.sql_append(mod:str,fcn:str):str ", "OPTsql_append;", "Avoid extra BAT copy with sql.append() whenever possible." ] [ "optimizer", "trace", "pattern optimizer.trace():str ", "OPTwrapper;", "" ] 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 @@ -1373,7 +1373,6 @@ str MDBgetExceptionReason(str *ret, str str MDBgetExceptionVariable(str *ret, str *msg); str MDBgetStackFrame(Client cntxt, MalBlkPtr m, MalStkPtr s, InstrPtr p); str MDBgetStackFrameN(Client cntxt, MalBlkPtr m, MalStkPtr s, InstrPtr p); -str MDBgrapTrappedProcess(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str MDBinspect(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str MDBlist(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str MDBlist3(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); @@ -1389,7 +1388,6 @@ str MDBshowFlowGraph(Client cntxt, MalBl str MDBstart(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str MDBstartFactory(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str MDBstop(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); -str MDBtrapFunction(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str MDBvar(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str MDBvar3(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str MKEYbathash(bat *res, const bat *bid); @@ -1615,8 +1613,6 @@ int QLOGisset(void); str QLOGissetFcn(int *ret); str QOTgetStatistics(bat *ret, str *nme); str QOToptimize(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); -str QOTshowFlowGraph(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); -str QOTshowPlan(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); void QOTstatisticsExit(void); void QOTupdateStatistics(str nme, int prop, lng val); QueryQueue QRYqueue; @@ -1991,7 +1987,6 @@ str convertConstant(malType type, ValPtr InstrPtr copyInstruction(InstrPtr p); MalBlkPtr copyMalBlk(MalBlkPtr mb); str copyRef; -int copyVariable(MalBlkPtr dst, VarPtr v); str copy_fromRef; str countRef; str count_no_nilRef; @@ -2132,7 +2127,6 @@ int initQlog(void); int initTrace(void); int inlineMALblock(MalBlkPtr mb, int pc, MalBlkPtr mc); str inplaceRef; -void insertInstruction(MalBlkPtr mb, InstrPtr p, int pc); void insertSymbol(Module scope, Symbol prg); str instruction2str(MalBlkPtr mb, MalStkPtr stl, InstrPtr p, int hidden); str instructionCall(MalBlkPtr mb, InstrPtr p, str s, str base, size_t len); @@ -2283,7 +2277,7 @@ InstrPtr newExitStmt(MalBlkPtr mb, str n InstrPtr newFcnCall(MalBlkPtr mb, char *mod, char *fcn); Symbol newFunction(str mod, str nme, int kind); MalStkPtr newGlobalStack(int size); -InstrPtr newInstruction(MalBlkPtr mb, str modnme, str fcnnme); +InstrPtr newInstruction(str modnme, str fcnnme); MalBlkPtr newMalBlk(int maxvars, int maxstmts); int newMalBlkStmt(MalBlkPtr mb, int maxstmts); Module newModule(Module scope, str nme); @@ -2349,7 +2343,7 @@ InstrPtr pushBit(MalBlkPtr mb, InstrPtr InstrPtr pushBte(MalBlkPtr mb, InstrPtr q, bte val); InstrPtr pushDbl(MalBlkPtr mb, InstrPtr q, dbl val); InstrPtr pushEmptyBAT(MalBlkPtr mb, InstrPtr q, int tpe); -void pushEndInstruction(MalBlkPtr mb); +InstrPtr pushEndInstruction(MalBlkPtr mb); InstrPtr pushFlt(MalBlkPtr mb, InstrPtr q, flt val); InstrPtr pushHge(MalBlkPtr mb, InstrPtr q, hge val); void pushInstruction(MalBlkPtr mb, InstrPtr p); @@ -2422,7 +2416,6 @@ void setPolymorphic(InstrPtr p, int tpe, void setReturnArgument(InstrPtr p, int varid); str setScenario(Client c, str nme); void setVarName(MalBlkPtr mb, int i, str nme); -void setVarType(MalBlkPtr mb, int i, int tpe); str setVariableRef; void setVariableScope(MalBlkPtr mb); str setWriteModeRef; diff --git a/monetdb5/mal/mal.h b/monetdb5/mal/mal.h --- a/monetdb5/mal/mal.h +++ b/monetdb5/mal/mal.h @@ -144,14 +144,14 @@ typedef struct SYMDEF { typedef struct VARRECORD { char id[IDLENGTH]; /* use the space for the full name */ malType type; /* internal type signature */ - int flags; /* see below, reserve some space */ + short flags; /* see below, reserve some space */ + short depth; /* scope block depth, set to -1 if not used */ + short worker; /* thread id of last worker producing it */ ValRecord value; int declared; /* pc index when it was first assigned */ int updated; /* pc index when it was first updated */ int eolife; /* pc index when it should be garbage collected */ - int depth; /* scope block depth, set to -1 if not used */ - int worker; /* thread id of last worker producing it */ - char stc[2* IDLENGTH]; /* rendering schema.table.column, with little more space */ + char stc[IDLENGTH]; /* rendering schema.table.column (truncated) */ BUN rowcnt; /* estimated row count*/ } *VarPtr, VarRecord; @@ -195,7 +195,7 @@ typedef struct MALBLK { int vtop; /* next free slot */ int vsize; /* size of variable arena */ int vid; /* generate local variable counter */ - VarRecord **var; /* Variable table */ + VarRecord *var; /* Variable table */ int stop; /* next free slot */ int ssize; /* byte size of arena */ InstrPtr *stmt; /* Instruction location */ diff --git a/monetdb5/mal/mal_builder.c b/monetdb5/mal/mal_builder.c --- a/monetdb5/mal/mal_builder.c +++ b/monetdb5/mal/mal_builder.c @@ -512,7 +512,7 @@ pushNil(MalBlkPtr mb, InstrPtr q, int tp cst.vtype = TYPE_bat; cst.val.bval = bat_nil; _t = defConstant(mb,TYPE_bat,&cst); - mb->var[_t]->type = tpe; + getVarType(mb,_t) = tpe; } q= pushArgument(mb, q, _t); setVarUDFtype(mb,getArg(q,q->argc-1)); /* needed */ diff --git a/monetdb5/mal/mal_dataflow.c b/monetdb5/mal/mal_dataflow.c --- a/monetdb5/mal/mal_dataflow.c +++ b/monetdb5/mal/mal_dataflow.c @@ -410,7 +410,7 @@ DFLOWworker(void *T) /* update the numa information. keep the thread-id producing the value */ p= getInstrPtr(flow->mb,fe->pc); for( i = 0; i < p->argc; i++) - flow->mb->var[getArg(p,i)]->worker = thr->tid; + setVarWorker(flow->mb,getArg(p,i),thr->tid); MT_lock_set(&flow->flowlock); fe->state = DFLOWwrapup; diff --git a/monetdb5/mal/mal_function.c b/monetdb5/mal/mal_function.c --- a/monetdb5/mal/mal_function.c +++ b/monetdb5/mal/mal_function.c @@ -570,14 +570,15 @@ setVariableScope(MalBlkPtr mb) for (k = 0; k < mb->vtop; k++) if( isVarConstant(mb,k)){ setVarScope(mb,k,0); - mb->var[k]->declared = 0; - mb->var[k]->updated = 0; - mb->var[k]->eolife = mb->stop; + setVarDeclared(mb,k,0); + setVarUpdated(mb,k,0); + setVarEolife(mb,k,mb->stop); } else { setVarScope(mb,k,0); - mb->var[k]->declared = 0; - mb->var[k]->updated = 0; - mb->var[k]->eolife = 0; + mb->var[k].declared = 0; + setVarDeclared(mb,k,0); + setVarUpdated(mb,k,0); + setVarEolife(mb,k,0); } for (pc = 0; pc < mb->stop; pc++) { @@ -598,20 +599,20 @@ setVariableScope(MalBlkPtr mb) for (k = 0; k < p->argc; k++) { int v = getArg(p,k); - if( isVarConstant(mb,v) && mb->var[v]->updated == 0) - mb->var[v]->updated= pc; + if( isVarConstant(mb,v) && getVarUpdated(mb,v) == 0) + setVarUpdated(mb,v, pc); - if (mb->var[v]->declared == 0 ){ - mb->var[v]->declared = pc; + if ( getVarDeclared(mb,v) == 0 ){ + setVarDeclared(mb,v, pc); setVarScope(mb,v,depth); } if (k < p->retc ) - mb->var[v]->updated= pc; + setVarUpdated(mb,v, pc); if ( getVarScope(mb,v) == depth ) - mb->var[v]->eolife = pc; + setVarEolife(mb,v,pc); if ( k >= p->retc && getVarScope(mb,v) < depth ) - mb->var[v]->eolife = -1; + setVarEolife(mb,v,-1); } /* * At a block exit we can finalize all variables defined within that block. @@ -620,10 +621,10 @@ setVariableScope(MalBlkPtr mb) */ if( blockExit(p) ){ for (k = 0; k < mb->vtop; k++) - if ( mb->var[k]->eolife == 0 && getVarScope(mb,k) ==depth ) - mb->var[k]->eolife = pc; - else if ( mb->var[k]->eolife == -1 ) - mb->var[k]->eolife = pc; + if ( getVarEolife(mb,k) == 0 && getVarScope(mb,k) ==depth ) + setVarEolife(mb,k,pc); + else if ( getVarEolife(mb,k) == -1 ) + setVarEolife(mb,k,pc); if( dflow == depth) dflow= -1; @@ -631,8 +632,8 @@ setVariableScope(MalBlkPtr mb) } } for (k = 0; k < mb->vtop; k++) - if( mb->var[k]->eolife == 0) - mb->var[k]->eolife = mb->stop-1; + if( getVarEolife(mb,k) == 0) + setVarEolife(mb,k, mb->stop-1); } int @@ -705,8 +706,8 @@ malGarbageCollector(MalBlkPtr mb) for (i = 0; i < mb->vtop; i++) if( isVarCleanup(mb,i) && getEndScope(mb,i) >= 0) { - mb->var[i]->eolife = getEndScope(mb,i); - mb->stmt[mb->var[i]->eolife]->gc |= GARBAGECONTROL; + setVarEolife(mb,i, getEndScope(mb,i)); + mb->stmt[getVarEolife(mb,i)]->gc |= GARBAGECONTROL; } } /* diff --git a/monetdb5/mal/mal_function.h b/monetdb5/mal/mal_function.h --- a/monetdb5/mal/mal_function.h +++ b/monetdb5/mal/mal_function.h @@ -13,9 +13,9 @@ #include "mal_module.h" #include "mal_resolve.h" -#define getLastUpdate(L,I) ((L)->var[I]->updated) -#define getEndScope(L,I) ((L)->var[I]->eolife) -#define getBeginScope(L,I) ((L)->var[I]->declared) +#define getLastUpdate(L,I) ((L)->var[I].updated) +#define getEndScope(L,I) ((L)->var[I].eolife) +#define getBeginScope(L,I) ((L)->var[I].declared) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list