From: <ibr...@us...> - 2011-04-15 15:16:29
|
Revision: 3943 http://tora.svn.sourceforge.net/tora/?rev=3943&view=rev Author: ibre5041 Date: 2011-04-15 15:16:22 +0000 (Fri, 15 Apr 2011) Log Message: ----------- Temporary fix sort a SEGFAULT, do not call toCache::objectExists() while toCache::objectNames.sort() is running in a parallel thread. PS: objectNames.sort() was called from toCache::loadDiskCache() TODO: toCache should use shared/exclusive locking. Modified Paths: -------------- branches/tora-trotl/src/tocache.cpp Modified: branches/tora-trotl/src/tocache.cpp =================================================================== --- branches/tora-trotl/src/tocache.cpp 2011-04-15 15:04:21 UTC (rev 3942) +++ branches/tora-trotl/src/tocache.cpp 2011-04-15 15:16:22 UTC (rev 3943) @@ -274,6 +274,7 @@ const std::list<toCache::objectName> toCache::tables(const objectName &object, bool nocache) const { + toLocker lock(cacheLock); std::list<objectName> ret; Q_FOREACH(objectName obj, ObjectNames) @@ -307,6 +308,7 @@ void toCache::setObjectList(const std::list<objectName> &list) { + toLocker lock(cacheLock); ObjectNames = list; // Set the date when information about this object was red. This will later // be used to clean up an old information. @@ -317,11 +319,13 @@ void toCache::setSynonymList(const std::map<QString, objectName> &list) { + toLocker lock(cacheLock); SynonymMap = list; } // setSynonymList bool toCache::objectExists(const QString &owner, const QString &type, const QString &name) { + toLocker lock(cacheLock); // TODO: ObjectList is sorted therefore going through all of it is not necessary! for (std::list<objectName>::iterator i = ObjectNames.begin(); i != ObjectNames.end(); i++) { @@ -336,6 +340,7 @@ toCache::RowList toCache::getObjects(const QString &owner, const QString &type) { + toLocker lock(cacheLock); Row r; RowList rl; for (std::list<objectName>::iterator i = ObjectNames.begin(); i != ObjectNames.end(); i++) @@ -354,6 +359,7 @@ void toCache::updateObjects(const QString &owner, const QString &type, const QList<objectName> rows) { + toLocker lock(cacheLock); bool OwnerExists = false; QList<objectName>::const_iterator newObjects = rows.begin(); std::list<objectName>::iterator currentObjects = ObjectNames.begin(); @@ -477,6 +483,7 @@ if(!data.isEmpty()) { + toLocker lock(cacheLock); QStringList records = data.split("\x1D", QString::KeepEmptyParts); for (QStringList::Iterator i = records.begin(); i != records.end(); i++) { @@ -514,11 +521,10 @@ ObjectNames.insert(ObjectNames.end(), (*cur)); delete cur; cur = 0; - } - } + } + ObjectNames.sort(); + } - ObjectNames.sort(); - return true; } @@ -542,29 +548,31 @@ if (!dir.exists(dirname)) dir.mkdir(dirname); - /** build record to write out - */ - QStringList record; // information about one object - QStringList records; // all objects - QStringList recordSynonym; // all synonyms of one particular object - for (std::list<objectName>::iterator i = ObjectNames.begin(); i != ObjectNames.end(); i++) - { - record.clear(); - record.append((*i).Owner); - record.append((*i).Name); - record.append((*i).Type); - record.append((*i).Comment); - for (std::list<QString>::iterator s = (*i).Synonyms.begin(); s != (*i).Synonyms.end(); s++) - { - recordSynonym.append((*s)); - synCounter++; - } - record.append(recordSynonym.join("\x1F")); - record.append((*i).Timestamp.toString("yyyy-MM-dd")); - recordSynonym.clear(); - objCounter++; - records.append(record.join("\x1E")); - } + /** build record to write out */ + QStringList record; // information about one object + QStringList records; // all objects + QStringList recordSynonym; // all synonyms of one particular object + { + toLocker lock(cacheLock); + for (std::list<objectName>::iterator i = ObjectNames.begin(); i != ObjectNames.end(); i++) + { + record.clear(); + record.append((*i).Owner); + record.append((*i).Name); + record.append((*i).Type); + record.append((*i).Comment); + for (std::list<QString>::iterator s = (*i).Synonyms.begin(); s != (*i).Synonyms.end(); s++) + { + recordSynonym.append((*s)); + synCounter++; + } + record.append(recordSynonym.join("\x1F")); + record.append((*i).Timestamp.toString("yyyy-MM-dd")); + recordSynonym.clear(); + objCounter++; + records.append(record.join("\x1E")); + } + } /** Write all records to a file */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |