summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2020-01-03 13:09:03 +0100
committerThomas Haller <thaller@redhat.com>2020-01-28 10:54:14 +0100
commit71fb823a43e6f0c84377c2b831a870c003c7ae84 (patch)
tree4ab5883f8672a3d4986c1419a7b82bfad27e48c2
parent8db556372294a606e6537488e469dcf83b63b410 (diff)
downloadNetworkManager-71fb823a43e6f0c84377c2b831a870c003c7ae84.tar.gz
shared/tests: add nmtst_context_busy_watcher_wait() helper
-rw-r--r--shared/nm-utils/nm-test-utils.h68
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)
{