Hi Frédéric, On Tue, Mar 16, 2021 at 10:26 AM Frédéric Danis <frederic.danis@xxxxxxxxxxxxx> wrote: > > g_timeout_add_seconds() call doesn't ensure the time for the first call of > the timer if the delay is less or equal to 1 second. > In case of a 0 delay call g_idle_add() instead of g_timeout_add_seconds(). > --- > src/shared/tester.c | 16 +++++++++------- > src/shared/timeout-ell.c | 6 ++++++ > src/shared/timeout-glib.c | 27 +++++++++++++++++++++++++++ > src/shared/timeout-mainloop.c | 6 ++++++ > src/shared/timeout.h | 3 +++ > 5 files changed, 51 insertions(+), 7 deletions(-) > > diff --git a/src/shared/tester.c b/src/shared/tester.c > index af33a79cd..c07cbc11c 100644 > --- a/src/shared/tester.c > +++ b/src/shared/tester.c > @@ -36,6 +36,7 @@ > #include "src/shared/util.h" > #include "src/shared/tester.h" > #include "src/shared/log.h" > +#include "src/shared/timeout.h" > > #define COLOR_OFF "\x1B[0m" > #define COLOR_BLACK "\x1B[0;30m" > @@ -126,7 +127,7 @@ static void test_destroy(gpointer data) > struct test_case *test = data; > > if (test->timeout_id > 0) > - g_source_remove(test->timeout_id); > + timeout_remove(test->timeout_id); > > if (test->teardown_id > 0) > g_source_remove(test->teardown_id); > @@ -429,7 +430,7 @@ static gboolean teardown_callback(gpointer user_data) > return FALSE; > } > > -static gboolean test_timeout(gpointer user_data) > +static bool test_timeout(gpointer user_data) > { > struct test_case *test = user_data; > > @@ -470,8 +471,9 @@ static void next_test_case(void) > test->start_time = g_timer_elapsed(test_timer, NULL); > > if (test->timeout > 0) > - test->timeout_id = g_timeout_add_seconds(test->timeout, > - test_timeout, test); > + test->timeout_id = timeout_add_seconds(test->timeout, > + test_timeout, test, > + NULL); > > test->stage = TEST_STAGE_PRE_SETUP; > > @@ -542,7 +544,7 @@ void tester_pre_setup_failed(void) > return; > > if (test->timeout_id > 0) { > - g_source_remove(test->timeout_id); > + timeout_remove(test->timeout_id); > test->timeout_id = 0; > } > > @@ -583,7 +585,7 @@ void tester_setup_failed(void) > test->stage = TEST_STAGE_POST_TEARDOWN; > > if (test->timeout_id > 0) { > - g_source_remove(test->timeout_id); > + timeout_remove(test->timeout_id); > test->timeout_id = 0; > } > > @@ -606,7 +608,7 @@ static void test_result(enum test_result result) > return; > > if (test->timeout_id > 0) { > - g_source_remove(test->timeout_id); > + timeout_remove(test->timeout_id); > test->timeout_id = 0; > } > > diff --git a/src/shared/timeout-ell.c b/src/shared/timeout-ell.c > index 023364069..6416d8590 100644 > --- a/src/shared/timeout-ell.c > +++ b/src/shared/timeout-ell.c > @@ -101,3 +101,9 @@ void timeout_remove(unsigned int id) > if (to) > l_timeout_remove(to); > } > + > +unsigned int timeout_add_seconds(unsigned int timeout, timeout_func_t func, > + void *user_data, timeout_destroy_func_t destroy) > +{ > + return timeout_add(timeout * 1000, func, user_data, destroy); > +} > diff --git a/src/shared/timeout-glib.c b/src/shared/timeout-glib.c > index 8bdb7a662..3268d480c 100644 > --- a/src/shared/timeout-glib.c > +++ b/src/shared/timeout-glib.c > @@ -71,3 +71,30 @@ void timeout_remove(unsigned int id) > if (source) > g_source_destroy(source); > } > + > +unsigned int timeout_add_seconds(unsigned int timeout, timeout_func_t func, > + void *user_data, timeout_destroy_func_t destroy) > +{ > + struct timeout_data *data; > + guint id; > + > + data = g_try_new0(struct timeout_data, 1); > + if (!data) > + return 0; > + > + data->func = func; > + data->destroy = destroy; > + data->user_data = user_data; > + > + if (!timeout) > + id = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, timeout_callback, > + data, timeout_destroy); > + else > + id = g_timeout_add_seconds_full(G_PRIORITY_DEFAULT, timeout, > + timeout_callback, data, > + timeout_destroy); > + if (!id) > + g_free(data); > + > + return id; > +} > diff --git a/src/shared/timeout-mainloop.c b/src/shared/timeout-mainloop.c > index 5ffa65c2a..9be803cda 100644 > --- a/src/shared/timeout-mainloop.c > +++ b/src/shared/timeout-mainloop.c > @@ -71,3 +71,9 @@ void timeout_remove(unsigned int id) > > mainloop_remove_timeout((int) id); > } > + > +unsigned int timeout_add_seconds(unsigned int timeout, timeout_func_t func, > + void *user_data, timeout_destroy_func_t destroy) > +{ > + return timeout_add(timeout * 1000, func, user_data, destroy); > +} > diff --git a/src/shared/timeout.h b/src/shared/timeout.h > index 7e22345dd..0945c3318 100644 > --- a/src/shared/timeout.h > +++ b/src/shared/timeout.h > @@ -16,3 +16,6 @@ typedef void (*timeout_destroy_func_t)(void *user_data); > unsigned int timeout_add(unsigned int timeout, timeout_func_t func, > void *user_data, timeout_destroy_func_t destroy); > void timeout_remove(unsigned int id); > + > +unsigned int timeout_add_seconds(unsigned int timeout, timeout_func_t func, > + void *user_data, timeout_destroy_func_t destroy); > -- > 2.18.0 Applied, note that I changed the commit message a little bit. -- Luiz Augusto von Dentz