update I/O Intr
This commit is contained in:
@ -31,6 +31,7 @@ typedef struct {
|
|||||||
|
|
||||||
PyObject *pyrecord;
|
PyObject *pyrecord;
|
||||||
PyObject *support;
|
PyObject *support;
|
||||||
|
PyObject *scanobj;
|
||||||
|
|
||||||
int allowscan;
|
int allowscan;
|
||||||
IOSCANPVT scan;
|
IOSCANPVT scan;
|
||||||
@ -70,6 +71,8 @@ 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 */
|
||||||
|
|
||||||
if(priv->support) {
|
if(priv->support) {
|
||||||
PyObject *junk = 0, *sup=priv->support;
|
PyObject *junk = 0, *sup=priv->support;
|
||||||
junk = PyObject_CallMethod(sup, "detach", "O", priv->pyrecord);
|
junk = PyObject_CallMethod(sup, "detach", "O", priv->pyrecord);
|
||||||
@ -112,11 +115,26 @@ static int allow_ioscan(pyDevice *priv)
|
|||||||
Py_XDECREF(ret);
|
Py_XDECREF(ret);
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
Py_DECREF(ret);
|
priv->scanobj = ret;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void release_ioscan(pyDevice *priv)
|
||||||
|
{
|
||||||
|
if(priv->scanobj && PyObject_HasAttrString(priv->scanobj, "release")) {
|
||||||
|
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 init_record(dbCommon *prec)
|
static long init_record(dbCommon *prec)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -235,15 +253,23 @@ static long del_record(dbCommon *prec)
|
|||||||
static long get_iointr_info(int dir, dbCommon *prec, IOSCANPVT *scan)
|
static long get_iointr_info(int dir, dbCommon *prec, IOSCANPVT *scan)
|
||||||
{
|
{
|
||||||
pyDevice *priv=prec->dpvt;
|
pyDevice *priv=prec->dpvt;
|
||||||
|
PyGILState_STATE pystate;
|
||||||
if(!priv || !priv->support)
|
if(!priv || !priv->support)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
pystate = PyGILState_Ensure();
|
||||||
|
|
||||||
if(dir==0) {
|
if(dir==0) {
|
||||||
if(!allow_ioscan(priv))
|
if(!allow_ioscan(priv))
|
||||||
return S_db_Blocked;
|
return S_db_Blocked;
|
||||||
priv->allowscan = 1;
|
priv->allowscan = 1;
|
||||||
} else
|
} else {
|
||||||
priv->allowscan = 0;
|
priv->allowscan = 0;
|
||||||
|
release_ioscan(priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
PyGILState_Release(pystate);
|
||||||
|
|
||||||
*scan = priv->scan;
|
*scan = priv->scan;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user