| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | /* GIO - GLib Input, Output and Streaming Library
 | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Copyright (C) 2006-2007 Red Hat, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2022-05-18 09:12:45 +01:00
										 |  |  |  * SPDX-License-Identifier: LGPL-2.1-or-later | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00: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. | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00: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/>.
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Author: Alexander Larsson <alexl@redhat.com> | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 15:10:51 +00:00
										 |  |  | #include "config.h"
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "gioscheduler.h"
 | 
					
						
							| 
									
										
										
										
											2008-07-01 06:32:35 +00:00
										 |  |  | #include "gcancellable.h"
 | 
					
						
							| 
									
										
										
										
											2011-11-21 09:19:56 -05:00
										 |  |  | #include "gtask.h"
 | 
					
						
							| 
									
										
										
										
											2007-11-28 12:39:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  | struct _GIOSchedulerJob { | 
					
						
							| 
									
										
										
										
											2012-06-21 11:10:00 -04:00
										 |  |  |   GList *active_link; | 
					
						
							| 
									
										
										
										
											2011-11-21 09:19:56 -05:00
										 |  |  |   GTask *task; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  |   GIOSchedulerJobFunc job_func; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   gpointer data; | 
					
						
							|  |  |  |   GDestroyNotify destroy_notify; | 
					
						
							| 
									
										
										
										
											2011-08-31 14:30:11 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   GCancellable *cancellable; | 
					
						
							| 
									
										
										
										
											2012-06-25 17:05:45 -04:00
										 |  |  |   gulong cancellable_id; | 
					
						
							| 
									
										
										
										
											2009-06-16 20:22:58 -04:00
										 |  |  |   GMainContext *context; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | G_LOCK_DEFINE_STATIC(active_jobs); | 
					
						
							| 
									
										
										
										
											2012-06-21 11:10:00 -04:00
										 |  |  | static GList *active_jobs = NULL; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  | g_io_job_free (GIOSchedulerJob *job) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-01-25 14:40:54 +00:00
										 |  |  |   if (job->destroy_notify) | 
					
						
							|  |  |  |     job->destroy_notify (job->data); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-25 17:05:45 -04:00
										 |  |  |   G_LOCK (active_jobs); | 
					
						
							|  |  |  |   active_jobs = g_list_delete_link (active_jobs, job->active_link); | 
					
						
							|  |  |  |   G_UNLOCK (active_jobs); | 
					
						
							| 
									
										
										
										
											2011-11-21 09:19:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (job->cancellable) | 
					
						
							|  |  |  |     g_object_unref (job->cancellable); | 
					
						
							|  |  |  |   g_main_context_unref (job->context); | 
					
						
							|  |  |  |   g_slice_free (GIOSchedulerJob, job); | 
					
						
							| 
									
										
										
										
											2008-01-25 14:40:54 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-11-21 09:19:56 -05:00
										 |  |  | io_job_thread (GTask         *task, | 
					
						
							|  |  |  |                gpointer       source_object, | 
					
						
							|  |  |  |                gpointer       task_data, | 
					
						
							|  |  |  |                GCancellable  *cancellable) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-11-21 09:19:56 -05:00
										 |  |  |   GIOSchedulerJob *job = task_data; | 
					
						
							| 
									
										
										
										
											2008-01-25 14:40:54 +00:00
										 |  |  |   gboolean result; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (job->cancellable) | 
					
						
							| 
									
										
										
										
											2007-12-13 16:48:06 +00:00
										 |  |  |     g_cancellable_push_current (job->cancellable); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-25 14:40:54 +00:00
										 |  |  |   do  | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       result = job->job_func (job, job->cancellable, job->data); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   while (result); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-25 14:40:54 +00:00
										 |  |  |   if (job->cancellable) | 
					
						
							|  |  |  |     g_cancellable_pop_current (job->cancellable); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  |  * g_io_scheduler_push_job: | 
					
						
							|  |  |  |  * @job_func: a #GIOSchedulerJobFunc. | 
					
						
							| 
									
										
										
										
											2008-01-23 05:46:43 +00:00
										 |  |  |  * @user_data: data to pass to @job_func | 
					
						
							| 
									
										
										
										
											2016-10-28 18:29:02 -07:00
										 |  |  |  * @notify: (nullable): a #GDestroyNotify for @user_data, or %NULL | 
					
						
							| 
									
										
										
										
											2024-03-22 00:51:44 +00:00
										 |  |  |  * @io_priority: the [I/O priority](iface.AsyncResult.html#io-priority) | 
					
						
							| 
									
										
										
										
											2007-11-30 05:51:10 +00:00
										 |  |  |  * of the request. | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |  * @cancellable: optional #GCancellable object, %NULL to ignore. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-10-05 11:45:51 -04:00
										 |  |  |  * Schedules the I/O job to run in another thread. | 
					
						
							| 
									
										
										
										
											2008-01-23 05:46:43 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @notify will be called on @user_data after @job_func has returned, | 
					
						
							|  |  |  |  * regardless whether the job was cancelled or has run to completion. | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |  *  | 
					
						
							| 
									
										
										
										
											2008-01-23 05:46:43 +00:00
										 |  |  |  * If @cancellable is not %NULL, it can be used to cancel the I/O job | 
					
						
							|  |  |  |  * by calling g_cancellable_cancel() or by calling  | 
					
						
							|  |  |  |  * g_io_scheduler_cancel_all_jobs(). | 
					
						
							| 
									
										
										
										
											2011-11-21 09:19:56 -05:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2023-11-15 11:21:07 +00:00
										 |  |  |  * Deprecated: 2.36: use #GThreadPool or g_task_run_in_thread() | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |  **/ | 
					
						
							|  |  |  | void | 
					
						
							| 
									
										
										
										
											2008-01-23 05:46:43 +00:00
										 |  |  | g_io_scheduler_push_job (GIOSchedulerJobFunc  job_func, | 
					
						
							|  |  |  | 			 gpointer             user_data, | 
					
						
							|  |  |  | 			 GDestroyNotify       notify, | 
					
						
							|  |  |  | 			 gint                 io_priority, | 
					
						
							|  |  |  | 			 GCancellable        *cancellable) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  |   GIOSchedulerJob *job; | 
					
						
							| 
									
										
										
										
											2011-11-21 09:19:56 -05:00
										 |  |  |   GTask *task; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   g_return_if_fail (job_func != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-21 09:19:56 -05:00
										 |  |  |   job = g_slice_new0 (GIOSchedulerJob); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   job->job_func = job_func; | 
					
						
							|  |  |  |   job->data = user_data; | 
					
						
							|  |  |  |   job->destroy_notify = notify; | 
					
						
							| 
									
										
										
										
											2011-11-21 09:19:56 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   if (cancellable) | 
					
						
							| 
									
										
										
										
											2011-11-21 09:19:56 -05:00
										 |  |  |     job->cancellable = g_object_ref (cancellable); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-05 10:46:57 -04:00
										 |  |  |   job->context = g_main_context_ref_thread_default (); | 
					
						
							| 
									
										
										
										
											2009-06-16 20:22:58 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   G_LOCK (active_jobs); | 
					
						
							| 
									
										
										
										
											2012-06-21 11:10:00 -04:00
										 |  |  |   active_jobs = g_list_prepend (active_jobs, job); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   job->active_link = active_jobs; | 
					
						
							|  |  |  |   G_UNLOCK (active_jobs); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-21 09:19:56 -05:00
										 |  |  |   task = g_task_new (NULL, cancellable, NULL, NULL); | 
					
						
							| 
									
										
										
										
											2016-06-16 19:39:38 -04:00
										 |  |  | G_GNUC_BEGIN_IGNORE_DEPRECATIONS | 
					
						
							|  |  |  |   g_task_set_source_tag (task, g_io_scheduler_push_job); | 
					
						
							|  |  |  | G_GNUC_END_IGNORE_DEPRECATIONS | 
					
						
							| 
									
										
										
										
											2011-11-21 09:19:56 -05:00
										 |  |  |   g_task_set_task_data (task, job, (GDestroyNotify)g_io_job_free); | 
					
						
							|  |  |  |   g_task_set_priority (task, io_priority); | 
					
						
							|  |  |  |   g_task_run_in_thread (task, io_job_thread); | 
					
						
							|  |  |  |   g_object_unref (task); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  |  * g_io_scheduler_cancel_all_jobs: | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |  *  | 
					
						
							| 
									
										
										
										
											2008-01-23 05:46:43 +00:00
										 |  |  |  * Cancels all cancellable I/O jobs.  | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * A job is cancellable if a #GCancellable was passed into | 
					
						
							|  |  |  |  * g_io_scheduler_push_job(). | 
					
						
							| 
									
										
										
										
											2011-11-21 09:19:56 -05:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2023-11-15 11:21:07 +00:00
										 |  |  |  * Deprecated: 2.36: You should never call this function, since you don't | 
					
						
							| 
									
										
										
										
											2011-11-21 09:19:56 -05:00
										 |  |  |  * know how other libraries in your program might be making use of | 
					
						
							|  |  |  |  * gioscheduler. | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |  **/ | 
					
						
							|  |  |  | void | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  | g_io_scheduler_cancel_all_jobs (void) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-21 11:10:00 -04:00
										 |  |  |   GList *cancellable_list, *l; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |    | 
					
						
							|  |  |  |   G_LOCK (active_jobs); | 
					
						
							|  |  |  |   cancellable_list = NULL; | 
					
						
							|  |  |  |   for (l = active_jobs; l != NULL; l = l->next) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  |       GIOSchedulerJob *job = l->data; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |       if (job->cancellable) | 
					
						
							| 
									
										
										
										
											2012-06-21 11:10:00 -04:00
										 |  |  | 	cancellable_list = g_list_prepend (cancellable_list, | 
					
						
							|  |  |  | 					   g_object_ref (job->cancellable)); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   G_UNLOCK (active_jobs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for (l = cancellable_list; l != NULL; l = l->next) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       GCancellable *c = l->data; | 
					
						
							|  |  |  |       g_cancellable_cancel (c); | 
					
						
							|  |  |  |       g_object_unref (c); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-06-21 11:10:00 -04:00
										 |  |  |   g_list_free (cancellable_list); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  |   GSourceFunc func; | 
					
						
							|  |  |  |   gboolean ret_val; | 
					
						
							|  |  |  |   gpointer data; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   GDestroyNotify notify; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-03 23:44:37 -04:00
										 |  |  |   GMutex ack_lock; | 
					
						
							|  |  |  |   GCond ack_condition; | 
					
						
							| 
									
										
										
										
											2011-10-04 11:07:15 -04:00
										 |  |  |   gboolean ack; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | } MainLoopProxy; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static gboolean | 
					
						
							|  |  |  | mainloop_proxy_func (gpointer data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   MainLoopProxy *proxy = data; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  |   proxy->ret_val = proxy->func (proxy->data); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-12 19:34:19 +00:00
										 |  |  |   if (proxy->notify) | 
					
						
							|  |  |  |     proxy->notify (proxy->data); | 
					
						
							| 
									
										
										
										
											2011-10-03 23:44:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   g_mutex_lock (&proxy->ack_lock); | 
					
						
							| 
									
										
										
										
											2011-10-04 11:07:15 -04:00
										 |  |  |   proxy->ack = TRUE; | 
					
						
							| 
									
										
										
										
											2011-10-03 23:44:37 -04:00
										 |  |  |   g_cond_signal (&proxy->ack_condition); | 
					
						
							|  |  |  |   g_mutex_unlock (&proxy->ack_lock); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   return FALSE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | mainloop_proxy_free (MainLoopProxy *proxy) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-10-03 23:44:37 -04:00
										 |  |  |   g_mutex_clear (&proxy->ack_lock); | 
					
						
							|  |  |  |   g_cond_clear (&proxy->ack_condition); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   g_free (proxy); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  |  * g_io_scheduler_job_send_to_mainloop: | 
					
						
							| 
									
										
										
										
											2008-01-23 05:46:43 +00:00
										 |  |  |  * @job: a #GIOSchedulerJob | 
					
						
							| 
									
										
										
										
											2009-06-16 20:22:58 -04:00
										 |  |  |  * @func: a #GSourceFunc callback that will be called in the original thread | 
					
						
							| 
									
										
										
										
											2008-01-23 05:46:43 +00:00
										 |  |  |  * @user_data: data to pass to @func | 
					
						
							| 
									
										
										
										
											2016-10-28 18:29:02 -07:00
										 |  |  |  * @notify: (nullable): a #GDestroyNotify for @user_data, or %NULL | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  |  *  | 
					
						
							| 
									
										
										
										
											2009-06-16 20:22:58 -04:00
										 |  |  |  * Used from an I/O job to send a callback to be run in the thread | 
					
						
							|  |  |  |  * that the job was started from, waiting for the result (and thus | 
					
						
							| 
									
										
										
										
											2007-12-17 07:04:51 +00:00
										 |  |  |  * blocking the I/O job). | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Returns: The return value of @func | 
					
						
							| 
									
										
										
										
											2011-11-21 09:19:56 -05:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2023-11-15 11:21:07 +00:00
										 |  |  |  * Deprecated: 2.36: Use g_main_context_invoke(). | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  |  **/ | 
					
						
							|  |  |  | gboolean | 
					
						
							|  |  |  | g_io_scheduler_job_send_to_mainloop (GIOSchedulerJob *job, | 
					
						
							| 
									
										
										
										
											2007-12-17 07:04:51 +00:00
										 |  |  | 				     GSourceFunc      func, | 
					
						
							|  |  |  | 				     gpointer         user_data, | 
					
						
							|  |  |  | 				     GDestroyNotify   notify) | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   GSource *source; | 
					
						
							|  |  |  |   MainLoopProxy *proxy; | 
					
						
							|  |  |  |   gboolean ret_val; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_return_val_if_fail (job != NULL, FALSE); | 
					
						
							|  |  |  |   g_return_val_if_fail (func != NULL, FALSE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   proxy = g_new0 (MainLoopProxy, 1); | 
					
						
							|  |  |  |   proxy->func = func; | 
					
						
							|  |  |  |   proxy->data = user_data; | 
					
						
							|  |  |  |   proxy->notify = notify; | 
					
						
							| 
									
										
										
										
											2011-10-03 23:44:37 -04:00
										 |  |  |   g_mutex_init (&proxy->ack_lock); | 
					
						
							|  |  |  |   g_cond_init (&proxy->ack_condition); | 
					
						
							|  |  |  |   g_mutex_lock (&proxy->ack_lock); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  |   source = g_idle_source_new (); | 
					
						
							|  |  |  |   g_source_set_priority (source, G_PRIORITY_DEFAULT); | 
					
						
							|  |  |  |   g_source_set_callback (source, mainloop_proxy_func, proxy, | 
					
						
							|  |  |  | 			 NULL); | 
					
						
							| 
									
										
										
										
											2021-07-26 10:53:02 +01:00
										 |  |  |   g_source_set_static_name (source, "[gio] mainloop_proxy_func"); | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-16 20:22:58 -04:00
										 |  |  |   g_source_attach (source, job->context); | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  |   g_source_unref (source); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-04 11:07:15 -04:00
										 |  |  |   while (!proxy->ack) | 
					
						
							|  |  |  |     g_cond_wait (&proxy->ack_condition, &proxy->ack_lock); | 
					
						
							| 
									
										
										
										
											2011-10-03 23:44:37 -04:00
										 |  |  |   g_mutex_unlock (&proxy->ack_lock); | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   ret_val = proxy->ret_val; | 
					
						
							|  |  |  |   mainloop_proxy_free (proxy); | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   return ret_val; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2007-12-17 07:04:51 +00:00
										 |  |  |  * g_io_scheduler_job_send_to_mainloop_async: | 
					
						
							| 
									
										
										
										
											2008-01-23 05:46:43 +00:00
										 |  |  |  * @job: a #GIOSchedulerJob | 
					
						
							| 
									
										
										
										
											2009-06-16 20:22:58 -04:00
										 |  |  |  * @func: a #GSourceFunc callback that will be called in the original thread | 
					
						
							| 
									
										
										
										
											2008-01-23 05:46:43 +00:00
										 |  |  |  * @user_data: data to pass to @func | 
					
						
							| 
									
										
										
										
											2016-10-28 18:29:02 -07:00
										 |  |  |  * @notify: (nullable): a #GDestroyNotify for @user_data, or %NULL | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |  *  | 
					
						
							| 
									
										
										
										
											2009-06-16 20:22:58 -04:00
										 |  |  |  * Used from an I/O job to send a callback to be run asynchronously in | 
					
						
							|  |  |  |  * the thread that the job was started from. The callback will be run | 
					
						
							|  |  |  |  * when the main loop is available, but at that time the I/O job might | 
					
						
							|  |  |  |  * have finished. The return value from the callback is ignored. | 
					
						
							| 
									
										
										
										
											2008-01-23 05:46:43 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Note that if you are passing the @user_data from g_io_scheduler_push_job() | 
					
						
							|  |  |  |  * on to this function you have to ensure that it is not freed before | 
					
						
							|  |  |  |  * @func is called, either by passing %NULL as @notify to  | 
					
						
							|  |  |  |  * g_io_scheduler_push_job() or by using refcounting for @user_data. | 
					
						
							| 
									
										
										
										
											2011-11-21 09:19:56 -05:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2023-11-15 11:21:07 +00:00
										 |  |  |  * Deprecated: 2.36: Use g_main_context_invoke(). | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |  **/ | 
					
						
							|  |  |  | void | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  | g_io_scheduler_job_send_to_mainloop_async (GIOSchedulerJob *job, | 
					
						
							| 
									
										
										
										
											2007-12-17 07:04:51 +00:00
										 |  |  | 					   GSourceFunc      func, | 
					
						
							|  |  |  | 					   gpointer         user_data, | 
					
						
							|  |  |  | 					   GDestroyNotify   notify) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   GSource *source; | 
					
						
							|  |  |  |   MainLoopProxy *proxy; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_return_if_fail (job != NULL); | 
					
						
							|  |  |  |   g_return_if_fail (func != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   proxy = g_new0 (MainLoopProxy, 1); | 
					
						
							|  |  |  |   proxy->func = func; | 
					
						
							|  |  |  |   proxy->data = user_data; | 
					
						
							|  |  |  |   proxy->notify = notify; | 
					
						
							| 
									
										
										
										
											2011-10-03 23:44:37 -04:00
										 |  |  |   g_mutex_init (&proxy->ack_lock); | 
					
						
							|  |  |  |   g_cond_init (&proxy->ack_condition); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   source = g_idle_source_new (); | 
					
						
							|  |  |  |   g_source_set_priority (source, G_PRIORITY_DEFAULT); | 
					
						
							| 
									
										
										
										
											2007-12-12 19:34:19 +00:00
										 |  |  |   g_source_set_callback (source, mainloop_proxy_func, proxy, | 
					
						
							| 
									
										
										
										
											2007-12-14 09:42:59 +00:00
										 |  |  | 			 (GDestroyNotify)mainloop_proxy_free); | 
					
						
							| 
									
										
										
										
											2021-07-26 10:53:02 +01:00
										 |  |  |   g_source_set_static_name (source, "[gio] mainloop_proxy_func"); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-16 20:22:58 -04:00
										 |  |  |   g_source_attach (source, job->context); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   g_source_unref (source); | 
					
						
							|  |  |  | } |