From 0d6acb1df8c20bb21f4d328cf2c35d0cbb6d7ea3 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 2 Aug 2013 15:44:15 -0400 Subject: [PATCH] variable_watch: Add a deleter for the client data The client data is arbitrary and the callback may be called an unspecified number of times, so the cmVariableWatch must be the one to delete the client data in the end (if it is needed at all). --- Source/cmVariableWatch.cxx | 4 +++- Source/cmVariableWatch.h | 13 +++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Source/cmVariableWatch.cxx b/Source/cmVariableWatch.cxx index 21b910dea6..21acd3b7e8 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 45273e5ae2..d666815982 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;