On Mon, 24 Jan 2022 10:33:58 +0800 (CST)
www  <[email protected]> wrote:

> 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);
> }

Try valgrind or address-sanitizer, they often work to find leaks.

Also better to pass UINT64_MAX instead of -1 to sd_bus_wait() since it takes 
uint64_t for the timeout.



Reply via email to