dev: Replaced callocMustSucceed() with calloc()

Make the *iSoftCallback devices allocate a single buffer for private
storage instead of several, and cope with calloc failures without
suspending the IOC thread.
This commit is contained in:
Andrew Johnson
2010-12-01 15:14:09 -06:00
parent 26f6eabdf5
commit 51578959d4
6 changed files with 102 additions and 109 deletions
+17 -19
View File
@@ -34,8 +34,9 @@
#define GET_OPTIONS (DBR_STATUS | DBR_TIME)
typedef struct devPvt {
processNotify *ppn;
CALLBACK *pcallback;
DBADDR dbaddr;
processNotify pn;
CALLBACK callback;
long options;
int status;
struct {
@@ -67,10 +68,9 @@ static void doneCallback(processNotify *ppn)
stringinRecord *prec = (stringinRecord *)ppn->usrPvt;
devPvt *pdevPvt = (devPvt *)prec->dpvt;
callbackRequestProcessCallback(pdevPvt->pcallback, prec->prio, prec);
callbackRequestProcessCallback(&pdevPvt->callback, prec->prio, prec);
}
static long add_record(dbCommon *pcommon)
{
stringinRecord *prec = (stringinRecord *)pcommon;
@@ -88,11 +88,19 @@ static long add_record(dbCommon *pcommon)
return S_db_badField;
}
pdbaddr = callocMustSucceed(1, sizeof(*pdbaddr),
"devSiSoftCallback::add_record");
pdevPvt = calloc(1, sizeof(*pdevPvt));
if (!pdevPvt) {
status = S_db_noMemory;
recGblRecordError(status, (void *)prec,
"devSiSoftCallback (add_record) out of memory, calloc() failed");
return status;
}
pdbaddr = &pdevPvt->dbaddr;
ppn = &pdevPvt->pn;
status = dbNameToAddr(plink->value.pv_link.pvname, pdbaddr);
if (status) {
free(pdbaddr);
free(pdevPvt);
recGblRecordError(status, (void *)prec,
"devSiSoftCallback (add_record) linked record not found");
return status;
@@ -103,19 +111,12 @@ static long add_record(dbCommon *pcommon)
plink->value.pv_link.pvt = pdbaddr;
plink->value.pv_link.pvlMask &= pvlOptMsMode; /* Severity flags only */
ppn = callocMustSucceed(1, sizeof(*ppn),
"devSiSoftCallback::add_record");
ppn->usrPvt = prec;
ppn->paddr = pdbaddr;
ppn->getCallback = getCallback;
ppn->doneCallback = doneCallback;
ppn->requestType = processGetRequest;
pdevPvt = callocMustSucceed(1, sizeof(*pdevPvt),
"devSiSoftCallback::add_record");
pdevPvt->pcallback = callocMustSucceed(1, sizeof(CALLBACK),
"devSiSoftCallback::add_record");
pdevPvt->ppn = ppn;
pdevPvt->options = GET_OPTIONS;
prec->dpvt = pdevPvt;
@@ -130,11 +131,8 @@ static long del_record(dbCommon *pcommon) {
if (plink->type == CONSTANT) return 0;
assert(plink->type == PN_LINK);
dbNotifyCancel(pdevPvt->ppn);
free(pdevPvt->ppn);
free(pdevPvt->pcallback);
dbNotifyCancel(&pdevPvt->pn);
free(pdevPvt);
free(plink->value.pv_link.pvt);
plink->type = PV_LINK;
plink->value.pv_link.pvt = NULL;
@@ -179,7 +177,7 @@ static long read_si(stringinRecord *prec)
return 0;
if (!prec->pact) {
dbProcessNotify(pdevPvt->ppn);
dbProcessNotify(&pdevPvt->pn);
prec->pact = TRUE;
return 0;
}