diff options
author | Thomas Haller <thaller@redhat.com> | 2020-03-02 17:49:31 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2020-03-02 21:52:27 +0100 |
commit | a7886b6ca8a5c12f2e87c073b323c22cdd639c74 (patch) | |
tree | 0e3fcaaa3df9105813be46e8f763d3eb549fac1f | |
parent | 105abf27c12074952872678463b2cf331150a2ce (diff) | |
download | NetworkManager-th/clean-shutdown.tar.gz |
core: add nm_shutdown_is_quitting()/_nm_shutdown_set_quitting() APIth/clean-shutdown
-rw-r--r-- | src/NetworkManagerUtils.c | 42 | ||||
-rw-r--r-- | src/NetworkManagerUtils.h | 3 |
2 files changed, 45 insertions, 0 deletions
diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c index 3f2f44d3cd..9f88e0ab81 100644 --- a/src/NetworkManagerUtils.c +++ b/src/NetworkManagerUtils.c @@ -954,6 +954,43 @@ struct _NMShutdownWaitObjHandle { static CList _shutdown_waitobj_lst_head; +static int _shutdown_is_quitting = 0; + +static gboolean +_shutdown_cancel_on_idle_cb (gpointer user_data) +{ + gs_unref_object GCancellable *cancellable = user_data; + + g_cancellable_cancel (cancellable); + return G_SOURCE_REMOVE; +} + +static void +_shutdown_cancel_on_idle (GCancellable *cancellable) +{ + g_idle_add (_shutdown_cancel_on_idle_cb, g_object_ref (cancellable)); +} + +void +_nm_shutdown_set_quitting (void) +{ + NMShutdownWaitObjHandle *handle; + + if (!g_atomic_int_compare_and_exchange (&_shutdown_is_quitting, 0, 1)) + return; + + c_list_for_each_entry (handle, &_shutdown_waitobj_lst_head, lst) { + if (handle->is_cancellable) + _shutdown_cancel_on_idle (handle->watched_obj); + } +} + +gboolean +nm_shutdown_is_quitting (void) +{ + return g_atomic_int_get (&_shutdown_is_quitting) != 0; +} + static void _shutdown_waitobj_unregister (NMShutdownWaitObjHandle *handle) { @@ -1051,6 +1088,11 @@ nm_shutdown_wait_obj_register_full (gpointer watched_obj, c_list_link_tail (&_shutdown_waitobj_lst_head, &handle->lst); if (watched_obj) g_object_weak_ref (watched_obj, _shutdown_waitobj_cb, handle); + + if ( wait_type == NM_SHUTDOWN_WAIT_TYPE_CANCELLABLE + && nm_shutdown_is_quitting ()) + _shutdown_cancel_on_idle (watched_obj); + return handle; } diff --git a/src/NetworkManagerUtils.h b/src/NetworkManagerUtils.h index 558a262b98..c8894e47c0 100644 --- a/src/NetworkManagerUtils.h +++ b/src/NetworkManagerUtils.h @@ -126,6 +126,9 @@ nm_shutdown_wait_obj_register_cancellable_full (GCancellable *watched_obj, void nm_shutdown_wait_obj_unregister (NMShutdownWaitObjHandle *handle); +void _nm_shutdown_set_quitting (void); +gboolean nm_shutdown_is_quitting (void); + /*****************************************************************************/ const char * |