Hash symbol libraries per library rather than statically per cache type.

This commit is contained in:
Wayne Stambaugh 2022-02-07 15:40:21 -05:00
parent d0d472f39d
commit fc3cad0b54
6 changed files with 18 additions and 77 deletions

View File

@ -2230,11 +2230,6 @@ void SCH_SEXPR_PLUGIN::cacheLib( const wxString& aLibraryFileName, const PROPERT
delete m_cache;
m_cache = new SCH_SEXPR_PLUGIN_CACHE( aLibraryFileName );
// Because m_cache is rebuilt, increment SYMBOL_LIBS::s_modify_generation
// to modify the hash value that indicate symbol to symbol links
// must be updated.
SYMBOL_LIBS::IncrementModifyGeneration();
if( !isBuffering( aProperties ) )
m_cache->Load();
}

View File

@ -1963,11 +1963,6 @@ void SCH_LEGACY_PLUGIN::cacheLib( const wxString& aLibraryFileName, const PROPER
delete m_cache;
m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryFileName );
// Because m_cache is rebuilt, increment SYMBOL_LIBS::s_modify_generation
// to modify the hash value that indicate symbol to symbol links
// must be updated.
SYMBOL_LIBS::IncrementModifyGeneration();
if( !isBuffering( aProperties ) )
m_cache->Load();
}
@ -1994,7 +1989,7 @@ bool SCH_LEGACY_PLUGIN::isBuffering( const PROPERTIES* aProperties )
int SCH_LEGACY_PLUGIN::GetModifyHash() const
{
if( m_cache )
return SCH_LEGACY_PLUGIN_CACHE::GetModifyHash();
return m_cache->GetModifyHash();
// If the cache hasn't been loaded, it hasn't been modified.
return 0;

View File

@ -25,11 +25,8 @@
#include <wx_filename.h>
int SCH_LIB_PLUGIN_CACHE::m_modHash = 1; // starts at 1 and goes up
std::mutex SCH_LIB_PLUGIN_CACHE::m_modHashMutex;
SCH_LIB_PLUGIN_CACHE::SCH_LIB_PLUGIN_CACHE( const wxString& aFullPathAndFileName ) :
m_modHash( 1 ),
m_fileName( aFullPathAndFileName ),
m_libFileName( aFullPathAndFileName ),
m_isWritable( true ),
@ -154,7 +151,7 @@ LIB_SYMBOL* SCH_LIB_PLUGIN_CACHE::removeSymbol( LIB_SYMBOL* aSymbol )
m_symbols.erase( it );
delete aSymbol;
m_isModified = true;
SCH_LIB_PLUGIN_CACHE::IncrementModifyHash();
IncrementModifyHash();
return firstChild;
}
@ -172,5 +169,5 @@ void SCH_LIB_PLUGIN_CACHE::AddSymbol( const LIB_SYMBOL* aSymbol )
m_symbols[ name ] = const_cast< LIB_SYMBOL* >( aSymbol );
m_isModified = true;
SCH_LIB_PLUGIN_CACHE::IncrementModifyHash();
IncrementModifyHash();
}

View File

@ -43,16 +43,16 @@ public:
SCH_LIB_PLUGIN_CACHE( const wxString& aLibraryPath );
virtual ~SCH_LIB_PLUGIN_CACHE();
static void IncrementModifyHash()
void IncrementModifyHash()
{
std::lock_guard<std::mutex> mut( SCH_LIB_PLUGIN_CACHE::m_modHashMutex );
SCH_LIB_PLUGIN_CACHE::m_modHash++;
std::lock_guard<std::mutex> mut( m_modHashMutex );
m_modHash++;
}
static int GetModifyHash()
int GetModifyHash()
{
std::lock_guard<std::mutex> mut( SCH_LIB_PLUGIN_CACHE::m_modHashMutex );
return SCH_LIB_PLUGIN_CACHE::m_modHash;
std::lock_guard<std::mutex> mut( m_modHashMutex );
return m_modHash;
}
// Most all functions in this class throw IO_ERROR exceptions. There are no
@ -88,8 +88,8 @@ public:
protected:
LIB_SYMBOL* removeSymbol( LIB_SYMBOL* aAlias );
static int m_modHash; // Keep track of the modification status of the library.
static std::mutex m_modHashMutex;
int m_modHash; // Keep track of the modification status of the library.
std::mutex m_modHashMutex;
wxString m_fileName; // Absolute path and file name.
wxFileName m_libFileName; // Absolute path and file name is required here.

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2004-2016 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 2004-2021 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2004-2022 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -45,10 +45,7 @@
#include <wx/tokenzr.h>
SYMBOL_LIB::SYMBOL_LIB( SCH_LIB_TYPE aType, const wxString& aFileName,
SCH_IO_MGR::SCH_FILE_T aPluginType ) :
// start @ != 0 so each additional library added
// is immediately detectable, zero would not be.
m_mod_hash( SYMBOL_LIBS::GetModifyGeneration() ),
SCH_IO_MGR::SCH_FILE_T aPluginType ) :
m_pluginType( aPluginType )
{
type = aType;
@ -75,8 +72,9 @@ SYMBOL_LIB::~SYMBOL_LIB()
void SYMBOL_LIB::Save( bool aSaveDocFile )
{
wxCHECK_RET( m_plugin != nullptr, wxString::Format( "no plugin defined for library `%s`.",
fileName.GetFullPath() ) );
wxCHECK_RET( m_plugin != nullptr,
wxString::Format( wxT( "no plugin defined for library `%s`." ),
fileName.GetFullPath() ) );
PROPERTIES props;
@ -409,28 +407,6 @@ void SYMBOL_LIBS::FindLibraryNearEntries( std::vector<LIB_SYMBOL*>& aCandidates,
}
int SYMBOL_LIBS::s_modify_generation = 1; // starts at 1 and goes up
std::mutex SYMBOL_LIBS::s_generationMutex;
int SYMBOL_LIBS::GetModifyHash()
{
int hash = 0;
for( SYMBOL_LIBS::const_iterator it = begin(); it != end(); ++it )
{
hash += it->GetModHash();
}
// Rebuilding the cache (m_cache) does not change the GetModHash() value,
// but changes SYMBOL_LIBS::s_modify_generation.
// Take this change in account:
hash += SYMBOL_LIBS::GetModifyGeneration();
return hash;
}
void SYMBOL_LIBS::LibNamesAndPaths( PROJECT* aProject, bool doSave,
wxString* aPaths, wxArrayString* aNames )
{

View File

@ -64,26 +64,7 @@ class SYMBOL_LIBS : public SYMBOL_LIBS_BASE, public PROJECT::_ELEM
public:
KICAD_T Type() override { return SYMBOL_LIBS_T; }
SYMBOL_LIBS()
{
IncrementModifyGeneration();
}
static void IncrementModifyGeneration()
{
std::lock_guard<std::mutex> mut( SYMBOL_LIBS::s_generationMutex );
++SYMBOL_LIBS::s_modify_generation;
}
static int GetModifyGeneration()
{
std::lock_guard<std::mutex> mut( SYMBOL_LIBS::s_generationMutex );
return SYMBOL_LIBS::s_modify_generation;
}
/// Return the modification hash for all libraries. The value returned
/// changes on every library modification.
int GetModifyHash();
SYMBOL_LIBS() {}
/**
* Allocate and adds a symbol library to the library list.
@ -175,9 +156,6 @@ public:
const wxString& aLibraryName = wxEmptyString );
int GetLibraryCount() { return size(); }
static int s_modify_generation; ///< helper for GetModifyHash()
static std::mutex s_generationMutex;
};