You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Andris Mednis (Commented) (JIRA)" <ji...@apache.org> on 2012/03/29 18:12:28 UTC
[jira] [Commented] (THRIFT-1389) c_glib_generator.cc generates
leaking code for cassandra_client_get_slice() and cassandra_client_get()
[ https://issues.apache.org/jira/browse/THRIFT-1389?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13241350#comment-13241350 ]
Andris Mednis commented on THRIFT-1389:
---------------------------------------
The fix in t_c_glib_generator.cc proposed by Jerry Gally helped to fix memory leak when Thrift 0.7.0 was used to generate files for connecting to Cassandra 1.0.7 from a C application. Does anybody know why the fix is not included in Thrift?
> 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
>
> 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,:
> <... snip>
> 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)
> <\snip ...>
> When the object of TYPE_COLUMN_OR_SUPER_COLUMN is instantiated, it in-turn instantiates a child of TYPE_COLUMN:
> <... snip>
> 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;
> </snip ...>
> 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:
> <... snip>
> 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)
> </snip ...>
> The above snippits/logic/leak described above for cassandra_client_get_slice() also apply for cassandra_client_get().
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira