cyclonedds icon indicating copy to clipboard operation
cyclonedds copied to clipboard

dds_take memory leak

Open gxl1457628736 opened this issue 4 months ago • 9 comments

static void subscriber_available_callback(dds_entity_t reader, void *arg)
{
    #define MAXCOUNT 10
    int samples_received;
    void *samples[MAXCOUNT] = { nullptr };
    dds_sample_info_t info[MAXCOUNT];
    std::memset(info, 0, sizeof(info));
    // samples[0] = Sensor_GNav_tGNavSensor__alloc();
    CIoxSensorCore *IoxSensorCore = (CIoxSensorCore *)arg;

    samples_received = dds_take(reader, samples, info, MAXCOUNT, MAXCOUNT);
    if (samples_received < 0)
    {
        printf("dds_take: %s\n", dds_strretcode(-samples_received));
    }
    for (int i = 0; i < samples_received; i++)
    {
        if (info[i].valid_data)
        {
            // 获取topic名
            auto iter = IoxSensorCore->m_reader_map.find(reader);

            if (iter != IoxSensorCore->m_reader_map.end())
            {
                char *topic_name = const_cast<char *>(iter->second.c_str());
                printf("topic[%s] trigger callback.. index[%d]\n", topic_name, info[i].source_timestamp);

                // 调用用户提供的回调函数
                if (IoxSensorCore->m_subscriber_callback != NULL)
                {
                    IoxSensorCore->m_subscriber_callback(info[i].source_timestamp, (void *)samples[i], topic_name);
                }
                
            }
        }
    }
    // dds_return_loan(reader, samples, samples_received);//dds_take完后一定要调用此函数进行内存回收
}

When using cycleddds for shared memory communication, the dds_take call caused a memory leak. After trying, it is necessary to manually call dds_turn_Loan for memory recovery. But I noticed that the example/shmsubscriber. c you provided did not call this function for memory recycling processing But when I was writing data in publisher, I didn't call dds_land_stample, and I'm not sure if this is the cause

gxl1457628736 avatar Oct 09 '24 09:10 gxl1457628736