[Mesa-dev] [PATCH 13/13] mesa/main: Verify context creation on progress
Ian Romanick
idr at freedesktop.org
Thu May 7 14:23:58 PDT 2015
On 05/07/2015 05:21 AM, Pohjolainen, Topi wrote:
> On Tue, May 05, 2015 at 02:25:29PM +0300, Juha-Pekka Heikkila wrote:
>> Stop context creation if something failed. If something errored
>> during context creation we'd segfault. Now will clean up and
>> return error.
>>
>> Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
>> ---
>> src/mesa/main/shared.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++---
>> 1 file changed, 62 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/mesa/main/shared.c b/src/mesa/main/shared.c
>> index 0b76cc0..cc05b05 100644
>> --- a/src/mesa/main/shared.c
>> +++ b/src/mesa/main/shared.c
>> @@ -64,9 +64,21 @@ _mesa_alloc_shared_state(struct gl_context *ctx)
>>
>> mtx_init(&shared->Mutex, mtx_plain);
>>
>> + /* Mutex and timestamp for texobj state validation */
>> + mtx_init(&shared->TexMutex, mtx_recursive);
>> + shared->TextureStateStamp = 0;
>
> Do you really need to move this here?
I was going to ask the same thing. I think moving it here means that it
can be unconditionally mtx_destroy'ed in the error path below.
>> +
>> shared->DisplayList = _mesa_NewHashTable();
>> + if (!shared->DisplayList)
>> + goto error_out;
>> +
>> shared->TexObjects = _mesa_NewHashTable();
>> + if (!shared->TexObjects)
>> + goto error_out;
>> +
>> shared->Programs = _mesa_NewHashTable();
>> + if (!shared->Programs)
>> + goto error_out;
>>
>> shared->DefaultVertexProgram =
>> gl_vertex_program(ctx->Driver.NewProgram(ctx,
>> @@ -76,17 +88,28 @@ _mesa_alloc_shared_state(struct gl_context *ctx)
>> GL_FRAGMENT_PROGRAM_ARB, 0));
>>
>> shared->ATIShaders = _mesa_NewHashTable();
>> + if (!shared->ATIShaders)
>> + goto error_out;
>> +
>> shared->DefaultFragmentShader = _mesa_new_ati_fragment_shader(ctx, 0);
>>
>> shared->ShaderObjects = _mesa_NewHashTable();
>> + if (!shared->ShaderObjects)
>> + goto error_out;
>>
>> shared->BufferObjects = _mesa_NewHashTable();
>> + if (!shared->BufferObjects)
>> + goto error_out;
>>
>> /* GL_ARB_sampler_objects */
>> shared->SamplerObjects = _mesa_NewHashTable();
>> + if (!shared->SamplerObjects)
>> + goto error_out;
>>
>> /* Allocate the default buffer object */
>> shared->NullBufferObj = ctx->Driver.NewBufferObject(ctx, 0);
>> + if (!shared->NullBufferObj)
>> + goto error_out;
>>
>> /* Create default texture objects */
>> for (i = 0; i < NUM_TEXTURE_TARGETS; i++) {
>> @@ -107,22 +130,57 @@ _mesa_alloc_shared_state(struct gl_context *ctx)
>> };
>> STATIC_ASSERT(ARRAY_SIZE(targets) == NUM_TEXTURE_TARGETS);
>> shared->DefaultTex[i] = ctx->Driver.NewTextureObject(ctx, 0, targets[i]);
>> +
>> + if (!shared->DefaultTex[i])
>> + goto error_out;
>> }
>>
>> /* sanity check */
>> assert(shared->DefaultTex[TEXTURE_1D_INDEX]->RefCount == 1);
>>
>> - /* Mutex and timestamp for texobj state validation */
>> - mtx_init(&shared->TexMutex, mtx_recursive);
>> - shared->TextureStateStamp = 0;
>> -
>> shared->FrameBuffers = _mesa_NewHashTable();
>> + if (!shared->FrameBuffers)
>> + goto error_out;
>> +
>> shared->RenderBuffers = _mesa_NewHashTable();
>> + if (!shared->RenderBuffers)
>> + goto error_out;
>>
>> shared->SyncObjects = _mesa_set_create(NULL, _mesa_hash_pointer,
>> _mesa_key_pointer_equal);
>> + if (!shared->SyncObjects)
>> + goto error_out;
>>
>> return shared;
>> +
>> +error_out:
>> + for (i = 0; i < NUM_TEXTURE_TARGETS; i++) {
>> + if (shared->DefaultTex[i]) {
>> + ctx->Driver.DeleteTexture(ctx, shared->DefaultTex[i]);
>> + }
>> + }
>> +
>> + _mesa_reference_buffer_object(ctx, &shared->NullBufferObj, NULL);
>> +
>> + _mesa_DeleteHashTable(shared->RenderBuffers);
>> + _mesa_DeleteHashTable(shared->FrameBuffers);
>> + _mesa_DeleteHashTable(shared->SamplerObjects);
>> + _mesa_DeleteHashTable(shared->BufferObjects);
>> + _mesa_DeleteHashTable(shared->ShaderObjects);
>> + _mesa_DeleteHashTable(shared->ATIShaders);
>> + _mesa_DeleteHashTable(shared->Programs);
>> + _mesa_DeleteHashTable(shared->TexObjects);
>> + _mesa_DeleteHashTable(shared->DisplayList);
>> +
>> + _mesa_reference_vertprog(ctx, &shared->DefaultVertexProgram, NULL);
>> + _mesa_reference_geomprog(ctx, &shared->DefaultGeometryProgram, NULL);
>> + _mesa_reference_fragprog(ctx, &shared->DefaultFragmentProgram, NULL);
>> +
>> + mtx_destroy(&shared->Mutex);
>> + mtx_destroy(&shared->TexMutex);
>> +
>> + free(shared);
>> + return NULL;
>> }
>>
>>
>> --
>> 1.8.5.1
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list