Changeset: 0c31de1be82a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0c31de1be82a
Modified Files:
        monetdb5/scheduler/mut_pack.c
Branch: mutation
Log Message:

Better handle pack followed by partitioning


diffs (121 lines):

diff --git a/monetdb5/scheduler/mut_pack.c b/monetdb5/scheduler/mut_pack.c
--- a/monetdb5/scheduler/mut_pack.c
+++ b/monetdb5/scheduler/mut_pack.c
@@ -61,10 +61,14 @@ validswitch(InstrPtr p, InstrPtr q)
 void 
 mutationPack(Client cntxt, Mutant m){
        MalBlkPtr mb = m->src;
-    int pc = m->target, i, j, mvar, svar, dvar, limit, packpc=0;
+    int pc = m->target, i, j, mvar, limit, packpc=0;
     InstrPtr p=0, *old= mb->stmt, q, newpack = 0, newpack1=0, newpack2 = 0;
        int profiler=0;
 
+       DEBUG_MULTICORE {
+               mnstr_printf(cntxt->fdout,"#MUTATIONPACK\n");
+               printFunction(cntxt->fdout, mb, 0, LIST_MAL_ALL);
+       }
     (void) cntxt;
     limit= mb->stop;
     if ( newMalBlkStmt(mb, mb->ssize) < 0)
@@ -72,7 +76,7 @@ mutationPack(Client cntxt, Mutant m){
        pushInstruction(mb,old[0]);//needed for debugging
 
        // first phase, see if we need to undo a bat.partition
-       svar = -1; mvar = -1; dvar = -1;
+       mvar = -1; 
     for (i = 1; i < limit; i++) {
                p= old[i];
                if (  i == pc){
@@ -80,41 +84,59 @@ mutationPack(Client cntxt, Mutant m){
                                continue;
                        mvar = getArg(p,0);
 
+                       DEBUG_MULTICORE 
mnstr_printf(cntxt->fdout,"#MUTATIONPACK move %d ",pc);
                        // move ahead to first candidate for consolidation
                        for(i++ ; i < limit && validswitch(old[pc],old[i]); 
i++){
                                old[pc] = old[i];
                                old[i] = p;
                                pc = i;
                        }
+                       packpc = pc;
+                       newpack = p;
+                       old[pc]= 0;
+
+                       DEBUG_MULTICORE mnstr_printf(cntxt->fdout," to 
%d\n",i-1);
                        q = old[i];
-
-                       // we found a partition to be removed
-                       if (getModuleId(q) == batRef && getFunctionId(q) == 
partitionRef && getArgPos(p,mvar) >=0){
-                               svar = getArg(q,0);
+                       if (getModuleId(q) == batRef && getFunctionId(q) == 
partitionRef && getArgPos(q,mvar) >=0){
+                       // we bounced upon a partition over a packed variable
+                       // this means we replace the partitions by the matpack 
components
+                               
+                               int partitions = 
getVarConstant(mb,getArg(q,2)).val.ival;
+                               for(j =i; j< limit; j++)
+                               if (getModuleId(q= old[j]) == batRef && 
getFunctionId(q) == partitionRef && getArgPos(q,mvar) >=0){
+                                       partitions --;
+                                       if ( partitions == 0 && p->argc > 
p->retc){
+                                               getArg(p,0)= getArg(q,0);
+                                               old[j] = p;
+                                               freeInstruction(q);
+                                       } else 
+                                       if ( partitions > 0 && p->argc > 
p->retc){
+                                               clrFunction(q);
+                                               q->argc= q->retc;
+                                               q = pushArgument(mb, q, 
getArg(p,1));
+                                               delArgument(p,1);
+                                       } else{
+                                               // inject an empty partition
+                                               clrFunction(q);
+                                               q = 
pushArgument(mb,q,newTmpVariable(mb,getArgType(mb,q,0)));
+                                       }
+                               }
+                               packpc = 0;
+                               newpack = 0;
                        } 
-                       packpc = i-1;
-                       newpack = p;
-                       old[i-1]= 0;
                        m->comment = GDKstrdup("mutationPack");
-               } else
-               // rollback all but one partitioned instruction
-               if (svar >= 0 && getArgPos(p,mvar) >= 0){
-                       if (dvar == -1){
-                               getArg(p, getArgPos(p,svar)) = mvar;
-                               dvar = getArg(p,0);
-                       } 
                } 
        }
 
-       DEBUG_MULTICORE 
-               mnstr_printf(cntxt->fdout,"#mutationPack mvar %d svar %d dvar 
%d leftover %d\n", mvar,svar,dvar,limit);
+       DEBUG_MULTICORE mnstr_printf(cntxt->fdout,"#mutationPack mvar %d packpc 
%d\n", mvar,packpc);
 
        // second phase, replace matpack with its successor
     for (i = 1; i < limit; i++) 
        if ( (p= old[i])){
                profiler = mb->profiler[i].trace;
 
-               if ( packpc == i && getArgPos(old[i+1],mvar) < 0){
+               if ( packpc == i && getArgPos(p,mvar) < 0){
+                       pushInstruction(mb,newpack);
                        pushInstruction(mb,p);
                        continue;
                }
@@ -156,10 +178,10 @@ mutationPack(Client cntxt, Mutant m){
                } else 
                        // handle non-partitioned operators
                        pushInstruction(mb,p);
-       }
-       DEBUG_MULTICORE {
-               mnstr_printf(cntxt->fdout,"#mutationPack mvar %d svar %d dvar 
%d leftover %d\n", mvar,svar,dvar,limit);
-               //printFunction(cntxt->fdout, mb, 0, LIST_MAL_ALL);
-       }
+       } else
+       if ( packpc == i )
+               pushInstruction(mb,newpack);
+       DEBUG_MULTICORE
+               printFunction(cntxt->fdout, mb, 0, LIST_MAL_ALL);
     GDKfree(old);
 }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to