瀏覽代碼

mesa: Always do proper ref counting of shared state.

undefined
José Fonseca 15 年之前
父節點
當前提交
1c39dbb90c
共有 3 個文件被更改,包括 34 次插入23 次删除
  1. 4
    20
      src/mesa/main/context.c
  2. 29
    2
      src/mesa/main/shared.c
  3. 1
    1
      src/mesa/main/shared.h

+ 4
- 20
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;
}

+ 29
- 2
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 );
}
}

+ 1
- 1
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

Loading…
取消
儲存