diff options
author | Philip Withnall <pwithnall@endlessos.org> | 2023-04-05 15:10:10 +0100 |
---|---|---|
committer | Philip Withnall <pwithnall@endlessos.org> | 2023-04-27 12:22:05 +0100 |
commit | 06eecda8235a614cfb837742e48cb233d35e6441 (patch) | |
tree | 99fbc9561c0cc5f27c34641004815f6b9e1ac61a /gio/gtask.h | |
parent | 8d527919b48a6062621281309dbae548a2bceea9 (diff) |
gtask: Track pending GTasks if G_ENABLE_DEBUG is defined
Track the `GTask`s which are still alive (not finalised) in a shared
list, and provide a secret debugging function for printing that list.
Too often when debugging apps, I have found that a ‘leaked’ object is
actually still (validly) referenced by an ongoing `GTask` which hasn’t
completed for whatever reason. Or I have found that an operation has
obviously stalled, but there are no pointers available to the `GTask`
which is stalled, because it’s being tracked as a collection of closure
pointers from some `GSource` which is hard to get to in the debugger.
It will be very useful for debugging apps, if there’s a list of all the
still alive `GTask`s somewhere. This is that list.
The code is disabled if `G_ENABLE_DEBUG` is not defined, to avoid every
`GTask` construction/finalisation imposing a global locking penalty.
To use the new list, break in `gdb` while running your app, and call
`g_task_print_alive_tasks()`, or inspect the `task_list` manually:
```
(gdb) print g_task_print_alive_tasks()
16:44:17:788 GLib-GIO 5 GTasks still alive:
• GTask 0x6100000ac740, gs_plugin_appstream_setup_async, ref count: 1, ever_returned: 0, completed: 0
• GTask 0x6100000bf940, [gio] D-Bus read, ref count: 2, ever_returned: 0, completed: 0
• GTask 0x6100000aac40, gs_plugin_loader_setup_async, ref count: 1, ever_returned: 0, completed: 0
• GTask 0x61000006d940, gs_plugin_loader_job_process_async GsPluginJobRefine, ref count: 1, ever_returned: 0, completed: 0
• GTask 0x610000118c40, [gio] D-Bus read, ref count: 2, ever_returned: 0, completed: 0
```
Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
Diffstat (limited to 'gio/gtask.h')
-rw-r--r-- | gio/gtask.h | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/gio/gtask.h b/gio/gtask.h index 1c2490fab..7642d2c68 100644 --- a/gio/gtask.h +++ b/gio/gtask.h @@ -194,6 +194,12 @@ gboolean g_task_had_error (GTask *task); GIO_AVAILABLE_IN_2_44 gboolean g_task_get_completed (GTask *task); +/*< private >*/ +#ifndef __GTK_DOC_IGNORE__ +/* Debugging API, not part of the public API */ +void g_task_print_alive_tasks (void); +#endif /* !__GTK_DOC_IGNORE__ */ + G_END_DECLS #endif /* __G_TASK_H__ */ |