cleanup device support

This commit is contained in:
Michael Davidsaver
2013-03-30 16:08:14 -04:00
parent e994a5d87b
commit 864fbf531e
4 changed files with 38 additions and 3 deletions

View File

@ -281,6 +281,37 @@ int isPyRecord(dbCommon *prec)
return prec->dset==(dset*)&pydevsupCom || prec->dset==(dset*)&pydevsupCom2;
}
/* Called with GIL locked */
void pyDBD_cleanup(void)
{
ELLNODE *cur;
while((cur=ellGet(&devices))!=NULL) {
pyDevice *priv=(pyDevice*)cur;
/* disconnect record by clearing DPVT */
Py_BEGIN_ALLOW_THREADS {
dbScanLock(priv->precord);
assert(priv==priv->precord->dpvt);
priv->precord->dpvt = NULL;
dbScanUnlock(priv->precord);
} Py_END_ALLOW_THREADS
/* cleanup and dealloc */
if(priv->support)
Py_DECREF(priv->support);
if(priv->pyrecord)
Py_DECREF(priv->pyrecord);
if(priv->reason)
Py_DECREF(priv->reason);
priv->support = priv->pyrecord = priv->reason = NULL;
free(priv);
}
}
#include <epicsExport.h>
epicsExportAddress(dset, pydevsupCom);

View File

@ -300,7 +300,7 @@ void pyField_setup(PyObject *module)
PyModule_AddObject(module, "_Field", (PyObject*)&pyField_type);
}
void PyField_cleanup(void)
void pyField_cleanup(void)
{
size_t i;

View File

@ -1,9 +1,11 @@
#ifndef PYDEVSUP_H
#define PYDEVSUP_H
void pyDBD_cleanup(void);
int pyField_prepare(void);
void pyField_setup(PyObject *module);
void PyField_cleanup(void);
void pyField_cleanup(void);
int pyRecord_prepare(void);
void pyRecord_setup(PyObject *module);

View File

@ -75,7 +75,9 @@ static void cleanupPy(void *junk)
/* special "fake" hook for shutdown */
pyhook((initHookState)9999);
PyField_cleanup();
pyDBD_cleanup();
pyField_cleanup();
/* release extra reference for hooktable */
Py_DECREF(hooktable);