diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h index a67a95f69..e0dbd13d4 100644 --- a/indra/llprimitive/llprimitive.h +++ b/indra/llprimitive/llprimitive.h @@ -107,6 +107,7 @@ public: PARAMS_RESERVED = 0x50, // Used on server-side PARAMS_MESH = 0x60, PARAMS_EXTENDED_MESH = 0x70, + PARAMS_MAX = PARAMS_EXTENDED_MESH }; public: diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 658120690..816455a52 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -288,7 +288,8 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe mPhysicsShapeUnknown(true), mAttachmentItemID(LLUUID::null), mLastUpdateType(OUT_UNKNOWN), - mLastUpdateCached(FALSE) + mLastUpdateCached(FALSE), + mExtraParameterList(LLNetworkData::PARAMS_MAX >> 4) { if(!is_global) { @@ -334,18 +335,6 @@ LLViewerObject::~LLViewerObject() } // Delete memory associated with extra parameters. - std::map::iterator iter; - for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter) - { - if(iter->second != NULL) - { - // - // There was a crash here - // - delete iter->second->data; - delete iter->second; - } - } mExtraParameterList.clear(); for_each(mNameValuePairs.begin(), mNameValuePairs.end(), DeletePairedPointer()) ; @@ -1388,10 +1377,11 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, unpackParticleSource(block_num, owner_id); // Mark all extra parameters not used - std::map::iterator iter; + std::vector >::iterator iter; for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter) { - iter->second->in_use = FALSE; + if(*iter) + (*iter)->in_use = FALSE; } // Unpack extra parameters @@ -1418,12 +1408,12 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, delete[] buffer; } - for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter) + for (size_t i = 0; i < mExtraParameterList.size(); ++i) { - if (!iter->second->in_use) + if (mExtraParameterList[i] && !mExtraParameterList[i]->in_use) { // Send an update message in case it was formerly in use - parameterChanged(iter->first, iter->second->data, FALSE, false); + parameterChanged((i + 1) << 4, mExtraParameterList[i]->data.get(), FALSE, false); } } break; @@ -1643,10 +1633,11 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, } // Mark all extra parameters not used - std::map::iterator iter; + std::vector >::iterator iter; for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter) { - iter->second->in_use = FALSE; + if(*iter) + (*iter)->in_use = FALSE; } // Unpack extra params @@ -1664,12 +1655,12 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, unpackParameterEntry(param_type, &dp2); } - for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter) + for (size_t i = 0; i < mExtraParameterList.size(); ++i) { - if (!iter->second->in_use) + if (mExtraParameterList[i] && !mExtraParameterList[i]->in_use) { // Send an update message in case it was formerly in use - parameterChanged(iter->first, iter->second->data, FALSE, false); + parameterChanged((i + 1) << 4, mExtraParameterList[i]->data.get(), FALSE, false); } } @@ -5824,7 +5815,7 @@ bool LLViewerObject::unpackParameterEntry(U16 param_type, LLDataPacker *dp) { param->data->unpack(*dp); param->in_use = TRUE; - parameterChanged(param_type, param->data, TRUE, false); + parameterChanged(param_type, param->data.get(), TRUE, false); return true; } else @@ -5873,9 +5864,9 @@ LLViewerObject::ExtraParameter* LLViewerObject::createNewParameterEntry(U16 para if (new_block) { ExtraParameter* new_entry = new ExtraParameter; - new_entry->data = new_block; + new_entry->data = decltype(new_entry->data)(new_block); new_entry->in_use = false; // not in use yet - mExtraParameterList[param_type] = new_entry; + mExtraParameterList[(param_type >> 4) - 1].reset(new_entry); return new_entry; } return NULL; @@ -5883,12 +5874,7 @@ LLViewerObject::ExtraParameter* LLViewerObject::createNewParameterEntry(U16 para LLViewerObject::ExtraParameter* LLViewerObject::getExtraParameterEntry(U16 param_type) const { - std::map::const_iterator itor = mExtraParameterList.find(param_type); - if (itor != mExtraParameterList.end()) - { - return itor->second; - } - return NULL; + return param_type <= LLNetworkData::PARAMS_MAX ? mExtraParameterList[(param_type >> 4) - 1].get() : nullptr; } LLViewerObject::ExtraParameter* LLViewerObject::getExtraParameterEntryCreate(U16 param_type) @@ -5906,7 +5892,7 @@ LLNetworkData* LLViewerObject::getParameterEntry(U16 param_type) const ExtraParameter* param = getExtraParameterEntry(param_type); if (param) { - return param->data; + return param->data.get(); } else { @@ -5938,7 +5924,7 @@ bool LLViewerObject::setParameterEntry(U16 param_type, const LLNetworkData& new_ } param->in_use = true; param->data->copy(new_value); - parameterChanged(param_type, param->data, TRUE, local_origin); + parameterChanged(param_type, param->data.get(), TRUE, local_origin); return true; } else @@ -5956,7 +5942,7 @@ bool LLViewerObject::setParameterEntryInUse(U16 param_type, BOOL in_use, bool lo if (param && param->in_use != in_use) { param->in_use = in_use; - parameterChanged(param_type, param->data, in_use, local_origin); + parameterChanged(param_type, param->data.get(), in_use, local_origin); return true; } return false; @@ -5967,7 +5953,7 @@ void LLViewerObject::parameterChanged(U16 param_type, bool local_origin) ExtraParameter* param = getExtraParameterEntry(param_type); if (param) { - parameterChanged(param_type, param->data, param->in_use, local_origin); + parameterChanged(param_type, param->data.get(), param->in_use, local_origin); } } diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index fc3e788d1..ef4031e92 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -127,9 +127,9 @@ protected: struct ExtraParameter { BOOL in_use; - LLNetworkData *data; + std::unique_ptr data; }; - std::map mExtraParameterList; + std::vector > mExtraParameterList; public: typedef std::list > child_list_t;