[ 
https://issues.apache.org/jira/browse/THRIFT-4873?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jens Geyer resolved THRIFT-4873.
--------------------------------
    Fix Version/s: 0.14.0
         Assignee: Jens Geyer
       Resolution: Duplicate

> Memory leak in c_glib
> ---------------------
>
>                 Key: THRIFT-4873
>                 URL: https://issues.apache.org/jira/browse/THRIFT-4873
>             Project: Thrift
>          Issue Type: Bug
>          Components: C glib - Compiler
>    Affects Versions: 0.11.0, 0.12.0, 0.13.0
>            Reporter: Matej Kupljen
>            Assignee: Jens Geyer
>            Priority: Major
>             Fix For: 0.14.0
>
>
> Using the following thrift definition, compiler generates code that is 
> leaking memory:
> {code:java}
> enum Command {                                                                
>   
>         CMD_A = 0,                                                            
>   
>         CMD_B = 0,                                                            
>   
>         CMD_C = 0,                                                            
>   
> }                                                                             
>   
>                                                                               
>   
> struct CommandRequest {                                                       
>   
>         1: string id;                                                         
>   
>         2: i32 type;                                                          
>   
>         3: list<Command> commands;                                            
>   
> }  
> {code}
> Since we use Enum element for the list, compiler uses GArray for that, like:
> {code}
> struct _CommandRequest                                                        
>   
> {                                                                             
>   
>   ThriftStruct parent;                                                        
>   
>                                                                               
>   
>   /* public */                                                                
>   
>   gchar * id;                                                                 
>   
>   gboolean __isset_id;                                                        
>   
>   gint32 type;                                                                
>   
>   gboolean __isset_type;                                                      
>   
>   GArray * commands;                                                          
>   
>   gboolean __isset_commands;                                                  
>   
> };                                                                            
>   
> typedef struct _CommandRequest CommandRequest;
> {code}
> However, when reading the object from stream, it allocates memory for every 
> element that it reads:
> {code}
>             for (i = 0; i < size; i++)                                        
>   
>             {                                                                 
>   
>               Command* _elem0 = g_new (Command, 1);                           
>   
>               gint32 ecast1;                                                  
>   
>               if ((ret = thrift_protocol_read_i32 (protocol, &ecast1, error)) 
> < 0)
>                 return -1;                                                    
>   
>               xfer += ret;                                                    
>   
>               *_elem0 = (Command)ecast1;                                      
>   
>               g_array_append_vals (this_object->commands, _elem0, 1);         
>   
>             } 
> {code}
> Although when clearing this element with g_array_unref, this does not free 
> memory.
>  From Glib documentation we should set g_array_clear_func() if we want to 
> free memory allocated for elements:
> {quote}If array contents point to dynamically-allocated memory, they should 
> be freed separately if free_seg is TRUE and no clear_func function has been 
> set for array .
> {quote}
> But I believe the best option would be just to read the elements into int and 
> casting it to proper type, without allocating memory.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to