cleanup device support
This commit is contained in:
@ -281,6 +281,37 @@ int isPyRecord(dbCommon *prec)
|
|||||||
return prec->dset==(dset*)&pydevsupCom || prec->dset==(dset*)&pydevsupCom2;
|
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>
|
#include <epicsExport.h>
|
||||||
|
|
||||||
epicsExportAddress(dset, pydevsupCom);
|
epicsExportAddress(dset, pydevsupCom);
|
||||||
|
@ -300,7 +300,7 @@ void pyField_setup(PyObject *module)
|
|||||||
PyModule_AddObject(module, "_Field", (PyObject*)&pyField_type);
|
PyModule_AddObject(module, "_Field", (PyObject*)&pyField_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PyField_cleanup(void)
|
void pyField_cleanup(void)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
#ifndef PYDEVSUP_H
|
#ifndef PYDEVSUP_H
|
||||||
#define PYDEVSUP_H
|
#define PYDEVSUP_H
|
||||||
|
|
||||||
|
void pyDBD_cleanup(void);
|
||||||
|
|
||||||
int pyField_prepare(void);
|
int pyField_prepare(void);
|
||||||
void pyField_setup(PyObject *module);
|
void pyField_setup(PyObject *module);
|
||||||
void PyField_cleanup(void);
|
void pyField_cleanup(void);
|
||||||
|
|
||||||
int pyRecord_prepare(void);
|
int pyRecord_prepare(void);
|
||||||
void pyRecord_setup(PyObject *module);
|
void pyRecord_setup(PyObject *module);
|
||||||
|
@ -75,7 +75,9 @@ static void cleanupPy(void *junk)
|
|||||||
/* special "fake" hook for shutdown */
|
/* special "fake" hook for shutdown */
|
||||||
pyhook((initHookState)9999);
|
pyhook((initHookState)9999);
|
||||||
|
|
||||||
PyField_cleanup();
|
pyDBD_cleanup();
|
||||||
|
|
||||||
|
pyField_cleanup();
|
||||||
|
|
||||||
/* release extra reference for hooktable */
|
/* release extra reference for hooktable */
|
||||||
Py_DECREF(hooktable);
|
Py_DECREF(hooktable);
|
||||||
|
Reference in New Issue
Block a user