From e43e207c7bbde2a9e0948da0d1e79879ccd5ce45 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Tue, 6 Aug 2013 14:08:57 -0400 Subject: [PATCH] variable_watch: Match client_data when finding duplicates If a callback has the same data as another call, we don't want to delete the old callback. This is because if the client_data is the same, it might get deleted causing the new client_data to be bogus. Now, AddWatch will return true if it will use the watch, false otherwise. Callers should check the return value to know whether client_data was adopted by the watch or not. --- Source/cmVariableWatch.cxx | 11 ++++++----- Source/cmVariableWatch.h | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Source/cmVariableWatch.cxx b/Source/cmVariableWatch.cxx index 21acd3b7e8..c2a899dcd2 100644 --- a/Source/cmVariableWatch.cxx +++ b/Source/cmVariableWatch.cxx @@ -52,7 +52,7 @@ cmVariableWatch::~cmVariableWatch() } } -void cmVariableWatch::AddWatch(const std::string& variable, +bool cmVariableWatch::AddWatch(const std::string& variable, WatchMethod method, void* client_data /*=0*/, DeleteData delete_data /*=0*/) { @@ -65,14 +65,15 @@ void cmVariableWatch::AddWatch(const std::string& variable, for ( cc = 0; cc < vp->size(); cc ++ ) { cmVariableWatch::Pair* pair = (*vp)[cc]; - if ( pair->Method == method ) + if ( pair->Method == method && + client_data && client_data == pair->ClientData) { - delete pair; - (*vp)[cc] = p; - return; + // Callback already exists + return false; } } vp->push_back(p); + return true; } void cmVariableWatch::RemoveWatch(const std::string& variable, diff --git a/Source/cmVariableWatch.h b/Source/cmVariableWatch.h index d666815982..3b6cafdb36 100644 --- a/Source/cmVariableWatch.h +++ b/Source/cmVariableWatch.h @@ -34,7 +34,7 @@ public: /** * Add watch to the variable */ - void AddWatch(const std::string& variable, WatchMethod method, + bool AddWatch(const std::string& variable, WatchMethod method, void* client_data=0, DeleteData delete_data=0); void RemoveWatch(const std::string& variable, WatchMethod method);