void Thread::setUserData(const String& id, void* data, DeinitFunc deinitFunc) { UserData oldData; oldData.data = NULL; oldData.deinitFunc = NULL; UserData newData; newData.data = data; newData.deinitFunc = deinitFunc; // Replace data. m_lock.enter(); UserData* found = m_userData.search(id); if (found) { oldData = *found; *found = newData; } if ((found != NULL) != (data != NULL || deinitFunc != NULL)) { if (found) m_userData.remove(id); else m_userData.add(id, newData); } m_lock.leave(); // Deinit old data. if (oldData.deinitFunc) oldData.deinitFunc(oldData.data); }