Skip to content

Commit 306e9e6

Browse files
committed
#3413 Crash at removeFromLocalIDTable #2
Don't rely onto region for cleanup
1 parent b1bd083 commit 306e9e6

File tree

3 files changed

+26
-24
lines changed

3 files changed

+26
-24
lines changed

indra/newview/llviewerobject.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,9 @@ class LLViewerObject
727727
// index into LLViewerObjectList::mActiveObjects or -1 if not in list
728728
S32 mListIndex;
729729

730+
// last index data for mIndexAndLocalIDToUUID
731+
U32 mRegionIndex;
732+
730733
LLPointer<LLViewerTexture> *mTEImages;
731734
LLPointer<LLViewerTexture> *mTENormalMaps;
732735
LLPointer<LLViewerTexture> *mTESpecularMaps;

indra/newview/llviewerobjectlist.cpp

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -164,21 +164,14 @@ U64 LLViewerObjectList::getIndex(const U32 local_id,
164164
return (((U64)index) << 32) | (U64)local_id;
165165
}
166166

167-
bool LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject* objectp)
167+
bool LLViewerObjectList::removeFromLocalIDTable(LLViewerObject* objectp)
168168
{
169169
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
170170

171-
if(objectp && objectp->getRegion())
171+
if(objectp && objectp->mRegionIndex != 0)
172172
{
173173
U32 local_id = objectp->mLocalID;
174-
U32 ip = objectp->getRegion()->getHost().getAddress();
175-
U32 port = objectp->getRegion()->getHost().getPort();
176-
U64 ipport = (((U64)ip) << 32) | (U64)port;
177-
U32 index = mIPAndPortToIndex[ipport];
178-
179-
// LL_INFOS() << "Removing object from table, local ID " << local_id << ", ip " << ip << ":" << port << LL_ENDL;
180-
181-
U64 indexid = (((U64)index) << 32) | (U64)local_id;
174+
U64 indexid = (((U64)objectp->mRegionIndex) << 32) | (U64)local_id;
182175

183176
std::map<U64, LLUUID>::iterator iter = mIndexAndLocalIDToUUID.find(indexid);
184177
if (iter == mIndexAndLocalIDToUUID.end())
@@ -190,6 +183,7 @@ bool LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject* objectp)
190183
if (iter->second == objectp->getID())
191184
{ // Full UUIDs match, so remove the entry
192185
mIndexAndLocalIDToUUID.erase(iter);
186+
objectp->mRegionIndex = 0;
193187
return true;
194188
}
195189
// 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)
203197
void LLViewerObjectList::setUUIDAndLocal(const LLUUID &id,
204198
const U32 local_id,
205199
const U32 ip,
206-
const U32 port)
200+
const U32 port,
201+
LLViewerObject* objectp)
207202
{
208203
U64 ipport = (((U64)ip) << 32) | (U64)port;
209204

@@ -215,6 +210,7 @@ void LLViewerObjectList::setUUIDAndLocal(const LLUUID &id,
215210
mIPAndPortToIndex[ipport] = index;
216211
}
217212

213+
objectp->mRegionIndex = index; // should never be zero, sSimulatorMachineIndex starts from 1
218214
U64 indexid = (((U64)index) << 32) | (U64)local_id;
219215

220216
mIndexAndLocalIDToUUID[indexid] = id;
@@ -335,7 +331,8 @@ LLViewerObject* LLViewerObjectList::processObjectUpdateFromCache(LLVOCacheEntry*
335331
removeFromLocalIDTable(objectp);
336332
setUUIDAndLocal(fullid, entry->getLocalID(),
337333
regionp->getHost().getAddress(),
338-
regionp->getHost().getPort());
334+
regionp->getHost().getPort(),
335+
objectp);
339336

340337
if (objectp->mLocalID != entry->getLocalID())
341338
{ // Update local ID in object with the one sent from the region
@@ -582,7 +579,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
582579
setUUIDAndLocal(fullid,
583580
local_id,
584581
gMessageSystem->getSenderIP(),
585-
gMessageSystem->getSenderPort());
582+
gMessageSystem->getSenderPort(),
583+
objectp);
586584

587585
if (objectp->mLocalID != local_id)
588586
{ // Update local ID in object with the one sent from the region
@@ -1309,10 +1307,7 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
13091307
// << objectp->getRegion()->getHost().getPort() << LL_ENDL;
13101308
//}
13111309

1312-
if (!mIndexAndLocalIDToUUID.empty())
1313-
{
1314-
removeFromLocalIDTable(objectp);
1315-
}
1310+
removeFromLocalIDTable(objectp);
13161311

13171312
if (objectp->onActiveList())
13181313
{
@@ -1396,6 +1391,7 @@ void LLViewerObjectList::killAllObjects()
13961391
objectp = *iter;
13971392
objectp->setOnActiveList(false);
13981393
objectp->setListIndex(-1);
1394+
objectp->mRegionIndex = 0;
13991395
objectp->mOnMap = false;
14001396
killObject(objectp);
14011397
// Object must be dead, or it's the LLVOAvatarSelf which never dies.
@@ -1508,9 +1504,9 @@ void LLViewerObjectList::updateActive(LLViewerObject *objectp)
15081504
mActiveObjects.push_back(objectp);
15091505
objectp->setListIndex(static_cast<S32>(mActiveObjects.size()) - 1);
15101506
objectp->setOnActiveList(true);
1511-
}
1512-
else
1513-
{
1507+
}
1508+
else
1509+
{
15141510
llassert(idx < mActiveObjects.size());
15151511
llassert(mActiveObjects[idx] == objectp);
15161512

@@ -1862,7 +1858,8 @@ LLViewerObject *LLViewerObjectList::createObjectFromCache(const LLPCode pcode, L
18621858
setUUIDAndLocal(uuid,
18631859
local_id,
18641860
regionp->getHost().getAddress(),
1865-
regionp->getHost().getPort());
1861+
regionp->getHost().getPort(),
1862+
objectp);
18661863
mObjects.push_back(objectp);
18671864

18681865
updateActive(objectp);
@@ -1900,7 +1897,8 @@ LLViewerObject *LLViewerObjectList::createObject(const LLPCode pcode, LLViewerRe
19001897
setUUIDAndLocal(fullid,
19011898
local_id,
19021899
gMessageSystem->getSenderIP(),
1903-
gMessageSystem->getSenderPort());
1900+
gMessageSystem->getSenderPort(),
1901+
objectp);
19041902

19051903
mObjects.push_back(objectp);
19061904

indra/newview/llviewerobjectlist.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,10 @@ class LLViewerObjectList
179179
void setUUIDAndLocal(const LLUUID &id,
180180
const U32 local_id,
181181
const U32 ip,
182-
const U32 port); // Requires knowledge of message system info!
182+
const U32 port,
183+
LLViewerObject* objectp); // Requires knowledge of message system info!
183184

184-
bool removeFromLocalIDTable(const LLViewerObject* objectp);
185+
bool removeFromLocalIDTable(LLViewerObject* objectp);
185186
// Used ONLY by the orphaned object code.
186187
U64 getIndex(const U32 local_id, const U32 ip, const U32 port);
187188

0 commit comments

Comments
 (0)