Changeset: 89b3a8dd61a9 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=89b3a8dd61a9 Modified Files: monetdb5/optimizer/opt_dataflow.c Branch: Jul2017 Log Message:
Properly administer and use R/W tags An erroneous SQL test uncovered potential garbage collection issues in a parallel block. diffs (50 lines): diff --git a/monetdb5/optimizer/opt_dataflow.c b/monetdb5/optimizer/opt_dataflow.c --- a/monetdb5/optimizer/opt_dataflow.c +++ b/monetdb5/optimizer/opt_dataflow.c @@ -46,7 +46,7 @@ typedef char *States; -#define setState(S,P,K,F) ( assert(getArg(P,K) < vlimit), (S)[getArg(P,K)] = F) +#define setState(S,P,K,F) ( assert(getArg(P,K) < vlimit), (S)[getArg(P,K)] |= F) #define getState(S,P,K) ((S)[getArg(P,K)]) static int @@ -126,7 +126,7 @@ dataflowBreakpoint(Client cntxt, MalBlkP } for(j=p->retc; j < p->argc; j++) - if ( getState(states,p,j) == VARBLOCK){ + if ( getState(states,p,j) & VARBLOCK){ #ifdef DEBUG_OPT_DATAFLOW if( getState(states,p,j) & VARREAD) fprintf(stderr,"#breakpoint on blocked var %s state %d\n", getVarName(mb,getArg(p,j)), getState(states,p,j)); @@ -236,7 +236,7 @@ OPTdataflowImplementation(Client cntxt, // collect BAT variables garbage collected within the block if( !simple) for( k=q->retc; k<q->argc; k++){ - if (getState(states,q,k) == VAR2READ && getEndScope(mb,getArg(q,k)) == j && isaBatType(getVarType(mb,getArg(q,k))) ) + if (getState(states,q,k) & VAR2READ && getEndScope(mb,getArg(q,k)) == j && isaBatType(getVarType(mb,getArg(q,k))) ) top = dflowGarbagesink(cntxt, mb, getArg(q,k), sink, top); } } @@ -288,15 +288,15 @@ OPTdataflowImplementation(Client cntxt, } // remember you assigned/read variables for ( k = 0; k < p->retc; k++) - setState(states,p,k,VARWRITE); - if( isUpdateInstruction(p) && (getState(states,p,1) == 0 || getState(states,p,1) == VARWRITE)) + setState(states,p,k, VARWRITE); + if( isUpdateInstruction(p) && (getState(states,p,1) == 0 || getState(states,p,1) & VARWRITE)) setState(states, p,1, VARBLOCK); for ( k = p->retc; k< p->argc; k++) if( !isVarConstant(mb,getArg(p,k)) ){ - if( getState(states, p, k) == VARREAD) + if( getState(states, p, k) & VARREAD) setState(states, p, k, VAR2READ); else - if( getState(states, p, k) == VARWRITE) + if( getState(states, p, k) & VARWRITE) setState(states, p ,k, VARREAD); } #ifdef DEBUG_OPT_DATAFLOW _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list