[
https://issues.apache.org/jira/browse/THRIFT-1389?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Simon South updated THRIFT-1389:
--------------------------------
Description:
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()}}.
was:
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().
> 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:
> {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)