diff options
author | Thomas Haller <thaller@redhat.com> | 2020-01-03 13:09:03 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2020-01-28 10:54:14 +0100 |
commit | 71fb823a43e6f0c84377c2b831a870c003c7ae84 (patch) | |
tree | 4ab5883f8672a3d4986c1419a7b82bfad27e48c2 | |
parent | 8db556372294a606e6537488e469dcf83b63b410 (diff) | |
download | NetworkManager-71fb823a43e6f0c84377c2b831a870c003c7ae84.tar.gz |
shared/tests: add nmtst_context_busy_watcher_wait() helper
-rw-r--r-- | shared/nm-utils/nm-test-utils.h | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/shared/nm-utils/nm-test-utils.h b/shared/nm-utils/nm-test-utils.h index 495aa0b35c..3a83e5c0ea 100644 --- a/shared/nm-utils/nm-test-utils.h +++ b/shared/nm-utils/nm-test-utils.h @@ -1040,6 +1040,74 @@ _nmtst_main_context_iterate_until_timeout (gpointer user_data) /*****************************************************************************/ +typedef struct { + GMainLoop *_main_loop; + union { + GSList *_list; + const void *const is_waiting; + }; +} NMTstContextBusyWatcherData; + +static inline void +_nmtst_context_busy_watcher_add_cb (gpointer data, + GObject *where_the_object_was) +{ + NMTstContextBusyWatcherData *watcher_data = data; + GSList *l; + + g_assert (watcher_data); + + l = g_slist_find (watcher_data->_list, where_the_object_was); + g_assert (l); + + watcher_data->_list = g_slist_delete_link (watcher_data->_list, l); + if (!watcher_data->_list) + g_main_loop_quit (watcher_data->_main_loop); +} + +static inline void +nmtst_context_busy_watcher_add (NMTstContextBusyWatcherData *watcher_data, + GObject *object) +{ + g_assert (watcher_data); + g_assert (G_IS_OBJECT (object)); + + if (!watcher_data->_main_loop) { + watcher_data->_main_loop = g_main_loop_new (g_main_context_get_thread_default (), + FALSE); + g_assert (!watcher_data->_list); + } else { + g_assert ( g_main_loop_get_context (watcher_data->_main_loop) + == (g_main_context_get_thread_default () ?: g_main_context_default ())); + } + + g_object_weak_ref (object, + _nmtst_context_busy_watcher_add_cb, + watcher_data); + watcher_data->_list = g_slist_prepend (watcher_data->_list, object); +} + +static inline void +nmtst_context_busy_watcher_wait (NMTstContextBusyWatcherData *watcher_data) +{ + g_assert (watcher_data); + + if (!watcher_data->_main_loop) { + g_assert (!watcher_data->_list); + return; + } + + if (watcher_data->_list) { + if (!nmtst_main_loop_run (watcher_data->_main_loop, 5000)) + g_error ("timeout running mainloop waiting for GObject to destruct"); + } + + g_assert (!watcher_data->_list); + nm_clear_pointer (&watcher_data->_main_loop, g_main_loop_unref); +} + +/*****************************************************************************/ + static inline const char * nmtst_get_sudo_cmd (void) { |