[Mesa-dev] [PATCH 13/13] mesa/main: Verify context creation on progress

Pohjolainen, Topi topi.pohjolainen at intel.com
Fri May 8 06:18:07 PDT 2015


On Fri, May 08, 2015 at 03:23:52PM +0300, Juha-Pekka Heikkil? wrote:
>    perjantai 8. toukokuuta 2015 Ian Romanick <idr at freedesktop.org> kirjoitti:
> 
>      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.
> 
>    Yes, Ian got it correct. When moving mutex creation here there is no need
>    to go checking about it if need to clean up. I though this makes things
>    more clean and simple.

As it can't fail, I would have moved it right before the return in the
success path. Saves you from adding the mutex tear-down in the failure path.

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