| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | /* GIO - GLib Input, Output and Streaming Library
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright 2011 Red Hat, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2022-05-18 09:12:45 +01:00
										 |  |  |  * SPDX-License-Identifier: LGPL-2.1-or-later | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  |  * This library is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License as published by the Free Software Foundation; either | 
					
						
							| 
									
										
										
										
											2017-05-27 18:21:30 +02:00
										 |  |  |  * version 2.1 of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Lesser General | 
					
						
							| 
									
										
										
										
											2014-01-23 12:58:29 +01:00
										 |  |  |  * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-27 23:43:14 -05:00
										 |  |  | #ifndef __G_TASK_H__
 | 
					
						
							|  |  |  | #define __G_TASK_H__
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | #if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION)
 | 
					
						
							|  |  |  | #error "Only <gio/gio.h> can be included directly."
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <gio/giotypes.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | G_BEGIN_DECLS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define G_TYPE_TASK         (g_task_get_type ())
 | 
					
						
							|  |  |  | #define G_TASK(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_TASK, GTask))
 | 
					
						
							|  |  |  | #define G_TASK_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_TASK, GTaskClass))
 | 
					
						
							|  |  |  | #define G_IS_TASK(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_TASK))
 | 
					
						
							|  |  |  | #define G_IS_TASK_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_TASK))
 | 
					
						
							|  |  |  | #define G_TASK_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_TASK, GTaskClass))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct _GTaskClass   GTaskClass; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | GType         g_task_get_type              (void) G_GNUC_CONST; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | GTask        *g_task_new                   (gpointer             source_object, | 
					
						
							|  |  |  |                                             GCancellable        *cancellable, | 
					
						
							|  |  |  |                                             GAsyncReadyCallback  callback, | 
					
						
							|  |  |  |                                             gpointer             callback_data); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | void          g_task_report_error          (gpointer             source_object, | 
					
						
							|  |  |  |                                             GAsyncReadyCallback  callback, | 
					
						
							|  |  |  |                                             gpointer             callback_data, | 
					
						
							|  |  |  |                                             gpointer             source_tag, | 
					
						
							|  |  |  |                                             GError              *error); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | void          g_task_report_new_error      (gpointer             source_object, | 
					
						
							|  |  |  |                                             GAsyncReadyCallback  callback, | 
					
						
							|  |  |  |                                             gpointer             callback_data, | 
					
						
							|  |  |  |                                             gpointer             source_tag, | 
					
						
							|  |  |  |                                             GQuark               domain, | 
					
						
							|  |  |  |                                             gint                 code, | 
					
						
							|  |  |  |                                             const char          *format, | 
					
						
							| 
									
										
										
										
											2013-01-13 14:05:14 -02:00
										 |  |  |                                             ...) G_GNUC_PRINTF(7, 8); | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | void          g_task_set_task_data         (GTask               *task, | 
					
						
							|  |  |  |                                             gpointer             task_data, | 
					
						
							|  |  |  |                                             GDestroyNotify       task_data_destroy); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | void          g_task_set_priority          (GTask               *task, | 
					
						
							|  |  |  |                                             gint                 priority); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | void          g_task_set_check_cancellable (GTask               *task, | 
					
						
							|  |  |  |                                             gboolean             check_cancellable); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | void          g_task_set_source_tag        (GTask               *task, | 
					
						
							|  |  |  |                                             gpointer             source_tag); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_60 | 
					
						
							| 
									
										
										
										
											2018-10-07 17:37:58 +01:00
										 |  |  | void          g_task_set_name              (GTask               *task, | 
					
						
							|  |  |  |                                             const gchar         *name); | 
					
						
							| 
									
										
										
										
											2022-08-27 21:34:58 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_76 | 
					
						
							|  |  |  | void          g_task_set_static_name       (GTask               *task, | 
					
						
							|  |  |  |                                             const gchar         *name); | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-25 23:36:08 +01:00
										 |  |  | /* Macro wrapper to set the task name when setting the source tag. */ | 
					
						
							| 
									
										
										
										
											2022-11-03 19:06:40 -05:00
										 |  |  | #if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_76
 | 
					
						
							| 
									
										
										
										
											2020-06-25 23:36:08 +01:00
										 |  |  | #define g_task_set_source_tag(task, tag) G_STMT_START { \
 | 
					
						
							|  |  |  |   GTask *_task = (task); \ | 
					
						
							|  |  |  |   (g_task_set_source_tag) (_task, tag); \ | 
					
						
							|  |  |  |   if (g_task_get_name (_task) == NULL) \ | 
					
						
							| 
									
										
										
										
											2022-08-27 21:34:58 -04:00
										 |  |  |     g_task_set_static_name (_task, G_STRINGIFY (tag)); \ | 
					
						
							|  |  |  | } G_STMT_END | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_76
 | 
					
						
							|  |  |  | #if defined (__GNUC__) && (__GNUC__ >= 2)
 | 
					
						
							|  |  |  | #define g_task_set_name(task, name) G_STMT_START { \
 | 
					
						
							|  |  |  |   GTask *_task = (task); \ | 
					
						
							|  |  |  |   if (__builtin_constant_p (name)) \ | 
					
						
							|  |  |  |     g_task_set_static_name (_task, name); \ | 
					
						
							|  |  |  |   else \ | 
					
						
							|  |  |  |     g_task_set_name (_task, name); \ | 
					
						
							| 
									
										
										
										
											2020-06-25 23:36:08 +01:00
										 |  |  | } G_STMT_END | 
					
						
							| 
									
										
										
										
											2020-07-15 17:07:12 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2022-08-27 21:34:58 -04:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-06-25 23:36:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | gpointer      g_task_get_source_object     (GTask               *task); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | gpointer      g_task_get_task_data         (GTask               *task); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | gint          g_task_get_priority          (GTask               *task); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | GMainContext *g_task_get_context           (GTask               *task); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | GCancellable *g_task_get_cancellable       (GTask               *task); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | gboolean      g_task_get_check_cancellable (GTask               *task); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | gpointer      g_task_get_source_tag        (GTask               *task); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_60 | 
					
						
							| 
									
										
										
										
											2018-10-07 17:37:58 +01:00
										 |  |  | const gchar  *g_task_get_name              (GTask               *task); | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | gboolean      g_task_is_valid              (gpointer             result, | 
					
						
							|  |  |  |                                             gpointer             source_object); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef void (*GTaskThreadFunc)           (GTask           *task, | 
					
						
							|  |  |  |                                            gpointer         source_object, | 
					
						
							|  |  |  |                                            gpointer         task_data, | 
					
						
							|  |  |  |                                            GCancellable    *cancellable); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | void          g_task_run_in_thread        (GTask           *task, | 
					
						
							|  |  |  |                                            GTaskThreadFunc  task_func); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | void          g_task_run_in_thread_sync   (GTask           *task, | 
					
						
							|  |  |  |                                            GTaskThreadFunc  task_func); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | gboolean      g_task_set_return_on_cancel (GTask           *task, | 
					
						
							|  |  |  |                                            gboolean         return_on_cancel); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | gboolean      g_task_get_return_on_cancel (GTask           *task); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | void          g_task_attach_source        (GTask           *task, | 
					
						
							|  |  |  |                                            GSource         *source, | 
					
						
							|  |  |  |                                            GSourceFunc      callback); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | void          g_task_return_pointer            (GTask           *task, | 
					
						
							|  |  |  |                                                 gpointer         result, | 
					
						
							|  |  |  |                                                 GDestroyNotify   result_destroy); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | void          g_task_return_boolean            (GTask           *task, | 
					
						
							|  |  |  |                                                 gboolean         result); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | void          g_task_return_int                (GTask           *task, | 
					
						
							|  |  |  |                                                 gssize           result); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | void          g_task_return_error              (GTask           *task, | 
					
						
							|  |  |  |                                                 GError          *error); | 
					
						
							| 
									
										
										
										
											2023-10-31 03:49:28 +00:00
										 |  |  | GIO_AVAILABLE_IN_2_80 | 
					
						
							|  |  |  | void          g_task_return_prefixed_error     (GTask           *task, | 
					
						
							|  |  |  |                                                 GError          *error, | 
					
						
							|  |  |  |                                                 const char      *format, | 
					
						
							|  |  |  |                                                 ...) G_GNUC_PRINTF (3, 4); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | void          g_task_return_new_error          (GTask           *task, | 
					
						
							|  |  |  |                                                 GQuark           domain, | 
					
						
							|  |  |  |                                                 gint             code, | 
					
						
							|  |  |  |                                                 const char      *format, | 
					
						
							|  |  |  |                                                 ...) G_GNUC_PRINTF (4, 5); | 
					
						
							| 
									
										
										
										
											2023-12-19 18:56:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | GIO_AVAILABLE_IN_2_80 | 
					
						
							|  |  |  | void          g_task_return_new_error_literal  (GTask           *task, | 
					
						
							|  |  |  |                                                 GQuark           domain, | 
					
						
							|  |  |  |                                                 gint             code, | 
					
						
							|  |  |  |                                                 const char      *message); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_64 | 
					
						
							| 
									
										
										
										
											2019-11-05 09:54:01 +01:00
										 |  |  | void          g_task_return_value              (GTask           *task, | 
					
						
							|  |  |  |                                                 GValue          *result); | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | gboolean      g_task_return_error_if_cancelled (GTask           *task); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | gpointer      g_task_propagate_pointer         (GTask           *task, | 
					
						
							|  |  |  |                                                 GError         **error); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | gboolean      g_task_propagate_boolean         (GTask           *task, | 
					
						
							|  |  |  |                                                 GError         **error); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | gssize        g_task_propagate_int             (GTask           *task, | 
					
						
							|  |  |  |                                                 GError         **error); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_64 | 
					
						
							| 
									
										
										
										
											2019-11-05 09:54:01 +01:00
										 |  |  | gboolean      g_task_propagate_value           (GTask           *task, | 
					
						
							|  |  |  |                                                 GValue          *value, | 
					
						
							|  |  |  |                                                 GError         **error); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_36 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | gboolean      g_task_had_error                 (GTask           *task); | 
					
						
							| 
									
										
										
										
											2022-10-05 13:39:21 -04:00
										 |  |  | GIO_AVAILABLE_IN_2_44 | 
					
						
							| 
									
										
										
										
											2014-08-21 19:04:04 +01:00
										 |  |  | gboolean      g_task_get_completed             (GTask           *task); | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												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>
											
										 
											2023-04-05 15:10:10 +01:00
										 |  |  | /*< private >*/ | 
					
						
							|  |  |  | #ifndef __GTK_DOC_IGNORE__
 | 
					
						
							| 
									
										
										
										
											2023-05-16 13:33:19 +01:00
										 |  |  | #ifndef __GI_SCANNER__
 | 
					
						
							| 
									
										
											  
											
												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>
											
										 
											2023-04-05 15:10:10 +01:00
										 |  |  | /* Debugging API, not part of the public API */ | 
					
						
							|  |  |  | void g_task_print_alive_tasks (void); | 
					
						
							| 
									
										
										
										
											2023-05-16 13:33:19 +01:00
										 |  |  | #endif /* !__GI_SCANNER__ */
 | 
					
						
							| 
									
										
											  
											
												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>
											
										 
											2023-04-05 15:10:10 +01:00
										 |  |  | #endif  /* !__GTK_DOC_IGNORE__ */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:05:50 -04:00
										 |  |  | G_END_DECLS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* __G_TASK_H__ */
 |