dset working

This commit is contained in:
Michael Davidsaver
2013-03-30 13:00:09 -04:00
parent 22b05a22a9
commit e3317d6f51

View File

@ -54,17 +54,23 @@ static long parse_link(dbCommon *prec, const char* src)
static long detach_common(dbCommon *prec) static long detach_common(dbCommon *prec)
{ {
pyDevice *priv = prec->dpvt; pyDevice *priv = prec->dpvt;
PyObject *ret; long ret = 0;
ret = PyObject_CallMethod(priv->support, "detach", "O", priv->pyrecord); if(priv->support) {
PyObject *sup = 0;
sup = PyObject_CallMethod(priv->support, "detach", "O", priv->pyrecord);
Py_DECREF(priv->support); Py_DECREF(priv->support);
Py_DECREF(priv->pyrecord);
priv->support = NULL; priv->support = NULL;
if(sup)
Py_DECREF(sup);
else
ret = -1;
}
if(priv->pyrecord)
Py_DECREF(priv->pyrecord);
priv->pyrecord = NULL; priv->pyrecord = NULL;
if(!ret)
return -1; return ret;
Py_DECREF(ret);
return 0;
} }
static long process_common(dbCommon *prec, int cause) static long process_common(dbCommon *prec, int cause)
@ -81,11 +87,24 @@ static long process_common(dbCommon *prec, int cause)
static long init_record(dbCommon *prec) static long init_record(dbCommon *prec)
{ {
pyDevice *priv; return 0;
DBENTRY ent; }
static long init_record2(dbCommon *prec)
{
return 2;
}
static long add_record(dbCommon *prec)
{
pyDevice *priv = prec->dpvt;
PyGILState_STATE pystate;
long ret; long ret;
priv = callocMustSucceed(1, sizeof(*priv), "init_record"); fprintf(stderr, "%s: init_record\n", prec->name);
if(!priv) {
DBENTRY ent;
dbInitEntry(pdbbase, &ent); dbInitEntry(pdbbase, &ent);
@ -101,7 +120,6 @@ static long init_record(dbCommon *prec)
if(ret) { if(ret) {
fprintf(stderr, "%s: Unable to find INP/OUT\n", prec->name); fprintf(stderr, "%s: Unable to find INP/OUT\n", prec->name);
recGblSetSevr(prec, BAD_SUB_ALARM, INVALID_ALARM); recGblSetSevr(prec, BAD_SUB_ALARM, INVALID_ALARM);
free(priv);
return 0; return 0;
} }
@ -110,41 +128,36 @@ static long init_record(dbCommon *prec)
{ {
fprintf(stderr, "%s: INP/OUT has unacceptible type %d\n", fprintf(stderr, "%s: INP/OUT has unacceptible type %d\n",
prec->name, ent.pflddes->field_type); prec->name, ent.pflddes->field_type);
goto fail; recGblSetSevr(prec, BAD_SUB_ALARM, INVALID_ALARM);
return 0;
} }
priv = callocMustSucceed(1, sizeof(*priv), "init_record");
priv->precord = prec;
priv->plink = ent.pfield; priv->plink = ent.pfield;
if(priv->plink->type != INST_IO) { if(priv->plink->type != INST_IO) {
fprintf(stderr, "%s: Has invalid link type %d\n", prec->name, priv->plink->type); fprintf(stderr, "%s: Has invalid link type %d\n", prec->name, priv->plink->type);
goto fail; recGblSetSevr(prec, BAD_SUB_ALARM, INVALID_ALARM);
}
dbFreeEntry(&ent);
prec->dpvt = priv;
return 0;
fail:
dbFreeEntry(&ent);
free(priv); free(priv);
return 0; return 0;
} }
static long init_record2(dbCommon *prec) dbFinishEntry(&ent);
{ prec->dpvt = priv;
long ret = init_record(prec); }
if(ret==0)
ret = 2;
return ret;
}
static long add_record(dbCommon *prec) assert(priv);
{ assert(priv->plink->type == INST_IO);
pyDevice *priv = prec->dpvt;
PyGILState_STATE pystate;
long ret;
if(!priv) {
char *msg=priv->plink->value.instio.string;
if(!msg || *msg=='\0') {
fprintf(stderr, "%s: Empty link string\n", prec->name);
recGblSetSevr(prec, BAD_SUB_ALARM, INVALID_ALARM);
return 0; return 0;
}
}
pystate = PyGILState_Ensure(); pystate = PyGILState_Ensure();
@ -164,16 +177,18 @@ done:
static long del_record(dbCommon *prec) static long del_record(dbCommon *prec)
{ {
pyDevice *priv = prec->dpvt; pyDevice *priv=prec->dpvt;
PyGILState_STATE pystate; PyGILState_STATE pystate;
fprintf(stderr, "%s: del_record. priv=%p\n", prec->name, priv);
if(!priv) if(!priv)
return 0; return 0;
pystate = PyGILState_Ensure(); pystate = PyGILState_Ensure();
if(detach_common(prec)) { if(detach_common(prec)) {
fprintf(stderr, "%s: Exception in del_record", prec->name); fprintf(stderr, "%s: Exception in del_record\n", prec->name);
PyErr_Print(); PyErr_Print();
PyErr_Clear(); PyErr_Clear();
} }
@ -194,13 +209,11 @@ static long process_record(dbCommon *prec)
pystate = PyGILState_Ensure(); pystate = PyGILState_Ensure();
if(process_common(prec, 0)) { if(process_common(prec, 0)) {
fprintf(stderr, "%s: Exception in process_record", prec->name); fprintf(stderr, "%s: Exception in process_record\n", prec->name);
PyErr_Print(); PyErr_Print();
PyErr_Clear(); PyErr_Clear();
} }
assert(!priv->support);
PyGILState_Release(pystate); PyGILState_Release(pystate);
return 0; return 0;
} }