during IOC shutdown del_record called w/o scanDelete

During IOC shutdown device support is disconnected
while SCAN=I/O Intr
This commit is contained in:
Michael Davidsaver
2013-03-31 16:38:50 -04:00
parent 977e857802
commit 8b1b880a8a

View File

@ -66,12 +66,42 @@ static long parse_link(dbCommon *prec, const char* src)
return 0;
}
static int allow_ioscan(pyDevice *priv)
{
PyObject *ret = PyObject_CallMethod(priv->support, "allowScan", "O", priv->pyrecord);
if(!ret) {
PyErr_Print();
PyErr_Clear();
} else if(!PyObject_IsTrue(ret)) {
Py_DECREF(ret);
} else {
priv->scanobj = ret;
return 1;
}
return 0;
}
static void release_ioscan(pyDevice *priv)
{
if(priv->scanobj && PyCallable_Check(priv->scanobj)) {
PyObject *ret = PyObject_CallFunction(priv->scanobj, "O", priv->pyrecord);
if(ret)
Py_DECREF(ret);
else {
PyErr_Print();
PyErr_Clear();
}
}
Py_XDECREF(priv->scanobj);
priv->scanobj = NULL;
}
static long detach_common(dbCommon *prec)
{
pyDevice *priv = prec->dpvt;
long ret = 0;
assert(!priv->scanobj); /* should already be released */
release_ioscan(priv);
if(priv->support) {
PyObject *junk = 0, *sup=priv->support;
@ -106,35 +136,6 @@ static long process_common(dbCommon *prec)
return 0;
}
static int allow_ioscan(pyDevice *priv)
{
PyObject *ret = PyObject_CallMethod(priv->support, "allowScan", "O", priv->pyrecord);
if(!ret || !PyObject_IsTrue(ret)) {
PyErr_Print();
PyErr_Clear();
Py_XDECREF(ret);
return 0;
} else {
priv->scanobj = ret;
return 1;
}
}
static void release_ioscan(pyDevice *priv)
{
if(priv->scanobj && PyCallable_Check(priv->scanobj)) {
PyObject *ret = PyObject_CallFunction(priv->scanobj, "O", priv->pyrecord);
if(ret)
Py_DECREF(ret);
else {
PyErr_Print();
PyErr_Clear();
}
}
Py_XDECREF(priv->scanobj);
priv->scanobj = NULL;
}
static long report(int lvl)
{
PyGILState_STATE pystate;
@ -292,9 +293,10 @@ static long get_iointr_info(int dir, dbCommon *prec, IOSCANPVT *scan)
pystate = PyGILState_Ensure();
if(dir==0) {
if(!allow_ioscan(priv))
priv->allowscan = allow_ioscan(priv);
fprintf(stderr, "%s: allowscan %d\n", prec->name, priv->allowscan);
if(!priv->allowscan)
return S_db_Blocked;
priv->allowscan = 1;
} else {
priv->allowscan = 0;
release_ioscan(priv);
@ -384,7 +386,7 @@ int isPyRecord(dbCommon *prec)
int canIOScanRecord(dbCommon *prec)
{
pyDevice *priv=prec->dpvt;
if(isPyRecord(prec))
if(!isPyRecord(prec))
return 0;
return priv->allowscan;
}