Hi,


When the busctl command is used to call the method corresponding to this 
function, the memory used by the process will increase after 65 ~ 70 times. If 
continue to call, the memory usage will continue to increase.
Refer to the method in SYSTEMd. (such as: ListUnits, GetDynamicUsers)


Thanks,
Byron










At 2022-01-22 22:25:35, "Dan Nicholson" <[email protected]> wrote:

Aren't your leaking reply there? You don't seem to be unreffing it and it's not 
being returned to someone else to do it either.


On Sat, Jan 22, 2022, 3:12 AM www <[email protected]> wrote:

+Add the implementation code of the method.


static int method_load_info(sd_bus_message *message, void *userdata, sd_bus_err 
*error)
{
    sd_bus_message *reply = NULL;
    ......
    r = sd_bus_message_read(message. "r", &xxx);
    ......
    r= sd_bus_message_new_return(message, &reply);     //
    ......
    r = sd_bus_message_open_container(reply, 'a', "(uuuu)");
    ....
    r = sd_bus_message_append(reply, "(uuuu)", xx, xx ,xx ,xx);
    ......
    r = sd_bus_message_close_container(reply);
    .......


    return sd_bus_send(NULL, reply, NULL);
}




Thanks,
Byron



At 2022-01-22 14:16:13, "www" <[email protected]> wrote:

Dear all,


When using sd_bus_process() + sd_bus_wait()  to implement the 
application(Service), call the methods function on the service can obtain the 
correct information.  Run a certain number of times will lead to insufficient 
memory and memleak does occur. 


It should not be a problem with the DBUS method, because a single call does not 
increase memory, it needs to call the method 65 ~ 70 times, and you will see 
the memory increase. After stopping the call, the memory will not decrease. It 
seems that it has nothing to do with the time interval when the method is 
called.


code implementation:
int main()
{
    ......
    r = sd_bus_open_system(&bus);
    ...
    r = sd_bus_add_object_vtable(bus, ......);
    ......
    r= sd_bus_request_name(bus, "xxx.xx.xx.xxx");
    ......


    for( ; ; )
    {
        r = sd_bus_process(bus, NULL);
        .......
        r = sd_bus_wait(bus, -1);
        ......
    }
    sd_bus_slot_unref(slot);
    sd_bus_unref(bus);
}


thanks,
Byron








 

Reply via email to