diff options
author | Ben Boeckel <mathstuf@gmail.com> | 2013-08-06 18:08:57 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2013-08-08 17:31:09 (GMT) |
commit | e43e207c7bbde2a9e0948da0d1e79879ccd5ce45 (patch) | |
tree | 4f04bfa4affb1ba933e93b63e1ea19ecf74e2531 /Source/cmVariableWatch.cxx | |
parent | 0d6acb1df8c20bb21f4d328cf2c35d0cbb6d7ea3 (diff) | |
download | CMake-e43e207c7bbde2a9e0948da0d1e79879ccd5ce45.zip CMake-e43e207c7bbde2a9e0948da0d1e79879ccd5ce45.tar.gz CMake-e43e207c7bbde2a9e0948da0d1e79879ccd5ce45.tar.bz2 |
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.
Diffstat (limited to 'Source/cmVariableWatch.cxx')
-rw-r--r-- | Source/cmVariableWatch.cxx | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/Source/cmVariableWatch.cxx b/Source/cmVariableWatch.cxx index 21acd3b..c2a899d 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, |