When Cider models are present, a normal batch mode sp_shutdown (for example, ngspice -b cmosinv.cir) will call com_quit(NULL). This cleans up so that valgrind will find no leaks in Cider devices after sp_shutdown. To disable this feature, set the environment variable CIDER_COM_QUIT="OFF". Even though it really does not matter that Cider memory is cleared just before exit, it makes it cleaner for valgrind checks.

This commit is contained in:
Brian Taylor 2023-07-03 15:22:38 -07:00 committed by Holger Vogt
parent ba2842b55a
commit 51b361bbf0
7 changed files with 43 additions and 2 deletions

View File

@ -30,7 +30,7 @@ D1 1 2 M_PN AREA=100
.op
.ac dec 10 100kHz 10gHz
.print ac i(Vpp)
.dc Vpp -3.0v 2.0001v 50mv
.print dc i(Vpp)
* .dc Vpp -3.0v 2.0001v 50mv
* .print dc i(Vpp)
.END

View File

@ -85,4 +85,8 @@ ONEdestroy(ONEdevice *pDevice)
/* NOT IMPLEMENTED */
FREE(pDevice);
{
extern void CiderLoaded(int);
CiderLoaded(-1);
}
}

View File

@ -194,6 +194,11 @@ ONEbuildMesh(ONEdevice *pDevice, ONEcoord *pCoord, ONEdomain *pDomain,
pDevice->dimBias = numEqn;
FREE(nodeArray);
{
extern void CiderLoaded(int);
CiderLoaded(1);
}
/*
* ONEprnMesh( pDevice );
*/

View File

@ -155,3 +155,14 @@ void GLOBprnGlobals(FILE *file, GLOBvalues *values)
return;
}
static int cider_is_loaded = 0;
void CiderLoaded(int val)
{
cider_is_loaded += val;
}
int IsCiderLoaded(void)
{
return cider_is_loaded;
}

View File

@ -107,4 +107,8 @@ TWOdestroy(TWOdevice *pDevice)
/* NOT IMPLEMENTED */
FREE( pDevice );
{
extern void CiderLoaded(int);
CiderLoaded(-1);
}
}

View File

@ -458,6 +458,10 @@ TWObuildMesh(TWOdevice *pDevice, TWOdomain *pDomain,
FREE(edgeArrayV);
FREE(edgeArrayH);
{
extern void CiderLoaded(int);
CiderLoaded(1);
}
/*
* TWOprnMesh( pDevice );
*/

View File

@ -533,6 +533,19 @@ SIMinit(IFfrontEnd *frontEnd, IFsimulator **simulator)
static ATTRIBUTE_NORETURN void
sp_shutdown(int exitval)
{
#ifdef CIDER
{
extern int IsCiderLoaded(void);
char *cider_quit = getenv("CIDER_COM_QUIT");
bool cider_com_quit = TRUE;
if (cider_quit && eq(cider_quit, "OFF")) {
cider_com_quit = FALSE;
}
if (cider_com_quit && IsCiderLoaded() > 0) {
com_quit(NULL);
}
}
#endif
destroy_ivars();
#ifdef HAS_WINGUI
if (exitval == EXIT_BAD)