[ https://issues.apache.org/jira/browse/THRIFT-1389?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Simon South updated THRIFT-1389: -------------------------------- Fix Version/s: 0.9 > c_glib_generator.cc generates leaking code for cassandra_client_get_slice() > and cassandra_client_get() > ------------------------------------------------------------------------------------------------------ > > Key: THRIFT-1389 > URL: https://issues.apache.org/jira/browse/THRIFT-1389 > Project: Thrift > Issue Type: Bug > Components: C glib - Compiler, C glib - Library > Affects Versions: 0.6.1 > Environment: Used with Cassandra 0.8.4 on Linux 2.6.32 with x86_64 > Reporter: Jerry Gally > Assignee: Simon South > Fix For: 0.9 > > > The generated cassandra.c {{cassandra_client_recv_get_slice()}} code for list > processing instantiates an object of {{TYPE_COLUMN_OR_SUPER_COLUMN}} then > calls {{thrift_struct_read()}} as in the following code snippet: > {noformat} > switch (fid) > { > case 0: > if (ftype == T_LIST) > { > { > guint32 size; > ThriftType element_type; > if ((ret = thrift_protocol_read_list_begin (protocol, > &element_type, &size, error)) < 0) > return 0; > xfer += ret; > /* iterate through list elements */ > guint32 i; > for (i = 0; i < size; i++) > { > ColumnOrSuperColumn * _elem19; > _elem19 = g_object_new (TYPE_COLUMN_OR_SUPER_COLUMN, NULL); > //printf("\nrecv_slice made %p\n", _elem19->column); > if ((ret = thrift_struct_read (THRIFT_STRUCT (_elem19), > protocol, error)) < 0) > {noformat} > When the object of {{TYPE_COLUMN_OR_SUPER_COLUMN}} is instantiated, it in > turn instantiates a child of {{TYPE_COLUMN}}: > {noformat} > void > column_or_super_column_instance_init (ColumnOrSuperColumn * object) > { > /* satisfy -Wall */ > THRIFT_UNUSED_VAR (object); > object->column = g_object_new (TYPE_COLUMN, NULL); > object->__isset_column = FALSE; > {noformat} > But this instance reference is lost and replaced by a new {{TYPE_COLUMN}} > instantiation reference when the column member is read by > {{column_or_super_column_read()}} within the same execution context of the > top level {{cassandra_client_recv_get_slice()}} call: > {noformat} > switch (fid) > { > case 1: > if (ftype == T_STRUCT) > { > this_object->column = g_object_new (TYPE_COLUMN, NULL); > if ((ret = thrift_struct_read (THRIFT_STRUCT (this_object->column), > protocol, error)) < 0) > {noformat} > The above snippets/logic/leak described above for > {{cassandra_client_get_slice()}} also apply for {{cassandra_client_get()}}. -- This message was sent by Atlassian JIRA (v6.3.4#6332)