void StatusManager::setStatus(const QString& name, Holder holder) { Holder older(status(name)); if (holder.is_valid() && older.is_valid()) { using namespace ::gsim::core::utils; Holder newer(older.clone()); // Hace una copia 'reflectiva' ya que holder puede no ser // del mismo tipo que el tipo del estado. reflective_copy(holder, newer); // Region protegida reducida al mínimo if (applyStatus(name, older, newer)) { unique_lock lock(m_data->messageMutex); m_data->status[name] = newer; // Ha de estar dentro de la región protegida para la // notificación en orden emit statusChanged(name, newer); emit statusChanged(name, older, newer); } } }
Holder StatusManager::status(const QString& name) { Holder res (statusRef(name)); // Devuelve siempre una copìa if (res.is_valid()) { res = Holder(res.clone()); } return res; }