add g_timeout_add_seconds_once

Add a new call combing behaviors of g_timeout_add_seconds and
g_timeout_add_once.
This commit is contained in:
Peter Eisenmann 2023-04-16 21:20:59 +02:00 committed by Peter Eisenmann
parent c86fde7e02
commit 3abf23b2a7
4 changed files with 45 additions and 0 deletions

View File

@ -586,6 +586,7 @@ g_timeout_add_once
g_timeout_add_full
g_timeout_add_seconds
g_timeout_add_seconds_full
g_timeout_add_seconds_once
<SUBSECTION>
g_idle_source_new

View File

@ -5471,6 +5471,26 @@ g_timeout_add_seconds (guint interval,
return g_timeout_add_seconds_full (G_PRIORITY_DEFAULT, interval, function, data, NULL);
}
/**
* g_timeout_add_seconds_once:
* @interval: the time after which the function will be called, in seconds
* @function: function to call
* @data: data to pass to @function
*
* This function behaves like g_timeout_add_once() but with a range in seconds.
*
* Returns: the ID (greater than 0) of the event source
*
* Since: 2.78
*/
guint
g_timeout_add_seconds_once (guint interval,
GSourceOnceFunc function,
gpointer data)
{
return timeout_add_full (G_PRIORITY_DEFAULT, interval, TRUE, TRUE, (GSourceFunc) function, data, NULL);
}
/* Child watch functions */
#ifdef G_OS_WIN32

View File

@ -800,6 +800,10 @@ GLIB_AVAILABLE_IN_ALL
guint g_timeout_add_seconds (guint interval,
GSourceFunc function,
gpointer data);
GLIB_AVAILABLE_IN_2_78
guint g_timeout_add_seconds_once (guint interval,
GSourceOnceFunc function,
gpointer data);
GLIB_AVAILABLE_IN_ALL
guint g_child_watch_add_full (gint priority,
GPid pid,

View File

@ -19,6 +19,12 @@ unreachable_callback (gpointer data)
return G_SOURCE_REMOVE;
}
static void
unreachable_void_callback (gpointer data)
{
g_assert_not_reached ();
}
static void
test_seconds (void)
{
@ -51,6 +57,19 @@ test_seconds (void)
g_source_remove (id);
}
static void
test_seconds_once (void)
{
/* Use the same principle as in test_seconds() */
loop = g_main_loop_new (NULL, FALSE);
g_timeout_add_once (2100, stop_waiting, NULL);
g_timeout_add_seconds_once (21475, unreachable_void_callback, NULL);
g_main_loop_run (loop);
g_main_loop_unref (loop);
}
static void
test_weeks_overflow (void)
{
@ -192,6 +211,7 @@ main (int argc, char *argv[])
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/timeout/seconds", test_seconds);
g_test_add_func ("/timeout/seconds-once", test_seconds_once);
g_test_add_func ("/timeout/weeks-overflow", test_weeks_overflow);
g_test_add_func ("/timeout/far-future-ready-time", test_far_future_ready_time);
g_test_add_func ("/timeout/rounding", test_rounding);