From 1c39dbb90cefad8a5a97e75042466d66ea4270bc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Mon, 1 Feb 2010 21:22:10 +0000 Subject: [PATCH] mesa: Always do proper ref counting of shared state. --- src/mesa/main/context.c | 24 ++++-------------------- src/mesa/main/shared.c | 31 +++++++++++++++++++++++++++++-- src/mesa/main/shared.h | 2 +- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 74c6ac4..fccce51 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -835,7 +835,7 @@ _mesa_initialize_context(GLcontext *ctx, _glthread_UNLOCK_MUTEX(shared->Mutex); if (!init_attrib_groups( ctx )) { - _mesa_free_shared_state(ctx, ctx->Shared); + _mesa_release_shared_state(ctx, ctx->Shared); return GL_FALSE; } @@ -843,7 +843,7 @@ _mesa_initialize_context(GLcontext *ctx, ctx->Exec = alloc_dispatch_table(); ctx->Save = alloc_dispatch_table(); if (!ctx->Exec || !ctx->Save) { - _mesa_free_shared_state(ctx, ctx->Shared); + _mesa_release_shared_state(ctx, ctx->Shared); if (ctx->Exec) _mesa_free(ctx->Exec); return GL_FALSE; @@ -933,8 +933,6 @@ _mesa_create_context(const GLvisual *visual, void _mesa_free_context_data( GLcontext *ctx ) { - GLint RefCount; - if (!_mesa_get_current_context()){ /* No current context, but we may need one in order to delete * texture objs, etc. So temporarily bind the context now. @@ -988,14 +986,7 @@ _mesa_free_context_data( GLcontext *ctx ) _mesa_free(ctx->Save); /* Shared context state (display lists, textures, etc) */ - _glthread_LOCK_MUTEX(ctx->Shared->Mutex); - RefCount = --ctx->Shared->RefCount; - _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); - assert(RefCount >= 0); - if (RefCount == 0) { - /* free shared state */ - _mesa_free_shared_state( ctx, ctx->Shared ); - } + _mesa_release_shared_state( ctx, ctx->Shared ); /* needs to be after freeing shared state */ _mesa_free_display_list_data(ctx); @@ -1397,7 +1388,6 @@ _mesa_share_state(GLcontext *ctx, GLcontext *ctxToShare) { if (ctx && ctxToShare && ctx->Shared && ctxToShare->Shared) { struct gl_shared_state *oldSharedState = ctx->Shared; - GLint RefCount; ctx->Shared = ctxToShare->Shared; @@ -1407,13 +1397,7 @@ _mesa_share_state(GLcontext *ctx, GLcontext *ctxToShare) update_default_objects(ctx); - _glthread_LOCK_MUTEX(oldSharedState->Mutex); - RefCount = --oldSharedState->RefCount; - _glthread_UNLOCK_MUTEX(oldSharedState->Mutex); - - if (RefCount == 0) { - _mesa_free_shared_state(ctx, oldSharedState); - } + _mesa_release_shared_state(ctx, oldSharedState); return GL_TRUE; } diff --git a/src/mesa/main/shared.c b/src/mesa/main/shared.c index 4d01e8ab..6cf63f6 100644 --- a/src/mesa/main/shared.c +++ b/src/mesa/main/shared.c @@ -288,8 +288,8 @@ delete_renderbuffer_cb(GLuint id, void *data, void *userData) * * \sa alloc_shared_state(). */ -void -_mesa_free_shared_state(GLcontext *ctx, struct gl_shared_state *shared) +static void +free_shared_state(GLcontext *ctx, struct gl_shared_state *shared) { GLuint i; @@ -368,3 +368,30 @@ _mesa_free_shared_state(GLcontext *ctx, struct gl_shared_state *shared) _mesa_free(shared); } + + +/** + * Decrement shared state object reference count and potentially free it + * and all children structures. + * + * \param ctx GL context. + * \param shared shared state pointer. + * + * \sa free_shared_state(). + */ +void +_mesa_release_shared_state(GLcontext *ctx, struct gl_shared_state *shared) +{ + GLint RefCount; + + _glthread_LOCK_MUTEX(shared->Mutex); + RefCount = --shared->RefCount; + _glthread_UNLOCK_MUTEX(shared->Mutex); + + assert(RefCount >= 0); + + if (RefCount == 0) { + /* free shared state */ + free_shared_state( ctx, shared ); + } +} diff --git a/src/mesa/main/shared.h b/src/mesa/main/shared.h index e59177e..ef164a1 100644 --- a/src/mesa/main/shared.h +++ b/src/mesa/main/shared.h @@ -31,7 +31,7 @@ _mesa_alloc_shared_state(GLcontext *ctx); void -_mesa_free_shared_state(GLcontext *ctx, struct gl_shared_state *shared); +_mesa_release_shared_state(GLcontext *ctx, struct gl_shared_state *shared); #endif -- 2.7.4