FWIW I’ve noticed the same thing with as-event https://github.com/systemd/systemd/issues/22046
I had to drain all events before waiting to fix this. On Mon, Jan 24, 2022 at 14:00 Stephen Hemminger <[email protected]> wrote: > 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. > > > >
