Thread (7 messages) 7 messages, 3 authors, 2021-03-16

Re: [PATCH Bluez v5 1/4] shared/timeout: Add timeout_add_seconds abstraction

From: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
Date: 2021-03-16 18:11:55

Hi Frédéric,

On Tue, Mar 16, 2021 at 10:26 AM Frédéric Danis
[off-list ref] wrote:
quoted hunk ↗ jump to hunk
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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help