Changeset: 7a266c349d8e for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7a266c349d8e
Modified Files:
        monetdb5/mal/mal_function.c
        monetdb5/mal/mal_interpreter.mx
        monetdb5/optimizer/opt_dataflow.mx
        monetdb5/optimizer/opt_deadcode.mx
        monetdb5/optimizer/opt_emptySet.mx
        monetdb5/optimizer/opt_evaluate.mx
        monetdb5/optimizer/opt_garbageCollector.mx
        monetdb5/optimizer/opt_joinpath.mx
        monetdb5/optimizer/opt_mergetable.mx
        monetdb5/optimizer/opt_origin.mx
        monetdb5/optimizer/opt_recycler.mx
        monetdb5/optimizer/opt_statistics.c
        sql/backends/monet5/sql.mx
        sql/backends/monet5/sql_scenario.c
Branch: default
Log Message:

Merge with Aug2011 branch.


diffs (truncated from 2135 to 300 lines):

diff --git a/monetdb5/ChangeLog.Aug2011 b/monetdb5/ChangeLog.Aug2011
--- a/monetdb5/ChangeLog.Aug2011
+++ b/monetdb5/ChangeLog.Aug2011
@@ -1,3 +1,10 @@
 # ChangeLog file for MonetDB5
 # This file is updated with Maddlog
 
+* Wed Sep 21 2011 Sjoerd Mullender <[email protected]>
+- Fixed a problem where MAL variables weren't properly cleared before
+  reuse of the data strucutre.  This problem could cause the data flow
+  scheduler to generate dependencies between instructions that didn't
+  actually exist, which in turn could cause circular dependencies among
+  instructions with deadlock as a result.  Bugs 2865 and 2888.
+
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
@@ -783,10 +783,10 @@ malGarbageCollector(MalBlkPtr mb)
                return ;
 
        for (i = 0; i < mb->vtop; i++)
-       if( isVarCleanup(mb,i) && getEndLifespan(span,i) >= 0) {
-               mb->var[i]->eolife = getEndLifespan(span,i);
-               mb->stmt[mb->var[i]->eolife]->gc |= GARBAGECONTROL;
-       }
+               if( isVarCleanup(mb,i) && getEndLifespan(span,i) >= 0) {
+                       mb->var[i]->eolife = getEndLifespan(span,i);
+                       mb->stmt[mb->var[i]->eolife]->gc |= GARBAGECONTROL;
+               }
        GDKfree(span);
 }
 /*
diff --git a/monetdb5/mal/mal_interpreter.mx b/monetdb5/mal/mal_interpreter.mx
--- a/monetdb5/mal/mal_interpreter.mx
+++ b/monetdb5/mal/mal_interpreter.mx
@@ -1159,6 +1159,7 @@ DFLOWinit(DataFlow flow, Client cntxt, M
                for (j = p->retc; j < p->argc; j++) {
                        /* list of instructions that wake n-th instruction up */
                        if (!isVarConstant(mb, getArg(p, j)) && (k = 
assign[getArg(p, j)])) {
+                               assert(k < pc); /* only dependencies on earlier 
instructions */
                                /* add edge to the target instruction for 
wakeup call */
                                k -= flow->start;
                                if (flow->nodes[k]) {
@@ -1178,7 +1179,7 @@ DFLOWinit(DataFlow flow, Client cntxt, M
 
                                flow->status[n].blocks++;
                        }
-                       
+
                        /* list of instructions to be woken up explicitly */
                        if ( !isVarConstant(mb, getArg(p, j)) ) {
                                /* be careful, watch out for garbage collection 
interference */
@@ -1187,6 +1188,7 @@ DFLOWinit(DataFlow flow, Client cntxt, M
                                if (l != pc && l < flow->stop && l > 
flow->start) {
                                        /* add edge to the target instruction 
for wakeup call */
                                        PARDEBUG mnstr_printf(GDKstdout, 
"endoflife for %s is %d -> %d\n", getVarName(mb, getArg(p,j)), n + flow->start, 
l);
+                                       assert(pc < l); /* only dependencies on 
earlier instructions */
                                        l -= flow->start;
                                        if (flow->nodes[n]) {
                                                /* add wakeup to tail of list */
@@ -1338,26 +1340,26 @@ DFLOWscheduler(DataFlow flow)
 
                oldq = queued;
                if ( f->pc > 0 )
-               for (; last >= 0 && (i = flow->nodes[last]) > 0; last = 
flow->edges[last])
-                       if (flow->status[i].state == DFLOWpending) {
-                               flow->status[i].argclaim += f->hotclaim;
-                               if (flow->status[i].blocks == 1 && ret == 
MAL_SUCCEED) {
+                       for (; last >= 0 && (i = flow->nodes[last]) > 0; last = 
flow->edges[last])
+                               if (flow->status[i].state == DFLOWpending) {
+                                       flow->status[i].argclaim += f->hotclaim;
+                                       if (flow->status[i].blocks == 1 && ret 
== MAL_SUCCEED) {
+                                               queued++;
+                                               q_enqueue_(flow->todo, 
flow->status + i);
+                                               flow->status[i].state = 
DFLOWrunning;
+                                               flow->status[i].blocks--;
+                                               PARDEBUG
+                                                       mnstr_printf(GDKstdout, 
"#enqueue pc=%d claim= " LLFMT " queued= %d\n", flow->status[i].pc, 
flow->status[i].argclaim, queued);
+                                       } else {
+                                               if (ret == MAL_SUCCEED)
+                                                       PARDEBUG 
mnstr_printf(GDKstdout, "#await   pc %d block %d claim= " LLFMT "\n", 
flow->start + i, flow->status[i].blocks, flow->status[i].argclaim);
+                                               flow->status[i].blocks--;
+                                       }
+                               } else { /* worker stole the candidate */
+                                       PARDEBUG mnstr_printf(GDKstdout, "#woke 
up pc %d block %d claim " LLFMT "\n", flow->start + i, flow->status[i].blocks, 
flow->status[i].argclaim);
                                        queued++;
-                                       q_enqueue_(flow->todo, flow->status + 
i);
-                                       flow->status[i].state = DFLOWrunning;
-                                       flow->status[i].blocks--;
-                                       PARDEBUG
-                                       mnstr_printf(GDKstdout, "#enqueue pc=%d 
claim= " LLFMT " queued= %d\n", flow->status[i].pc, flow->status[i].argclaim, 
queued);
-                               } else {
-                                        if (ret == MAL_SUCCEED)
-                                               PARDEBUG 
mnstr_printf(GDKstdout, "#await   pc %d block %d claim= " LLFMT "\n", 
flow->start + i, flow->status[i].blocks, flow->status[i].argclaim);
-                                       flow->status[i].blocks--;
+                                       oldq++;
                                }
-                       } else { /* worker stole the candidate */
-                               PARDEBUG mnstr_printf(GDKstdout, "#woke up pc 
%d block %d claim " LLFMT "\n", flow->start + i, flow->status[i].blocks, 
flow->status[i].argclaim);
-                               queued++;
-                               oldq++;
-                       }
                if (0 && oldq != queued) /* invalidate */
                        queue_sort(flow->todo);
                MT_lock_unset(&flow->todo->l, "q_enqueue");
diff --git a/monetdb5/optimizer/opt_accumulators.mx 
b/monetdb5/optimizer/opt_accumulators.mx
--- a/monetdb5/optimizer/opt_accumulators.mx
+++ b/monetdb5/optimizer/opt_accumulators.mx
@@ -107,7 +107,7 @@ OPTaccumulatorsImplementation(Client cnt
                        continue;
                }
                OPTDEBUGaccumulators
-                       printInstruction(cntxt->fdout, mb, 0, p, LIST_MAL_ALL);
+                       printInstruction(GDKstdout, mb, 0, p, LIST_MAL_ALL);
                if (p->retc==1 && p->argc == 2) {
                        /* unary operation, avoid clash with binary */
                        pushInstruction(mb,p);
@@ -134,8 +134,8 @@ OPTaccumulatorsImplementation(Client cnt
                        typeChecker(scope, mb, p, TRUE);
                        if (mb->errors || p->typechk == TYPE_UNKNOWN) {
                                OPTDEBUGaccumulators{
-                                       mnstr_printf(cntxt->fdout,"# Failed 
typecheck");
-                                       printInstruction(cntxt->fdout, mb, 0, 
p, LIST_MAL_ALL);
+                                       mnstr_printf(GDKstdout,"# Failed 
typecheck");
+                                       printInstruction(GDKstdout, mb, 0, p, 
LIST_MAL_ALL);
                                }
                                /* reset instruction error buffer */
                                cntxt->errbuf[0]=0;
@@ -144,15 +144,15 @@ OPTaccumulatorsImplementation(Client cnt
                                p=q; /* restore */
                        } else  {
                                OPTDEBUGaccumulators{
-                                       mnstr_printf(cntxt->fdout, "#Found 
accumulation candidate ");
-                                       mnstr_printf(cntxt->fdout, "%d: 
%d(%d)\n", i, getArg(p,0),getArg(p,2));
-                                       printInstruction(cntxt->fdout, mb, 0, 
p, LIST_MAL_ALL);
+                                       mnstr_printf(GDKstdout, "#Found 
accumulation candidate ");
+                                       mnstr_printf(GDKstdout, "%d: %d(%d)\n", 
i, getArg(p,0),getArg(p,2));
+                                       printInstruction(GDKstdout, mb, 0, p, 
LIST_MAL_ALL);
                                }
                                freeInstruction(q);
                                actions++;  
                        }
                        OPTDEBUGaccumulators
-                               printInstruction(cntxt->fdout, mb, 0, p, 
LIST_MAL_ALL);
+                               printInstruction(GDKstdout, mb, 0, p, 
LIST_MAL_ALL);
                }
                pushInstruction(mb,p);
        } 
@@ -162,7 +162,7 @@ OPTaccumulatorsImplementation(Client cnt
        GDKfree(old);
        GDKfree(span);
        DEBUGoptimizers
-               mnstr_printf(cntxt->fdout,"#opt_accumulators:%d 
accumulations\n",actions);
+               mnstr_printf(GDKstdout,"#opt_accumulators:%d 
accumulations\n",actions);
        return actions;
 }
 
diff --git a/monetdb5/optimizer/opt_aliases.mx 
b/monetdb5/optimizer/opt_aliases.mx
--- a/monetdb5/optimizer/opt_aliases.mx
+++ b/monetdb5/optimizer/opt_aliases.mx
@@ -175,7 +175,7 @@ OPTaliasesImplementation(Client cntxt, M
        GDKfree(span);
        GDKfree(alias);
        DEBUGoptimizers
-               mnstr_printf(cntxt->fdout,"#opt_aliases: %d removed\n",actions);
+               mnstr_printf(GDKstdout,"#opt_aliases: %d removed\n",actions);
        return actions;
 }
 @include optimizerWrapper.mx
diff --git a/monetdb5/optimizer/opt_coercion.mx 
b/monetdb5/optimizer/opt_coercion.mx
--- a/monetdb5/optimizer/opt_coercion.mx
+++ b/monetdb5/optimizer/opt_coercion.mx
@@ -112,7 +112,7 @@ OPTcoercionImplementation(Client cntxt,M
         * structure. A cheaper optimizer is sufficient.
         */
        DEBUGoptimizers
-               mnstr_printf(cntxt->fdout,"#opt_coercion: %d coersions 
applied\n",actions);
+               mnstr_printf(GDKstdout,"#opt_coercion: %d coersions 
applied\n",actions);
        return actions;
 }
 @include optimizerWrapper.mx
diff --git a/monetdb5/optimizer/opt_commonTerms.mx 
b/monetdb5/optimizer/opt_commonTerms.mx
--- a/monetdb5/optimizer/opt_commonTerms.mx
+++ b/monetdb5/optimizer/opt_commonTerms.mx
@@ -189,15 +189,15 @@ OPTcommonTermsImplementation(Client cntx
                barrier |= getFunctionId(p) == assertRef;
                if (p->token == NOOPsymbol || p->token == ASSIGNsymbol || 
barrier /* || p->retc == p->argc */) {
 #ifdef DEBUG_OPT_COMMONTERMS_MORE
-                               mnstr_printf(cntxt->fdout, "COMMON SKIPPED[%d] 
%d %d\n",i, barrier, p->retc == p->argc);
+                               mnstr_printf(GDKstdout, "COMMON SKIPPED[%d] %d 
%d\n",i, barrier, p->retc == p->argc);
 #endif
                        continue;
                }
 
                /* from here we have a candidate to look for a match */
 #ifdef DEBUG_OPT_COMMONTERMS_MORE
-               mnstr_printf(cntxt->fdout,"#CANDIDATE[%d] ",i);
-               printInstruction(cntxt->fdout, mb, 0, p, LIST_MAL_ALL);
+               mnstr_printf(GDKstdout,"#CANDIDATE[%d] ",i);
+               printInstruction(GDKstdout, mb, 0, p, LIST_MAL_ALL);
 #endif
                prop = hasSideEffects(p,TRUE) || isUpdateInstruction(p);
                j =     isVarConstant(mb, getArg(p,p->argc-1))? cstlist: 
candidate;
@@ -206,11 +206,11 @@ OPTcommonTermsImplementation(Client cntx
                for (; j ; j = list[j]) 
                        if ( (q=getInstrPtr(mb,j))->fcn == p->fcn  && 
!isUnsafeFunction(q)){
 #ifdef DEBUG_OPT_COMMONTERMS_MORE
-                       mnstr_printf(cntxt->fdout,"#CANDIDATE %d, %d  %d %d ", 
i, j, 
+                       mnstr_printf(GDKstdout,"#CANDIDATE %d, %d  %d %d ", i, 
j, 
                                hasSameSignature(mb, p, q, p->retc), 
                                hasSameArguments(mb, p, q));
-                               printInstruction(cntxt->fdout, mb, 0, q, 
LIST_MAL_ALL);
-                               mnstr_printf(cntxt->fdout," :%d %d %d=%d %d %d 
%d %d %d\n", 
+                               printInstruction(GDKstdout, mb, 0, q, 
LIST_MAL_ALL);
+                               mnstr_printf(GDKstdout," :%d %d %d=%d %d %d %d 
%d %d\n", 
                                        q->token != ASSIGNsymbol ,
                                        list[getArg(q,q->argc-1)],i,
                                        !hasCommonResults(p, q), 
@@ -232,13 +232,13 @@ OPTcommonTermsImplementation(Client cntx
                                   ) {
                                                if (safetyBarrier(p, q) ){
 #ifdef DEBUG_OPT_COMMONTERMS_MORE
-                                               
mnstr_printf(cntxt->fdout,"#safetybarrier reached\n");
+                                               
mnstr_printf(GDKstdout,"#safetybarrier reached\n");
 #endif
                                                break;
                                        }
 #ifdef DEBUG_OPT_COMMONTERMS_MORE
-                                               mnstr_printf(cntxt->fdout, 
"Found a common expression " "%d <-> %d\n", j, i);
-                                               printInstruction(cntxt->fdout, 
mb, 0, q, LIST_MAL_ALL);
+                                               mnstr_printf(GDKstdout, "Found 
a common expression " "%d <-> %d\n", j, i);
+                                               printInstruction(GDKstdout, mb, 
0, q, LIST_MAL_ALL);
 #endif
                                        clrFunction(p);
                                        p->argc = p->retc;
@@ -247,8 +247,8 @@ OPTcommonTermsImplementation(Client cntx
                                                p= pushArgument(mb,p, 
getArg(q,k));
                                        }
 #ifdef DEBUG_OPT_COMMONTERMS_MORE
-                                       mnstr_printf(cntxt->fdout, "COMMON 
MODIFIED EXPRESSION %d -> %d\n",i,j);
-                                       printInstruction(cntxt->fdout, mb, 0, 
p, LIST_MAL_ALL);
+                                       mnstr_printf(GDKstdout, "COMMON 
MODIFIED EXPRESSION %d -> %d\n",i,j);
+                                       printInstruction(GDKstdout, mb, 0, p, 
LIST_MAL_ALL);
 #endif
                                        actions++;
                                        break; /* end of search */
@@ -256,8 +256,8 @@ OPTcommonTermsImplementation(Client cntx
                        }
 #ifdef DEBUG_OPT_COMMONTERMS_MORE
                        else if ( hasSideEffects(q, TRUE) || 
isUpdateInstruction(p)){
-                               mnstr_printf(cntxt->fdout, "COMMON SKIPPED %d 
%d\n", hasSideEffects(q, TRUE) , isUpdateInstruction(p));
-                               printInstruction(cntxt->fdout, mb, 0, q, 
LIST_MAL_ALL);
+                               mnstr_printf(GDKstdout, "COMMON SKIPPED %d 
%d\n", hasSideEffects(q, TRUE) , isUpdateInstruction(p));
+                               printInstruction(GDKstdout, mb, 0, q, 
LIST_MAL_ALL);
                        }
 #endif
        }
@@ -269,9 +269,9 @@ OPTcommonTermsImplementation(Client cntx
        GDKfree(old);
        GDKfree(alias);
        DEBUGoptimizers
-               mnstr_printf(cntxt->fdout,"#opt_commonTerms: %d statements 
catched\n",actions);
+               mnstr_printf(GDKstdout,"#opt_commonTerms: %d statements 
catched\n",actions);
 #ifdef DEBUG_OPT_COMMONTERMS_MORE
-               mnstr_printf(cntxt->fdout,"#opt_commonTerms: %d statements 
catched\n",actions);
+               mnstr_printf(GDKstdout,"#opt_commonTerms: %d statements 
catched\n",actions);
 #endif
        return actions;
 }
diff --git a/monetdb5/optimizer/opt_constants.mx 
b/monetdb5/optimizer/opt_constants.mx
--- a/monetdb5/optimizer/opt_constants.mx
+++ b/monetdb5/optimizer/opt_constants.mx
@@ -66,7 +66,7 @@ OPTconstantsImplementation(Client cntxt,
        int *alias, *index;
        VarPtr x,y, *cst;
 
-       OPTDEBUGconstants mnstr_printf(cntxt->fdout,"#OPT_CONSTANTS: MATCHING 
CONSTANTS ELEMENTS\n");
+       OPTDEBUGconstants mnstr_printf(GDKstdout,"#OPT_CONSTANTS: MATCHING 
CONSTANTS ELEMENTS\n");
 
        alias= (int*) GDKzalloc(sizeof(int) * mb->vtop);
        cst= (VarPtr*) GDKzalloc(sizeof(VarPtr) * mb->vtop);
@@ -95,9 +95,9 @@ OPTconstantsImplementation(Client cntxt,
                                         x->value.vtype == y->value.vtype &&
                                        ATOMcmp(x->value.vtype, 
VALget(&x->value), VALget(&y->value)) == 0){
                                        OPTDEBUGconstants {
-                                               
mnstr_printf(cntxt->fdout,"#opt_constants: matching elements %s %d %d ", 
getVarName(mb,i), i,k);
-                                               
ATOMprint(x->value.vtype,VALget(&x->value),cntxt->fdout);
-                                               mnstr_printf(cntxt->fdout,"\n");
+                                               
mnstr_printf(GDKstdout,"#opt_constants: matching elements %s %d %d ", 
getVarName(mb,i), i,k);
+                                               
ATOMprint(x->value.vtype,VALget(&x->value),GDKstdout);
+                                               mnstr_printf(GDKstdout,"\n");
                                        }
                                        /* re-use a constant */
                                        alias[i]= index[k];
@@ -107,7 +107,7 @@ OPTconstantsImplementation(Client cntxt,
                                }
                        }
                        if ( fnd == 0){
-                               OPTDEBUGconstants 
mnstr_printf(cntxt->fdout,"swith elements %d %d\n", i,n);
+                               OPTDEBUGconstants mnstr_printf(GDKstdout,"swith 
elements %d %d\n", i,n);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to