Remove m_props from symbol library plugins. It's not thread-safe.
Fixes https://gitlab.com/kicad/code/kicad/issues/8035
This commit is contained in:
parent
3d6c05b210
commit
a0a5e93782
|
@ -379,7 +379,6 @@ void SCH_SEXPR_PLUGIN::init( SCHEMATIC* aSchematic, const PROPERTIES* aPropertie
|
|||
{
|
||||
m_version = 0;
|
||||
m_rootSheet = nullptr;
|
||||
m_props = aProperties;
|
||||
m_schematic = aSchematic;
|
||||
m_cache = nullptr;
|
||||
m_out = nullptr;
|
||||
|
@ -2070,7 +2069,7 @@ void SCH_SEXPR_PLUGIN_CACHE::DeleteSymbol( const wxString& aSymbolName )
|
|||
}
|
||||
|
||||
|
||||
void SCH_SEXPR_PLUGIN::cacheLib( const wxString& aLibraryFileName )
|
||||
void SCH_SEXPR_PLUGIN::cacheLib( const wxString& aLibraryFileName, const PROPERTIES* aProperties )
|
||||
{
|
||||
if( !m_cache || !m_cache->IsFile( aLibraryFileName ) || m_cache->IsFileChanged() )
|
||||
{
|
||||
|
@ -2083,7 +2082,7 @@ void SCH_SEXPR_PLUGIN::cacheLib( const wxString& aLibraryFileName )
|
|||
// must be updated.
|
||||
PART_LIBS::s_modify_generation++;
|
||||
|
||||
if( !isBuffering( m_props ) )
|
||||
if( !isBuffering( aProperties ) )
|
||||
m_cache->Load();
|
||||
}
|
||||
}
|
||||
|
@ -2111,11 +2110,10 @@ void SCH_SEXPR_PLUGIN::EnumerateSymbolLib( wxArrayString& aSymbolNameList,
|
|||
{
|
||||
LOCALE_IO toggle; // toggles on, then off, the C locale.
|
||||
|
||||
m_props = aProperties;
|
||||
|
||||
bool powerSymbolsOnly = ( aProperties &&
|
||||
aProperties->find( SYMBOL_LIB_TABLE::PropPowerSymsOnly ) != aProperties->end() );
|
||||
cacheLib( aLibraryPath );
|
||||
|
||||
cacheLib( aLibraryPath, aProperties );
|
||||
|
||||
const LIB_PART_MAP& symbols = m_cache->m_symbols;
|
||||
|
||||
|
@ -2133,11 +2131,10 @@ void SCH_SEXPR_PLUGIN::EnumerateSymbolLib( std::vector<LIB_PART*>& aSymbolList,
|
|||
{
|
||||
LOCALE_IO toggle; // toggles on, then off, the C locale.
|
||||
|
||||
m_props = aProperties;
|
||||
|
||||
bool powerSymbolsOnly = ( aProperties &&
|
||||
aProperties->find( SYMBOL_LIB_TABLE::PropPowerSymsOnly ) != aProperties->end() );
|
||||
cacheLib( aLibraryPath );
|
||||
|
||||
cacheLib( aLibraryPath, aProperties );
|
||||
|
||||
const LIB_PART_MAP& symbols = m_cache->m_symbols;
|
||||
|
||||
|
@ -2154,9 +2151,7 @@ LIB_PART* SCH_SEXPR_PLUGIN::LoadSymbol( const wxString& aLibraryPath, const wxSt
|
|||
{
|
||||
LOCALE_IO toggle; // toggles on, then off, the C locale.
|
||||
|
||||
m_props = aProperties;
|
||||
|
||||
cacheLib( aLibraryPath );
|
||||
cacheLib( aLibraryPath, aProperties );
|
||||
|
||||
LIB_PART_MAP::const_iterator it = m_cache->m_symbols.find( aSymbolName );
|
||||
|
||||
|
@ -2171,9 +2166,8 @@ void SCH_SEXPR_PLUGIN::SaveSymbol( const wxString& aLibraryPath, const LIB_PART*
|
|||
const PROPERTIES* aProperties )
|
||||
{
|
||||
LOCALE_IO toggle; // toggles on, then off, the C locale.
|
||||
m_props = aProperties;
|
||||
|
||||
cacheLib( aLibraryPath );
|
||||
cacheLib( aLibraryPath, aProperties );
|
||||
|
||||
m_cache->AddSymbol( aSymbol );
|
||||
|
||||
|
@ -2186,9 +2180,8 @@ void SCH_SEXPR_PLUGIN::DeleteSymbol( const wxString& aLibraryPath, const wxStrin
|
|||
const PROPERTIES* aProperties )
|
||||
{
|
||||
LOCALE_IO toggle; // toggles on, then off, the C locale.
|
||||
m_props = aProperties;
|
||||
|
||||
cacheLib( aLibraryPath );
|
||||
cacheLib( aLibraryPath, aProperties );
|
||||
|
||||
m_cache->DeleteSymbol( aSymbolName );
|
||||
|
||||
|
@ -2209,8 +2202,6 @@ void SCH_SEXPR_PLUGIN::CreateSymbolLib( const wxString& aLibraryPath,
|
|||
|
||||
LOCALE_IO toggle;
|
||||
|
||||
m_props = aProperties;
|
||||
|
||||
delete m_cache;
|
||||
m_cache = new SCH_SEXPR_PLUGIN_CACHE( aLibraryPath );
|
||||
m_cache->SetModified();
|
||||
|
|
|
@ -142,7 +142,7 @@ private:
|
|||
void saveText( SCH_TEXT* aText, int aNestLevel );
|
||||
void saveBusAlias( std::shared_ptr<BUS_ALIAS> aAlias, int aNestLevel );
|
||||
|
||||
void cacheLib( const wxString& aLibraryFileName );
|
||||
void cacheLib( const wxString& aLibraryFileName, const PROPERTIES* aProperties );
|
||||
bool isBuffering( const PROPERTIES* aProperties );
|
||||
|
||||
protected:
|
||||
|
@ -153,7 +153,6 @@ protected:
|
|||
|
||||
wxString m_path; ///< Root project path for loading child sheets.
|
||||
std::stack<wxString> m_currentPath;///< Stack to maintain nested sheet paths
|
||||
const PROPERTIES* m_props; ///< Passed via Save() or Load(), no ownership, may be nullptr.
|
||||
SCH_SHEET* m_rootSheet; ///< The root sheet of the schematic being loaded..
|
||||
SCHEMATIC* m_schematic; ///< Passed to Load(), the schematic object being loaded
|
||||
OUTPUTFORMATTER* m_out; ///< The output formatter for saving SCH_SCREEN objects.
|
||||
|
|
|
@ -581,7 +581,6 @@ void SCH_LEGACY_PLUGIN::init( SCHEMATIC* aSchematic, const PROPERTIES* aProperti
|
|||
{
|
||||
m_version = 0;
|
||||
m_rootSheet = nullptr;
|
||||
m_props = aProperties;
|
||||
m_schematic = aSchematic;
|
||||
m_cache = nullptr;
|
||||
m_out = nullptr;
|
||||
|
@ -4204,7 +4203,7 @@ void SCH_LEGACY_PLUGIN_CACHE::DeleteSymbol( const wxString& aSymbolName )
|
|||
}
|
||||
|
||||
|
||||
void SCH_LEGACY_PLUGIN::cacheLib( const wxString& aLibraryFileName )
|
||||
void SCH_LEGACY_PLUGIN::cacheLib( const wxString& aLibraryFileName, const PROPERTIES* aProperties )
|
||||
{
|
||||
if( !m_cache || !m_cache->IsFile( aLibraryFileName ) || m_cache->IsFileChanged() )
|
||||
{
|
||||
|
@ -4217,7 +4216,7 @@ void SCH_LEGACY_PLUGIN::cacheLib( const wxString& aLibraryFileName )
|
|||
// must be updated.
|
||||
PART_LIBS::s_modify_generation++;
|
||||
|
||||
if( !isBuffering( m_props ) )
|
||||
if( !isBuffering( aProperties ) )
|
||||
m_cache->Load();
|
||||
}
|
||||
}
|
||||
|
@ -4256,11 +4255,10 @@ void SCH_LEGACY_PLUGIN::EnumerateSymbolLib( wxArrayString& aSymbolNameList,
|
|||
{
|
||||
LOCALE_IO toggle; // toggles on, then off, the C locale.
|
||||
|
||||
m_props = aProperties;
|
||||
|
||||
bool powerSymbolsOnly = ( aProperties &&
|
||||
aProperties->find( SYMBOL_LIB_TABLE::PropPowerSymsOnly ) != aProperties->end() );
|
||||
cacheLib( aLibraryPath );
|
||||
|
||||
cacheLib( aLibraryPath, aProperties );
|
||||
|
||||
const LIB_PART_MAP& symbols = m_cache->m_symbols;
|
||||
|
||||
|
@ -4278,11 +4276,10 @@ void SCH_LEGACY_PLUGIN::EnumerateSymbolLib( std::vector<LIB_PART*>& aSymbolList,
|
|||
{
|
||||
LOCALE_IO toggle; // toggles on, then off, the C locale.
|
||||
|
||||
m_props = aProperties;
|
||||
|
||||
bool powerSymbolsOnly = ( aProperties &&
|
||||
aProperties->find( SYMBOL_LIB_TABLE::PropPowerSymsOnly ) != aProperties->end() );
|
||||
cacheLib( aLibraryPath );
|
||||
|
||||
cacheLib( aLibraryPath, aProperties );
|
||||
|
||||
const LIB_PART_MAP& symbols = m_cache->m_symbols;
|
||||
|
||||
|
@ -4299,9 +4296,7 @@ LIB_PART* SCH_LEGACY_PLUGIN::LoadSymbol( const wxString& aLibraryPath, const wxS
|
|||
{
|
||||
LOCALE_IO toggle; // toggles on, then off, the C locale.
|
||||
|
||||
m_props = aProperties;
|
||||
|
||||
cacheLib( aLibraryPath );
|
||||
cacheLib( aLibraryPath, aProperties );
|
||||
|
||||
LIB_PART_MAP::const_iterator it = m_cache->m_symbols.find( aSymbolName );
|
||||
|
||||
|
@ -4316,9 +4311,8 @@ void SCH_LEGACY_PLUGIN::SaveSymbol( const wxString& aLibraryPath, const LIB_PART
|
|||
const PROPERTIES* aProperties )
|
||||
{
|
||||
LOCALE_IO toggle; // toggles on, then off, the C locale.
|
||||
m_props = aProperties;
|
||||
|
||||
cacheLib( aLibraryPath );
|
||||
cacheLib( aLibraryPath, aProperties );
|
||||
|
||||
m_cache->AddSymbol( aSymbol );
|
||||
|
||||
|
@ -4331,9 +4325,8 @@ void SCH_LEGACY_PLUGIN::DeleteSymbol( const wxString& aLibraryPath, const wxStri
|
|||
const PROPERTIES* aProperties )
|
||||
{
|
||||
LOCALE_IO toggle; // toggles on, then off, the C locale.
|
||||
m_props = aProperties;
|
||||
|
||||
cacheLib( aLibraryPath );
|
||||
cacheLib( aLibraryPath, aProperties );
|
||||
|
||||
m_cache->DeleteSymbol( aSymbolName );
|
||||
|
||||
|
@ -4354,8 +4347,6 @@ void SCH_LEGACY_PLUGIN::CreateSymbolLib( const wxString& aLibraryPath,
|
|||
|
||||
LOCALE_IO toggle;
|
||||
|
||||
m_props = aProperties;
|
||||
|
||||
delete m_cache;
|
||||
m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryPath );
|
||||
m_cache->SetModified();
|
||||
|
|
|
@ -164,7 +164,7 @@ private:
|
|||
void saveText( SCH_TEXT* aText );
|
||||
void saveBusAlias( std::shared_ptr<BUS_ALIAS> aAlias );
|
||||
|
||||
void cacheLib( const wxString& aLibraryFileName );
|
||||
void cacheLib( const wxString& aLibraryFileName, const PROPERTIES* aProperties );
|
||||
bool writeDocFile( const PROPERTIES* aProperties );
|
||||
bool isBuffering( const PROPERTIES* aProperties );
|
||||
|
||||
|
@ -176,7 +176,6 @@ protected:
|
|||
|
||||
wxString m_path; ///< Root project path for loading child sheets.
|
||||
std::stack<wxString> m_currentPath;///< Stack to maintain nested sheet paths
|
||||
const PROPERTIES* m_props; ///< Passed via Save() or Load(), no ownership, may be nullptr.
|
||||
SCH_SHEET* m_rootSheet; ///< The root sheet of the schematic being loaded..
|
||||
OUTPUTFORMATTER* m_out; ///< The output formatter for saving SCH_SCREEN objects.
|
||||
SCH_LEGACY_PLUGIN_CACHE* m_cache;
|
||||
|
|
|
@ -73,7 +73,14 @@ bool SYMBOL_ASYNC_LOADER::Join()
|
|||
if( m_output && !ret.empty() )
|
||||
{
|
||||
for( const LOADED_PAIR& pair : ret )
|
||||
{
|
||||
// Don't show libraries that had no power symbols
|
||||
if( m_onlyPowerSymbols && pair.second.empty() )
|
||||
continue;
|
||||
|
||||
// *Do* show empty libraries in the normal case
|
||||
m_output->insert( pair );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue