[Mesa-dev] [PATCH 1/3] mesa: add NULL checking to free_shared_state()

Timothy Arceri tarceri at itsqueeze.com
Wed Jul 26 01:11:00 UTC 2017


This will allow us to call this function from
_mesa_alloc_shared_state() in the case that we run out of memory
part way through allocating the state.
---
 src/mesa/main/shared.c          | 88 +++++++++++++++++++++++++++--------------
 src/mesa/main/texturebindless.c |  8 +++-
 2 files changed, 65 insertions(+), 31 deletions(-)

diff --git a/src/mesa/main/shared.c b/src/mesa/main/shared.c
index 6926d40..4bc93a7 100644
--- a/src/mesa/main/shared.c
+++ b/src/mesa/main/shared.c
@@ -322,46 +322,73 @@ free_shared_state(struct gl_context *ctx, struct gl_shared_state *shared)
    /*
     * Free display lists
     */
-   _mesa_HashDeleteAll(shared->DisplayList, delete_displaylist_cb, ctx);
-   _mesa_DeleteHashTable(shared->DisplayList);
-   _mesa_HashDeleteAll(shared->BitmapAtlas, delete_bitmap_atlas_cb, ctx);
-   _mesa_DeleteHashTable(shared->BitmapAtlas);
+   if (shared->DisplayList) {
+      _mesa_HashDeleteAll(shared->DisplayList, delete_displaylist_cb, ctx);
+      _mesa_DeleteHashTable(shared->DisplayList);
+   }
+
+   if (shared->BitmapAtlas) {
+      _mesa_HashDeleteAll(shared->BitmapAtlas, delete_bitmap_atlas_cb, ctx);
+      _mesa_DeleteHashTable(shared->BitmapAtlas);
+   }
 
-   _mesa_HashWalk(shared->ShaderObjects, free_shader_program_data_cb, ctx);
-   _mesa_HashDeleteAll(shared->ShaderObjects, delete_shader_cb, ctx);
-   _mesa_DeleteHashTable(shared->ShaderObjects);
+   if (shared->ShaderObjects) {
+      _mesa_HashWalk(shared->ShaderObjects, free_shader_program_data_cb, ctx);
+      _mesa_HashDeleteAll(shared->ShaderObjects, delete_shader_cb, ctx);
+      _mesa_DeleteHashTable(shared->ShaderObjects);
+   }
 
-   _mesa_HashDeleteAll(shared->Programs, delete_program_cb, ctx);
-   _mesa_DeleteHashTable(shared->Programs);
+   if (shared->Programs) {
+      _mesa_HashDeleteAll(shared->Programs, delete_program_cb, ctx);
+      _mesa_DeleteHashTable(shared->Programs);
+   }
 
-   _mesa_reference_program(ctx, &shared->DefaultVertexProgram, NULL);
-   _mesa_reference_program(ctx, &shared->DefaultFragmentProgram, NULL);
+   if (shared->DefaultVertexProgram)
+      _mesa_reference_program(ctx, &shared->DefaultVertexProgram, NULL);
 
-   _mesa_HashDeleteAll(shared->ATIShaders, delete_fragshader_cb, ctx);
-   _mesa_DeleteHashTable(shared->ATIShaders);
-   _mesa_delete_ati_fragment_shader(ctx, shared->DefaultFragmentShader);
+   if (shared->DefaultFragmentProgram)
+      _mesa_reference_program(ctx, &shared->DefaultFragmentProgram, NULL);
 
-   _mesa_HashDeleteAll(shared->BufferObjects, delete_bufferobj_cb, ctx);
-   _mesa_DeleteHashTable(shared->BufferObjects);
+   if (shared->DefaultFragmentShader)
+      _mesa_delete_ati_fragment_shader(ctx, shared->DefaultFragmentShader);
 
-   _mesa_HashDeleteAll(shared->FrameBuffers, delete_framebuffer_cb, ctx);
-   _mesa_DeleteHashTable(shared->FrameBuffers);
-   _mesa_HashDeleteAll(shared->RenderBuffers, delete_renderbuffer_cb, ctx);
-   _mesa_DeleteHashTable(shared->RenderBuffers);
+   if (shared->ATIShaders) {
+      _mesa_HashDeleteAll(shared->ATIShaders, delete_fragshader_cb, ctx);
+      _mesa_DeleteHashTable(shared->ATIShaders);
+   }
 
-   _mesa_reference_buffer_object(ctx, &shared->NullBufferObj, NULL);
+   if (shared->BufferObjects) {
+      _mesa_HashDeleteAll(shared->BufferObjects, delete_bufferobj_cb, ctx);
+      _mesa_DeleteHashTable(shared->BufferObjects);
+   }
 
-   {
-      struct set_entry *entry;
+   if (shared->FrameBuffers) {
+      _mesa_HashDeleteAll(shared->FrameBuffers, delete_framebuffer_cb, ctx);
+      _mesa_DeleteHashTable(shared->FrameBuffers);
+   }
+
+   if (shared->RenderBuffers) {
+      _mesa_HashDeleteAll(shared->RenderBuffers, delete_renderbuffer_cb, ctx);
+      _mesa_DeleteHashTable(shared->RenderBuffers);
+   }
+
+   if (shared->NullBufferObj)
+      _mesa_reference_buffer_object(ctx, &shared->NullBufferObj, NULL);
 
+   if (shared->SyncObjects) {
+      struct set_entry *entry;
       set_foreach(shared->SyncObjects, entry) {
          _mesa_unref_sync_object(ctx, (struct gl_sync_object *) entry->key, 1);
       }
+
+      _mesa_set_destroy(shared->SyncObjects, NULL);
    }
-   _mesa_set_destroy(shared->SyncObjects, NULL);
 
-   _mesa_HashDeleteAll(shared->SamplerObjects, delete_sampler_object_cb, ctx);
-   _mesa_DeleteHashTable(shared->SamplerObjects);
+   if (shared->SamplerObjects) {
+      _mesa_HashDeleteAll(shared->SamplerObjects, delete_sampler_object_cb,
+                          ctx);
+      _mesa_DeleteHashTable(shared->SamplerObjects);
+   }
 
    /*
     * Free texture objects (after FBOs since some textures might have
@@ -370,12 +397,15 @@ free_shared_state(struct gl_context *ctx, struct gl_shared_state *shared)
    assert(ctx->Driver.DeleteTexture);
    /* the default textures */
    for (i = 0; i < NUM_TEXTURE_TARGETS; i++) {
-      ctx->Driver.DeleteTexture(ctx, shared->DefaultTex[i]);
+      if (shared->DefaultTex[i])
+         ctx->Driver.DeleteTexture(ctx, shared->DefaultTex[i]);
    }
 
    /* all other textures */
-   _mesa_HashDeleteAll(shared->TexObjects, delete_texture_cb, ctx);
-   _mesa_DeleteHashTable(shared->TexObjects);
+   if (shared->TexObjects) {
+      _mesa_HashDeleteAll(shared->TexObjects, delete_texture_cb, ctx);
+      _mesa_DeleteHashTable(shared->TexObjects);
+   }
 
    _mesa_free_shared_handles(shared);
 
diff --git a/src/mesa/main/texturebindless.c b/src/mesa/main/texturebindless.c
index cb95ed0..f062ea9 100644
--- a/src/mesa/main/texturebindless.c
+++ b/src/mesa/main/texturebindless.c
@@ -394,8 +394,12 @@ _mesa_init_shared_handles(struct gl_shared_state *shared)
 void
 _mesa_free_shared_handles(struct gl_shared_state *shared)
 {
-   _mesa_hash_table_u64_destroy(shared->TextureHandles, NULL);
-   _mesa_hash_table_u64_destroy(shared->ImageHandles, NULL);
+   if (shared->TextureHandles)
+      _mesa_hash_table_u64_destroy(shared->TextureHandles, NULL);
+
+   if (shared->ImageHandles)
+      _mesa_hash_table_u64_destroy(shared->ImageHandles, NULL);
+
    mtx_destroy(&shared->HandlesMutex);
 }
 
-- 
2.9.4



More information about the mesa-dev mailing list