diff --git a/Source/cmVariableWatch.cxx b/Source/cmVariableWatch.cxx index 21b910dea..21acd3b7e 100644 --- a/Source/cmVariableWatch.cxx +++ b/Source/cmVariableWatch.cxx @@ -53,11 +53,13 @@ cmVariableWatch::~cmVariableWatch() } void cmVariableWatch::AddWatch(const std::string& variable, - WatchMethod method, void* client_data /*=0*/) + WatchMethod method, void* client_data /*=0*/, + DeleteData delete_data /*=0*/) { cmVariableWatch::Pair* p = new cmVariableWatch::Pair; p->Method = method; p->ClientData = client_data; + p->DeleteDataCall = delete_data; cmVariableWatch::VectorOfPairs* vp = &this->WatchMap[variable]; cmVariableWatch::VectorOfPairs::size_type cc; for ( cc = 0; cc < vp->size(); cc ++ ) diff --git a/Source/cmVariableWatch.h b/Source/cmVariableWatch.h index 45273e5ae..d66681598 100644 --- a/Source/cmVariableWatch.h +++ b/Source/cmVariableWatch.h @@ -26,6 +26,7 @@ class cmVariableWatch public: typedef void (*WatchMethod)(const std::string& variable, int access_type, void* client_data, const char* newValue, const cmMakefile* mf); + typedef void (*DeleteData)(void* client_data); cmVariableWatch(); ~cmVariableWatch(); @@ -34,7 +35,7 @@ public: * Add watch to the variable */ void AddWatch(const std::string& variable, WatchMethod method, - void* client_data=0); + void* client_data=0, DeleteData delete_data=0); void RemoveWatch(const std::string& variable, WatchMethod method); /** @@ -67,7 +68,15 @@ protected: { WatchMethod Method; void* ClientData; - Pair() : Method(0), ClientData(0) {} + DeleteData DeleteDataCall; + Pair() : Method(0), ClientData(0), DeleteDataCall(0) {} + ~Pair() + { + if (this->DeleteDataCall && this->ClientData) + { + this->DeleteDataCall(this->ClientData); + } + } }; typedef std::vector< Pair* > VectorOfPairs;