<div dir="ltr">Hi,<div><br></div><div>I'm trying to make a friendly API for our developers where one API function will wait until a heartbeat signal is received or a timeout occurs.  It should only call the callback 1 time and then unregister the callback handler since we only want to know that one heartbeat occurred. I have an event loop to handle the signal received if there is one and a simple callback function listed here : </div><div></div><div><br></div><div>The general code is simple:</div><div>/* Callback Function */</div><div>    int32_t tcb(sd_bus_message* message, void* userdata, sd_bus_error* error)<br>    {<br>        <br>        waiting_control_t* ud = userdata;<br>        if (ud)<br>        {<br>            /* printf("CALLBACK CALLED\n"); */<br>            ud->found = 1;<br>            sd_bus_slot_unref(ud->slot);<br>        }<br>        <br>        return EXIT_SUCCESS;<br>    }<br></div><div><br></div><div>/* Wait for signal */</div><div>int32_t<br>wait_for_signal(sd_bus* bus, char* match, uint64_t time_microseconds)<br>{<br><br>    int32_t r;<br>    int32_t found          = 0;<br>    waiting_control_t data = { .slot = NULL, .found = 0 };<br>    sd_bus_error err       = SD_BUS_ERROR_NULL;<br><br>    sd_bus_add_match(bus, &data.slot, match, tcb, &data);<br>    do<br>    {<br>        r = sd_bus_process(bus, NULL);<br>        if (r < 0)<br>        {<br>            fprintf(stderr, "Failed to process bus: %s\n", strerror(-r));<br>            break;<br>        }<br>        r = sd_bus_wait(bus, 1000);<br>    } while (!data.found && (time_microseconds-=1000) > 0);<br><br>    if (data.found)<br>        return 0;<br>    else<br>        return -1;<br>}<br></div><div><br></div><div>/*Other API function that returns sees -22 on sd_bus_set_property */</div><div>int logging_client_set_log_path(char *path)<br>{<br>    int32_t r;<br>    logging_client_bus_struct_t b;<br>    sd_bus_message* msg;<br>    sd_bus_error error;<br>    logging_client_bus_init(&b);<br>    const char *s;<br>    r = logging_client_bus_open(&b);<br>    if (r < 0)<br>    {<br>        printf("Failed to open log_client bus\n");<br>        return r;<br>    }<br>    r = sd_bus_set_property(b.bus, <br>                            LOG_DESTINATION_NAME,<br>                            LOG_OBJECT_PATH,<br>                            LOG_INTERFACE_NAME,<br>                            "logPath",<br>                            &b.client_bus_error,<br>                            "s",<br>                            path<br>                            );<br>    return r;<br>}<br></div><div><br></div><div><br></div><div>The problem I have is that if I call another API function (logging_client_set_log_path) AFTER I have called this function, then the second API call (which sets a property)  ALWAYS fails with a -22 return code (coming from sd_bus_set_property). However, if I don't call this wait_for_signal API call, then my other API function seems to always succeed.  </div><div><br></div><div>Through all of this testing I can always run "busctl set-property ..." commands to set the logPath property . Hence I know that my server can correctly see these set-property commands and leads me to believe  that I'm not cleaning up structures in the function wait_for_signal correctly.</div><div><br></div><div><br></div><div>In addition, there was something weird about my code. I had to add this</div><div> </div><div>if (ud) { .. }  </div><div><br></div><div>block because my callback function was getting called twice. I did not expect this since  I thought the first<br></div><div><br></div><div>sd_bus_slot_unref(ud->slot);<br></div><div><br></div><div>would have disabled the callback function.</div><div><br></div><div>Thanks  for any tips about what I'm not doing correctly to clean up this signal matcher and maybe why my signal matcher is getting called twice.</div><div><br></div><div>-Jimi</div><div><br></div><div><br></div></div>