[Mesa-dev] [PATCH] glsl: Hook up loop_variable_state destructor to plug a memory leak.

Marcin Slusarz marcin.slusarz at gmail.com
Thu Jun 7 19:45:49 CEST 2012


On Thu, Jun 07, 2012 at 10:33:39AM -0700, Ian Romanick wrote:
> On 06/05/2012 04:01 PM, Kenneth Graunke wrote:
> > While ~loop_state() is already freeing the loop_variable_state objects
> > via ralloc_free(this->mem_ctx), the ~loop_variable_state() destructor
> > was never getting called, so the hash table inside loop_variable_state
> > was never getting destroyed.
> >
> > Fixes a memory leak in any shader with loops.
> >
> > NOTE: This is a candidate for stable release branches.
> >
> > Signed-off-by: Kenneth Graunke<kenneth at whitecape.org>
> > ---
> >   src/glsl/loop_analysis.h |   17 +++++++++++++++++
> >   1 file changed, 17 insertions(+)
> >
> > diff --git a/src/glsl/loop_analysis.h b/src/glsl/loop_analysis.h
> > index 8bed1db..05c982f 100644
> > --- a/src/glsl/loop_analysis.h
> > +++ b/src/glsl/loop_analysis.h
> > @@ -140,6 +140,23 @@ public:
> >      {
> >         hash_table_dtor(this->var_hash);
> >      }
> > +
> > +   static void* operator new(size_t size, void *ctx)
> > +   {
> > +      void *lvs = ralloc_size(ctx, size);
> > +      assert(lvs != NULL);
> > +
> > +      ralloc_set_destructor(lvs, (void (*)(void*)) destructor);
> > +
> > +      return lvs;
> > +   }
> > +
> > +private:
> > +   static void
> > +   destructor(loop_variable_state *lvs)
> > +   {
> > +      lvs->~loop_variable_state();
> > +   }
> >   };
> >
> >
> 
> This just looks wrong. :) Would it be better to have the real destructor 
> code here and ~loop_variable_state call this->destructor?

Nope, this->destructor, when called from ralloc_free, would not call destructors
for this->fields.

Marcin


More information about the mesa-dev mailing list