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:
@ -66,12 +66,42 @@ static long parse_link(dbCommon *prec, const char* src)
|
|||||||
return 0;
|
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)
|
static long detach_common(dbCommon *prec)
|
||||||
{
|
{
|
||||||
pyDevice *priv = prec->dpvt;
|
pyDevice *priv = prec->dpvt;
|
||||||
long ret = 0;
|
long ret = 0;
|
||||||
|
|
||||||
assert(!priv->scanobj); /* should already be released */
|
release_ioscan(priv);
|
||||||
|
|
||||||
if(priv->support) {
|
if(priv->support) {
|
||||||
PyObject *junk = 0, *sup=priv->support;
|
PyObject *junk = 0, *sup=priv->support;
|
||||||
@ -106,35 +136,6 @@ static long process_common(dbCommon *prec)
|
|||||||
return 0;
|
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)
|
static long report(int lvl)
|
||||||
{
|
{
|
||||||
PyGILState_STATE pystate;
|
PyGILState_STATE pystate;
|
||||||
@ -292,9 +293,10 @@ static long get_iointr_info(int dir, dbCommon *prec, IOSCANPVT *scan)
|
|||||||
pystate = PyGILState_Ensure();
|
pystate = PyGILState_Ensure();
|
||||||
|
|
||||||
if(dir==0) {
|
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;
|
return S_db_Blocked;
|
||||||
priv->allowscan = 1;
|
|
||||||
} else {
|
} else {
|
||||||
priv->allowscan = 0;
|
priv->allowscan = 0;
|
||||||
release_ioscan(priv);
|
release_ioscan(priv);
|
||||||
@ -384,7 +386,7 @@ int isPyRecord(dbCommon *prec)
|
|||||||
int canIOScanRecord(dbCommon *prec)
|
int canIOScanRecord(dbCommon *prec)
|
||||||
{
|
{
|
||||||
pyDevice *priv=prec->dpvt;
|
pyDevice *priv=prec->dpvt;
|
||||||
if(isPyRecord(prec))
|
if(!isPyRecord(prec))
|
||||||
return 0;
|
return 0;
|
||||||
return priv->allowscan;
|
return priv->allowscan;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user