Changeset: e5a8931bc392 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e5a8931bc392
Modified Files:
        monetdb5/mal/mal_instruction.mx
        monetdb5/mal/mal_interpreter.mx
Branch: Dec2011
Log Message:

Plugged two more memory leaks that have to do with BLOB handling.


diffs (192 lines):

diff --git a/monetdb5/mal/mal_instruction.mx b/monetdb5/mal/mal_instruction.mx
--- a/monetdb5/mal/mal_instruction.mx
+++ b/monetdb5/mal/mal_instruction.mx
@@ -1759,7 +1759,9 @@ defConstant(MalBlkPtr mb, int type, ValP
        k = newTmpVariable(mb, type);
        setVarConstant(mb, k);
        setVarFixed(mb, k);
-       if ( type == TYPE_str)
+       if ( type == TYPE_str ||
+                (type >= 0 && type < TYPE_any &&
+                 strcmp(BATatoms[type].name, "blob") == 0))
                setVarCleanup(mb, k);
        else clrVarCleanup(mb, k);
        vr = &getVarConstant(mb, k);
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
@@ -452,8 +452,7 @@ str runMALsequence(Client cntxt, MalBlkP
 #if FAST
        int stamp = -1;
 #endif
-       bat *backup = (bat*)GDKzalloc(mb->maxarg * sizeof(bat));
-       str *sbackup = (str*)GDKzalloc(mb->maxarg * sizeof(str));
+       ValPtr backup = GDKzalloc(mb->maxarg * sizeof(ValRecord));
        int *garbage = (int*)GDKzalloc(mb->maxarg * sizeof(int));
        lng oldtimer = 0;
        struct Mallinfo oldMemory;
@@ -566,7 +565,6 @@ workslow:
                }
        }
        GDKfree(backup);
-       GDKfree(sbackup);
        GDKfree(garbage);
        return ret;
 }
@@ -945,8 +943,7 @@ DFLOWstep(FlowTask *t, FlowStatus fs)
 #if FAST
        int stamp = -1;
 #endif
-       bat *backup = (bat*)GDKzalloc(fs->mb->maxarg * sizeof(bat));
-       str *sbackup = (str*)GDKzalloc(fs->mb->maxarg * sizeof(str));
+       ValPtr backup = GDKzalloc(fs->mb->maxarg * sizeof(ValRecord));
        int *garbage = (int*)GDKzalloc(fs->mb->maxarg * sizeof(int));
        Client cntxt = fs->cntxt;
        MalBlkPtr mb = fs->mb;
@@ -991,7 +988,6 @@ DFLOWstep(FlowTask *t, FlowStatus fs)
                        stkpc = mb->stop;
                        fs->state = -1;
                        GDKfree(backup);
-                       GDKfree(sbackup);
                        GDKfree(garbage);
                        return ret;
                }
@@ -1018,19 +1014,19 @@ DFLOWstep(FlowTask *t, FlowStatus fs)
                 */
                switch (pci->token) {
                case ASSIGNsymbol: 
-                       @:assignStmt(FAST,fs->pc = -fs->pc; GDKfree(backup); 
GDKfree(sbackup);GDKfree(garbage); return ret,t)@ 
+                       @:assignStmt(FAST,fs->pc = -fs->pc; 
GDKfree(backup);GDKfree(garbage); return ret,t)@
                        break;
                case PATcall: 
-                       @:patterncall(FAST,fs->pc = -fs->pc; GDKfree(backup); 
GDKfree(sbackup);GDKfree(garbage); return ret,t)@ 
+                       @:patterncall(FAST,fs->pc = -fs->pc; 
GDKfree(backup);GDKfree(garbage); return ret,t)@
                        break;
                case CMDcall: 
-                       @:commandcall(FAST,fs->pc = -fs->pc; GDKfree(backup); 
GDKfree(sbackup);GDKfree(garbage); return ret,t)@ 
+                       @:commandcall(FAST,fs->pc = -fs->pc; 
GDKfree(backup);GDKfree(garbage); return ret,t)@
                        break;
                case FACcall: 
-                       @:factorycall(FAST,fs->pc = -fs->pc; GDKfree(backup); 
GDKfree(sbackup);GDKfree(garbage); return ret,t)@ 
+                       @:factorycall(FAST,fs->pc = -fs->pc; 
GDKfree(backup);GDKfree(garbage); return ret,t)@
                        break;
                case FCNcall: 
-                       @:functioncall(FAST,fs->pc = -fs->pc; GDKfree(backup); 
GDKfree(sbackup);GDKfree(garbage); return ret,t)@ 
+                       @:functioncall(FAST,fs->pc = -fs->pc; 
GDKfree(backup);GDKfree(garbage); return ret,t) 
                        break;
                case NOOPsymbol:
                case REMsymbol:
@@ -1048,7 +1044,6 @@ DFLOWstep(FlowTask *t, FlowStatus fs)
        if (ret)
                fs->pc = -fs->pc;
        GDKfree(backup);
-       GDKfree(sbackup);
        GDKfree(garbage);
        return ret;
 }
@@ -1728,7 +1723,6 @@ safeguardStack(Client cntxt, MalBlkPtr m
                if (oldtimer)
                        cntxt->timer = oldtimer;
                GDKfree(backup);
-               GDKfree(sbackup);
                GDKfree(garbage);
                return yieldFactory(mb, pci, stkpc);
        case RETURNsymbol:
@@ -1839,25 +1833,27 @@ safeguardStack(Client cntxt, MalBlkPtr m
 #endif
        if (garbageControl(pci)) {
                for (i = 0; i < pci->argc; i++) {
-                       sbackup[i] = 0;
-                       backup[i] = 0;
+                       int a = getArg(pci, i);
+
+                       backup[i].vtype = 0;
+                       backup[i].len = 0;
                        garbage[i] = -1;
-                       if (stk->stk[getArg(pci, i)].vtype == TYPE_bat && 
getEndOfLife(mb, getArg(pci, i)) == stkpc && isNotUsedIn(pci, i + 1, 
getArg(pci, i))) {
-                               garbage[i] = getArg(pci, i);
+                       if (stk->stk[a].vtype == TYPE_bat && getEndOfLife(mb, 
a) == stkpc && isNotUsedIn(pci, i + 1, a)) {
+                               garbage[i] = a;
 #ifdef DEBUG_GC
-                               mnstr_printf(GDKstdout, "GC %d %s prep\n", 
getArg(pci, i), getArgName(mb, pci, i));
+                               mnstr_printf(GDKstdout, "GC %d %s prep\n", a, 
getArgName(mb, pci, i));
 #endif
                        }
 
-                       if (i < pci->retc && stk->stk[getArg(pci, i)].vtype == 
TYPE_bat) {
-                               backup[i] = stk->stk[getArg(pci, i)].val.bval;
+                       if (i < pci->retc && stk->stk[a].vtype == TYPE_bat) {
+                               backup[i] = stk->stk[a];
 #if @1
                                stamp = BBPcurstamp();
 #endif
-                       } else if (i < pci->retc && stk->stk[getArg(pci, 
i)].vtype == TYPE_str) {
-                               backup[i] = stk->stk[getArg(pci, i)].len;
-                               sbackup[i] = stk->stk[getArg(pci, i)].val.sval;
-                               backup[i] += (sbackup[i] != NULL);
+                       } else if (i < pci->retc &&
+                                          (stk->stk[a].vtype == TYPE_str ||
+                                               
strcmp(BATatoms[stk->stk[a].vtype].name, "blob") == 0)) {
+                               backup[i] = stk->stk[a];
                        }
                }
        }
@@ -1899,20 +1895,22 @@ safeguardStack(Client cntxt, MalBlkPtr m
        @:MALrecycleExit(@2)@
        if (ret == MAL_SUCCEED && garbageControl(pci)) {
                for (i = 0; i < pci->argc; i++) {
+                       int a = getArg(pci, i);
+
                        if (isaBatType(getArgType(mb, pci, i))) {
-                               bat bid = stk->stk[getArg(pci, i)].val.bval;
+                               bat bid = stk->stk[a].val.bval;
 
                                /* update the bigfoot information only if we 
need to gc */
                                if (cntxt->flags & bigfootFlag)
                                        updateBigFoot(cntxt, bid, TRUE);
-                               if (i < pci->retc && backup[i]) {
-                                       if (backup[i] != bid && i < pci->retc) {
+                               if (i < pci->retc && backup[i].val.bval) {
+                                       if (backup[i].val.bval != bid && i < 
pci->retc) {
                                                /* possible garbage collect the 
variable */
                                                if (cntxt->flags & bigfootFlag)
-                                                       updateBigFoot(cntxt, 
backup[i], FALSE);
+                                                       updateBigFoot(cntxt, 
backup[i].val.bval, FALSE);
                                        }
-                                       BBPdecref(backup[i], TRUE);
-                                       backup[i] = 0;
+                                       BBPdecref(backup[i].val.bval, TRUE);
+                                       backup[i].val.bval = 0;
                                }
                                if (garbage[i] >= 0) {
                                        bid = 
ABS(stk->stk[garbage[i]].val.bval);
@@ -1920,17 +1918,20 @@ safeguardStack(Client cntxt, MalBlkPtr m
                                        PARDEBUG mnstr_printf(GDKstdout, "#GC 
pc=%d bid=%d %s done\n", stkpc, bid, getVarName(mb, garbage[i]));
                                        stk->stk[garbage[i]].val.bval = 0;
                                }
-                       } else if (i < pci->retc && stk->stk[getArg(pci, 
i)].vtype == TYPE_str) {
-                               int a = getArg(pci, i);
-                               if (sbackup[i] && sbackup[i] != 
stk->stk[a].val.sval) {
-                                       if (backup[i] > 0)
-                                               GDKfree(sbackup[i]);
+                       } else if (i < pci->retc &&
+                                          0 < stk->stk[a].vtype &&
+                                          stk->stk[a].vtype < TYPE_any &&
+                                          (stk->stk[a].vtype == TYPE_str ||
+                                               
strcmp(BATatoms[stk->stk[a].vtype].name, "blob") == 0)) {
+                               if (backup[i].val.sval && backup[i].val.sval != 
stk->stk[a].val.sval) {
+                                       if (backup[i].val.sval)
+                                               GDKfree(backup[i].val.sval);
                                        if (i >= pci->retc) {
-                                               stk->stk[getArg(pci, 
i)].val.sval = 0;
-                                               stk->stk[getArg(pci, i)].len = 
0;
+                                               stk->stk[a].val.sval = 0;
+                                               stk->stk[a].len = 0;
                                        }
-                                       backup[i] = 0;
-                                       sbackup[i] = 0;
+                                       backup[i].len = 0;
+                                       backup[i].val.sval = 0;
                                }
                        }
                }
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to