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.
