Spice simulator: reload ngSpice dll on error
ngSpice frequently ends up a simulation with an error: "Error: ngspice.dll cannot recover and awaits to be detached" The only way forward is to reload the shared library and reinitialize ngSpice. Fixes: lp:1753101 * https://bugs.launchpad.net/kicad/+bug/1753101
This commit is contained in:
parent
61e42ba392
commit
bad462a228
|
@ -50,12 +50,6 @@ NGSPICE::~NGSPICE()
|
|||
|
||||
void NGSPICE::Init()
|
||||
{
|
||||
if( m_error )
|
||||
{
|
||||
delete m_dll;
|
||||
init_dll();
|
||||
}
|
||||
|
||||
Command( "reset" );
|
||||
}
|
||||
|
||||
|
@ -247,6 +241,7 @@ bool NGSPICE::IsRunning()
|
|||
bool NGSPICE::Command( const string& aCmd )
|
||||
{
|
||||
LOCALE_IO c_locale; // ngspice works correctly only with C locale
|
||||
validate();
|
||||
m_ngSpice_Command( (char*) aCmd.c_str() );
|
||||
return true;
|
||||
}
|
||||
|
@ -454,13 +449,24 @@ int NGSPICE::cbBGThreadRunning( bool is_running, int id, void* user )
|
|||
int NGSPICE::cbControlledExit( int status, bool immediate, bool exit_upon_quit, int id, void* user )
|
||||
{
|
||||
// Something went wrong, reload the dll
|
||||
//NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
|
||||
//sim->m_initialized = false;
|
||||
//printf("stat %d immed %d quit %d\n", status, !!immediate, !!exit_upon_quit);
|
||||
NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
|
||||
sim->m_error = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void NGSPICE::validate()
|
||||
{
|
||||
if( m_error )
|
||||
{
|
||||
delete m_dll;
|
||||
m_initialized = false;
|
||||
init_dll();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const std::string NGSPICE::GetNetlist() const
|
||||
{
|
||||
return m_netlist;
|
||||
|
|
|
@ -119,9 +119,10 @@ private:
|
|||
static int cbBGThreadRunning( bool is_running, int id, void* user );
|
||||
static int cbControlledExit( int status, bool immediate, bool exit_upon_quit, int id, void* user );
|
||||
|
||||
void dump();
|
||||
// Assures ngspice is in a valid state and reinitializes it if need be
|
||||
void validate();
|
||||
|
||||
///> Error flag, meaning ngspice needs to be reloaded
|
||||
///> Error flag indicating that ngspice needs to be reloaded
|
||||
bool m_error;
|
||||
|
||||
///> NGspice should be initialized only once
|
||||
|
|
Loading…
Reference in New Issue