MAINT-1709 Factor out realloc

Reviewed by VoidPointer
master
Dave Parks 2012-10-11 17:02:45 -05:00
parent 6c989a692d
commit 7ebbb5067d
3 changed files with 80 additions and 80 deletions

View File

@ -78,7 +78,7 @@ public:
typedef LLOctreeTraveler<T> oct_traveler;
typedef LLTreeTraveler<T> tree_traveler;
typedef LLPointer<T>* element_list;
typedef std::vector<LLPointer<T>> element_list;
typedef LLPointer<T>* element_iter;
typedef const LLPointer<T>* const_element_iter;
typedef typename std::vector<LLTreeListener<T>*>::iterator tree_listener_iter;
@ -106,8 +106,9 @@ public:
: mParent((oct_node*)parent),
mOctant(octant)
{
mData = NULL;
mDataEnd = NULL;
//always keep a NULL terminated list to avoid out of bounds exceptions in debug builds
mData.push_back(NULL);
mDataEnd = &mData[0];
mCenter = center;
mSize = size;
@ -133,9 +134,9 @@ public:
mData[i] = NULL;
}
free(mData);
mData = NULL;
mDataEnd = NULL;
mData.clear();
mData.push_back(NULL);
mDataEnd = &mData[0];
for (U32 i = 0; i < getChildCount(); i++)
{
@ -239,9 +240,9 @@ public:
bool isEmpty() const { return mElementCount == 0; }
element_list& getData() { return mData; }
const element_list& getData() const { return mData; }
element_iter getDataBegin() { return mData; }
element_iter getDataBegin() { return &mData[0]; }
element_iter getDataEnd() { return mDataEnd; }
const_element_iter getDataBegin() const { return mData; }
const_element_iter getDataBegin() const { return &mData[0]; }
const_element_iter getDataEnd() const { return mDataEnd; }
U32 getChildCount() const { return mChildCount; }
@ -321,14 +322,10 @@ public:
if ((getElementCount() < gOctreeMaxCapacity && contains(data->getBinRadius()) ||
(data->getBinRadius() > getSize()[0] && parent && parent->getElementCount() >= gOctreeMaxCapacity)))
{ //it belongs here
mData.push_back(NULL);
mData[mElementCount] = data;
mElementCount++;
mData = (element_list) realloc(mData, sizeof(LLPointer<T>)*mElementCount);
//avoid unref on uninitialized memory
memset(mData+mElementCount-1, 0, sizeof(LLPointer<T>));
mData[mElementCount-1] = data;
mDataEnd = mData + mElementCount;
mDataEnd = &mData[mElementCount];
data->setBinIndex(mElementCount-1);
BaseType::insert(data);
return true;
@ -364,14 +361,10 @@ public:
if( lt == 0x7 )
{
mData.push_back(NULL);
mData[mElementCount] = data;
mElementCount++;
mData = (element_list) realloc(mData, sizeof(LLPointer<T>)*mElementCount);
//avoid unref on uninitialized memory
memset(mData+mElementCount-1, 0, sizeof(LLPointer<T>));
mData[mElementCount-1] = data;
mDataEnd = mData + mElementCount;
mDataEnd = &mData[mElementCount];
data->setBinIndex(mElementCount-1);
BaseType::insert(data);
return true;
@ -436,16 +429,15 @@ public:
mData[i]->setBinIndex(i);
}
mData[mElementCount] = NULL; //needed for unref
mData = (element_list) realloc(mData, sizeof(LLPointer<T>)*mElementCount);
mDataEnd = mData+mElementCount;
mData[mElementCount] = NULL;
mData.pop_back();
mDataEnd = &mData[mElementCount];
}
else
{
mData[0] = NULL; //needed for unref
free(mData);
mData = NULL;
mDataEnd = NULL;
mData.clear();
mData.push_back(NULL);
mDataEnd = &mData[0];
}
notifyRemoval(data);
@ -491,7 +483,7 @@ public:
}
//node is now root
llwarns << "!!! OCTREE REMOVING FACE BY ADDRESS, SEVERE PERFORMANCE PENALTY |||" << llendl;
llwarns << "!!! OCTREE REMOVING ELEMENT BY ADDRESS, SEVERE PERFORMANCE PENALTY |||" << llendl;
node->removeByAddress(data);
llassert(data->getBinIndex() == -1);
return true;

View File

@ -4680,55 +4680,63 @@ LLCullResult::LLCullResult()
mVisibleListAllocated = 0;
mVisibleBridgeAllocated = 0;
mVisibleGroups = NULL;
mVisibleGroupsEnd = NULL;
mAlphaGroups = NULL;
mAlphaGroupsEnd = NULL;
mOcclusionGroups = NULL;
mOcclusionGroupsEnd = NULL;
mDrawableGroups = NULL;
mDrawableGroupsEnd = NULL;
mVisibleList = NULL;
mVisibleListEnd = NULL;
mVisibleBridge = NULL;
mVisibleBridgeEnd = NULL;
mVisibleGroups.clear();
mVisibleGroups.push_back(NULL);
mVisibleGroupsEnd = &mVisibleGroups[0];
mAlphaGroups.clear();
mAlphaGroups.push_back(NULL);
mAlphaGroupsEnd = &mAlphaGroups[0];
mOcclusionGroups.clear();
mOcclusionGroups.push_back(NULL);
mOcclusionGroupsEnd = &mOcclusionGroups[0];
mDrawableGroups.clear();
mDrawableGroups.push_back(NULL);
mDrawableGroupsEnd = &mDrawableGroups[0];
mVisibleList.clear();
mVisibleList.push_back(NULL);
mVisibleListEnd = &mVisibleList[0];
mVisibleBridge.clear();
mVisibleBridge.push_back(NULL);
mVisibleBridgeEnd = &mVisibleBridge[0];
for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++)
{
mRenderMap[i] = NULL;
mRenderMapEnd[i] = NULL;
mRenderMap[i].clear();
mRenderMap[i].push_back(NULL);
mRenderMapEnd[i] = &mRenderMap[i][0];
mRenderMapAllocated[i] = 0;
}
clear();
}
void LLCullResult::pushBack(void**& head, U32& count, void* val)
template <class T, class V>
void LLCullResult::pushBack(T& head, U32& count, V* val)
{
head[count] = val;
head.push_back(NULL);
count++;
head = (void**) realloc((void*) head, sizeof(void*) * count);
head[count-1] = val;
}
void LLCullResult::clear()
{
mVisibleGroupsSize = 0;
mVisibleGroupsEnd = mVisibleGroups;
mVisibleGroupsEnd = &mVisibleGroups[0];
mAlphaGroupsSize = 0;
mAlphaGroupsEnd = mAlphaGroups;
mAlphaGroupsEnd = &mAlphaGroups[0];
mOcclusionGroupsSize = 0;
mOcclusionGroupsEnd = mOcclusionGroups;
mOcclusionGroupsEnd = &mOcclusionGroups[0];
mDrawableGroupsSize = 0;
mDrawableGroupsEnd = mDrawableGroups;
mDrawableGroupsEnd = &mDrawableGroups[0];
mVisibleListSize = 0;
mVisibleListEnd = mVisibleList;
mVisibleListEnd = &mVisibleList[0];
mVisibleBridgeSize = 0;
mVisibleBridgeEnd = mVisibleBridge;
mVisibleBridgeEnd = &mVisibleBridge[0];
for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++)
@ -4738,13 +4746,13 @@ void LLCullResult::clear()
mRenderMap[i][j] = 0;
}
mRenderMapSize[i] = 0;
mRenderMapEnd[i] = mRenderMap[i];
mRenderMapEnd[i] = &(mRenderMap[i][0]);
}
}
LLCullResult::sg_iterator LLCullResult::beginVisibleGroups()
{
return mVisibleGroups;
return &mVisibleGroups[0];
}
LLCullResult::sg_iterator LLCullResult::endVisibleGroups()
@ -4754,7 +4762,7 @@ LLCullResult::sg_iterator LLCullResult::endVisibleGroups()
LLCullResult::sg_iterator LLCullResult::beginAlphaGroups()
{
return mAlphaGroups;
return &mAlphaGroups[0];
}
LLCullResult::sg_iterator LLCullResult::endAlphaGroups()
@ -4764,7 +4772,7 @@ LLCullResult::sg_iterator LLCullResult::endAlphaGroups()
LLCullResult::sg_iterator LLCullResult::beginOcclusionGroups()
{
return mOcclusionGroups;
return &mOcclusionGroups[0];
}
LLCullResult::sg_iterator LLCullResult::endOcclusionGroups()
@ -4774,7 +4782,7 @@ LLCullResult::sg_iterator LLCullResult::endOcclusionGroups()
LLCullResult::sg_iterator LLCullResult::beginDrawableGroups()
{
return mDrawableGroups;
return &mDrawableGroups[0];
}
LLCullResult::sg_iterator LLCullResult::endDrawableGroups()
@ -4784,7 +4792,7 @@ LLCullResult::sg_iterator LLCullResult::endDrawableGroups()
LLCullResult::drawable_iterator LLCullResult::beginVisibleList()
{
return mVisibleList;
return &mVisibleList[0];
}
LLCullResult::drawable_iterator LLCullResult::endVisibleList()
@ -4794,7 +4802,7 @@ LLCullResult::drawable_iterator LLCullResult::endVisibleList()
LLCullResult::bridge_iterator LLCullResult::beginVisibleBridge()
{
return mVisibleBridge;
return &mVisibleBridge[0];
}
LLCullResult::bridge_iterator LLCullResult::endVisibleBridge()
@ -4804,7 +4812,7 @@ LLCullResult::bridge_iterator LLCullResult::endVisibleBridge()
LLCullResult::drawinfo_iterator LLCullResult::beginRenderMap(U32 type)
{
return mRenderMap[type];
return &mRenderMap[type][0];
}
LLCullResult::drawinfo_iterator LLCullResult::endRenderMap(U32 type)
@ -4820,10 +4828,10 @@ void LLCullResult::pushVisibleGroup(LLSpatialGroup* group)
}
else
{
pushBack((void**&) mVisibleGroups, mVisibleGroupsAllocated, (void*) group);
pushBack(mVisibleGroups, mVisibleGroupsAllocated, group);
}
++mVisibleGroupsSize;
mVisibleGroupsEnd = mVisibleGroups+mVisibleGroupsSize;
mVisibleGroupsEnd = &mVisibleGroups[mVisibleGroupsSize];
}
void LLCullResult::pushAlphaGroup(LLSpatialGroup* group)
@ -4834,10 +4842,10 @@ void LLCullResult::pushAlphaGroup(LLSpatialGroup* group)
}
else
{
pushBack((void**&) mAlphaGroups, mAlphaGroupsAllocated, (void*) group);
pushBack(mAlphaGroups, mAlphaGroupsAllocated, group);
}
++mAlphaGroupsSize;
mAlphaGroupsEnd = mAlphaGroups+mAlphaGroupsSize;
mAlphaGroupsEnd = &mAlphaGroups[mAlphaGroupsSize];
}
void LLCullResult::pushOcclusionGroup(LLSpatialGroup* group)
@ -4848,10 +4856,10 @@ void LLCullResult::pushOcclusionGroup(LLSpatialGroup* group)
}
else
{
pushBack((void**&) mOcclusionGroups, mOcclusionGroupsAllocated, (void*) group);
pushBack(mOcclusionGroups, mOcclusionGroupsAllocated, group);
}
++mOcclusionGroupsSize;
mOcclusionGroupsEnd = mOcclusionGroups+mOcclusionGroupsSize;
mOcclusionGroupsEnd = &mOcclusionGroups[mOcclusionGroupsSize];
}
void LLCullResult::pushDrawableGroup(LLSpatialGroup* group)
@ -4862,10 +4870,10 @@ void LLCullResult::pushDrawableGroup(LLSpatialGroup* group)
}
else
{
pushBack((void**&) mDrawableGroups, mDrawableGroupsAllocated, (void*) group);
pushBack(mDrawableGroups, mDrawableGroupsAllocated, group);
}
++mDrawableGroupsSize;
mDrawableGroupsEnd = mDrawableGroups+mDrawableGroupsSize;
mDrawableGroupsEnd = &mDrawableGroups[mDrawableGroupsSize];
}
void LLCullResult::pushDrawable(LLDrawable* drawable)
@ -4876,10 +4884,10 @@ void LLCullResult::pushDrawable(LLDrawable* drawable)
}
else
{
pushBack((void**&) mVisibleList, mVisibleListAllocated, (void*) drawable);
pushBack(mVisibleList, mVisibleListAllocated, drawable);
}
++mVisibleListSize;
mVisibleListEnd = mVisibleList+mVisibleListSize;
mVisibleListEnd = &mVisibleList[mVisibleListSize];
}
void LLCullResult::pushBridge(LLSpatialBridge* bridge)
@ -4890,10 +4898,10 @@ void LLCullResult::pushBridge(LLSpatialBridge* bridge)
}
else
{
pushBack((void**&) mVisibleBridge, mVisibleBridgeAllocated, (void*) bridge);
pushBack(mVisibleBridge, mVisibleBridgeAllocated, bridge);
}
++mVisibleBridgeSize;
mVisibleBridgeEnd = mVisibleBridge+mVisibleBridgeSize;
mVisibleBridgeEnd = &mVisibleBridge[mVisibleBridgeSize];
}
void LLCullResult::pushDrawInfo(U32 type, LLDrawInfo* draw_info)
@ -4904,10 +4912,10 @@ void LLCullResult::pushDrawInfo(U32 type, LLDrawInfo* draw_info)
}
else
{
pushBack((void**&) mRenderMap[type], mRenderMapAllocated[type], (void*) draw_info);
pushBack(mRenderMap[type], mRenderMapAllocated[type], draw_info);
}
++mRenderMapSize[type];
mRenderMapEnd[type] = mRenderMap[type] + mRenderMapSize[type];
mRenderMapEnd[type] = &(mRenderMap[type][mRenderMapSize[type]]);
}

View File

@ -567,10 +567,10 @@ class LLCullResult
public:
LLCullResult();
typedef LLSpatialGroup** sg_list_t;
typedef LLDrawable** drawable_list_t;
typedef LLSpatialBridge** bridge_list_t;
typedef LLDrawInfo** drawinfo_list_t;
typedef std::vector<LLSpatialGroup*> sg_list_t;
typedef std::vector<LLDrawable*> drawable_list_t;
typedef std::vector<LLSpatialBridge*> bridge_list_t;
typedef std::vector<LLDrawInfo*> drawinfo_list_t;
typedef LLSpatialGroup** sg_iterator;
typedef LLSpatialBridge** bridge_iterator;
@ -620,7 +620,7 @@ public:
private:
void pushBack(void** &head, U32& count, void* val);
template <class T, class V> void pushBack(T &head, U32& count, V* val);
U32 mVisibleGroupsSize;
U32 mAlphaGroupsSize;