mesa: Reads must also be done with lock held.
authorJosé Fonseca <jfonseca@vmware.com>
Fri, 6 Mar 2009 14:02:42 +0000 (14:02 +0000)
committerJosé Fonseca <jfonseca@vmware.com>
Fri, 6 Mar 2009 14:03:04 +0000 (14:03 +0000)
Otherwise two threads might think each made the refcount go zero.

src/mesa/main/context.c

index 27fc26a2a42cf6660d3d85a76f42b529edfdee90..05b19a43500230f07b99a5697f54933a4f510371 100644 (file)
@@ -1310,6 +1310,8 @@ _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.
@@ -1361,10 +1363,10 @@ _mesa_free_context_data( GLcontext *ctx )
 
    /* Shared context state (display lists, textures, etc) */
    _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
-   ctx->Shared->RefCount--;
-   assert(ctx->Shared->RefCount >= 0);
+   RefCount = --ctx->Shared->RefCount;
    _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
-   if (ctx->Shared->RefCount == 0) {
+   assert(RefCount >= 0);
+   if (RefCount == 0) {
       /* free shared state */
       free_shared_state( ctx, ctx->Shared );
    }