Changeset: cb72f71d7327 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cb72f71d7327
Modified Files:
monetdb5/mal/mal_builder.c
monetdb5/mal/mal_instruction.c
monetdb5/mal/mal_instruction.h
Branch: default
Log Message:
Add more defensive code for the rare case that mallocs starting to fail
near the end-of-life situation of running out of memory.
The basic approach is to mark MAL blocks with exceptions and stumble on
with invalide blocks, which will likely be catched by optimizers/interpreter.
diffs (truncated from 514 to 300 lines):
diff --git a/monetdb5/mal/mal_builder.c b/monetdb5/mal/mal_builder.c
--- a/monetdb5/mal/mal_builder.c
+++ b/monetdb5/mal/mal_builder.c
@@ -24,13 +24,9 @@ InstrPtr
newAssignment(MalBlkPtr mb)
{
InstrPtr q = newInstruction(mb,NULL,NULL);
-
- if ( q == NULL)
- return NULL;
- if ((getArg(q,0)= newTmpVariable(mb,TYPE_any)) < 0 || mb->errors !=
MAL_SUCCEED) {
- freeInstruction(q);
- return NULL;
- }
+ assert(q);
+ if ((getArg(q,0)= newTmpVariable(mb,TYPE_any)) < 0)
+ addMalException(mb, createException(MAL, "newAssignment", "Can
not allocate variable"));
pushInstruction(mb, q);
return q;
}
@@ -41,17 +37,11 @@ newStmt(MalBlkPtr mb, const char *module
InstrPtr q;
str mName = putName(module), nName = putName(name);
- if(mName == NULL || nName == NULL) {
- return NULL;
- }
q = newInstruction(mb, mName, nName);
- if ( q == NULL)
- return NULL;
+ assert(q);
setDestVar(q, newTmpVariable(mb, TYPE_any));
- if (getDestVar(q) < 0 || mb->errors != MAL_SUCCEED) {
- freeInstruction(q);
- return NULL;
- }
+ if (getDestVar(q) < 0 )
+ addMalException(mb, createException(MAL, "newStmt", "Can not
allocate variable"));
pushInstruction(mb, q);
return q;
}
@@ -62,17 +52,12 @@ newStmtArgs(MalBlkPtr mb, const char *mo
InstrPtr q;
str mName = putName(module), nName = putName(name);
- if(mName == NULL || nName == NULL) {
- return NULL;
- }
q = newInstructionArgs(mb, mName, nName, args);
- if ( q == NULL)
- return NULL;
+ assert(q);
+
setDestVar(q, newTmpVariable(mb, TYPE_any));
- if (getDestVar(q) < 0 || mb->errors != MAL_SUCCEED) {
- freeInstruction(q);
- return NULL;
- }
+ if (getDestVar(q) < 0 || mb->errors != MAL_SUCCEED)
+ addMalException(mb, createException(MAL, "newStmtArgs", "Can
not allocate variable"));
pushInstruction(mb, q);
return q;
}
@@ -81,13 +66,9 @@ InstrPtr
newReturnStmt(MalBlkPtr mb)
{
InstrPtr q = newInstruction(mb, NULL, NULL);
-
- if ( q == NULL)
- return NULL;
- if ((getArg(q,0)= newTmpVariable(mb,TYPE_any)) < 0 || mb->errors !=
MAL_SUCCEED) {
- freeInstruction(q);
- return NULL;
- }
+ assert(q);
+ if ((getArg(q,0)= newTmpVariable(mb,TYPE_any)) < 0 )
+ addMalException(mb, createException(MAL, "newReturnStmt", "Can
not allocate return variable"));
q->barrier= RETURNsymbol;
pushInstruction(mb, q);
return q;
@@ -99,14 +80,8 @@ newFcnCall(MalBlkPtr mb, char *mod, char
InstrPtr q = newAssignment(mb);
str fcnName, modName;
- if ( q == NULL || mod == NULL || fcn == NULL)
- return NULL;
modName = putName(mod);
fcnName = putName(fcn);
- if(modName == NULL || fcnName == NULL) {
- freeInstruction(q);
- return NULL;
- }
setModuleId(q, modName);
setFunctionId(q, fcnName);
return q;
@@ -118,23 +93,17 @@ newComment(MalBlkPtr mb, const char *val
InstrPtr q = newInstruction(mb, NULL, NULL);
ValRecord cst;
- if (q == NULL)
- return NULL;
+ assert(q);
q->token = REMsymbol;
q->barrier = 0;
cst.vtype= TYPE_str;
- if ((cst.val.sval= GDKstrdup(val)) == NULL) {
- freeInstruction(q);
- return NULL;
- }
+ if ((cst.val.sval= GDKstrdup(val)) == NULL)
+ addMalException(mb, createException(MAL, "newComment", "Can not
allocate comment"));
+
cst.len = strlen(cst.val.sval);
getArg(q,0) = defConstant(mb,TYPE_str,&cst);
clrVarConstant(mb,getArg(q,0));
setVarDisabled(mb,getArg(q,0));
- if (mb->errors != MAL_SUCCEED) {
- freeInstruction(q);
- return NULL;
- }
pushInstruction(mb, q);
return q;
}
@@ -145,14 +114,11 @@ newCatchStmt(MalBlkPtr mb, str nme)
InstrPtr q = newAssignment(mb);
int i= findVariable(mb,nme);
- if ( q == NULL)
- return NULL;
+ assert(q);
q->barrier = CATCHsymbol;
if ( i< 0) {
- if ((getArg(q,0)= newVariable(mb, nme, strlen(nme),TYPE_str)) <
0 || mb->errors != MAL_SUCCEED) {
- freeInstruction(q);
- return NULL;
- }
+ if ((getArg(q,0)= newVariable(mb, nme, strlen(nme),TYPE_str)) <
0 )
+ addMalException(mb, createException(MAL,
"newCatchStmt", "Can not allocate variable"));
setVarUDFtype(mb,getArg(q,0));
} else getArg(q,0) = i;
return q;
@@ -164,14 +130,11 @@ newRaiseStmt(MalBlkPtr mb, str nme)
InstrPtr q = newAssignment(mb);
int i= findVariable(mb,nme);
- if ( q == NULL)
- return NULL;
+ assert(q);
q->barrier = RAISEsymbol;
if ( i< 0) {
- if ((getArg(q,0)= newVariable(mb, nme, strlen(nme),TYPE_str)) <
0 || mb->errors != MAL_SUCCEED) {
- freeInstruction(q);
- return NULL;
- }
+ if ((getArg(q,0)= newVariable(mb, nme, strlen(nme),TYPE_str)) <
0 || mb->errors != MAL_SUCCEED)
+ addMalException(mb, createException(MAL,
"newRaiseStmt", "Can not allocate variable"));
} else
getArg(q,0) = i;
return q;
@@ -183,14 +146,11 @@ newExitStmt(MalBlkPtr mb, str nme)
InstrPtr q = newAssignment(mb);
int i= findVariable(mb,nme);
- if ( q == NULL)
- return NULL;
+ assert(q);
q->barrier = EXITsymbol;
if ( i< 0) {
- if ((getArg(q,0)= newVariable(mb, nme,strlen(nme),TYPE_str)) <
0 || mb->errors != MAL_SUCCEED) {
- freeInstruction(q);
- return NULL;
- }
+ if ((getArg(q,0)= newVariable(mb, nme,strlen(nme),TYPE_str)) <
0 )
+ addMalException(mb, createException(MAL, "newExitStmt",
"Can not allocate variable"));
} else
getArg(q,0) = i;
return q;
@@ -199,11 +159,9 @@ newExitStmt(MalBlkPtr mb, str nme)
InstrPtr
pushEndInstruction(MalBlkPtr mb)
{
- InstrPtr q;
-
- q = newInstruction(mb,NULL, NULL);
- if ( q == NULL)
- return NULL;
+ InstrPtr q = newInstruction(mb,NULL, NULL);
+
+ assert(q);
q->token = ENDsymbol;
q->barrier = 0;
q->argc = 0;
@@ -264,8 +222,7 @@ pushBte(MalBlkPtr mb, InstrPtr q, bte va
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ assert(q);
cst.vtype= TYPE_bte;
cst.val.btval= val;
cst.len = 0;
@@ -294,8 +251,7 @@ pushOid(MalBlkPtr mb, InstrPtr q, oid va
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ assert(q);
cst.vtype= TYPE_oid;
cst.val.oval= val;
cst.len = 0;
@@ -309,8 +265,7 @@ pushVoid(MalBlkPtr mb, InstrPtr q)
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ assert(q);
cst.vtype= TYPE_void;
cst.val.oval= oid_nil;
cst.len = 0;
@@ -339,8 +294,7 @@ pushLng(MalBlkPtr mb, InstrPtr q, lng va
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ assert(q);
cst.vtype= TYPE_lng;
cst.val.lval= val;
cst.len = 0;
@@ -369,8 +323,7 @@ pushSht(MalBlkPtr mb, InstrPtr q, sht va
int _t;
ValRecord cst;
- if ( q == NULL)
- return NULL;
+ assert(q);
cst.vtype= TYPE_sht;
cst.val.shval= val;
cst.len = 0;
@@ -400,8 +353,7 @@ pushHge(MalBlkPtr mb, InstrPtr q, hge va
int _t;
ValRecord cst;
- if ( q == NULL)
- return NULL;
+ assert(q);
cst.vtype= TYPE_hge;
cst.val.hval= val;
cst.len = 0;
@@ -431,8 +383,7 @@ pushDbl(MalBlkPtr mb, InstrPtr q, dbl va
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ assert(q);
cst.vtype= TYPE_dbl;
cst.val.dval= val;
cst.len = 0;
@@ -461,8 +412,7 @@ pushFlt(MalBlkPtr mb, InstrPtr q, flt va
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ assert(q);
cst.vtype= TYPE_flt;
cst.val.fval= val;
cst.len = 0;
@@ -494,13 +444,10 @@ pushStr(MalBlkPtr mb, InstrPtr q, const
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ assert(q);
cst.vtype= TYPE_str;
- if ((cst.val.sval= GDKstrdup(Val)) == NULL) {
- freeInstruction(q);
- return NULL;
- }
+ if ((cst.val.sval= GDKstrdup(Val)) == NULL)
+ addMalException(mb, createException(MAL, "pushStr", "Can not
allocate string variable"));
cst.len = strlen(cst.val.sval);
_t = defConstant(mb,TYPE_str,&cst);
return pushArgument(mb, q, _t);
@@ -527,8 +474,7 @@ pushBit(MalBlkPtr mb, InstrPtr q, bit va
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ assert(q);
cst.vtype= TYPE_bit;
cst.val.btval= val;
cst.len = 0;
@@ -543,8 +489,7 @@ pushNil(MalBlkPtr mb, InstrPtr q, int tp
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list