Kaydet (Commit) dc2329fb authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Remove broken MergeDataHashMap optimization

...which apparently didn't take into account that inserting into a
std::unordered_map may invalidate iterators, which now started to cause build
failures like

> [PRP] dictionaries/hu_HU/dialog/hu_HU_de
> warn:sal.osl:25175:25175:sal/osl/unx/thread.cxx:1026: RTL_TEXTENCODING_DONTKNOW -> _ASCII_US
> .../gcc/trunk/inst/include/c++/9.0.1/debug/safe_iterator.h:307:
> In function:
>     __gnu_debug::_Safe_iterator<_Iterator, _Sequence, _Category>::pointer
>     __gnu_debug::_Safe_iterator<_Iterator, _Sequence,
>     _Category>::operator->() const [with _Iterator =
>     std::__detail::_Node_iterator<std::pair<const rtl::OString,
>     std::unique_ptr<MergeData> >, false, true>; _Sequence =
>     std::__debug::unordered_map<rtl::OString, std::unique_ptr<MergeData> >;
>     _Category = std::forward_iterator_tag;
>     __gnu_debug::_Safe_iterator<_Iterator, _Sequence, _Category>::pointer =
>     std::pair<const rtl::OString, std::unique_ptr<MergeData> >*]
>
> Error: attempt to dereference a singular iterator.
>
> Objects involved in the operation:
>     iterator "this" @ 0x0x5a8228 {
>       type = std::__detail::_Node_iterator<std::pair<rtl::OString const, std::unique_ptr<MergeData, std::default_delete<MergeData> > >, false, true> (mutable iterator);
>       state = singular;
>       references sequence with type 'std::__debug::unordered_map<rtl::OString, std::unique_ptr<MergeData, std::default_delete<MergeData> >, std::hash<rtl::OString>, std::equal_to<rtl::OString>, std::allocator<std::pair<rtl::OString const, std::unique_ptr<MergeData, std::default_delete<MergeData> > > > >' @ 0x0x5a81c8
>     }
> /bin/sh: line 1: 25175 Aborted                 (core dumped) LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}"$I/program:$I/program" $W/LinkTarget/Executable/propex -i $S/dictionaries/hu_HU/dialog/hu_HU_en_US.properties -l de -m ${MERGEINPUT} -o $W/PropertiesTranslateTarget/dictionaries/hu_HU/dialog/hu_HU_de.properties
> make[1]: *** [.../solenv/gbuild/Dictionary.mk:88: .../workdir/PropertiesTranslateTarget/dictionaries/hu_HU/dialog/hu_HU_de.properties] Error 134

with trunk libstdc++ in debug mode.

Both classes MergeData and MergeDataHashMap became redundant.

Change-Id: I771548a6155e14037d84acfd74cd13566a26a8d7
Reviewed-on: https://gerrit.libreoffice.org/69395
Tested-by: Jenkins
Reviewed-by: 's avatarStephan Bergmann <sbergman@redhat.com>
üst 8925bd2e
...@@ -119,74 +119,6 @@ public: ...@@ -119,74 +119,6 @@ public:
}; };
// class MergeDataHashMap
class MergeData;
/** Container for MergeData
This class is an HashMap with a hidden insertion
order. The class can used just like a simple
HashMap, but good to know that it's use is
more effective if the accessing(find) order
match with the insertion order.
In the most case, this match is good.
(e.g. reading PO files of different languages,
executables merging)
*/
class MergeDataHashMap
{
private:
typedef std::unordered_map<OString, std::unique_ptr<MergeData>> HashMap_t;
public:
MergeDataHashMap()
: bFirstSearch(true)
, aLastInsertion(m_aHashMap.end())
, aLastFound(m_aHashMap.end())
, aFirstInOrder(m_aHashMap.end())
{
}
typedef HashMap_t::iterator iterator;
typedef HashMap_t::const_iterator const_iterator;
std::pair<iterator,bool> insert(const OString& rKey, std::unique_ptr<MergeData> pMergeData);
iterator const & find(const OString& rKey);
iterator end() {return m_aHashMap.end();}
private:
bool bFirstSearch;
HashMap_t m_aHashMap;
iterator aLastInsertion;
iterator aLastFound;
iterator aFirstInOrder;
};
// class MergeData
/// Purpose: holds information of data to merge (one resource)
class MergeData
{
friend class MergeDataHashMap;
std::unique_ptr<MergeEntrys> pMergeEntrys;
MergeDataHashMap::iterator m_aNextData;
public:
MergeData();
~MergeData();
MergeEntrys* GetMergeEntries() { return pMergeEntrys.get();}
};
// class MergeDataFile // class MergeDataFile
...@@ -194,10 +126,10 @@ public: ...@@ -194,10 +126,10 @@ public:
class MergeDataFile class MergeDataFile
{ {
private: private:
MergeDataHashMap aMap; std::unordered_map<OString, std::unique_ptr<MergeEntrys>> aMap;
std::set<OString> aLanguageSet; std::set<OString> aLanguageSet;
MergeData *GetMergeData( ResData *pResData , bool bCaseSensitive = false ); MergeEntrys *GetMergeData( ResData *pResData , bool bCaseSensitive = false );
void InsertEntry(const OString &rTYP, const OString &rGID, void InsertEntry(const OString &rTYP, const OString &rGID,
const OString &rLID, const OString &nLang, const OString &rLID, const OString &nLang,
const OString &rTEXT, const OString &rQHTEXT, const OString &rTEXT, const OString &rQHTEXT,
......
...@@ -108,74 +108,6 @@ OString MergeEntrys::GetQTZText(const ResData& rResData, const OString& rOrigTex ...@@ -108,74 +108,6 @@ OString MergeEntrys::GetQTZText(const ResData& rResData, const OString& rOrigTex
return sKey + GetDoubleBars() + rOrigText; return sKey + GetDoubleBars() + rOrigText;
} }
// class MergeDataHashMap
std::pair<MergeDataHashMap::iterator,bool> MergeDataHashMap::insert(const OString& rKey, std::unique_ptr<MergeData> pMergeData)
{
std::pair<iterator,bool> aTemp = m_aHashMap.emplace( rKey, std::move(pMergeData) );
if( m_aHashMap.size() == 1 )
{
// When first insert, set an iterator to the first element
aFirstInOrder = aTemp.first;
}
else
{
// Define insertion order by setting an iterator to the next element.
aLastInsertion->second->m_aNextData = aTemp.first;
}
aLastInsertion = aTemp.first;
return aTemp;
}
MergeDataHashMap::iterator const & MergeDataHashMap::find(const OString& rKey)
{
iterator aHint = m_aHashMap.end();
// Add a hint
if( bFirstSearch && !m_aHashMap.empty() )
{
aHint = aFirstInOrder;
}
else if( aLastFound == aLastInsertion )
{
// Next to the last element is the first element
aHint = aFirstInOrder;
}
else if( aLastFound != m_aHashMap.end() && aLastFound != aLastInsertion )
{
aHint = aLastFound->second->m_aNextData;
}
// If hint works than no need for search
if( aHint != m_aHashMap.end() && aHint->first == rKey )
{
aLastFound = aHint;
}
else
{
aLastFound = m_aHashMap.find(rKey);
}
bFirstSearch = false;
return aLastFound;
}
// class MergeData
MergeData::MergeData()
: pMergeEntrys( new MergeEntrys() )
{
}
MergeData::~MergeData()
{
}
// class MergeDataFile // class MergeDataFile
...@@ -304,7 +236,7 @@ std::vector<OString> MergeDataFile::GetLanguages() const ...@@ -304,7 +236,7 @@ std::vector<OString> MergeDataFile::GetLanguages() const
return std::vector<OString>(aLanguageSet.begin(),aLanguageSet.end()); return std::vector<OString>(aLanguageSet.begin(),aLanguageSet.end());
} }
MergeData *MergeDataFile::GetMergeData( ResData *pResData , bool bCaseSensitive ) MergeEntrys *MergeDataFile::GetMergeData( ResData *pResData , bool bCaseSensitive )
{ {
OString sOldG = pResData->sGId; OString sOldG = pResData->sGId;
OString sOldL = pResData->sId; OString sOldL = pResData->sId;
...@@ -319,7 +251,7 @@ MergeData *MergeDataFile::GetMergeData( ResData *pResData , bool bCaseSensitive ...@@ -319,7 +251,7 @@ MergeData *MergeDataFile::GetMergeData( ResData *pResData , bool bCaseSensitive
OString sKey = CreateKey( pResData->sResTyp , pResData->sGId , pResData->sId , pResData->sFilename , bCaseSensitive ); OString sKey = CreateKey( pResData->sResTyp , pResData->sGId , pResData->sId , pResData->sFilename , bCaseSensitive );
MergeDataHashMap::const_iterator mit = aMap.find( sKey ); auto mit = aMap.find( sKey );
if(mit != aMap.end()) if(mit != aMap.end())
{ {
pResData->sGId = sOldG; pResData->sGId = sOldG;
...@@ -334,19 +266,13 @@ MergeData *MergeDataFile::GetMergeData( ResData *pResData , bool bCaseSensitive ...@@ -334,19 +266,13 @@ MergeData *MergeDataFile::GetMergeData( ResData *pResData , bool bCaseSensitive
MergeEntrys *MergeDataFile::GetMergeEntrys( ResData *pResData ) MergeEntrys *MergeDataFile::GetMergeEntrys( ResData *pResData )
{ {
// search for requested MergeEntrys // search for requested MergeEntrys
MergeData *pData = GetMergeData( pResData ); return GetMergeData( pResData );
if ( pData )
return pData->GetMergeEntries();
return nullptr;
} }
MergeEntrys *MergeDataFile::GetMergeEntrysCaseSensitive( ResData *pResData ) MergeEntrys *MergeDataFile::GetMergeEntrysCaseSensitive( ResData *pResData )
{ {
// search for requested MergeEntrys // search for requested MergeEntrys
MergeData *pData = GetMergeData( pResData , true ); return GetMergeData( pResData , true );
if ( pData )
return pData->GetMergeEntries();
return nullptr;
} }
void MergeDataFile::InsertEntry( void MergeDataFile::InsertEntry(
...@@ -356,28 +282,27 @@ void MergeDataFile::InsertEntry( ...@@ -356,28 +282,27 @@ void MergeDataFile::InsertEntry(
const OString &rTITLE, const OString &rInFilename, const OString &rTITLE, const OString &rInFilename,
bool bFirstLang, bool bCaseSensitive ) bool bFirstLang, bool bCaseSensitive )
{ {
MergeData *pData = nullptr; MergeEntrys *pMergeEntrys = nullptr;
// search for MergeData // search for MergeData
OString sKey = CreateKey(rTYP , rGID , rLID , rInFilename , bCaseSensitive); OString sKey = CreateKey(rTYP , rGID , rLID , rInFilename , bCaseSensitive);
if( !bFirstLang ) if( !bFirstLang )
{ {
MergeDataHashMap::const_iterator mit = aMap.find( sKey ); auto mit = aMap.find( sKey );
if(mit != aMap.end()) if(mit != aMap.end())
pData = mit->second.get(); pMergeEntrys = mit->second.get();
} }
if( !pData ) if( !pMergeEntrys )
{ {
pData = new MergeData; pMergeEntrys = new MergeEntrys;
aMap.insert( sKey, std::unique_ptr<MergeData>(pData) ); aMap.emplace( sKey, std::unique_ptr<MergeEntrys>(pMergeEntrys) );
} }
// insert the cur string // insert the cur string
MergeEntrys *pMergeEntrys = pData->GetMergeEntries();
if( nLANG =="qtz" ) if( nLANG =="qtz" )
{ {
const OString sTemp = rInFilename + rGID + rLID + rTYP; const OString sTemp = rInFilename + rGID + rLID + rTYP;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment