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.
This commit is contained in:
Ben Boeckel 2013-08-06 14:08:57 -04:00 committed by Brad King
parent 0d6acb1df8
commit e43e207c7b
2 changed files with 7 additions and 6 deletions

View File

@ -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*/, WatchMethod method, void* client_data /*=0*/,
DeleteData delete_data /*=0*/) DeleteData delete_data /*=0*/)
{ {
@ -65,14 +65,15 @@ void cmVariableWatch::AddWatch(const std::string& variable,
for ( cc = 0; cc < vp->size(); cc ++ ) for ( cc = 0; cc < vp->size(); cc ++ )
{ {
cmVariableWatch::Pair* pair = (*vp)[cc]; cmVariableWatch::Pair* pair = (*vp)[cc];
if ( pair->Method == method ) if ( pair->Method == method &&
client_data && client_data == pair->ClientData)
{ {
delete pair; // Callback already exists
(*vp)[cc] = p; return false;
return;
} }
} }
vp->push_back(p); vp->push_back(p);
return true;
} }
void cmVariableWatch::RemoveWatch(const std::string& variable, void cmVariableWatch::RemoveWatch(const std::string& variable,

View File

@ -34,7 +34,7 @@ public:
/** /**
* Add watch to the variable * 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* client_data=0, DeleteData delete_data=0);
void RemoveWatch(const std::string& variable, WatchMethod method); void RemoveWatch(const std::string& variable, WatchMethod method);