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