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

Kenneth Graunke kenneth at whitecape.org
Thu Jun 7 20:00:38 CEST 2012


On 06/07/2012 10:33 AM, 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. :)

Not disagreeing, however, see glsl_symbol_table.h.  It's the exact same
method we already use.

> Would it be better to have the real destructor
> code here and ~loop_variable_state call this->destructor?
> 
> In my dream of dreams, we'd be able to either allocate objects via
> ralloc or allocate (automatic) objects on the stack.

Yeah.


More information about the mesa-dev mailing list