diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2025-01-17 17:57:03 +0200 | 
|---|---|---|
| committer | Andrey Kleshchev <117672381+akleshchev@users.noreply.github.com> | 2025-01-17 19:19:16 +0200 | 
| commit | 306e9e6d0293ed6470db19c0882930fff0cd145f (patch) | |
| tree | 88d02a69e89224b105f9e656d4614830a2bd3b6b | |
| parent | b1bd083728d0fb630abdff64cd57cefb833bd0b9 (diff) | |
#3413 Crash at removeFromLocalIDTable #2
Don't rely onto region for cleanup
| -rw-r--r-- | indra/newview/llviewerobject.h | 3 | ||||
| -rw-r--r-- | indra/newview/llviewerobjectlist.cpp | 42 | ||||
| -rw-r--r-- | indra/newview/llviewerobjectlist.h | 5 | 
3 files changed, 26 insertions, 24 deletions
| diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index b6846c6716..206840ebfb 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -727,6 +727,9 @@ public:      // index into LLViewerObjectList::mActiveObjects or -1 if not in list      S32             mListIndex; +    // last index data for mIndexAndLocalIDToUUID +    U32             mRegionIndex; +      LLPointer<LLViewerTexture> *mTEImages;      LLPointer<LLViewerTexture> *mTENormalMaps;      LLPointer<LLViewerTexture> *mTESpecularMaps; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index d8f446db05..cd9d152437 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -164,21 +164,14 @@ U64 LLViewerObjectList::getIndex(const U32 local_id,      return (((U64)index) << 32) | (U64)local_id;  } -bool LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject* objectp) +bool LLViewerObjectList::removeFromLocalIDTable(LLViewerObject* objectp)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; -    if(objectp && objectp->getRegion()) +    if(objectp && objectp->mRegionIndex != 0)      {          U32 local_id = objectp->mLocalID; -        U32 ip = objectp->getRegion()->getHost().getAddress(); -        U32 port = objectp->getRegion()->getHost().getPort(); -        U64 ipport = (((U64)ip) << 32) | (U64)port; -        U32 index = mIPAndPortToIndex[ipport]; - -        // LL_INFOS() << "Removing object from table, local ID " << local_id << ", ip " << ip << ":" << port << LL_ENDL; - -        U64 indexid = (((U64)index) << 32) | (U64)local_id; +        U64 indexid = (((U64)objectp->mRegionIndex) << 32) | (U64)local_id;          std::map<U64, LLUUID>::iterator iter = mIndexAndLocalIDToUUID.find(indexid);          if (iter == mIndexAndLocalIDToUUID.end()) @@ -190,6 +183,7 @@ bool LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject* objectp)          if (iter->second == objectp->getID())          {   // Full UUIDs match, so remove the entry              mIndexAndLocalIDToUUID.erase(iter); +            objectp->mRegionIndex = 0;              return true;          }          // UUIDs did not match - this would zap a valid entry, so don't erase it @@ -203,7 +197,8 @@ bool LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject* objectp)  void LLViewerObjectList::setUUIDAndLocal(const LLUUID &id,                                            const U32 local_id,                                            const U32 ip, -                                          const U32 port) +                                          const U32 port, +                                          LLViewerObject* objectp)  {      U64 ipport = (((U64)ip) << 32) | (U64)port; @@ -215,6 +210,7 @@ void LLViewerObjectList::setUUIDAndLocal(const LLUUID &id,          mIPAndPortToIndex[ipport] = index;      } +    objectp->mRegionIndex = index; // should never be zero, sSimulatorMachineIndex starts from 1      U64 indexid = (((U64)index) << 32) | (U64)local_id;      mIndexAndLocalIDToUUID[indexid] = id; @@ -335,7 +331,8 @@ LLViewerObject* LLViewerObjectList::processObjectUpdateFromCache(LLVOCacheEntry*              removeFromLocalIDTable(objectp);              setUUIDAndLocal(fullid, entry->getLocalID(),                              regionp->getHost().getAddress(), -                            regionp->getHost().getPort()); +                            regionp->getHost().getPort(), +                            objectp);              if (objectp->mLocalID != entry->getLocalID())              {   // Update local ID in object with the one sent from the region @@ -582,7 +579,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,              setUUIDAndLocal(fullid,                              local_id,                              gMessageSystem->getSenderIP(), -                            gMessageSystem->getSenderPort()); +                            gMessageSystem->getSenderPort(), +                            objectp);              if (objectp->mLocalID != local_id)              {   // Update local ID in object with the one sent from the region @@ -1309,10 +1307,7 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)      //              << objectp->getRegion()->getHost().getPort() << LL_ENDL;      //} -    if (!mIndexAndLocalIDToUUID.empty()) -    { -        removeFromLocalIDTable(objectp); -    } +    removeFromLocalIDTable(objectp);      if (objectp->onActiveList())      { @@ -1396,6 +1391,7 @@ void LLViewerObjectList::killAllObjects()          objectp = *iter;          objectp->setOnActiveList(false);          objectp->setListIndex(-1); +        objectp->mRegionIndex = 0;          objectp->mOnMap = false;          killObject(objectp);          // Object must be dead, or it's the LLVOAvatarSelf which never dies. @@ -1508,9 +1504,9 @@ void LLViewerObjectList::updateActive(LLViewerObject *objectp)                  mActiveObjects.push_back(objectp);                  objectp->setListIndex(static_cast<S32>(mActiveObjects.size()) - 1);              objectp->setOnActiveList(true); -        } -        else -        { +            } +            else +            {                  llassert(idx < mActiveObjects.size());                  llassert(mActiveObjects[idx] == objectp); @@ -1862,7 +1858,8 @@ LLViewerObject *LLViewerObjectList::createObjectFromCache(const LLPCode pcode, L      setUUIDAndLocal(uuid,                      local_id,                      regionp->getHost().getAddress(), -                    regionp->getHost().getPort()); +                    regionp->getHost().getPort(), +                    objectp);      mObjects.push_back(objectp);      updateActive(objectp); @@ -1900,7 +1897,8 @@ LLViewerObject *LLViewerObjectList::createObject(const LLPCode pcode, LLViewerRe      setUUIDAndLocal(fullid,                      local_id,                      gMessageSystem->getSenderIP(), -                    gMessageSystem->getSenderPort()); +                    gMessageSystem->getSenderPort(), +                    objectp);      mObjects.push_back(objectp); diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h index dc31995eb1..547ef9fb2d 100644 --- a/indra/newview/llviewerobjectlist.h +++ b/indra/newview/llviewerobjectlist.h @@ -179,9 +179,10 @@ public:      void setUUIDAndLocal(const LLUUID &id,                                  const U32 local_id,                                  const U32 ip, -                                const U32 port); // Requires knowledge of message system info! +                                const U32 port, +                                LLViewerObject* objectp); // Requires knowledge of message system info! -    bool removeFromLocalIDTable(const LLViewerObject* objectp); +    bool removeFromLocalIDTable(LLViewerObject* objectp);      // Used ONLY by the orphaned object code.      U64 getIndex(const U32 local_id, const U32 ip, const U32 port); | 
