update I/O Intr

This commit is contained in:
Michael Davidsaver
2013-03-31 12:36:55 -04:00
parent 0049d2c59f
commit 5a465176c6

View File

@ -31,6 +31,7 @@ typedef struct {
PyObject *pyrecord;
PyObject *support;
PyObject *scanobj;
int allowscan;
IOSCANPVT scan;
@ -70,6 +71,8 @@ static long detach_common(dbCommon *prec)
pyDevice *priv = prec->dpvt;
long ret = 0;
assert(!priv->scanobj); /* should already be released */
if(priv->support) {
PyObject *junk = 0, *sup=priv->support;
junk = PyObject_CallMethod(sup, "detach", "O", priv->pyrecord);
@ -112,11 +115,26 @@ static int allow_ioscan(pyDevice *priv)
Py_XDECREF(ret);
return 0;
} else {
Py_DECREF(ret);
priv->scanobj = ret;
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)
{
return 0;
@ -235,15 +253,23 @@ static long del_record(dbCommon *prec)
static long get_iointr_info(int dir, dbCommon *prec, IOSCANPVT *scan)
{
pyDevice *priv=prec->dpvt;
PyGILState_STATE pystate;
if(!priv || !priv->support)
return 0;
pystate = PyGILState_Ensure();
if(dir==0) {
if(!allow_ioscan(priv))
return S_db_Blocked;
priv->allowscan = 1;
} else
} else {
priv->allowscan = 0;
release_ioscan(priv);
}
PyGILState_Release(pystate);
*scan = priv->scan;
return 0;
}