FIX VWR-25609: crash on shutdown in LLGLNamePool::sInstances destructor
parent
4bc90f24b3
commit
d4b9db012e
|
|
@ -105,7 +105,6 @@ LLMatrix4 gGLObliqueProjectionInverse;
|
|||
|
||||
#define LL_GL_NAME_POOLING 0
|
||||
|
||||
LLGLNamePool::pool_list_t LLGLNamePool::sInstances;
|
||||
std::list<LLGLUpdate*> LLGLUpdate::sGLQ;
|
||||
|
||||
#if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS
|
||||
|
|
@ -1920,22 +1919,8 @@ LLGLNamePool::LLGLNamePool()
|
|||
{
|
||||
}
|
||||
|
||||
void LLGLNamePool::registerPool(LLGLNamePool* pool)
|
||||
{
|
||||
pool_list_t::iterator iter = std::find(sInstances.begin(), sInstances.end(), pool);
|
||||
if (iter == sInstances.end())
|
||||
{
|
||||
sInstances.push_back(pool);
|
||||
}
|
||||
}
|
||||
|
||||
LLGLNamePool::~LLGLNamePool()
|
||||
{
|
||||
pool_list_t::iterator iter = std::find(sInstances.begin(), sInstances.end(), this);
|
||||
if (iter != sInstances.end())
|
||||
{
|
||||
sInstances.erase(iter);
|
||||
}
|
||||
}
|
||||
|
||||
void LLGLNamePool::upkeep()
|
||||
|
|
@ -2004,20 +1989,22 @@ void LLGLNamePool::release(GLuint name)
|
|||
void LLGLNamePool::upkeepPools()
|
||||
{
|
||||
LLMemType mt(LLMemType::MTYPE_UPKEEP_POOLS);
|
||||
for (pool_list_t::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
|
||||
tracker_t::LLInstanceTrackerScopedGuard guard;
|
||||
for (tracker_t::instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); ++iter)
|
||||
{
|
||||
LLGLNamePool* pool = *iter;
|
||||
pool->upkeep();
|
||||
LLGLNamePool & pool = *iter;
|
||||
pool.upkeep();
|
||||
}
|
||||
}
|
||||
|
||||
//static
|
||||
void LLGLNamePool::cleanupPools()
|
||||
{
|
||||
for (pool_list_t::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
|
||||
tracker_t::LLInstanceTrackerScopedGuard guard;
|
||||
for (tracker_t::instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); ++iter)
|
||||
{
|
||||
LLGLNamePool* pool = *iter;
|
||||
pool->cleanup();
|
||||
LLGLNamePool & pool = *iter;
|
||||
pool.cleanup();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@
|
|||
#include "v4math.h"
|
||||
#include "llplane.h"
|
||||
#include "llgltypes.h"
|
||||
#include "llinstancetracker.h"
|
||||
|
||||
#include "llglheaders.h"
|
||||
#include "glh/glh_linear.h"
|
||||
|
|
@ -328,9 +329,11 @@ public:
|
|||
Generic pooling scheme for things which use GL names (used for occlusion queries and vertex buffer objects).
|
||||
Prevents thrashing of GL name caches by avoiding calls to glGenFoo and glDeleteFoo.
|
||||
*/
|
||||
class LLGLNamePool
|
||||
class LLGLNamePool : public LLInstanceTracker<LLGLNamePool>
|
||||
{
|
||||
public:
|
||||
typedef LLInstanceTracker<LLGLNamePool> tracker_t;
|
||||
|
||||
struct NameEntry
|
||||
{
|
||||
GLuint name;
|
||||
|
|
@ -357,13 +360,11 @@ public:
|
|||
GLuint allocate();
|
||||
void release(GLuint name);
|
||||
|
||||
static void registerPool(LLGLNamePool* pool);
|
||||
static void upkeepPools();
|
||||
static void cleanupPools();
|
||||
|
||||
protected:
|
||||
typedef std::vector<LLGLNamePool*> pool_list_t;
|
||||
static pool_list_t sInstances;
|
||||
|
||||
virtual GLuint allocateName() = 0;
|
||||
virtual void releaseName(GLuint name) = 0;
|
||||
|
|
|
|||
|
|
@ -323,10 +323,6 @@ void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping)
|
|||
}
|
||||
|
||||
sDisableVBOMapping = sEnableVBOs && no_vbo_mapping ;
|
||||
LLGLNamePool::registerPool(&sDynamicVBOPool);
|
||||
LLGLNamePool::registerPool(&sDynamicIBOPool);
|
||||
LLGLNamePool::registerPool(&sStreamVBOPool);
|
||||
LLGLNamePool::registerPool(&sStreamIBOPool);
|
||||
}
|
||||
|
||||
//static
|
||||
|
|
|
|||
|
|
@ -1635,8 +1635,6 @@ LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32
|
|||
mSlopRatio = 0.25f;
|
||||
mInfiniteFarClip = FALSE;
|
||||
|
||||
LLGLNamePool::registerPool(&sQueryPool);
|
||||
|
||||
mOctree = new LLSpatialGroup::OctreeRoot(LLVector3d(0,0,0),
|
||||
LLVector3d(1,1,1),
|
||||
NULL);
|
||||
|
|
|
|||
Loading…
Reference in New Issue