From bd97feadc875de486429729ed0a3b1572b13e8d2 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 11 Mar 2022 11:42:23 +0100 Subject: [PATCH] glib-aux: add nm_g_main_context_can_acquire() helper (cherry picked from commit 5dc9307a34271c50d6850e02c48d623879ae4d72) --- src/libnm-glib-aux/nm-shared-utils.c | 20 ++++++++++++++++++++ src/libnm-glib-aux/nm-shared-utils.h | 2 ++ 2 files changed, 22 insertions(+) diff --git a/src/libnm-glib-aux/nm-shared-utils.c b/src/libnm-glib-aux/nm-shared-utils.c index 6e6fed12c2..563b7cc2a5 100644 --- a/src/libnm-glib-aux/nm-shared-utils.c +++ b/src/libnm-glib-aux/nm-shared-utils.c @@ -6680,3 +6680,23 @@ nm_g_main_context_iterate_for_msec(GMainContext *context, guint timeout_msec) while (source) g_main_context_iteration(context, TRUE); } + +/*****************************************************************************/ + +gboolean +nm_g_main_context_can_acquire(GMainContext *context) +{ + /* Fast path. Usually we don't pass contexts between threads + * and operate while iterating the context. Hence, usually we + * already acquired the context. Check that first. */ + if (g_main_context_is_owner(context)) + return TRUE; + + /* Either the context is not owned, or owned by somebody else. Only + * one way to find out. */ + if (!g_main_context_acquire(context)) + return FALSE; + + g_main_context_release(context); + return TRUE; +} diff --git a/src/libnm-glib-aux/nm-shared-utils.h b/src/libnm-glib-aux/nm-shared-utils.h index 54550f2737..6e1ad658eb 100644 --- a/src/libnm-glib-aux/nm-shared-utils.h +++ b/src/libnm-glib-aux/nm-shared-utils.h @@ -1931,6 +1931,8 @@ nm_g_main_context_iterate_ready(GMainContext *context) void nm_g_main_context_iterate_for_msec(GMainContext *context, guint timeout_msec); +gboolean nm_g_main_context_can_acquire(GMainContext *context); + /*****************************************************************************/ static inline int