Fixing constant-sized memory leaks

This commit is contained in:
DennisOSRM 2012-01-31 17:44:55 +01:00
parent d41b0f28b4
commit 93b1ff1c5d
4 changed files with 23 additions and 19 deletions

View File

@ -26,7 +26,7 @@ class BaseParser {
public: public:
virtual ~BaseParser() {} virtual ~BaseParser() {}
virtual bool Init() = 0; virtual bool Init() = 0;
virtual bool RegisterCallbacks(bool (*nodeCallbackPointer)(NodeT), bool (*restrictionCallbackPointer)(RestrictionT), bool (*wayCallbackPointer)(WayT), bool (*addressCallbackPointer)(NodeT, HashTable<std::string, std::string>)) = 0; virtual bool RegisterCallbacks(bool (*nodeCallbackPointer)(NodeT), bool (*restrictionCallbackPointer)(RestrictionT), bool (*wayCallbackPointer)(WayT), bool (*addressCallbackPointer)(NodeT, HashTable<std::string, std::string>&)) = 0;
virtual bool Parse() = 0; virtual bool Parse() = 0;
}; };

View File

@ -29,7 +29,7 @@ typedef stxxl::vector<NodeID> STXXLNodeIDVector;
typedef stxxl::vector<_Node> STXXLNodeVector; typedef stxxl::vector<_Node> STXXLNodeVector;
typedef stxxl::vector<_Edge> STXXLEdgeVector; typedef stxxl::vector<_Edge> STXXLEdgeVector;
typedef stxxl::vector<_Address> STXXLAddressVector; typedef stxxl::vector<_Address> STXXLAddressVector;
typedef stxxl::vector<string> STXXLStringVector; typedef stxxl::vector<std::string> STXXLStringVector;
typedef stxxl::vector<_RawRestrictionContainer> STXXLRestrictionsVector; typedef stxxl::vector<_RawRestrictionContainer> STXXLRestrictionsVector;
typedef stxxl::vector<_WayIDStartAndEndEdge> STXXLWayIDStartEndVector; typedef stxxl::vector<_WayIDStartAndEndEdge> STXXLWayIDStartEndVector;
@ -42,6 +42,16 @@ struct STXXLContainers {
STXXLStringVector nameVector; STXXLStringVector nameVector;
STXXLRestrictionsVector restrictionsVector; STXXLRestrictionsVector restrictionsVector;
STXXLWayIDStartEndVector wayStartEndVector; STXXLWayIDStartEndVector wayStartEndVector;
~STXXLContainers() {
usedNodeIDs.clear();
allNodes.clear();
allEdges.clear();
adressVector.clear();
nameVector.clear();
restrictionsVector.clear();
wayStartEndVector.clear();
}
}; };
class ExtractorCallbacks{ class ExtractorCallbacks{
@ -51,7 +61,7 @@ private:
STXXLContainers * externalMemory; STXXLContainers * externalMemory;
public: public:
ExtractorCallbacks(STXXLContainers * ext, Settings set, StringMap * strMap){ ExtractorCallbacks(STXXLContainers * ext, Settings set, StringMap * strMap) {
externalMemory = ext; externalMemory = ext;
settings = set; settings = set;
stringMap = strMap; stringMap = strMap;

View File

@ -22,6 +22,7 @@ or see http://www.gnu.org/licenses/agpl.txt.
#define PBFPARSER_H_ #define PBFPARSER_H_
#include <zlib.h> #include <zlib.h>
#include <boost/shared_ptr.hpp>
#include "BaseParser.h" #include "BaseParser.h"
@ -61,9 +62,9 @@ class PBFParser : public BaseParser<_Node, _RawRestrictionContainer, _Way> {
}; };
public: public:
PBFParser(const char * fileName) PBFParser(const char * fileName) { /* Max 25 items in queue */
: threadDataQueue( new ConcurrentQueue<_ThreadData*>(25) ) { /* Max 25 items in queue */
GOOGLE_PROTOBUF_VERIFY_VERSION; GOOGLE_PROTOBUF_VERIFY_VERSION;
threadDataQueue.reset( new ConcurrentQueue<_ThreadData*>(25) );
input.open(fileName, std::ios::in | std::ios::binary); input.open(fileName, std::ios::in | std::ios::binary);
if (!input) { if (!input) {
@ -78,7 +79,7 @@ public:
addressCallback = NULL; restrictionCallback = NULL; addressCallback = NULL; restrictionCallback = NULL;
} }
bool RegisterCallbacks(bool (*nodeCallbackPointer)(_Node), bool (*restrictionCallbackPointer)(_RawRestrictionContainer), bool (*wayCallbackPointer)(_Way),bool (*addressCallbackPointer)(_Node, HashTable<std::string, std::string>) ) { bool RegisterCallbacks(bool (*nodeCallbackPointer)(_Node), bool (*restrictionCallbackPointer)(_RawRestrictionContainer), bool (*wayCallbackPointer)(_Way),bool (*addressCallbackPointer)(_Node, HashTable<std::string, std::string>&) ) {
nodeCallback = *nodeCallbackPointer; nodeCallback = *nodeCallbackPointer;
wayCallback = *wayCallbackPointer; wayCallback = *wayCallbackPointer;
restrictionCallback = *restrictionCallbackPointer; restrictionCallback = *restrictionCallbackPointer;
@ -95,8 +96,6 @@ public:
while (threadDataQueue->try_pop(td)) { while (threadDataQueue->try_pop(td)) {
delete td; delete td;
} }
delete threadDataQueue;
google::protobuf::ShutdownProtobufLibrary(); google::protobuf::ShutdownProtobufLibrary();
#ifndef NDEBUG #ifndef NDEBUG
@ -145,8 +144,10 @@ public:
if (keepRunning) if (keepRunning)
threadDataQueue->push(threadData); threadDataQueue->push(threadData);
else else {
threadDataQueue->push(NULL); // No more data to read, parse stops when NULL encountered threadDataQueue->push(NULL); // No more data to read, parse stops when NULL encountered
delete threadData;
}
} while(keepRunning); } while(keepRunning);
} }
@ -219,13 +220,6 @@ private:
int keyValue = dense.keys_vals ( denseTagIndex+1 ); int keyValue = dense.keys_vals ( denseTagIndex+1 );
std::string key = threadData->PBFprimitiveBlock.stringtable().s(tagValue).data(); std::string key = threadData->PBFprimitiveBlock.stringtable().s(tagValue).data();
std::string value = threadData->PBFprimitiveBlock.stringtable().s(keyValue).data(); std::string value = threadData->PBFprimitiveBlock.stringtable().s(keyValue).data();
if("barrier" == key && "bollard" == value) {
n.bollard = true;
}
if("highway" == key && "traffic_signals" == value) {
n.trafficLight = true;
}
keyVals.Add(key, value); keyVals.Add(key, value);
denseTagIndex += 2; denseTagIndex += 2;
} }
@ -531,12 +525,12 @@ private:
bool (*nodeCallback)(_Node); bool (*nodeCallback)(_Node);
bool (*wayCallback)(_Way); bool (*wayCallback)(_Way);
bool (*restrictionCallback)(_RawRestrictionContainer); bool (*restrictionCallback)(_RawRestrictionContainer);
bool (*addressCallback)(_Node, HashTable<std::string, std::string>); bool (*addressCallback)(_Node, HashTable<std::string, std::string>&);
/* the input stream to parse */ /* the input stream to parse */
std::fstream input; std::fstream input;
/* ThreadData Queue */ /* ThreadData Queue */
ConcurrentQueue < _ThreadData* >* threadDataQueue; boost::shared_ptr<ConcurrentQueue < _ThreadData* > > threadDataQueue;
}; };
#endif /* PBFPARSER_H_ */ #endif /* PBFPARSER_H_ */

View File

@ -37,7 +37,7 @@ public:
} }
virtual ~XMLParser() {} virtual ~XMLParser() {}
bool RegisterCallbacks(bool (*nodeCallbackPointer)(_Node), bool (*restrictionCallbackPointer)(_RawRestrictionContainer), bool (*wayCallbackPointer)(_Way), bool (*addressCallbackPointer)(_Node, HashTable<std::string, std::string>) ) { bool RegisterCallbacks(bool (*nodeCallbackPointer)(_Node), bool (*restrictionCallbackPointer)(_RawRestrictionContainer), bool (*wayCallbackPointer)(_Way), bool (*addressCallbackPointer)(_Node, HashTable<std::string, std::string>&) ) {
nodeCallback = *nodeCallbackPointer; nodeCallback = *nodeCallbackPointer;
wayCallback = *wayCallbackPointer; wayCallback = *wayCallbackPointer;
restrictionCallback = *restrictionCallbackPointer; restrictionCallback = *restrictionCallbackPointer;