[systemd-devel] sd_bus_process() + sd_bus_wait() is it not suitable for application?

Stephen Hemminger stephen at networkplumber.org
Mon Jan 24 20:53:46 UTC 2022


On Mon, 24 Jan 2022 10:33:58 +0800 (CST)
www  <ouyangxuan10 at 163.com> 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" <dbn at endlessos.org> 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 <ouyangxuan10 at 163.com> 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" <ouyangxuan10 at 163.com> 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.





More information about the systemd-devel mailing list