From 4986c184c7e172aefb82f481944941c7172eb781 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Thu, 28 Jun 2012 13:44:33 -0400 Subject: [PATCH] cleanup for dbRegisterFilter() --- src/ioc/db/chfPlugin.c | 9 +++++++++ src/ioc/db/dbChannel.h | 4 ++++ src/ioc/dbStatic/dbStaticLib.c | 12 ++++++++++++ 3 files changed, 25 insertions(+) diff --git a/src/ioc/db/chfPlugin.c b/src/ioc/db/chfPlugin.c index c4e5c150f..23bfdc6f9 100644 --- a/src/ioc/db/chfPlugin.c +++ b/src/ioc/db/chfPlugin.c @@ -523,11 +523,20 @@ static void channel_close(chFilter *filter) free(f); /* FIXME: Use a free-list */ } +static void plugin_free(void* puser) +{ + chfPlugin *p=puser; + free(p->required); + free(p); +} + /* * chFilterIf for the wrapper * we just support a simple one-level map, and no arrays */ static chFilterIf wrapper_fif = { + plugin_free, + parse_start, parse_abort, parse_end, diff --git a/src/ioc/db/dbChannel.h b/src/ioc/db/dbChannel.h index 2e50185aa..f646cac9d 100644 --- a/src/ioc/db/dbChannel.h +++ b/src/ioc/db/dbChannel.h @@ -72,6 +72,10 @@ typedef enum { /* These routines must be implemented by each filter plug-in */ typedef struct chFilterIf { + /* cleanup pointer passed to dbRegisterFilter(). + * Called during DB shutdown + */ + void (* priv_free)(void *puser); /* Parsing event handlers: */ parse_result (* parse_start)(chFilter *filter); /* If parse_start() returns parse_continue for a filter, one of diff --git a/src/ioc/dbStatic/dbStaticLib.c b/src/ioc/dbStatic/dbStaticLib.c index 2ef3c0585..f845c73e2 100644 --- a/src/ioc/dbStatic/dbStaticLib.c +++ b/src/ioc/dbStatic/dbStaticLib.c @@ -31,6 +31,7 @@ #include "epicsStdlib.h" #include "epicsString.h" #include "epicsStdio.h" +#include "dbChannel.h" #define epicsExportSharedSymbols #include "link.h" @@ -592,6 +593,8 @@ void epicsShareAPI dbFreeBase(dbBase *pdbbase) drvSup *pdrvSupNext; brkTable *pbrkTable; brkTable *pbrkTableNext; + chFilterPlugin *pfilt; + chFilterPlugin *pfiltNext; int i; DBENTRY dbentry; @@ -723,6 +726,15 @@ void epicsShareAPI dbFreeBase(dbBase *pdbbase) free((void *)pbrkTable); pbrkTable = pbrkTableNext; } + pfilt = (chFilterPlugin *)ellFirst(&pdbbase->filterList); + while(pfilt) { + pfiltNext = (chFilterPlugin *)ellNext(&pfilt->node); + free((char*)pfilt->name); + if(pfilt->fif->priv_free) + (*pfilt->fif->priv_free)(pfilt->puser); + free(pfilt); + pfilt = pfiltNext; + } gphFreeMem(pdbbase->pgpHash); dbPvdFreeMem(pdbbase); dbFreePath(pdbbase);