gmain: Warn when g_source_remove() fails
[platform/upstream/glib.git] / glib / gmain.c
1 /* GLIB - Library of useful routines for C programming
2  * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * gmain.c: Main loop abstraction, timeouts, and idle functions
5  * Copyright 1998 Owen Taylor
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the
19  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22
23 /*
24  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
25  * file for a list of people on the GLib Team.  See the ChangeLog
26  * files for a list of changes.  These files are distributed with
27  * GLib at ftp://ftp.gtk.org/pub/gtk/.
28  */
29
30 /*
31  * MT safe
32  */
33
34 #include "config.h"
35 #include "glibconfig.h"
36
37 /* Uncomment the next line (and the corresponding line in gpoll.c) to
38  * enable debugging printouts if the environment variable
39  * G_MAIN_POLL_DEBUG is set to some value.
40  */
41 /* #define G_MAIN_POLL_DEBUG */
42
43 #ifdef _WIN32
44 /* Always enable debugging printout on Windows, as it is more often
45  * needed there...
46  */
47 #define G_MAIN_POLL_DEBUG
48 #endif
49
50 #ifdef G_OS_UNIX
51 #include "glib-unix.h"
52 #include <pthread.h>
53 #ifdef HAVE_EVENTFD
54 #include <sys/eventfd.h>
55 #endif
56 #endif
57
58 #include <signal.h>
59 #include <sys/types.h>
60 #include <time.h>
61 #include <stdlib.h>
62 #ifdef HAVE_SYS_TIME_H
63 #include <sys/time.h>
64 #endif /* HAVE_SYS_TIME_H */
65 #ifdef HAVE_UNISTD_H
66 #include <unistd.h>
67 #endif /* HAVE_UNISTD_H */
68 #include <errno.h>
69 #include <string.h>
70
71 #ifdef G_OS_WIN32
72 #define STRICT
73 #include <windows.h>
74 #endif /* G_OS_WIN32 */
75
76 #ifdef G_OS_BEOS
77 #include <sys/socket.h>
78 #include <sys/wait.h>
79 #endif /* G_OS_BEOS */
80
81 #include "gmain.h"
82
83 #include "garray.h"
84 #include "giochannel.h"
85 #include "ghash.h"
86 #include "ghook.h"
87 #include "gqueue.h"
88 #include "gstrfuncs.h"
89 #include "gtestutils.h"
90
91 #ifdef G_OS_WIN32
92 #include "gwin32.h"
93 #endif
94
95 #ifdef  G_MAIN_POLL_DEBUG
96 #include "gtimer.h"
97 #endif
98
99 #include "gwakeup.h"
100 #include "gmain-internal.h"
101 #include "glib-init.h"
102 #include "glib-private.h"
103
104 /**
105  * SECTION:main
106  * @title: The Main Event Loop
107  * @short_description: manages all available sources of events
108  *
109  * The main event loop manages all the available sources of events for
110  * GLib and GTK+ applications. These events can come from any number of
111  * different types of sources such as file descriptors (plain files,
112  * pipes or sockets) and timeouts. New types of event sources can also
113  * be added using g_source_attach().
114  *
115  * To allow multiple independent sets of sources to be handled in
116  * different threads, each source is associated with a #GMainContext.
117  * A GMainContext can only be running in a single thread, but
118  * sources can be added to it and removed from it from other threads.
119  *
120  * Each event source is assigned a priority. The default priority,
121  * #G_PRIORITY_DEFAULT, is 0. Values less than 0 denote higher priorities.
122  * Values greater than 0 denote lower priorities. Events from high priority
123  * sources are always processed before events from lower priority sources.
124  *
125  * Idle functions can also be added, and assigned a priority. These will
126  * be run whenever no events with a higher priority are ready to be processed.
127  *
128  * The #GMainLoop data type represents a main event loop. A GMainLoop is
129  * created with g_main_loop_new(). After adding the initial event sources,
130  * g_main_loop_run() is called. This continuously checks for new events from
131  * each of the event sources and dispatches them. Finally, the processing of
132  * an event from one of the sources leads to a call to g_main_loop_quit() to
133  * exit the main loop, and g_main_loop_run() returns.
134  *
135  * It is possible to create new instances of #GMainLoop recursively.
136  * This is often used in GTK+ applications when showing modal dialog
137  * boxes. Note that event sources are associated with a particular
138  * #GMainContext, and will be checked and dispatched for all main
139  * loops associated with that GMainContext.
140  *
141  * GTK+ contains wrappers of some of these functions, e.g. gtk_main(),
142  * gtk_main_quit() and gtk_events_pending().
143  *
144  * <refsect2><title>Creating new source types</title>
145  * <para>One of the unusual features of the #GMainLoop functionality
146  * is that new types of event source can be created and used in
147  * addition to the builtin type of event source. A new event source
148  * type is used for handling GDK events. A new source type is created
149  * by <firstterm>deriving</firstterm> from the #GSource structure.
150  * The derived type of source is represented by a structure that has
151  * the #GSource structure as a first element, and other elements specific
152  * to the new source type. To create an instance of the new source type,
153  * call g_source_new() passing in the size of the derived structure and
154  * a table of functions. These #GSourceFuncs determine the behavior of
155  * the new source type.</para>
156  * <para>New source types basically interact with the main context
157  * in two ways. Their prepare function in #GSourceFuncs can set a timeout
158  * to determine the maximum amount of time that the main loop will sleep
159  * before checking the source again. In addition, or as well, the source
160  * can add file descriptors to the set that the main context checks using
161  * g_source_add_poll().</para>
162  * </refsect2>
163  * <refsect2><title>Customizing the main loop iteration</title>
164  * <para>Single iterations of a #GMainContext can be run with
165  * g_main_context_iteration(). In some cases, more detailed control
166  * of exactly how the details of the main loop work is desired, for
167  * instance, when integrating the #GMainLoop with an external main loop.
168  * In such cases, you can call the component functions of
169  * g_main_context_iteration() directly. These functions are
170  * g_main_context_prepare(), g_main_context_query(),
171  * g_main_context_check() and g_main_context_dispatch().</para>
172  * <para>The operation of these functions can best be seen in terms
173  * of a state diagram, as shown in <xref linkend="mainloop-states"/>.</para>
174  * <figure id="mainloop-states"><title>States of a Main Context</title>
175  * <graphic fileref="mainloop-states.gif" format="GIF"></graphic>
176  * </figure>
177  * </refsect2>
178  *
179  * On Unix, the GLib mainloop is incompatible with fork().  Any program
180  * using the mainloop must either exec() or exit() from the child
181  * without returning to the mainloop.
182  */
183
184 /* Types */
185
186 typedef struct _GTimeoutSource GTimeoutSource;
187 typedef struct _GChildWatchSource GChildWatchSource;
188 typedef struct _GUnixSignalWatchSource GUnixSignalWatchSource;
189 typedef struct _GPollRec GPollRec;
190 typedef struct _GSourceCallback GSourceCallback;
191
192 typedef enum
193 {
194   G_SOURCE_READY = 1 << G_HOOK_FLAG_USER_SHIFT,
195   G_SOURCE_CAN_RECURSE = 1 << (G_HOOK_FLAG_USER_SHIFT + 1),
196   G_SOURCE_BLOCKED = 1 << (G_HOOK_FLAG_USER_SHIFT + 2)
197 } GSourceFlags;
198
199 typedef struct _GSourceList GSourceList;
200
201 struct _GSourceList
202 {
203   GSource *head, *tail;
204   gint priority;
205 };
206
207 typedef struct _GMainWaiter GMainWaiter;
208
209 struct _GMainWaiter
210 {
211   GCond *cond;
212   GMutex *mutex;
213 };
214
215 typedef struct _GMainDispatch GMainDispatch;
216
217 struct _GMainDispatch
218 {
219   gint depth;
220   GSource *source;
221 };
222
223 #ifdef G_MAIN_POLL_DEBUG
224 gboolean _g_main_poll_debug = FALSE;
225 #endif
226
227 struct _GMainContext
228 {
229   /* The following lock is used for both the list of sources
230    * and the list of poll records
231    */
232   GMutex mutex;
233   GCond cond;
234   GThread *owner;
235   guint owner_count;
236   GSList *waiters;
237
238   gint ref_count;
239
240   GPtrArray *pending_dispatches;
241   gint timeout;                 /* Timeout for current iteration */
242
243   guint next_id;
244   GHashTable *overflow_used_source_ids; /* set<guint> */
245   GList *source_lists;
246   gint in_check_or_prepare;
247
248   GPollRec *poll_records, *poll_records_tail;
249   guint n_poll_records;
250   GPollFD *cached_poll_array;
251   guint cached_poll_array_size;
252
253   GWakeup *wakeup;
254
255   GPollFD wake_up_rec;
256
257 /* Flag indicating whether the set of fd's changed during a poll */
258   gboolean poll_changed;
259
260   GPollFunc poll_func;
261
262   gint64   time;
263   gboolean time_is_fresh;
264 };
265
266 struct _GSourceCallback
267 {
268   guint ref_count;
269   GSourceFunc func;
270   gpointer    data;
271   GDestroyNotify notify;
272 };
273
274 struct _GMainLoop
275 {
276   GMainContext *context;
277   gboolean is_running;
278   gint ref_count;
279 };
280
281 struct _GTimeoutSource
282 {
283   GSource     source;
284   guint       interval;
285   gboolean    seconds;
286 };
287
288 struct _GChildWatchSource
289 {
290   GSource     source;
291   GPid        pid;
292   gint        child_status;
293 #ifdef G_OS_WIN32
294   GPollFD     poll;
295 #else /* G_OS_WIN32 */
296   gboolean    child_exited;
297 #endif /* G_OS_WIN32 */
298 };
299
300 struct _GUnixSignalWatchSource
301 {
302   GSource     source;
303   int         signum;
304   gboolean    pending;
305 };
306
307 struct _GPollRec
308 {
309   GPollFD *fd;
310   GPollRec *prev;
311   GPollRec *next;
312   gint priority;
313 };
314
315 struct _GSourcePrivate
316 {
317   GSList *child_sources;
318   GSource *parent_source;
319
320   gint64 ready_time;
321
322   /* This is currently only used on UNIX, but we always declare it (and
323    * let it remain empty on Windows) to avoid #ifdef all over the place.
324    */
325   GSList *fds;
326 };
327
328 typedef struct _GSourceIter
329 {
330   GMainContext *context;
331   gboolean may_modify;
332   GList *current_list;
333   GSource *source;
334 } GSourceIter;
335
336 #define LOCK_CONTEXT(context) g_mutex_lock (&context->mutex)
337 #define UNLOCK_CONTEXT(context) g_mutex_unlock (&context->mutex)
338 #define G_THREAD_SELF g_thread_self ()
339
340 #define SOURCE_DESTROYED(source) (((source)->flags & G_HOOK_FLAG_ACTIVE) == 0)
341 #define SOURCE_BLOCKED(source) (((source)->flags & G_SOURCE_BLOCKED) != 0)
342
343 #define SOURCE_UNREF(source, context)                       \
344    G_STMT_START {                                           \
345     if ((source)->ref_count > 1)                            \
346       (source)->ref_count--;                                \
347     else                                                    \
348       g_source_unref_internal ((source), (context), TRUE);  \
349    } G_STMT_END
350
351
352 /* Forward declarations */
353
354 static void g_source_unref_internal             (GSource      *source,
355                                                  GMainContext *context,
356                                                  gboolean      have_lock);
357 static void g_source_destroy_internal           (GSource      *source,
358                                                  GMainContext *context,
359                                                  gboolean      have_lock);
360 static void g_source_set_priority_unlocked      (GSource      *source,
361                                                  GMainContext *context,
362                                                  gint          priority);
363 static void g_child_source_remove_internal      (GSource      *child_source,
364                                                  GMainContext *context);
365
366 static void g_main_context_poll                 (GMainContext *context,
367                                                  gint          timeout,
368                                                  gint          priority,
369                                                  GPollFD      *fds,
370                                                  gint          n_fds);
371 static void g_main_context_add_poll_unlocked    (GMainContext *context,
372                                                  gint          priority,
373                                                  GPollFD      *fd);
374 static void g_main_context_remove_poll_unlocked (GMainContext *context,
375                                                  GPollFD      *fd);
376
377 static void     g_source_iter_init  (GSourceIter   *iter,
378                                      GMainContext  *context,
379                                      gboolean       may_modify);
380 static gboolean g_source_iter_next  (GSourceIter   *iter,
381                                      GSource      **source);
382 static void     g_source_iter_clear (GSourceIter   *iter);
383
384 static gboolean g_timeout_dispatch (GSource     *source,
385                                     GSourceFunc  callback,
386                                     gpointer     user_data);
387 static gboolean g_child_watch_prepare  (GSource     *source,
388                                         gint        *timeout);
389 static gboolean g_child_watch_check    (GSource     *source);
390 static gboolean g_child_watch_dispatch (GSource     *source,
391                                         GSourceFunc  callback,
392                                         gpointer     user_data);
393 static void     g_child_watch_finalize (GSource     *source);
394 #ifdef G_OS_UNIX
395 static void g_unix_signal_handler (int signum);
396 static gboolean g_unix_signal_watch_prepare  (GSource     *source,
397                                               gint        *timeout);
398 static gboolean g_unix_signal_watch_check    (GSource     *source);
399 static gboolean g_unix_signal_watch_dispatch (GSource     *source,
400                                               GSourceFunc  callback,
401                                               gpointer     user_data);
402 static void     g_unix_signal_watch_finalize  (GSource     *source);
403 #endif
404 static gboolean g_idle_prepare     (GSource     *source,
405                                     gint        *timeout);
406 static gboolean g_idle_check       (GSource     *source);
407 static gboolean g_idle_dispatch    (GSource     *source,
408                                     GSourceFunc  callback,
409                                     gpointer     user_data);
410
411 static void block_source (GSource *source);
412
413 static GMainContext *glib_worker_context;
414
415 G_LOCK_DEFINE_STATIC (main_loop);
416 static GMainContext *default_main_context;
417
418 #ifndef G_OS_WIN32
419
420
421 /* UNIX signals work by marking one of these variables then waking the
422  * worker context to check on them and dispatch accordingly.
423  */
424 #ifdef HAVE_SIG_ATOMIC_T
425 static volatile sig_atomic_t unix_signal_pending[NSIG];
426 static volatile sig_atomic_t any_unix_signal_pending;
427 #else
428 static volatile int unix_signal_pending[NSIG];
429 static volatile int any_unix_signal_pending;
430 #endif
431 static volatile guint unix_signal_refcount[NSIG];
432
433 /* Guards all the data below */
434 G_LOCK_DEFINE_STATIC (unix_signal_lock);
435 static GSList *unix_signal_watches;
436 static GSList *unix_child_watches;
437
438 GSourceFuncs g_unix_signal_funcs =
439 {
440   g_unix_signal_watch_prepare,
441   g_unix_signal_watch_check,
442   g_unix_signal_watch_dispatch,
443   g_unix_signal_watch_finalize
444 };
445 #endif /* !G_OS_WIN32 */
446 G_LOCK_DEFINE_STATIC (main_context_list);
447 static GSList *main_context_list = NULL;
448
449 GSourceFuncs g_timeout_funcs =
450 {
451   NULL, /* prepare */
452   NULL, /* check */
453   g_timeout_dispatch,
454   NULL
455 };
456
457 GSourceFuncs g_child_watch_funcs =
458 {
459   g_child_watch_prepare,
460   g_child_watch_check,
461   g_child_watch_dispatch,
462   g_child_watch_finalize
463 };
464
465 GSourceFuncs g_idle_funcs =
466 {
467   g_idle_prepare,
468   g_idle_check,
469   g_idle_dispatch,
470   NULL
471 };
472
473 /**
474  * g_main_context_ref:
475  * @context: a #GMainContext
476  * 
477  * Increases the reference count on a #GMainContext object by one.
478  *
479  * Returns: the @context that was passed in (since 2.6)
480  **/
481 GMainContext *
482 g_main_context_ref (GMainContext *context)
483 {
484   g_return_val_if_fail (context != NULL, NULL);
485   g_return_val_if_fail (g_atomic_int_get (&context->ref_count) > 0, NULL); 
486
487   g_atomic_int_inc (&context->ref_count);
488
489   return context;
490 }
491
492 static inline void
493 poll_rec_list_free (GMainContext *context,
494                     GPollRec     *list)
495 {
496   g_slice_free_chain (GPollRec, list, next);
497 }
498
499 /**
500  * g_main_context_unref:
501  * @context: a #GMainContext
502  * 
503  * Decreases the reference count on a #GMainContext object by one. If
504  * the result is zero, free the context and free all associated memory.
505  **/
506 void
507 g_main_context_unref (GMainContext *context)
508 {
509   GSourceIter iter;
510   GSource *source;
511   GList *sl_iter;
512   GSourceList *list;
513
514   g_return_if_fail (context != NULL);
515   g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0); 
516
517   if (!g_atomic_int_dec_and_test (&context->ref_count))
518     return;
519
520   G_LOCK (main_context_list);
521   main_context_list = g_slist_remove (main_context_list, context);
522   G_UNLOCK (main_context_list);
523
524   /* g_source_iter_next() assumes the context is locked. */
525   LOCK_CONTEXT (context);
526   g_source_iter_init (&iter, context, TRUE);
527   while (g_source_iter_next (&iter, &source))
528     {
529       source->context = NULL;
530       g_source_destroy_internal (source, context, TRUE);
531     }
532   UNLOCK_CONTEXT (context);
533
534   for (sl_iter = context->source_lists; sl_iter; sl_iter = sl_iter->next)
535     {
536       list = sl_iter->data;
537       g_slice_free (GSourceList, list);
538     }
539   g_list_free (context->source_lists);
540
541   if (context->overflow_used_source_ids)
542     g_hash_table_destroy (context->overflow_used_source_ids);
543
544   g_mutex_clear (&context->mutex);
545
546   g_ptr_array_free (context->pending_dispatches, TRUE);
547   g_free (context->cached_poll_array);
548
549   poll_rec_list_free (context, context->poll_records);
550
551   g_wakeup_free (context->wakeup);
552   g_cond_clear (&context->cond);
553
554   g_free (context);
555 }
556
557 /* Helper function used by mainloop/overflow test.
558  */
559 GMainContext *
560 g_main_context_new_with_next_id (guint next_id)
561 {
562   GMainContext *ret = g_main_context_new ();
563   
564   ret->next_id = next_id;
565   
566   return ret;
567 }
568
569 /**
570  * g_main_context_new:
571  * 
572  * Creates a new #GMainContext structure.
573  * 
574  * Return value: the new #GMainContext
575  **/
576 GMainContext *
577 g_main_context_new (void)
578 {
579   static gsize initialised;
580   GMainContext *context;
581
582   if (g_once_init_enter (&initialised))
583     {
584 #ifdef G_MAIN_POLL_DEBUG
585       if (getenv ("G_MAIN_POLL_DEBUG") != NULL)
586         _g_main_poll_debug = TRUE;
587 #endif
588
589       g_once_init_leave (&initialised, TRUE);
590     }
591
592   context = g_new0 (GMainContext, 1);
593
594   g_mutex_init (&context->mutex);
595   g_cond_init (&context->cond);
596
597   context->owner = NULL;
598   context->waiters = NULL;
599
600   context->ref_count = 1;
601
602   context->next_id = 1;
603   
604   context->source_lists = NULL;
605   
606   context->poll_func = g_poll;
607   
608   context->cached_poll_array = NULL;
609   context->cached_poll_array_size = 0;
610   
611   context->pending_dispatches = g_ptr_array_new ();
612   
613   context->time_is_fresh = FALSE;
614   
615   context->wakeup = g_wakeup_new ();
616   g_wakeup_get_pollfd (context->wakeup, &context->wake_up_rec);
617   g_main_context_add_poll_unlocked (context, 0, &context->wake_up_rec);
618
619   G_LOCK (main_context_list);
620   main_context_list = g_slist_append (main_context_list, context);
621
622 #ifdef G_MAIN_POLL_DEBUG
623   if (_g_main_poll_debug)
624     g_print ("created context=%p\n", context);
625 #endif
626
627   G_UNLOCK (main_context_list);
628
629   return context;
630 }
631
632 /**
633  * g_main_context_default:
634  * 
635  * Returns the global default main context. This is the main context
636  * used for main loop functions when a main loop is not explicitly
637  * specified, and corresponds to the "main" main loop. See also
638  * g_main_context_get_thread_default().
639  * 
640  * Return value: (transfer none): the global default main context.
641  **/
642 GMainContext *
643 g_main_context_default (void)
644 {
645   /* Slow, but safe */
646   
647   G_LOCK (main_loop);
648
649   if (!default_main_context)
650     {
651       default_main_context = g_main_context_new ();
652 #ifdef G_MAIN_POLL_DEBUG
653       if (_g_main_poll_debug)
654         g_print ("default context=%p\n", default_main_context);
655 #endif
656     }
657
658   G_UNLOCK (main_loop);
659
660   return default_main_context;
661 }
662
663 static void
664 free_context (gpointer data)
665 {
666   GMainContext *context = data;
667
668   g_main_context_release (context);
669   if (context)
670     g_main_context_unref (context);
671 }
672
673 static void
674 free_context_stack (gpointer data)
675 {
676   g_queue_free_full((GQueue *) data, (GDestroyNotify) free_context);
677 }
678
679 static GPrivate thread_context_stack = G_PRIVATE_INIT (free_context_stack);
680
681 /**
682  * g_main_context_push_thread_default:
683  * @context: (allow-none): a #GMainContext, or %NULL for the global default context
684  *
685  * Acquires @context and sets it as the thread-default context for the
686  * current thread. This will cause certain asynchronous operations
687  * (such as most <link linkend="gio">gio</link>-based I/O) which are
688  * started in this thread to run under @context and deliver their
689  * results to its main loop, rather than running under the global
690  * default context in the main thread. Note that calling this function
691  * changes the context returned by
692  * g_main_context_get_thread_default(), <emphasis>not</emphasis> the
693  * one returned by g_main_context_default(), so it does not affect the
694  * context used by functions like g_idle_add().
695  *
696  * Normally you would call this function shortly after creating a new
697  * thread, passing it a #GMainContext which will be run by a
698  * #GMainLoop in that thread, to set a new default context for all
699  * async operations in that thread. (In this case, you don't need to
700  * ever call g_main_context_pop_thread_default().) In some cases
701  * however, you may want to schedule a single operation in a
702  * non-default context, or temporarily use a non-default context in
703  * the main thread. In that case, you can wrap the call to the
704  * asynchronous operation inside a
705  * g_main_context_push_thread_default() /
706  * g_main_context_pop_thread_default() pair, but it is up to you to
707  * ensure that no other asynchronous operations accidentally get
708  * started while the non-default context is active.
709  *
710  * Beware that libraries that predate this function may not correctly
711  * handle being used from a thread with a thread-default context. Eg,
712  * see g_file_supports_thread_contexts().
713  *
714  * Since: 2.22
715  **/
716 void
717 g_main_context_push_thread_default (GMainContext *context)
718 {
719   GQueue *stack;
720   gboolean acquired_context;
721
722   acquired_context = g_main_context_acquire (context);
723   g_return_if_fail (acquired_context);
724
725   if (context == g_main_context_default ())
726     context = NULL;
727   else if (context)
728     g_main_context_ref (context);
729
730   stack = g_private_get (&thread_context_stack);
731   if (!stack)
732     {
733       stack = g_queue_new ();
734       g_private_set (&thread_context_stack, stack);
735     }
736
737   g_queue_push_head (stack, context);
738 }
739
740 /**
741  * g_main_context_pop_thread_default:
742  * @context: (allow-none): a #GMainContext object, or %NULL
743  *
744  * Pops @context off the thread-default context stack (verifying that
745  * it was on the top of the stack).
746  *
747  * Since: 2.22
748  **/
749 void
750 g_main_context_pop_thread_default (GMainContext *context)
751 {
752   GQueue *stack;
753
754   if (context == g_main_context_default ())
755     context = NULL;
756
757   stack = g_private_get (&thread_context_stack);
758
759   g_return_if_fail (stack != NULL);
760   g_return_if_fail (g_queue_peek_head (stack) == context);
761
762   g_queue_pop_head (stack);
763
764   g_main_context_release (context);
765   if (context)
766     g_main_context_unref (context);
767 }
768
769 /**
770  * g_main_context_get_thread_default:
771  *
772  * Gets the thread-default #GMainContext for this thread. Asynchronous
773  * operations that want to be able to be run in contexts other than
774  * the default one should call this method or
775  * g_main_context_ref_thread_default() to get a #GMainContext to add
776  * their #GSource<!-- -->s to. (Note that even in single-threaded
777  * programs applications may sometimes want to temporarily push a
778  * non-default context, so it is not safe to assume that this will
779  * always return %NULL if you are running in the default thread.)
780  *
781  * If you need to hold a reference on the context, use
782  * g_main_context_ref_thread_default() instead.
783  *
784  * Returns: (transfer none): the thread-default #GMainContext, or
785  * %NULL if the thread-default context is the global default context.
786  *
787  * Since: 2.22
788  **/
789 GMainContext *
790 g_main_context_get_thread_default (void)
791 {
792   GQueue *stack;
793
794   stack = g_private_get (&thread_context_stack);
795   if (stack)
796     return g_queue_peek_head (stack);
797   else
798     return NULL;
799 }
800
801 /**
802  * g_main_context_ref_thread_default:
803  *
804  * Gets the thread-default #GMainContext for this thread, as with
805  * g_main_context_get_thread_default(), but also adds a reference to
806  * it with g_main_context_ref(). In addition, unlike
807  * g_main_context_get_thread_default(), if the thread-default context
808  * is the global default context, this will return that #GMainContext
809  * (with a ref added to it) rather than returning %NULL.
810  *
811  * Returns: (transfer full): the thread-default #GMainContext. Unref
812  *     with g_main_context_unref() when you are done with it.
813  *
814  * Since: 2.32
815  */
816 GMainContext *
817 g_main_context_ref_thread_default (void)
818 {
819   GMainContext *context;
820
821   context = g_main_context_get_thread_default ();
822   if (!context)
823     context = g_main_context_default ();
824   return g_main_context_ref (context);
825 }
826
827 /* Hooks for adding to the main loop */
828
829 /**
830  * g_source_new:
831  * @source_funcs: structure containing functions that implement
832  *                the sources behavior.
833  * @struct_size: size of the #GSource structure to create.
834  * 
835  * Creates a new #GSource structure. The size is specified to
836  * allow creating structures derived from #GSource that contain
837  * additional data. The size passed in must be at least
838  * <literal>sizeof (GSource)</literal>.
839  * 
840  * The source will not initially be associated with any #GMainContext
841  * and must be added to one with g_source_attach() before it will be
842  * executed.
843  * 
844  * Return value: the newly-created #GSource.
845  **/
846 GSource *
847 g_source_new (GSourceFuncs *source_funcs,
848               guint         struct_size)
849 {
850   GSource *source;
851
852   g_return_val_if_fail (source_funcs != NULL, NULL);
853   g_return_val_if_fail (struct_size >= sizeof (GSource), NULL);
854   
855   source = (GSource*) g_malloc0 (struct_size);
856   source->priv = g_slice_new0 (GSourcePrivate);
857   source->source_funcs = source_funcs;
858   source->ref_count = 1;
859   
860   source->priority = G_PRIORITY_DEFAULT;
861
862   source->flags = G_HOOK_FLAG_ACTIVE;
863
864   source->priv->ready_time = -1;
865
866   /* NULL/0 initialization for all other fields */
867   
868   return source;
869 }
870
871 /* Holds context's lock */
872 static void
873 g_source_iter_init (GSourceIter  *iter,
874                     GMainContext *context,
875                     gboolean      may_modify)
876 {
877   iter->context = context;
878   iter->current_list = NULL;
879   iter->source = NULL;
880   iter->may_modify = may_modify;
881 }
882
883 /* Holds context's lock */
884 static gboolean
885 g_source_iter_next (GSourceIter *iter, GSource **source)
886 {
887   GSource *next_source;
888
889   if (iter->source)
890     next_source = iter->source->next;
891   else
892     next_source = NULL;
893
894   if (!next_source)
895     {
896       if (iter->current_list)
897         iter->current_list = iter->current_list->next;
898       else
899         iter->current_list = iter->context->source_lists;
900
901       if (iter->current_list)
902         {
903           GSourceList *source_list = iter->current_list->data;
904
905           next_source = source_list->head;
906         }
907     }
908
909   /* Note: unreffing iter->source could potentially cause its
910    * GSourceList to be removed from source_lists (if iter->source is
911    * the only source in its list, and it is destroyed), so we have to
912    * keep it reffed until after we advance iter->current_list, above.
913    */
914
915   if (iter->source && iter->may_modify)
916     SOURCE_UNREF (iter->source, iter->context);
917   iter->source = next_source;
918   if (iter->source && iter->may_modify)
919     iter->source->ref_count++;
920
921   *source = iter->source;
922   return *source != NULL;
923 }
924
925 /* Holds context's lock. Only necessary to call if you broke out of
926  * the g_source_iter_next() loop early.
927  */
928 static void
929 g_source_iter_clear (GSourceIter *iter)
930 {
931   if (iter->source && iter->may_modify)
932     {
933       SOURCE_UNREF (iter->source, iter->context);
934       iter->source = NULL;
935     }
936 }
937
938 /* Holds context's lock
939  */
940 static GSourceList *
941 find_source_list_for_priority (GMainContext *context,
942                                gint          priority,
943                                gboolean      create)
944 {
945   GList *iter, *last;
946   GSourceList *source_list;
947
948   last = NULL;
949   for (iter = context->source_lists; iter != NULL; last = iter, iter = iter->next)
950     {
951       source_list = iter->data;
952
953       if (source_list->priority == priority)
954         return source_list;
955
956       if (source_list->priority > priority)
957         {
958           if (!create)
959             return NULL;
960
961           source_list = g_slice_new0 (GSourceList);
962           source_list->priority = priority;
963           context->source_lists = g_list_insert_before (context->source_lists,
964                                                         iter,
965                                                         source_list);
966           return source_list;
967         }
968     }
969
970   if (!create)
971     return NULL;
972
973   source_list = g_slice_new0 (GSourceList);
974   source_list->priority = priority;
975
976   if (!last)
977     context->source_lists = g_list_append (NULL, source_list);
978   else
979     {
980       /* This just appends source_list to the end of
981        * context->source_lists without having to walk the list again.
982        */
983       last = g_list_append (last, source_list);
984     }
985   return source_list;
986 }
987
988 /* Holds context's lock
989  */
990 static void
991 source_add_to_context (GSource      *source,
992                        GMainContext *context)
993 {
994   GSourceList *source_list;
995   GSource *prev, *next;
996
997   source_list = find_source_list_for_priority (context, source->priority, TRUE);
998
999   if (source->priv->parent_source)
1000     {
1001       g_assert (source_list->head != NULL);
1002
1003       /* Put the source immediately before its parent */
1004       prev = source->priv->parent_source->prev;
1005       next = source->priv->parent_source;
1006     }
1007   else
1008     {
1009       prev = source_list->tail;
1010       next = NULL;
1011     }
1012
1013   source->next = next;
1014   if (next)
1015     next->prev = source;
1016   else
1017     source_list->tail = source;
1018   
1019   source->prev = prev;
1020   if (prev)
1021     prev->next = source;
1022   else
1023     source_list->head = source;
1024 }
1025
1026 /* Holds context's lock
1027  */
1028 static void
1029 source_remove_from_context (GSource      *source,
1030                             GMainContext *context)
1031 {
1032   GSourceList *source_list;
1033
1034   source_list = find_source_list_for_priority (context, source->priority, FALSE);
1035   g_return_if_fail (source_list != NULL);
1036
1037   if (source->prev)
1038     source->prev->next = source->next;
1039   else
1040     source_list->head = source->next;
1041
1042   if (source->next)
1043     source->next->prev = source->prev;
1044   else
1045     source_list->tail = source->prev;
1046
1047   source->prev = NULL;
1048   source->next = NULL;
1049
1050   if (source_list->head == NULL)
1051     {
1052       context->source_lists = g_list_remove (context->source_lists, source_list);
1053       g_slice_free (GSourceList, source_list);
1054     }
1055
1056   if (context->overflow_used_source_ids)
1057     g_hash_table_remove (context->overflow_used_source_ids,
1058                          GUINT_TO_POINTER (source->source_id));
1059   
1060 }
1061
1062 static void
1063 assign_source_id_unlocked (GMainContext   *context,
1064                            GSource        *source)
1065 {
1066   guint id;
1067
1068   /* Are we about to overflow back to 0? 
1069    * See https://bugzilla.gnome.org/show_bug.cgi?id=687098
1070    */
1071   if (G_UNLIKELY (context->next_id == G_MAXUINT &&
1072                   context->overflow_used_source_ids == NULL))
1073     {
1074       GSourceIter iter;
1075       GSource *source;
1076
1077       context->overflow_used_source_ids = g_hash_table_new (NULL, NULL);
1078   
1079       g_source_iter_init (&iter, context, FALSE);
1080       while (g_source_iter_next (&iter, &source))
1081         {
1082           g_hash_table_add (context->overflow_used_source_ids,
1083                             GUINT_TO_POINTER (source->source_id));
1084         }
1085       id = G_MAXUINT;
1086       g_hash_table_add (context->overflow_used_source_ids, GUINT_TO_POINTER (id));
1087     }
1088   else if (context->overflow_used_source_ids == NULL)
1089     {
1090       id = context->next_id++;
1091     }
1092   else
1093     {
1094       /*
1095        * If we overran G_MAXUINT, we fall back to randomly probing the
1096        * source ids for the current context.  This will be slower the more
1097        * sources there are, but we're mainly concerned right now about
1098        * correctness and code size.  There's time for a more clever solution
1099        * later.
1100        */
1101       do
1102         id = g_random_int ();
1103       while (id == 0 ||
1104              g_hash_table_contains (context->overflow_used_source_ids,
1105                                     GUINT_TO_POINTER (id)));
1106       g_hash_table_add (context->overflow_used_source_ids, GUINT_TO_POINTER (id));
1107     }
1108
1109   source->source_id = id;
1110 }
1111
1112 static guint
1113 g_source_attach_unlocked (GSource      *source,
1114                           GMainContext *context)
1115 {
1116   GSList *tmp_list;
1117
1118   source->context = context;
1119   assign_source_id_unlocked (context, source);
1120   source->ref_count++;
1121   source_add_to_context (source, context);
1122
1123   if (!SOURCE_BLOCKED (source))
1124     {
1125       tmp_list = source->poll_fds;
1126       while (tmp_list)
1127         {
1128           g_main_context_add_poll_unlocked (context, source->priority, tmp_list->data);
1129           tmp_list = tmp_list->next;
1130         }
1131
1132       for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next)
1133         g_main_context_add_poll_unlocked (context, source->priority, tmp_list->data);
1134     }
1135
1136   tmp_list = source->priv->child_sources;
1137   while (tmp_list)
1138     {
1139       g_source_attach_unlocked (tmp_list->data, context);
1140       tmp_list = tmp_list->next;
1141     }
1142
1143   return source->source_id;
1144 }
1145
1146 /**
1147  * g_source_attach:
1148  * @source: a #GSource
1149  * @context: (allow-none): a #GMainContext (if %NULL, the default context will be used)
1150  * 
1151  * Adds a #GSource to a @context so that it will be executed within
1152  * that context. Remove it by calling g_source_destroy().
1153  *
1154  * Return value: the ID (greater than 0) for the source within the 
1155  *   #GMainContext. 
1156  **/
1157 guint
1158 g_source_attach (GSource      *source,
1159                  GMainContext *context)
1160 {
1161   guint result = 0;
1162
1163   g_return_val_if_fail (source->context == NULL, 0);
1164   g_return_val_if_fail (!SOURCE_DESTROYED (source), 0);
1165   
1166   if (!context)
1167     context = g_main_context_default ();
1168
1169   LOCK_CONTEXT (context);
1170
1171   result = g_source_attach_unlocked (source, context);
1172
1173   /* If another thread has acquired the context, wake it up since it
1174    * might be in poll() right now.
1175    */
1176   if (context->owner && context->owner != G_THREAD_SELF)
1177     g_wakeup_signal (context->wakeup);
1178
1179   UNLOCK_CONTEXT (context);
1180
1181   return result;
1182 }
1183
1184 static void
1185 g_source_destroy_internal (GSource      *source,
1186                            GMainContext *context,
1187                            gboolean      have_lock)
1188 {
1189   if (!have_lock)
1190     LOCK_CONTEXT (context);
1191   
1192   if (!SOURCE_DESTROYED (source))
1193     {
1194       GSList *tmp_list;
1195       gpointer old_cb_data;
1196       GSourceCallbackFuncs *old_cb_funcs;
1197       
1198       source->flags &= ~G_HOOK_FLAG_ACTIVE;
1199
1200       old_cb_data = source->callback_data;
1201       old_cb_funcs = source->callback_funcs;
1202
1203       source->callback_data = NULL;
1204       source->callback_funcs = NULL;
1205
1206       if (old_cb_funcs)
1207         {
1208           UNLOCK_CONTEXT (context);
1209           old_cb_funcs->unref (old_cb_data);
1210           LOCK_CONTEXT (context);
1211         }
1212
1213       if (!SOURCE_BLOCKED (source))
1214         {
1215           tmp_list = source->poll_fds;
1216           while (tmp_list)
1217             {
1218               g_main_context_remove_poll_unlocked (context, tmp_list->data);
1219               tmp_list = tmp_list->next;
1220             }
1221
1222           for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next)
1223             g_main_context_remove_poll_unlocked (context, tmp_list->data);
1224         }
1225
1226       while (source->priv->child_sources)
1227         g_child_source_remove_internal (source->priv->child_sources->data, context);
1228
1229       if (source->priv->parent_source)
1230         g_child_source_remove_internal (source, context);
1231           
1232       g_source_unref_internal (source, context, TRUE);
1233     }
1234
1235   if (!have_lock)
1236     UNLOCK_CONTEXT (context);
1237 }
1238
1239 /**
1240  * g_source_destroy:
1241  * @source: a #GSource
1242  * 
1243  * Removes a source from its #GMainContext, if any, and mark it as
1244  * destroyed.  The source cannot be subsequently added to another
1245  * context.
1246  **/
1247 void
1248 g_source_destroy (GSource *source)
1249 {
1250   GMainContext *context;
1251   
1252   g_return_if_fail (source != NULL);
1253   
1254   context = source->context;
1255   
1256   if (context)
1257     g_source_destroy_internal (source, context, FALSE);
1258   else
1259     source->flags &= ~G_HOOK_FLAG_ACTIVE;
1260 }
1261
1262 /**
1263  * g_source_get_id:
1264  * @source: a #GSource
1265  * 
1266  * Returns the numeric ID for a particular source. The ID of a source
1267  * is a positive integer which is unique within a particular main loop 
1268  * context. The reverse
1269  * mapping from ID to source is done by g_main_context_find_source_by_id().
1270  *
1271  * Return value: the ID (greater than 0) for the source
1272  **/
1273 guint
1274 g_source_get_id (GSource *source)
1275 {
1276   guint result;
1277   
1278   g_return_val_if_fail (source != NULL, 0);
1279   g_return_val_if_fail (source->context != NULL, 0);
1280
1281   LOCK_CONTEXT (source->context);
1282   result = source->source_id;
1283   UNLOCK_CONTEXT (source->context);
1284   
1285   return result;
1286 }
1287
1288 /**
1289  * g_source_get_context:
1290  * @source: a #GSource
1291  * 
1292  * Gets the #GMainContext with which the source is associated.
1293  *
1294  * You can call this on a source that has been destroyed, provided
1295  * that the #GMainContext it was attached to still exists (in which
1296  * case it will return that #GMainContext). In particular, you can
1297  * always call this function on the source returned from
1298  * g_main_current_source(). But calling this function on a source
1299  * whose #GMainContext has been destroyed is an error.
1300  * 
1301  * Return value: (transfer none) (allow-none): the #GMainContext with which the
1302  *               source is associated, or %NULL if the context has not
1303  *               yet been added to a source.
1304  **/
1305 GMainContext *
1306 g_source_get_context (GSource *source)
1307 {
1308   g_return_val_if_fail (source->context != NULL || !SOURCE_DESTROYED (source), NULL);
1309
1310   return source->context;
1311 }
1312
1313 /**
1314  * g_source_add_poll:
1315  * @source:a #GSource 
1316  * @fd: a #GPollFD structure holding information about a file
1317  *      descriptor to watch.
1318  *
1319  * Adds a file descriptor to the set of file descriptors polled for
1320  * this source. This is usually combined with g_source_new() to add an
1321  * event source. The event source's check function will typically test
1322  * the @revents field in the #GPollFD struct and return %TRUE if events need
1323  * to be processed.
1324  *
1325  * Using this API forces the linear scanning of event sources on each
1326  * main loop iteration.  Newly-written event sources should try to use
1327  * g_source_add_unix_fd() instead of this API.
1328  **/
1329 void
1330 g_source_add_poll (GSource *source,
1331                    GPollFD *fd)
1332 {
1333   GMainContext *context;
1334   
1335   g_return_if_fail (source != NULL);
1336   g_return_if_fail (fd != NULL);
1337   g_return_if_fail (!SOURCE_DESTROYED (source));
1338   
1339   context = source->context;
1340
1341   if (context)
1342     LOCK_CONTEXT (context);
1343   
1344   source->poll_fds = g_slist_prepend (source->poll_fds, fd);
1345
1346   if (context)
1347     {
1348       if (!SOURCE_BLOCKED (source))
1349         g_main_context_add_poll_unlocked (context, source->priority, fd);
1350       UNLOCK_CONTEXT (context);
1351     }
1352 }
1353
1354 /**
1355  * g_source_remove_poll:
1356  * @source:a #GSource 
1357  * @fd: a #GPollFD structure previously passed to g_source_add_poll().
1358  * 
1359  * Removes a file descriptor from the set of file descriptors polled for
1360  * this source. 
1361  **/
1362 void
1363 g_source_remove_poll (GSource *source,
1364                       GPollFD *fd)
1365 {
1366   GMainContext *context;
1367   
1368   g_return_if_fail (source != NULL);
1369   g_return_if_fail (fd != NULL);
1370   g_return_if_fail (!SOURCE_DESTROYED (source));
1371   
1372   context = source->context;
1373
1374   if (context)
1375     LOCK_CONTEXT (context);
1376   
1377   source->poll_fds = g_slist_remove (source->poll_fds, fd);
1378
1379   if (context)
1380     {
1381       if (!SOURCE_BLOCKED (source))
1382         g_main_context_remove_poll_unlocked (context, fd);
1383       UNLOCK_CONTEXT (context);
1384     }
1385 }
1386
1387 /**
1388  * g_source_add_child_source:
1389  * @source:a #GSource
1390  * @child_source: a second #GSource that @source should "poll"
1391  *
1392  * Adds @child_source to @source as a "polled" source; when @source is
1393  * added to a #GMainContext, @child_source will be automatically added
1394  * with the same priority, when @child_source is triggered, it will
1395  * cause @source to dispatch (in addition to calling its own
1396  * callback), and when @source is destroyed, it will destroy
1397  * @child_source as well. (@source will also still be dispatched if
1398  * its own prepare/check functions indicate that it is ready.)
1399  *
1400  * If you don't need @child_source to do anything on its own when it
1401  * triggers, you can call g_source_set_dummy_callback() on it to set a
1402  * callback that does nothing (except return %TRUE if appropriate).
1403  *
1404  * @source will hold a reference on @child_source while @child_source
1405  * is attached to it.
1406  *
1407  * Since: 2.28
1408  **/
1409 void
1410 g_source_add_child_source (GSource *source,
1411                            GSource *child_source)
1412 {
1413   GMainContext *context;
1414
1415   g_return_if_fail (source != NULL);
1416   g_return_if_fail (child_source != NULL);
1417   g_return_if_fail (!SOURCE_DESTROYED (source));
1418   g_return_if_fail (!SOURCE_DESTROYED (child_source));
1419   g_return_if_fail (child_source->context == NULL);
1420   g_return_if_fail (child_source->priv->parent_source == NULL);
1421
1422   context = source->context;
1423
1424   if (context)
1425     LOCK_CONTEXT (context);
1426
1427   source->priv->child_sources = g_slist_prepend (source->priv->child_sources,
1428                                                  g_source_ref (child_source));
1429   child_source->priv->parent_source = source;
1430   g_source_set_priority_unlocked (child_source, NULL, source->priority);
1431   if (SOURCE_BLOCKED (source))
1432     block_source (child_source);
1433
1434   if (context)
1435     {
1436       UNLOCK_CONTEXT (context);
1437       g_source_attach (child_source, context);
1438     }
1439 }
1440
1441 static void
1442 g_child_source_remove_internal (GSource *child_source,
1443                                 GMainContext *context)
1444 {
1445   GSource *parent_source = child_source->priv->parent_source;
1446
1447   parent_source->priv->child_sources =
1448     g_slist_remove (parent_source->priv->child_sources, child_source);
1449   child_source->priv->parent_source = NULL;
1450
1451   g_source_destroy_internal (child_source, context, TRUE);
1452   g_source_unref_internal (child_source, context, TRUE);
1453 }
1454
1455 /**
1456  * g_source_remove_child_source:
1457  * @source:a #GSource
1458  * @child_source: a #GSource previously passed to
1459  *     g_source_add_child_source().
1460  *
1461  * Detaches @child_source from @source and destroys it.
1462  *
1463  * Since: 2.28
1464  **/
1465 void
1466 g_source_remove_child_source (GSource *source,
1467                               GSource *child_source)
1468 {
1469   GMainContext *context;
1470
1471   g_return_if_fail (source != NULL);
1472   g_return_if_fail (child_source != NULL);
1473   g_return_if_fail (child_source->priv->parent_source == source);
1474   g_return_if_fail (!SOURCE_DESTROYED (source));
1475   g_return_if_fail (!SOURCE_DESTROYED (child_source));
1476
1477   context = source->context;
1478
1479   if (context)
1480     LOCK_CONTEXT (context);
1481
1482   g_child_source_remove_internal (child_source, context);
1483
1484   if (context)
1485     UNLOCK_CONTEXT (context);
1486 }
1487
1488 /**
1489  * g_source_set_callback_indirect:
1490  * @source: the source
1491  * @callback_data: pointer to callback data "object"
1492  * @callback_funcs: functions for reference counting @callback_data
1493  *                  and getting the callback and data
1494  * 
1495  * Sets the callback function storing the data as a refcounted callback
1496  * "object". This is used internally. Note that calling 
1497  * g_source_set_callback_indirect() assumes
1498  * an initial reference count on @callback_data, and thus
1499  * @callback_funcs->unref will eventually be called once more
1500  * than @callback_funcs->ref.
1501  **/
1502 void
1503 g_source_set_callback_indirect (GSource              *source,
1504                                 gpointer              callback_data,
1505                                 GSourceCallbackFuncs *callback_funcs)
1506 {
1507   GMainContext *context;
1508   gpointer old_cb_data;
1509   GSourceCallbackFuncs *old_cb_funcs;
1510   
1511   g_return_if_fail (source != NULL);
1512   g_return_if_fail (callback_funcs != NULL || callback_data == NULL);
1513
1514   context = source->context;
1515
1516   if (context)
1517     LOCK_CONTEXT (context);
1518
1519   old_cb_data = source->callback_data;
1520   old_cb_funcs = source->callback_funcs;
1521
1522   source->callback_data = callback_data;
1523   source->callback_funcs = callback_funcs;
1524   
1525   if (context)
1526     UNLOCK_CONTEXT (context);
1527   
1528   if (old_cb_funcs)
1529     old_cb_funcs->unref (old_cb_data);
1530 }
1531
1532 static void
1533 g_source_callback_ref (gpointer cb_data)
1534 {
1535   GSourceCallback *callback = cb_data;
1536
1537   callback->ref_count++;
1538 }
1539
1540
1541 static void
1542 g_source_callback_unref (gpointer cb_data)
1543 {
1544   GSourceCallback *callback = cb_data;
1545
1546   callback->ref_count--;
1547   if (callback->ref_count == 0)
1548     {
1549       if (callback->notify)
1550         callback->notify (callback->data);
1551       g_free (callback);
1552     }
1553 }
1554
1555 static void
1556 g_source_callback_get (gpointer     cb_data,
1557                        GSource     *source, 
1558                        GSourceFunc *func,
1559                        gpointer    *data)
1560 {
1561   GSourceCallback *callback = cb_data;
1562
1563   *func = callback->func;
1564   *data = callback->data;
1565 }
1566
1567 static GSourceCallbackFuncs g_source_callback_funcs = {
1568   g_source_callback_ref,
1569   g_source_callback_unref,
1570   g_source_callback_get,
1571 };
1572
1573 /**
1574  * g_source_set_callback:
1575  * @source: the source
1576  * @func: a callback function
1577  * @data: the data to pass to callback function
1578  * @notify: (allow-none): a function to call when @data is no longer in use, or %NULL.
1579  * 
1580  * Sets the callback function for a source. The callback for a source is
1581  * called from the source's dispatch function.
1582  *
1583  * The exact type of @func depends on the type of source; ie. you
1584  * should not count on @func being called with @data as its first
1585  * parameter.
1586  * 
1587  * Typically, you won't use this function. Instead use functions specific
1588  * to the type of source you are using.
1589  **/
1590 void
1591 g_source_set_callback (GSource        *source,
1592                        GSourceFunc     func,
1593                        gpointer        data,
1594                        GDestroyNotify  notify)
1595 {
1596   GSourceCallback *new_callback;
1597
1598   g_return_if_fail (source != NULL);
1599
1600   new_callback = g_new (GSourceCallback, 1);
1601
1602   new_callback->ref_count = 1;
1603   new_callback->func = func;
1604   new_callback->data = data;
1605   new_callback->notify = notify;
1606
1607   g_source_set_callback_indirect (source, new_callback, &g_source_callback_funcs);
1608 }
1609
1610
1611 /**
1612  * g_source_set_funcs:
1613  * @source: a #GSource
1614  * @funcs: the new #GSourceFuncs
1615  * 
1616  * Sets the source functions (can be used to override 
1617  * default implementations) of an unattached source.
1618  * 
1619  * Since: 2.12
1620  */
1621 void
1622 g_source_set_funcs (GSource     *source,
1623                    GSourceFuncs *funcs)
1624 {
1625   g_return_if_fail (source != NULL);
1626   g_return_if_fail (source->context == NULL);
1627   g_return_if_fail (source->ref_count > 0);
1628   g_return_if_fail (funcs != NULL);
1629
1630   source->source_funcs = funcs;
1631 }
1632
1633 static void
1634 g_source_set_priority_unlocked (GSource      *source,
1635                                 GMainContext *context,
1636                                 gint          priority)
1637 {
1638   GSList *tmp_list;
1639   
1640   g_return_if_fail (source->priv->parent_source == NULL ||
1641                     source->priv->parent_source->priority == priority);
1642
1643   if (context)
1644     {
1645       /* Remove the source from the context's source and then
1646        * add it back after so it is sorted in the correct place
1647        */
1648       source_remove_from_context (source, source->context);
1649     }
1650
1651   source->priority = priority;
1652
1653   if (context)
1654     {
1655       source_add_to_context (source, source->context);
1656
1657       if (!SOURCE_BLOCKED (source))
1658         {
1659           tmp_list = source->poll_fds;
1660           while (tmp_list)
1661             {
1662               g_main_context_remove_poll_unlocked (context, tmp_list->data);
1663               g_main_context_add_poll_unlocked (context, priority, tmp_list->data);
1664               
1665               tmp_list = tmp_list->next;
1666             }
1667
1668           for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next)
1669             {
1670               g_main_context_remove_poll_unlocked (context, tmp_list->data);
1671               g_main_context_add_poll_unlocked (context, priority, tmp_list->data);
1672             }
1673         }
1674     }
1675
1676   if (source->priv->child_sources)
1677     {
1678       tmp_list = source->priv->child_sources;
1679       while (tmp_list)
1680         {
1681           g_source_set_priority_unlocked (tmp_list->data, context, priority);
1682           tmp_list = tmp_list->next;
1683         }
1684     }
1685 }
1686
1687 /**
1688  * g_source_set_priority:
1689  * @source: a #GSource
1690  * @priority: the new priority.
1691  *
1692  * Sets the priority of a source. While the main loop is being run, a
1693  * source will be dispatched if it is ready to be dispatched and no
1694  * sources at a higher (numerically smaller) priority are ready to be
1695  * dispatched.
1696  **/
1697 void
1698 g_source_set_priority (GSource  *source,
1699                        gint      priority)
1700 {
1701   GMainContext *context;
1702
1703   g_return_if_fail (source != NULL);
1704
1705   context = source->context;
1706
1707   if (context)
1708     LOCK_CONTEXT (context);
1709   g_source_set_priority_unlocked (source, context, priority);
1710   if (context)
1711     UNLOCK_CONTEXT (source->context);
1712 }
1713
1714 /**
1715  * g_source_get_priority:
1716  * @source: a #GSource
1717  * 
1718  * Gets the priority of a source.
1719  * 
1720  * Return value: the priority of the source
1721  **/
1722 gint
1723 g_source_get_priority (GSource *source)
1724 {
1725   g_return_val_if_fail (source != NULL, 0);
1726
1727   return source->priority;
1728 }
1729
1730 /**
1731  * g_source_set_ready_time:
1732  * @source: a #GSource
1733  * @ready_time: the monotonic time at which the source will be ready,
1734  *              0 for "immediately", -1 for "never"
1735  *
1736  * Sets a #GSource to be dispatched when the given monotonic time is
1737  * reached (or passed).  If the monotonic time is in the past (as it
1738  * always will be if @ready_time is 0) then the source will be
1739  * dispatched immediately.
1740  *
1741  * If @ready_time is -1 then the source is never woken up on the basis
1742  * of the passage of time.
1743  *
1744  * Dispatching the source does not reset the ready time.  You should do
1745  * so yourself, from the source dispatch function.
1746  *
1747  * Note that if you have a pair of sources where the ready time of one
1748  * suggests that it will be delivered first but the priority for the
1749  * other suggests that it would be delivered first, and the ready time
1750  * for both sources is reached during the same main context iteration
1751  * then the order of dispatch is undefined.
1752  *
1753  * Since: 2.36
1754  **/
1755 void
1756 g_source_set_ready_time (GSource *source,
1757                          gint64   ready_time)
1758 {
1759   GMainContext *context;
1760
1761   g_return_if_fail (source != NULL);
1762   g_return_if_fail (source->ref_count > 0);
1763
1764   if (source->priv->ready_time == ready_time)
1765     return;
1766
1767   context = source->context;
1768
1769   if (context)
1770     LOCK_CONTEXT (context);
1771
1772   source->priv->ready_time = ready_time;
1773
1774   if (context)
1775     {
1776       /* Quite likely that we need to change the timeout on the poll */
1777       if (!SOURCE_BLOCKED (source))
1778         g_wakeup_signal (context->wakeup);
1779       UNLOCK_CONTEXT (context);
1780     }
1781 }
1782
1783 /**
1784  * g_source_get_ready_time:
1785  * @source: a #GSource
1786  *
1787  * Gets the "ready time" of @source, as set by
1788  * g_source_set_ready_time().
1789  *
1790  * Any time before the current monotonic time (including 0) is an
1791  * indication that the source will fire immediately.
1792  *
1793  * Returns: the monotonic ready time, -1 for "never"
1794  **/
1795 gint64
1796 g_source_get_ready_time (GSource *source)
1797 {
1798   g_return_val_if_fail (source != NULL, -1);
1799
1800   return source->priv->ready_time;
1801 }
1802
1803 /**
1804  * g_source_set_can_recurse:
1805  * @source: a #GSource
1806  * @can_recurse: whether recursion is allowed for this source
1807  * 
1808  * Sets whether a source can be called recursively. If @can_recurse is
1809  * %TRUE, then while the source is being dispatched then this source
1810  * will be processed normally. Otherwise, all processing of this
1811  * source is blocked until the dispatch function returns.
1812  **/
1813 void
1814 g_source_set_can_recurse (GSource  *source,
1815                           gboolean  can_recurse)
1816 {
1817   GMainContext *context;
1818   
1819   g_return_if_fail (source != NULL);
1820
1821   context = source->context;
1822
1823   if (context)
1824     LOCK_CONTEXT (context);
1825   
1826   if (can_recurse)
1827     source->flags |= G_SOURCE_CAN_RECURSE;
1828   else
1829     source->flags &= ~G_SOURCE_CAN_RECURSE;
1830
1831   if (context)
1832     UNLOCK_CONTEXT (context);
1833 }
1834
1835 /**
1836  * g_source_get_can_recurse:
1837  * @source: a #GSource
1838  * 
1839  * Checks whether a source is allowed to be called recursively.
1840  * see g_source_set_can_recurse().
1841  * 
1842  * Return value: whether recursion is allowed.
1843  **/
1844 gboolean
1845 g_source_get_can_recurse (GSource  *source)
1846 {
1847   g_return_val_if_fail (source != NULL, FALSE);
1848   
1849   return (source->flags & G_SOURCE_CAN_RECURSE) != 0;
1850 }
1851
1852
1853 /**
1854  * g_source_set_name:
1855  * @source: a #GSource
1856  * @name: debug name for the source
1857  *
1858  * Sets a name for the source, used in debugging and profiling.
1859  * The name defaults to #NULL.
1860  *
1861  * The source name should describe in a human-readable way
1862  * what the source does. For example, "X11 event queue"
1863  * or "GTK+ repaint idle handler" or whatever it is.
1864  *
1865  * It is permitted to call this function multiple times, but is not
1866  * recommended due to the potential performance impact.  For example,
1867  * one could change the name in the "check" function of a #GSourceFuncs 
1868  * to include details like the event type in the source name.
1869  *
1870  * Since: 2.26
1871  **/
1872 void
1873 g_source_set_name (GSource    *source,
1874                    const char *name)
1875 {
1876   g_return_if_fail (source != NULL);
1877
1878   /* setting back to NULL is allowed, just because it's
1879    * weird if get_name can return NULL but you can't
1880    * set that.
1881    */
1882
1883   g_free (source->name);
1884   source->name = g_strdup (name);
1885 }
1886
1887 /**
1888  * g_source_get_name:
1889  * @source: a #GSource
1890  *
1891  * Gets a name for the source, used in debugging and profiling.
1892  * The name may be #NULL if it has never been set with
1893  * g_source_set_name().
1894  *
1895  * Return value: the name of the source
1896  * Since: 2.26
1897  **/
1898 const char *
1899 g_source_get_name (GSource *source)
1900 {
1901   g_return_val_if_fail (source != NULL, NULL);
1902
1903   return source->name;
1904 }
1905
1906 /**
1907  * g_source_set_name_by_id:
1908  * @tag: a #GSource ID
1909  * @name: debug name for the source
1910  *
1911  * Sets the name of a source using its ID.
1912  *
1913  * This is a convenience utility to set source names from the return
1914  * value of g_idle_add(), g_timeout_add(), etc.
1915  *
1916  * Since: 2.26
1917  **/
1918 void
1919 g_source_set_name_by_id (guint           tag,
1920                          const char     *name)
1921 {
1922   GSource *source;
1923
1924   g_return_if_fail (tag > 0);
1925
1926   source = g_main_context_find_source_by_id (NULL, tag);
1927   if (source == NULL)
1928     return;
1929
1930   g_source_set_name (source, name);
1931 }
1932
1933
1934 /**
1935  * g_source_ref:
1936  * @source: a #GSource
1937  * 
1938  * Increases the reference count on a source by one.
1939  * 
1940  * Return value: @source
1941  **/
1942 GSource *
1943 g_source_ref (GSource *source)
1944 {
1945   GMainContext *context;
1946   
1947   g_return_val_if_fail (source != NULL, NULL);
1948
1949   context = source->context;
1950
1951   if (context)
1952     LOCK_CONTEXT (context);
1953
1954   source->ref_count++;
1955
1956   if (context)
1957     UNLOCK_CONTEXT (context);
1958
1959   return source;
1960 }
1961
1962 /* g_source_unref() but possible to call within context lock
1963  */
1964 static void
1965 g_source_unref_internal (GSource      *source,
1966                          GMainContext *context,
1967                          gboolean      have_lock)
1968 {
1969   gpointer old_cb_data = NULL;
1970   GSourceCallbackFuncs *old_cb_funcs = NULL;
1971
1972   g_return_if_fail (source != NULL);
1973   
1974   if (!have_lock && context)
1975     LOCK_CONTEXT (context);
1976
1977   source->ref_count--;
1978   if (source->ref_count == 0)
1979     {
1980       old_cb_data = source->callback_data;
1981       old_cb_funcs = source->callback_funcs;
1982
1983       source->callback_data = NULL;
1984       source->callback_funcs = NULL;
1985
1986       if (context)
1987         {
1988           if (!SOURCE_DESTROYED (source))
1989             g_warning (G_STRLOC ": ref_count == 0, but source was still attached to a context!");
1990           source_remove_from_context (source, context);
1991         }
1992
1993       if (source->source_funcs->finalize)
1994         {
1995           if (context)
1996             UNLOCK_CONTEXT (context);
1997           source->source_funcs->finalize (source);
1998           if (context)
1999             LOCK_CONTEXT (context);
2000         }
2001
2002       g_free (source->name);
2003       source->name = NULL;
2004
2005       g_slist_free (source->poll_fds);
2006       source->poll_fds = NULL;
2007
2008       g_slist_free_full (source->priv->fds, g_free);
2009
2010       g_slice_free (GSourcePrivate, source->priv);
2011       source->priv = NULL;
2012
2013       g_free (source);
2014     }
2015   
2016   if (!have_lock && context)
2017     UNLOCK_CONTEXT (context);
2018
2019   if (old_cb_funcs)
2020     {
2021       if (have_lock)
2022         UNLOCK_CONTEXT (context);
2023       
2024       old_cb_funcs->unref (old_cb_data);
2025
2026       if (have_lock)
2027         LOCK_CONTEXT (context);
2028     }
2029 }
2030
2031 /**
2032  * g_source_unref:
2033  * @source: a #GSource
2034  * 
2035  * Decreases the reference count of a source by one. If the
2036  * resulting reference count is zero the source and associated
2037  * memory will be destroyed. 
2038  **/
2039 void
2040 g_source_unref (GSource *source)
2041 {
2042   g_return_if_fail (source != NULL);
2043
2044   g_source_unref_internal (source, source->context, FALSE);
2045 }
2046
2047 /**
2048  * g_main_context_find_source_by_id:
2049  * @context: (allow-none): a #GMainContext (if %NULL, the default context will be used)
2050  * @source_id: the source ID, as returned by g_source_get_id(). 
2051  * 
2052  * Finds a #GSource given a pair of context and ID.
2053  * 
2054  * Return value: (transfer none): the #GSource if found, otherwise, %NULL
2055  **/
2056 GSource *
2057 g_main_context_find_source_by_id (GMainContext *context,
2058                                   guint         source_id)
2059 {
2060   GSourceIter iter;
2061   GSource *source;
2062   
2063   g_return_val_if_fail (source_id > 0, NULL);
2064
2065   if (context == NULL)
2066     context = g_main_context_default ();
2067   
2068   LOCK_CONTEXT (context);
2069   
2070   g_source_iter_init (&iter, context, FALSE);
2071   while (g_source_iter_next (&iter, &source))
2072     {
2073       if (!SOURCE_DESTROYED (source) &&
2074           source->source_id == source_id)
2075         break;
2076     }
2077   g_source_iter_clear (&iter);
2078
2079   UNLOCK_CONTEXT (context);
2080
2081   return source;
2082 }
2083
2084 /**
2085  * g_main_context_find_source_by_funcs_user_data:
2086  * @context: (allow-none): a #GMainContext (if %NULL, the default context will be used).
2087  * @funcs: the @source_funcs passed to g_source_new().
2088  * @user_data: the user data from the callback.
2089  * 
2090  * Finds a source with the given source functions and user data.  If
2091  * multiple sources exist with the same source function and user data,
2092  * the first one found will be returned.
2093  * 
2094  * Return value: (transfer none): the source, if one was found, otherwise %NULL
2095  **/
2096 GSource *
2097 g_main_context_find_source_by_funcs_user_data (GMainContext *context,
2098                                                GSourceFuncs *funcs,
2099                                                gpointer      user_data)
2100 {
2101   GSourceIter iter;
2102   GSource *source;
2103   
2104   g_return_val_if_fail (funcs != NULL, NULL);
2105
2106   if (context == NULL)
2107     context = g_main_context_default ();
2108   
2109   LOCK_CONTEXT (context);
2110
2111   g_source_iter_init (&iter, context, FALSE);
2112   while (g_source_iter_next (&iter, &source))
2113     {
2114       if (!SOURCE_DESTROYED (source) &&
2115           source->source_funcs == funcs &&
2116           source->callback_funcs)
2117         {
2118           GSourceFunc callback;
2119           gpointer callback_data;
2120
2121           source->callback_funcs->get (source->callback_data, source, &callback, &callback_data);
2122           
2123           if (callback_data == user_data)
2124             break;
2125         }
2126     }
2127   g_source_iter_clear (&iter);
2128
2129   UNLOCK_CONTEXT (context);
2130
2131   return source;
2132 }
2133
2134 /**
2135  * g_main_context_find_source_by_user_data:
2136  * @context: a #GMainContext
2137  * @user_data: the user_data for the callback.
2138  * 
2139  * Finds a source with the given user data for the callback.  If
2140  * multiple sources exist with the same user data, the first
2141  * one found will be returned.
2142  * 
2143  * Return value: (transfer none): the source, if one was found, otherwise %NULL
2144  **/
2145 GSource *
2146 g_main_context_find_source_by_user_data (GMainContext *context,
2147                                          gpointer      user_data)
2148 {
2149   GSourceIter iter;
2150   GSource *source;
2151   
2152   if (context == NULL)
2153     context = g_main_context_default ();
2154   
2155   LOCK_CONTEXT (context);
2156
2157   g_source_iter_init (&iter, context, FALSE);
2158   while (g_source_iter_next (&iter, &source))
2159     {
2160       if (!SOURCE_DESTROYED (source) &&
2161           source->callback_funcs)
2162         {
2163           GSourceFunc callback;
2164           gpointer callback_data = NULL;
2165
2166           source->callback_funcs->get (source->callback_data, source, &callback, &callback_data);
2167
2168           if (callback_data == user_data)
2169             break;
2170         }
2171     }
2172   g_source_iter_clear (&iter);
2173
2174   UNLOCK_CONTEXT (context);
2175
2176   return source;
2177 }
2178
2179 /**
2180  * g_source_remove:
2181  * @tag: the ID of the source to remove.
2182  *
2183  * Removes the source with the given id from the default main context.
2184  *
2185  * The id of a #GSource is given by g_source_get_id(), or will be
2186  * returned by the functions g_source_attach(), g_idle_add(),
2187  * g_idle_add_full(), g_timeout_add(), g_timeout_add_full(),
2188  * g_child_watch_add(), g_child_watch_add_full(), g_io_add_watch(), and
2189  * g_io_add_watch_full().
2190  *
2191  * See also g_source_destroy(). You must use g_source_destroy() for sources
2192  * added to a non-default main context.
2193  *
2194  * It is a programmer error to attempt to remove a non-existent source.
2195  *
2196  * Return value: For historical reasons, this function always returns %TRUE
2197  **/
2198 gboolean
2199 g_source_remove (guint tag)
2200 {
2201   GSource *source;
2202
2203   g_return_val_if_fail (tag > 0, FALSE);
2204
2205   source = g_main_context_find_source_by_id (NULL, tag);
2206   if (source)
2207     g_source_destroy (source);
2208   else
2209     g_critical ("Source ID %u was not found when attempting to remove it", tag);
2210
2211   return source != NULL;
2212 }
2213
2214 /**
2215  * g_source_remove_by_user_data:
2216  * @user_data: the user_data for the callback.
2217  * 
2218  * Removes a source from the default main loop context given the user
2219  * data for the callback. If multiple sources exist with the same user
2220  * data, only one will be destroyed.
2221  * 
2222  * Return value: %TRUE if a source was found and removed. 
2223  **/
2224 gboolean
2225 g_source_remove_by_user_data (gpointer user_data)
2226 {
2227   GSource *source;
2228   
2229   source = g_main_context_find_source_by_user_data (NULL, user_data);
2230   if (source)
2231     {
2232       g_source_destroy (source);
2233       return TRUE;
2234     }
2235   else
2236     return FALSE;
2237 }
2238
2239 /**
2240  * g_source_remove_by_funcs_user_data:
2241  * @funcs: The @source_funcs passed to g_source_new()
2242  * @user_data: the user data for the callback
2243  * 
2244  * Removes a source from the default main loop context given the
2245  * source functions and user data. If multiple sources exist with the
2246  * same source functions and user data, only one will be destroyed.
2247  * 
2248  * Return value: %TRUE if a source was found and removed. 
2249  **/
2250 gboolean
2251 g_source_remove_by_funcs_user_data (GSourceFuncs *funcs,
2252                                     gpointer      user_data)
2253 {
2254   GSource *source;
2255
2256   g_return_val_if_fail (funcs != NULL, FALSE);
2257
2258   source = g_main_context_find_source_by_funcs_user_data (NULL, funcs, user_data);
2259   if (source)
2260     {
2261       g_source_destroy (source);
2262       return TRUE;
2263     }
2264   else
2265     return FALSE;
2266 }
2267
2268 #ifdef G_OS_UNIX
2269 /**
2270  * g_source_add_unix_fd:
2271  * @source: a #GSource
2272  * @fd: the fd to monitor
2273  * @events: an event mask
2274  *
2275  * Monitors @fd for the IO events in @events.
2276  *
2277  * The tag returned by this function can be used to remove or modify the
2278  * monitoring of the fd using g_source_remove_unix_fd() or
2279  * g_source_modify_unix_fd().
2280  *
2281  * It is not necessary to remove the fd before destroying the source; it
2282  * will be cleaned up automatically.
2283  *
2284  * As the name suggests, this function is not available on Windows.
2285  *
2286  * Returns: an opaque tag
2287  *
2288  * Since: 2.36
2289  **/
2290 gpointer
2291 g_source_add_unix_fd (GSource      *source,
2292                       gint          fd,
2293                       GIOCondition  events)
2294 {
2295   GMainContext *context;
2296   GPollFD *poll_fd;
2297
2298   g_return_val_if_fail (source != NULL, NULL);
2299   g_return_val_if_fail (!SOURCE_DESTROYED (source), NULL);
2300
2301   poll_fd = g_new (GPollFD, 1);
2302   poll_fd->fd = fd;
2303   poll_fd->events = events;
2304   poll_fd->revents = 0;
2305
2306   context = source->context;
2307
2308   if (context)
2309     LOCK_CONTEXT (context);
2310
2311   source->priv->fds = g_slist_prepend (source->priv->fds, poll_fd);
2312
2313   if (context)
2314     {
2315       if (!SOURCE_BLOCKED (source))
2316         g_main_context_add_poll_unlocked (context, source->priority, poll_fd);
2317       UNLOCK_CONTEXT (context);
2318     }
2319
2320   return poll_fd;
2321 }
2322
2323 /**
2324  * g_source_modify_unix_fd:
2325  * @source: a #GSource
2326  * @tag: the tag from g_source_add_unix_fd()
2327  * @new_events: the new event mask to watch
2328  *
2329  * Updates the event mask to watch for the fd identified by @tag.
2330  *
2331  * @tag is the tag returned from g_source_add_unix_fd().
2332  *
2333  * If you want to remove a fd, don't set its event mask to zero.
2334  * Instead, call g_source_remove_unix_fd().
2335  *
2336  * As the name suggests, this function is not available on Windows.
2337  *
2338  * Since: 2.36
2339  **/
2340 void
2341 g_source_modify_unix_fd (GSource      *source,
2342                          gpointer      tag,
2343                          GIOCondition  new_events)
2344 {
2345   GMainContext *context;
2346   GPollFD *poll_fd;
2347
2348   g_return_if_fail (source != NULL);
2349   g_return_if_fail (g_slist_find (source->priv->fds, tag));
2350
2351   context = source->context;
2352   poll_fd = tag;
2353
2354   poll_fd->events = new_events;
2355
2356   if (context)
2357     g_main_context_wakeup (context);
2358 }
2359
2360 /**
2361  * g_source_remove_unix_fd:
2362  * @source: a #GSource
2363  * @tag: the tag from g_source_add_unix_fd()
2364  *
2365  * Reverses the effect of a previous call to g_source_add_unix_fd().
2366  *
2367  * You only need to call this if you want to remove an fd from being
2368  * watched while keeping the same source around.  In the normal case you
2369  * will just want to destroy the source.
2370  *
2371  * As the name suggests, this function is not available on Windows.
2372  *
2373  * Since: 2.36
2374  **/
2375 void
2376 g_source_remove_unix_fd (GSource  *source,
2377                          gpointer  tag)
2378 {
2379   GMainContext *context;
2380   GPollFD *poll_fd;
2381
2382   g_return_if_fail (source != NULL);
2383   g_return_if_fail (g_slist_find (source->priv->fds, tag));
2384
2385   context = source->context;
2386   poll_fd = tag;
2387
2388   if (context)
2389     LOCK_CONTEXT (context);
2390
2391   source->priv->fds = g_slist_remove (source->priv->fds, poll_fd);
2392
2393   if (context)
2394     {
2395       if (!SOURCE_BLOCKED (source))
2396         g_main_context_remove_poll_unlocked (context, poll_fd);
2397
2398       UNLOCK_CONTEXT (context);
2399     }
2400
2401   g_free (poll_fd);
2402 }
2403
2404 /**
2405  * g_source_query_unix_fd:
2406  * @source: a #GSource
2407  * @tag: the tag from g_source_add_unix_fd()
2408  *
2409  * Queries the events reported for the fd corresponding to @tag on
2410  * @source during the last poll.
2411  *
2412  * The return value of this function is only defined when the function
2413  * is called from the check or dispatch functions for @source.
2414  *
2415  * As the name suggests, this function is not available on Windows.
2416  *
2417  * Returns: the conditions reported on the fd
2418  *
2419  * Since: 2.36
2420  **/
2421 GIOCondition
2422 g_source_query_unix_fd (GSource  *source,
2423                         gpointer  tag)
2424 {
2425   GPollFD *poll_fd;
2426
2427   g_return_val_if_fail (source != NULL, 0);
2428   g_return_val_if_fail (g_slist_find (source->priv->fds, tag), 0);
2429
2430   poll_fd = tag;
2431
2432   return poll_fd->revents;
2433 }
2434 #endif /* G_OS_UNIX */
2435
2436 /**
2437  * g_get_current_time:
2438  * @result: #GTimeVal structure in which to store current time.
2439  *
2440  * Equivalent to the UNIX gettimeofday() function, but portable.
2441  *
2442  * You may find g_get_real_time() to be more convenient.
2443  **/
2444 void
2445 g_get_current_time (GTimeVal *result)
2446 {
2447 #ifndef G_OS_WIN32
2448   struct timeval r;
2449
2450   g_return_if_fail (result != NULL);
2451
2452   /*this is required on alpha, there the timeval structs are int's
2453     not longs and a cast only would fail horribly*/
2454   gettimeofday (&r, NULL);
2455   result->tv_sec = r.tv_sec;
2456   result->tv_usec = r.tv_usec;
2457 #else
2458   FILETIME ft;
2459   guint64 time64;
2460
2461   g_return_if_fail (result != NULL);
2462
2463   GetSystemTimeAsFileTime (&ft);
2464   memmove (&time64, &ft, sizeof (FILETIME));
2465
2466   /* Convert from 100s of nanoseconds since 1601-01-01
2467    * to Unix epoch. Yes, this is Y2038 unsafe.
2468    */
2469   time64 -= G_GINT64_CONSTANT (116444736000000000);
2470   time64 /= 10;
2471
2472   result->tv_sec = time64 / 1000000;
2473   result->tv_usec = time64 % 1000000;
2474 #endif
2475 }
2476
2477 /**
2478  * g_get_real_time:
2479  *
2480  * Queries the system wall-clock time.
2481  *
2482  * This call is functionally equivalent to g_get_current_time() except
2483  * that the return value is often more convenient than dealing with a
2484  * #GTimeVal.
2485  *
2486  * You should only use this call if you are actually interested in the real
2487  * wall-clock time.  g_get_monotonic_time() is probably more useful for
2488  * measuring intervals.
2489  *
2490  * Returns: the number of microseconds since January 1, 1970 UTC.
2491  *
2492  * Since: 2.28
2493  **/
2494 gint64
2495 g_get_real_time (void)
2496 {
2497   GTimeVal tv;
2498
2499   g_get_current_time (&tv);
2500
2501   return (((gint64) tv.tv_sec) * 1000000) + tv.tv_usec;
2502 }
2503
2504 #ifdef G_OS_WIN32
2505 static ULONGLONG (*g_GetTickCount64) (void) = NULL;
2506 static guint32 g_win32_tick_epoch = 0;
2507
2508 void
2509 g_clock_win32_init (void)
2510 {
2511   HMODULE kernel32;
2512
2513   g_GetTickCount64 = NULL;
2514   kernel32 = GetModuleHandle ("KERNEL32.DLL");
2515   if (kernel32 != NULL)
2516     g_GetTickCount64 = (void *) GetProcAddress (kernel32, "GetTickCount64");
2517   g_win32_tick_epoch = ((guint32)GetTickCount()) >> 31;
2518 }
2519 #endif
2520
2521 /**
2522  * g_get_monotonic_time:
2523  *
2524  * Queries the system monotonic time, if available.
2525  *
2526  * On POSIX systems with clock_gettime() and <literal>CLOCK_MONOTONIC</literal> this call
2527  * is a very shallow wrapper for that.  Otherwise, we make a best effort
2528  * that probably involves returning the wall clock time (with at least
2529  * microsecond accuracy, subject to the limitations of the OS kernel).
2530  *
2531  * It's important to note that POSIX <literal>CLOCK_MONOTONIC</literal> does
2532  * not count time spent while the machine is suspended.
2533  *
2534  * On Windows, "limitations of the OS kernel" is a rather substantial
2535  * statement.  Depending on the configuration of the system, the wall
2536  * clock time is updated as infrequently as 64 times a second (which
2537  * is approximately every 16ms). Also, on XP (but not on Vista or later)
2538  * the monotonic clock is locally monotonic, but may differ in exact
2539  * value between processes due to timer wrap handling.
2540  *
2541  * Returns: the monotonic time, in microseconds
2542  *
2543  * Since: 2.28
2544  **/
2545 gint64
2546 g_get_monotonic_time (void)
2547 {
2548 #ifdef HAVE_CLOCK_GETTIME
2549   /* librt clock_gettime() is our first choice */
2550   struct timespec ts;
2551
2552 #ifdef CLOCK_MONOTONIC
2553   clock_gettime (CLOCK_MONOTONIC, &ts);
2554 #else
2555   clock_gettime (CLOCK_REALTIME, &ts);
2556 #endif
2557
2558   /* In theory monotonic time can have any epoch.
2559    *
2560    * glib presently assumes the following:
2561    *
2562    *   1) The epoch comes some time after the birth of Jesus of Nazareth, but
2563    *      not more than 10000 years later.
2564    *
2565    *   2) The current time also falls sometime within this range.
2566    *
2567    * These two reasonable assumptions leave us with a maximum deviation from
2568    * the epoch of 10000 years, or 315569520000000000 seconds.
2569    *
2570    * If we restrict ourselves to this range then the number of microseconds
2571    * will always fit well inside the constraints of a int64 (by a factor of
2572    * about 29).
2573    *
2574    * If you actually hit the following assertion, probably you should file a
2575    * bug against your operating system for being excessively silly.
2576    **/
2577   g_assert (G_GINT64_CONSTANT (-315569520000000000) < ts.tv_sec &&
2578             ts.tv_sec < G_GINT64_CONSTANT (315569520000000000));
2579
2580   return (((gint64) ts.tv_sec) * 1000000) + (ts.tv_nsec / 1000);
2581
2582 #elif defined (G_OS_WIN32)
2583   guint64 ticks;
2584   guint32 ticks32;
2585
2586   /* There are four sources for the monotonic time on Windows:
2587    *
2588    * Three are based on a (1 msec accuracy, but only read periodically) clock chip:
2589    * - GetTickCount (GTC)
2590    *    32bit msec counter, updated each ~15msec, wraps in ~50 days
2591    * - GetTickCount64 (GTC64)
2592    *    Same as GetTickCount, but extended to 64bit, so no wrap
2593    *    Only available in Vista or later
2594    * - timeGetTime (TGT)
2595    *    similar to GetTickCount by default: 15msec, 50 day wrap.
2596    *    available in winmm.dll (thus known as the multimedia timers)
2597    *    However apps can raise the system timer clock frequency using timeBeginPeriod()
2598    *    increasing the accuracy up to 1 msec, at a cost in general system performance
2599    *    and battery use.
2600    *
2601    * One is based on high precision clocks:
2602    * - QueryPrecisionCounter (QPC)
2603    *    This has much higher accuracy, but is not guaranteed monotonic, and
2604    *    has lots of complications like clock jumps and different times on different
2605    *    CPUs. It also has lower long term accuracy (i.e. it will drift compared to
2606    *    the low precision clocks.
2607    *
2608    * Additionally, the precision available in the timer-based wakeup such as
2609    * MsgWaitForMultipleObjectsEx (which is what the mainloop is based on) is based
2610    * on the TGT resolution, so by default it is ~15msec, but can be increased by apps.
2611    *
2612    * The QPC timer has too many issues to be used as is. The only way it could be used
2613    * is to use it to interpolate the lower precision clocks. Firefox does something like
2614    * this:
2615    *   https://bugzilla.mozilla.org/show_bug.cgi?id=363258
2616    * 
2617    * However this seems quite complicated, so we're not doing this right now.
2618    *
2619    * The approach we take instead is to use the TGT timer, extending it to 64bit
2620    * either by using the GTC64 value, or if that is not available, a process local
2621    * time epoch that we increment when we detect a timer wrap (assumes that we read
2622    * the time at least once every 50 days).
2623    *
2624    * This means that:
2625    *  - We have a globally consistent monotonic clock on Vista and later
2626    *  - We have a locally monotonic clock on XP
2627    *  - Apps that need higher precision in timeouts and clock reads can call 
2628    *    timeBeginPeriod() to increase it as much as they want
2629    */
2630
2631   if (g_GetTickCount64 != NULL)
2632     {
2633       guint32 ticks_as_32bit;
2634
2635       ticks = g_GetTickCount64 ();
2636       ticks32 = timeGetTime();
2637
2638       /* GTC64 and TGT are sampled at different times, however they 
2639        * have the same base and source (msecs since system boot). 
2640        * They can differ by as much as -16 to +16 msecs.
2641        * We can't just inject the low bits into the 64bit counter 
2642        * as one of the counters can have wrapped in 32bit space and
2643        * the other not. Instead we calculate the signed difference
2644        * in 32bit space and apply that difference to the 64bit counter.
2645        */
2646       ticks_as_32bit = (guint32)ticks;
2647
2648       /* We could do some 2's complement hack, but we play it safe */
2649       if (ticks32 - ticks_as_32bit <= G_MAXINT32)
2650         ticks += ticks32 - ticks_as_32bit;
2651       else
2652         ticks -= ticks_as_32bit - ticks32;
2653     }
2654   else
2655     {
2656       guint32 epoch;
2657
2658       epoch = g_atomic_int_get (&g_win32_tick_epoch);
2659
2660       /* Must read ticks after the epoch. Then we're guaranteed
2661        * that the ticks value we read is higher or equal to any
2662        * previous ones that lead to the writing of the epoch.
2663        */
2664       ticks32 = timeGetTime();
2665
2666       /* We store the MSB of the current time as the LSB
2667        * of the epoch. Comparing these bits lets us detect when
2668        * the 32bit counter has wrapped so we can increase the
2669        * epoch.
2670        *
2671        * This will work as long as this function is called at
2672        * least once every ~24 days, which is half the wrap time
2673        * of a 32bit msec counter. I think this is pretty likely.
2674        *
2675        * Note that g_win32_tick_epoch is a process local state,
2676        * so the monotonic clock will not be the same between
2677        * processes.
2678        */
2679       if ((ticks32 >> 31) != (epoch & 1))
2680         {
2681           epoch++;
2682           g_atomic_int_set (&g_win32_tick_epoch, epoch);
2683         }
2684
2685
2686       ticks = (guint64)ticks32 | ((guint64)epoch) << 31;
2687     }
2688
2689   return ticks * 1000;
2690
2691 #else /* !HAVE_CLOCK_GETTIME && ! G_OS_WIN32*/
2692
2693   GTimeVal tv;
2694
2695   g_get_current_time (&tv);
2696
2697   return (((gint64) tv.tv_sec) * 1000000) + tv.tv_usec;
2698 #endif
2699 }
2700
2701 static void
2702 g_main_dispatch_free (gpointer dispatch)
2703 {
2704   g_slice_free (GMainDispatch, dispatch);
2705 }
2706
2707 /* Running the main loop */
2708
2709 static GMainDispatch *
2710 get_dispatch (void)
2711 {
2712   static GPrivate depth_private = G_PRIVATE_INIT (g_main_dispatch_free);
2713   GMainDispatch *dispatch;
2714
2715   dispatch = g_private_get (&depth_private);
2716
2717   if (!dispatch)
2718     {
2719       dispatch = g_slice_new0 (GMainDispatch);
2720       g_private_set (&depth_private, dispatch);
2721     }
2722
2723   return dispatch;
2724 }
2725
2726 /**
2727  * g_main_depth:
2728  *
2729  * Returns the depth of the stack of calls to
2730  * g_main_context_dispatch() on any #GMainContext in the current thread.
2731  *  That is, when called from the toplevel, it gives 0. When
2732  * called from within a callback from g_main_context_iteration()
2733  * (or g_main_loop_run(), etc.) it returns 1. When called from within 
2734  * a callback to a recursive call to g_main_context_iteration(),
2735  * it returns 2. And so forth.
2736  *
2737  * This function is useful in a situation like the following:
2738  * Imagine an extremely simple "garbage collected" system.
2739  *
2740  * |[
2741  * static GList *free_list;
2742  * 
2743  * gpointer
2744  * allocate_memory (gsize size)
2745  * { 
2746  *   gpointer result = g_malloc (size);
2747  *   free_list = g_list_prepend (free_list, result);
2748  *   return result;
2749  * }
2750  * 
2751  * void
2752  * free_allocated_memory (void)
2753  * {
2754  *   GList *l;
2755  *   for (l = free_list; l; l = l->next);
2756  *     g_free (l->data);
2757  *   g_list_free (free_list);
2758  *   free_list = NULL;
2759  *  }
2760  * 
2761  * [...]
2762  * 
2763  * while (TRUE); 
2764  *  {
2765  *    g_main_context_iteration (NULL, TRUE);
2766  *    free_allocated_memory();
2767  *   }
2768  * ]|
2769  *
2770  * This works from an application, however, if you want to do the same
2771  * thing from a library, it gets more difficult, since you no longer
2772  * control the main loop. You might think you can simply use an idle
2773  * function to make the call to free_allocated_memory(), but that
2774  * doesn't work, since the idle function could be called from a
2775  * recursive callback. This can be fixed by using g_main_depth()
2776  *
2777  * |[
2778  * gpointer
2779  * allocate_memory (gsize size)
2780  * { 
2781  *   FreeListBlock *block = g_new (FreeListBlock, 1);
2782  *   block->mem = g_malloc (size);
2783  *   block->depth = g_main_depth ();   
2784  *   free_list = g_list_prepend (free_list, block);
2785  *   return block->mem;
2786  * }
2787  * 
2788  * void
2789  * free_allocated_memory (void)
2790  * {
2791  *   GList *l;
2792  *   
2793  *   int depth = g_main_depth ();
2794  *   for (l = free_list; l; );
2795  *     {
2796  *       GList *next = l->next;
2797  *       FreeListBlock *block = l->data;
2798  *       if (block->depth > depth)
2799  *         {
2800  *           g_free (block->mem);
2801  *           g_free (block);
2802  *           free_list = g_list_delete_link (free_list, l);
2803  *         }
2804  *               
2805  *       l = next;
2806  *     }
2807  *   }
2808  * ]|
2809  *
2810  * There is a temptation to use g_main_depth() to solve
2811  * problems with reentrancy. For instance, while waiting for data
2812  * to be received from the network in response to a menu item,
2813  * the menu item might be selected again. It might seem that
2814  * one could make the menu item's callback return immediately
2815  * and do nothing if g_main_depth() returns a value greater than 1.
2816  * However, this should be avoided since the user then sees selecting
2817  * the menu item do nothing. Furthermore, you'll find yourself adding
2818  * these checks all over your code, since there are doubtless many,
2819  * many things that the user could do. Instead, you can use the
2820  * following techniques:
2821  *
2822  * <orderedlist>
2823  *  <listitem>
2824  *   <para>
2825  *     Use gtk_widget_set_sensitive() or modal dialogs to prevent
2826  *     the user from interacting with elements while the main
2827  *     loop is recursing.
2828  *   </para>
2829  *  </listitem>
2830  *  <listitem>
2831  *   <para>
2832  *     Avoid main loop recursion in situations where you can't handle
2833  *     arbitrary  callbacks. Instead, structure your code so that you
2834  *     simply return to the main loop and then get called again when
2835  *     there is more work to do.
2836  *   </para>
2837  *  </listitem>
2838  * </orderedlist>
2839  * 
2840  * Return value: The main loop recursion level in the current thread
2841  **/
2842 int
2843 g_main_depth (void)
2844 {
2845   GMainDispatch *dispatch = get_dispatch ();
2846   return dispatch->depth;
2847 }
2848
2849 /**
2850  * g_main_current_source:
2851  *
2852  * Returns the currently firing source for this thread.
2853  * 
2854  * Return value: (transfer none): The currently firing source or %NULL.
2855  *
2856  * Since: 2.12
2857  */
2858 GSource *
2859 g_main_current_source (void)
2860 {
2861   GMainDispatch *dispatch = get_dispatch ();
2862   return dispatch->source;
2863 }
2864
2865 /**
2866  * g_source_is_destroyed:
2867  * @source: a #GSource
2868  *
2869  * Returns whether @source has been destroyed.
2870  *
2871  * This is important when you operate upon your objects 
2872  * from within idle handlers, but may have freed the object 
2873  * before the dispatch of your idle handler.
2874  *
2875  * |[
2876  * static gboolean 
2877  * idle_callback (gpointer data)
2878  * {
2879  *   SomeWidget *self = data;
2880  *    
2881  *   GDK_THREADS_ENTER (<!-- -->);
2882  *   /<!-- -->* do stuff with self *<!-- -->/
2883  *   self->idle_id = 0;
2884  *   GDK_THREADS_LEAVE (<!-- -->);
2885  *    
2886  *   return G_SOURCE_REMOVE;
2887  * }
2888  *  
2889  * static void 
2890  * some_widget_do_stuff_later (SomeWidget *self)
2891  * {
2892  *   self->idle_id = g_idle_add (idle_callback, self);
2893  * }
2894  *  
2895  * static void 
2896  * some_widget_finalize (GObject *object)
2897  * {
2898  *   SomeWidget *self = SOME_WIDGET (object);
2899  *    
2900  *   if (self->idle_id)
2901  *     g_source_remove (self->idle_id);
2902  *    
2903  *   G_OBJECT_CLASS (parent_class)->finalize (object);
2904  * }
2905  * ]|
2906  *
2907  * This will fail in a multi-threaded application if the 
2908  * widget is destroyed before the idle handler fires due 
2909  * to the use after free in the callback. A solution, to 
2910  * this particular problem, is to check to if the source
2911  * has already been destroy within the callback.
2912  *
2913  * |[
2914  * static gboolean 
2915  * idle_callback (gpointer data)
2916  * {
2917  *   SomeWidget *self = data;
2918  *   
2919  *   GDK_THREADS_ENTER ();
2920  *   if (!g_source_is_destroyed (g_main_current_source ()))
2921  *     {
2922  *       /<!-- -->* do stuff with self *<!-- -->/
2923  *     }
2924  *   GDK_THREADS_LEAVE ();
2925  *   
2926  *   return FALSE;
2927  * }
2928  * ]|
2929  *
2930  * Return value: %TRUE if the source has been destroyed
2931  *
2932  * Since: 2.12
2933  */
2934 gboolean
2935 g_source_is_destroyed (GSource *source)
2936 {
2937   return SOURCE_DESTROYED (source);
2938 }
2939
2940 /* Temporarily remove all this source's file descriptors from the
2941  * poll(), so that if data comes available for one of the file descriptors
2942  * we don't continually spin in the poll()
2943  */
2944 /* HOLDS: source->context's lock */
2945 static void
2946 block_source (GSource *source)
2947 {
2948   GSList *tmp_list;
2949
2950   g_return_if_fail (!SOURCE_BLOCKED (source));
2951
2952   source->flags |= G_SOURCE_BLOCKED;
2953
2954   if (source->context)
2955     {
2956       tmp_list = source->poll_fds;
2957       while (tmp_list)
2958         {
2959           g_main_context_remove_poll_unlocked (source->context, tmp_list->data);
2960           tmp_list = tmp_list->next;
2961         }
2962
2963       for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next)
2964         g_main_context_remove_poll_unlocked (source->context, tmp_list->data);
2965     }
2966
2967   if (source->priv && source->priv->child_sources)
2968     {
2969       tmp_list = source->priv->child_sources;
2970       while (tmp_list)
2971         {
2972           block_source (tmp_list->data);
2973           tmp_list = tmp_list->next;
2974         }
2975     }
2976 }
2977
2978 /* HOLDS: source->context's lock */
2979 static void
2980 unblock_source (GSource *source)
2981 {
2982   GSList *tmp_list;
2983
2984   g_return_if_fail (SOURCE_BLOCKED (source)); /* Source already unblocked */
2985   g_return_if_fail (!SOURCE_DESTROYED (source));
2986   
2987   source->flags &= ~G_SOURCE_BLOCKED;
2988
2989   tmp_list = source->poll_fds;
2990   while (tmp_list)
2991     {
2992       g_main_context_add_poll_unlocked (source->context, source->priority, tmp_list->data);
2993       tmp_list = tmp_list->next;
2994     }
2995
2996   for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next)
2997     g_main_context_add_poll_unlocked (source->context, source->priority, tmp_list->data);
2998
2999   if (source->priv && source->priv->child_sources)
3000     {
3001       tmp_list = source->priv->child_sources;
3002       while (tmp_list)
3003         {
3004           unblock_source (tmp_list->data);
3005           tmp_list = tmp_list->next;
3006         }
3007     }
3008 }
3009
3010 /* HOLDS: context's lock */
3011 static void
3012 g_main_dispatch (GMainContext *context)
3013 {
3014   GMainDispatch *current = get_dispatch ();
3015   guint i;
3016
3017   for (i = 0; i < context->pending_dispatches->len; i++)
3018     {
3019       GSource *source = context->pending_dispatches->pdata[i];
3020
3021       context->pending_dispatches->pdata[i] = NULL;
3022       g_assert (source);
3023
3024       source->flags &= ~G_SOURCE_READY;
3025
3026       if (!SOURCE_DESTROYED (source))
3027         {
3028           gboolean was_in_call;
3029           gpointer user_data = NULL;
3030           GSourceFunc callback = NULL;
3031           GSourceCallbackFuncs *cb_funcs;
3032           gpointer cb_data;
3033           gboolean need_destroy;
3034
3035           gboolean (*dispatch) (GSource *,
3036                                 GSourceFunc,
3037                                 gpointer);
3038           GSource *prev_source;
3039
3040           dispatch = source->source_funcs->dispatch;
3041           cb_funcs = source->callback_funcs;
3042           cb_data = source->callback_data;
3043
3044           if (cb_funcs)
3045             cb_funcs->ref (cb_data);
3046           
3047           if ((source->flags & G_SOURCE_CAN_RECURSE) == 0)
3048             block_source (source);
3049           
3050           was_in_call = source->flags & G_HOOK_FLAG_IN_CALL;
3051           source->flags |= G_HOOK_FLAG_IN_CALL;
3052
3053           if (cb_funcs)
3054             cb_funcs->get (cb_data, source, &callback, &user_data);
3055
3056           UNLOCK_CONTEXT (context);
3057
3058           /* These operations are safe because 'current' is thread-local
3059            * and not modified from anywhere but this function.
3060            */
3061           prev_source = current->source;
3062           current->source = source;
3063           current->depth++;
3064
3065           need_destroy = !(* dispatch) (source, callback, user_data);
3066
3067           current->source = prev_source;
3068           current->depth--;
3069
3070           if (cb_funcs)
3071             cb_funcs->unref (cb_data);
3072
3073           LOCK_CONTEXT (context);
3074           
3075           if (!was_in_call)
3076             source->flags &= ~G_HOOK_FLAG_IN_CALL;
3077
3078           if (SOURCE_BLOCKED (source) && !SOURCE_DESTROYED (source))
3079             unblock_source (source);
3080           
3081           /* Note: this depends on the fact that we can't switch
3082            * sources from one main context to another
3083            */
3084           if (need_destroy && !SOURCE_DESTROYED (source))
3085             {
3086               g_assert (source->context == context);
3087               g_source_destroy_internal (source, context, TRUE);
3088             }
3089         }
3090       
3091       SOURCE_UNREF (source, context);
3092     }
3093
3094   g_ptr_array_set_size (context->pending_dispatches, 0);
3095 }
3096
3097 /**
3098  * g_main_context_acquire:
3099  * @context: a #GMainContext
3100  * 
3101  * Tries to become the owner of the specified context.
3102  * If some other thread is the owner of the context,
3103  * returns %FALSE immediately. Ownership is properly
3104  * recursive: the owner can require ownership again
3105  * and will release ownership when g_main_context_release()
3106  * is called as many times as g_main_context_acquire().
3107  *
3108  * You must be the owner of a context before you
3109  * can call g_main_context_prepare(), g_main_context_query(),
3110  * g_main_context_check(), g_main_context_dispatch().
3111  * 
3112  * Return value: %TRUE if the operation succeeded, and
3113  *   this thread is now the owner of @context.
3114  **/
3115 gboolean 
3116 g_main_context_acquire (GMainContext *context)
3117 {
3118   gboolean result = FALSE;
3119   GThread *self = G_THREAD_SELF;
3120
3121   if (context == NULL)
3122     context = g_main_context_default ();
3123   
3124   LOCK_CONTEXT (context);
3125
3126   if (!context->owner)
3127     {
3128       context->owner = self;
3129       g_assert (context->owner_count == 0);
3130     }
3131
3132   if (context->owner == self)
3133     {
3134       context->owner_count++;
3135       result = TRUE;
3136     }
3137
3138   UNLOCK_CONTEXT (context); 
3139   
3140   return result;
3141 }
3142
3143 /**
3144  * g_main_context_release:
3145  * @context: a #GMainContext
3146  * 
3147  * Releases ownership of a context previously acquired by this thread
3148  * with g_main_context_acquire(). If the context was acquired multiple
3149  * times, the ownership will be released only when g_main_context_release()
3150  * is called as many times as it was acquired.
3151  **/
3152 void
3153 g_main_context_release (GMainContext *context)
3154 {
3155   if (context == NULL)
3156     context = g_main_context_default ();
3157   
3158   LOCK_CONTEXT (context);
3159
3160   context->owner_count--;
3161   if (context->owner_count == 0)
3162     {
3163       context->owner = NULL;
3164
3165       if (context->waiters)
3166         {
3167           GMainWaiter *waiter = context->waiters->data;
3168           gboolean loop_internal_waiter = (waiter->mutex == &context->mutex);
3169           context->waiters = g_slist_delete_link (context->waiters,
3170                                                   context->waiters);
3171           if (!loop_internal_waiter)
3172             g_mutex_lock (waiter->mutex);
3173           
3174           g_cond_signal (waiter->cond);
3175           
3176           if (!loop_internal_waiter)
3177             g_mutex_unlock (waiter->mutex);
3178         }
3179     }
3180
3181   UNLOCK_CONTEXT (context); 
3182 }
3183
3184 /**
3185  * g_main_context_wait:
3186  * @context: a #GMainContext
3187  * @cond: a condition variable
3188  * @mutex: a mutex, currently held
3189  * 
3190  * Tries to become the owner of the specified context,
3191  * as with g_main_context_acquire(). But if another thread
3192  * is the owner, atomically drop @mutex and wait on @cond until 
3193  * that owner releases ownership or until @cond is signaled, then
3194  * try again (once) to become the owner.
3195  * 
3196  * Return value: %TRUE if the operation succeeded, and
3197  *   this thread is now the owner of @context.
3198  **/
3199 gboolean
3200 g_main_context_wait (GMainContext *context,
3201                      GCond        *cond,
3202                      GMutex       *mutex)
3203 {
3204   gboolean result = FALSE;
3205   GThread *self = G_THREAD_SELF;
3206   gboolean loop_internal_waiter;
3207   
3208   if (context == NULL)
3209     context = g_main_context_default ();
3210
3211   loop_internal_waiter = (mutex == &context->mutex);
3212   
3213   if (!loop_internal_waiter)
3214     LOCK_CONTEXT (context);
3215
3216   if (context->owner && context->owner != self)
3217     {
3218       GMainWaiter waiter;
3219
3220       waiter.cond = cond;
3221       waiter.mutex = mutex;
3222
3223       context->waiters = g_slist_append (context->waiters, &waiter);
3224       
3225       if (!loop_internal_waiter)
3226         UNLOCK_CONTEXT (context);
3227       g_cond_wait (cond, mutex);
3228       if (!loop_internal_waiter)      
3229         LOCK_CONTEXT (context);
3230
3231       context->waiters = g_slist_remove (context->waiters, &waiter);
3232     }
3233
3234   if (!context->owner)
3235     {
3236       context->owner = self;
3237       g_assert (context->owner_count == 0);
3238     }
3239
3240   if (context->owner == self)
3241     {
3242       context->owner_count++;
3243       result = TRUE;
3244     }
3245
3246   if (!loop_internal_waiter)
3247     UNLOCK_CONTEXT (context); 
3248   
3249   return result;
3250 }
3251
3252 /**
3253  * g_main_context_prepare:
3254  * @context: a #GMainContext
3255  * @priority: location to store priority of highest priority
3256  *            source already ready.
3257  * 
3258  * Prepares to poll sources within a main loop. The resulting information
3259  * for polling is determined by calling g_main_context_query ().
3260  * 
3261  * Return value: %TRUE if some source is ready to be dispatched
3262  *               prior to polling.
3263  **/
3264 gboolean
3265 g_main_context_prepare (GMainContext *context,
3266                         gint         *priority)
3267 {
3268   gint i;
3269   gint n_ready = 0;
3270   gint current_priority = G_MAXINT;
3271   GSource *source;
3272   GSourceIter iter;
3273
3274   if (context == NULL)
3275     context = g_main_context_default ();
3276   
3277   LOCK_CONTEXT (context);
3278
3279   context->time_is_fresh = FALSE;
3280
3281   if (context->in_check_or_prepare)
3282     {
3283       g_warning ("g_main_context_prepare() called recursively from within a source's check() or "
3284                  "prepare() member.");
3285       UNLOCK_CONTEXT (context);
3286       return FALSE;
3287     }
3288
3289 #if 0
3290   /* If recursing, finish up current dispatch, before starting over */
3291   if (context->pending_dispatches)
3292     {
3293       if (dispatch)
3294         g_main_dispatch (context, &current_time);
3295       
3296       UNLOCK_CONTEXT (context);
3297       return TRUE;
3298     }
3299 #endif
3300
3301   /* If recursing, clear list of pending dispatches */
3302
3303   for (i = 0; i < context->pending_dispatches->len; i++)
3304     {
3305       if (context->pending_dispatches->pdata[i])
3306         SOURCE_UNREF ((GSource *)context->pending_dispatches->pdata[i], context);
3307     }
3308   g_ptr_array_set_size (context->pending_dispatches, 0);
3309   
3310   /* Prepare all sources */
3311
3312   context->timeout = -1;
3313   
3314   g_source_iter_init (&iter, context, TRUE);
3315   while (g_source_iter_next (&iter, &source))
3316     {
3317       gint source_timeout = -1;
3318
3319       if (SOURCE_DESTROYED (source) || SOURCE_BLOCKED (source))
3320         continue;
3321       if ((n_ready > 0) && (source->priority > current_priority))
3322         break;
3323
3324       if (!(source->flags & G_SOURCE_READY))
3325         {
3326           gboolean result;
3327           gboolean (* prepare) (GSource  *source,
3328                                 gint     *timeout);
3329
3330           prepare = source->source_funcs->prepare;
3331
3332           if (prepare)
3333             {
3334               context->in_check_or_prepare++;
3335               UNLOCK_CONTEXT (context);
3336
3337               result = (* prepare) (source, &source_timeout);
3338
3339               LOCK_CONTEXT (context);
3340               context->in_check_or_prepare--;
3341             }
3342           else
3343             {
3344               source_timeout = -1;
3345               result = FALSE;
3346             }
3347
3348           if (result == FALSE && source->priv->ready_time != -1)
3349             {
3350               if (!context->time_is_fresh)
3351                 {
3352                   context->time = g_get_monotonic_time ();
3353                   context->time_is_fresh = TRUE;
3354                 }
3355
3356               if (source->priv->ready_time <= context->time)
3357                 {
3358                   source_timeout = 0;
3359                   result = TRUE;
3360                 }
3361               else
3362                 {
3363                   gint timeout;
3364
3365                   /* rounding down will lead to spinning, so always round up */
3366                   timeout = (source->priv->ready_time - context->time + 999) / 1000;
3367
3368                   if (source_timeout < 0 || timeout < source_timeout)
3369                     source_timeout = timeout;
3370                 }
3371             }
3372
3373           if (result)
3374             {
3375               GSource *ready_source = source;
3376
3377               while (ready_source)
3378                 {
3379                   ready_source->flags |= G_SOURCE_READY;
3380                   ready_source = ready_source->priv->parent_source;
3381                 }
3382             }
3383         }
3384
3385       if (source->flags & G_SOURCE_READY)
3386         {
3387           n_ready++;
3388           current_priority = source->priority;
3389           context->timeout = 0;
3390         }
3391       
3392       if (source_timeout >= 0)
3393         {
3394           if (context->timeout < 0)
3395             context->timeout = source_timeout;
3396           else
3397             context->timeout = MIN (context->timeout, source_timeout);
3398         }
3399     }
3400   g_source_iter_clear (&iter);
3401
3402   UNLOCK_CONTEXT (context);
3403   
3404   if (priority)
3405     *priority = current_priority;
3406   
3407   return (n_ready > 0);
3408 }
3409
3410 /**
3411  * g_main_context_query:
3412  * @context: a #GMainContext
3413  * @max_priority: maximum priority source to check
3414  * @timeout_: (out): location to store timeout to be used in polling
3415  * @fds: (out caller-allocates) (array length=n_fds): location to
3416  *       store #GPollFD records that need to be polled.
3417  * @n_fds: length of @fds.
3418  * 
3419  * Determines information necessary to poll this main loop.
3420  * 
3421  * Return value: the number of records actually stored in @fds,
3422  *   or, if more than @n_fds records need to be stored, the number
3423  *   of records that need to be stored.
3424  **/
3425 gint
3426 g_main_context_query (GMainContext *context,
3427                       gint          max_priority,
3428                       gint         *timeout,
3429                       GPollFD      *fds,
3430                       gint          n_fds)
3431 {
3432   gint n_poll;
3433   GPollRec *pollrec;
3434   
3435   LOCK_CONTEXT (context);
3436
3437   pollrec = context->poll_records;
3438   n_poll = 0;
3439   while (pollrec && max_priority >= pollrec->priority)
3440     {
3441       /* We need to include entries with fd->events == 0 in the array because
3442        * otherwise if the application changes fd->events behind our back and 
3443        * makes it non-zero, we'll be out of sync when we check the fds[] array.
3444        * (Changing fd->events after adding an FD wasn't an anticipated use of 
3445        * this API, but it occurs in practice.) */
3446       if (n_poll < n_fds)
3447         {
3448           fds[n_poll].fd = pollrec->fd->fd;
3449           /* In direct contradiction to the Unix98 spec, IRIX runs into
3450            * difficulty if you pass in POLLERR, POLLHUP or POLLNVAL
3451            * flags in the events field of the pollfd while it should
3452            * just ignoring them. So we mask them out here.
3453            */
3454           fds[n_poll].events = pollrec->fd->events & ~(G_IO_ERR|G_IO_HUP|G_IO_NVAL);
3455           fds[n_poll].revents = 0;
3456         }
3457
3458       pollrec = pollrec->next;
3459       n_poll++;
3460     }
3461
3462   context->poll_changed = FALSE;
3463   
3464   if (timeout)
3465     {
3466       *timeout = context->timeout;
3467       if (*timeout != 0)
3468         context->time_is_fresh = FALSE;
3469     }
3470   
3471   UNLOCK_CONTEXT (context);
3472
3473   return n_poll;
3474 }
3475
3476 /**
3477  * g_main_context_check:
3478  * @context: a #GMainContext
3479  * @max_priority: the maximum numerical priority of sources to check
3480  * @fds: (array length=n_fds): array of #GPollFD's that was passed to
3481  *       the last call to g_main_context_query()
3482  * @n_fds: return value of g_main_context_query()
3483  * 
3484  * Passes the results of polling back to the main loop.
3485  * 
3486  * Return value: %TRUE if some sources are ready to be dispatched.
3487  **/
3488 gboolean
3489 g_main_context_check (GMainContext *context,
3490                       gint          max_priority,
3491                       GPollFD      *fds,
3492                       gint          n_fds)
3493 {
3494   GSource *source;
3495   GSourceIter iter;
3496   GPollRec *pollrec;
3497   gint n_ready = 0;
3498   gint i;
3499    
3500   LOCK_CONTEXT (context);
3501
3502   if (context->in_check_or_prepare)
3503     {
3504       g_warning ("g_main_context_check() called recursively from within a source's check() or "
3505                  "prepare() member.");
3506       UNLOCK_CONTEXT (context);
3507       return FALSE;
3508     }
3509
3510   if (context->wake_up_rec.revents)
3511     g_wakeup_acknowledge (context->wakeup);
3512
3513   /* If the set of poll file descriptors changed, bail out
3514    * and let the main loop rerun
3515    */
3516   if (context->poll_changed)
3517     {
3518       UNLOCK_CONTEXT (context);
3519       return FALSE;
3520     }
3521   
3522   pollrec = context->poll_records;
3523   i = 0;
3524   while (i < n_fds)
3525     {
3526       if (pollrec->fd->events)
3527         pollrec->fd->revents = fds[i].revents;
3528
3529       pollrec = pollrec->next;
3530       i++;
3531     }
3532
3533   g_source_iter_init (&iter, context, TRUE);
3534   while (g_source_iter_next (&iter, &source))
3535     {
3536       if (SOURCE_DESTROYED (source) || SOURCE_BLOCKED (source))
3537         continue;
3538       if ((n_ready > 0) && (source->priority > max_priority))
3539         break;
3540
3541       if (!(source->flags & G_SOURCE_READY))
3542         {
3543           gboolean result;
3544           gboolean (* check) (GSource *source);
3545
3546           check = source->source_funcs->check;
3547
3548           if (check)
3549             {
3550               /* If the check function is set, call it. */
3551               context->in_check_or_prepare++;
3552               UNLOCK_CONTEXT (context);
3553
3554               result = (* check) (source);
3555
3556               LOCK_CONTEXT (context);
3557               context->in_check_or_prepare--;
3558             }
3559           else
3560             result = FALSE;
3561
3562           if (result == FALSE)
3563             {
3564               GSList *tmp_list;
3565
3566               /* If not already explicitly flagged ready by ->check()
3567                * (or if we have no check) then we can still be ready if
3568                * any of our fds poll as ready.
3569                */
3570               for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next)
3571                 {
3572                   GPollFD *pollfd = tmp_list->data;
3573
3574                   if (pollfd->revents)
3575                     {
3576                       result = TRUE;
3577                       break;
3578                     }
3579                 }
3580             }
3581
3582           if (result == FALSE && source->priv->ready_time != -1)
3583             {
3584               if (!context->time_is_fresh)
3585                 {
3586                   context->time = g_get_monotonic_time ();
3587                   context->time_is_fresh = TRUE;
3588                 }
3589
3590               if (source->priv->ready_time <= context->time)
3591                 result = TRUE;
3592             }
3593
3594           if (result)
3595             {
3596               GSource *ready_source = source;
3597
3598               while (ready_source)
3599                 {
3600                   ready_source->flags |= G_SOURCE_READY;
3601                   ready_source = ready_source->priv->parent_source;
3602                 }
3603             }
3604         }
3605
3606       if (source->flags & G_SOURCE_READY)
3607         {
3608           source->ref_count++;
3609           g_ptr_array_add (context->pending_dispatches, source);
3610
3611           n_ready++;
3612
3613           /* never dispatch sources with less priority than the first
3614            * one we choose to dispatch
3615            */
3616           max_priority = source->priority;
3617         }
3618     }
3619   g_source_iter_clear (&iter);
3620
3621   UNLOCK_CONTEXT (context);
3622
3623   return n_ready > 0;
3624 }
3625
3626 /**
3627  * g_main_context_dispatch:
3628  * @context: a #GMainContext
3629  * 
3630  * Dispatches all pending sources.
3631  **/
3632 void
3633 g_main_context_dispatch (GMainContext *context)
3634 {
3635   LOCK_CONTEXT (context);
3636
3637   if (context->pending_dispatches->len > 0)
3638     {
3639       g_main_dispatch (context);
3640     }
3641
3642   UNLOCK_CONTEXT (context);
3643 }
3644
3645 /* HOLDS context lock */
3646 static gboolean
3647 g_main_context_iterate (GMainContext *context,
3648                         gboolean      block,
3649                         gboolean      dispatch,
3650                         GThread      *self)
3651 {
3652   gint max_priority;
3653   gint timeout;
3654   gboolean some_ready;
3655   gint nfds, allocated_nfds;
3656   GPollFD *fds = NULL;
3657
3658   UNLOCK_CONTEXT (context);
3659
3660   if (!g_main_context_acquire (context))
3661     {
3662       gboolean got_ownership;
3663
3664       LOCK_CONTEXT (context);
3665
3666       if (!block)
3667         return FALSE;
3668
3669       got_ownership = g_main_context_wait (context,
3670                                            &context->cond,
3671                                            &context->mutex);
3672
3673       if (!got_ownership)
3674         return FALSE;
3675     }
3676   else
3677     LOCK_CONTEXT (context);
3678   
3679   if (!context->cached_poll_array)
3680     {
3681       context->cached_poll_array_size = context->n_poll_records;
3682       context->cached_poll_array = g_new (GPollFD, context->n_poll_records);
3683     }
3684
3685   allocated_nfds = context->cached_poll_array_size;
3686   fds = context->cached_poll_array;
3687   
3688   UNLOCK_CONTEXT (context);
3689
3690   g_main_context_prepare (context, &max_priority); 
3691   
3692   while ((nfds = g_main_context_query (context, max_priority, &timeout, fds, 
3693                                        allocated_nfds)) > allocated_nfds)
3694     {
3695       LOCK_CONTEXT (context);
3696       g_free (fds);
3697       context->cached_poll_array_size = allocated_nfds = nfds;
3698       context->cached_poll_array = fds = g_new (GPollFD, nfds);
3699       UNLOCK_CONTEXT (context);
3700     }
3701
3702   if (!block)
3703     timeout = 0;
3704   
3705   g_main_context_poll (context, timeout, max_priority, fds, nfds);
3706   
3707   some_ready = g_main_context_check (context, max_priority, fds, nfds);
3708   
3709   if (dispatch)
3710     g_main_context_dispatch (context);
3711   
3712   g_main_context_release (context);
3713
3714   LOCK_CONTEXT (context);
3715
3716   return some_ready;
3717 }
3718
3719 /**
3720  * g_main_context_pending:
3721  * @context: (allow-none): a #GMainContext (if %NULL, the default context will be used)
3722  *
3723  * Checks if any sources have pending events for the given context.
3724  * 
3725  * Return value: %TRUE if events are pending.
3726  **/
3727 gboolean 
3728 g_main_context_pending (GMainContext *context)
3729 {
3730   gboolean retval;
3731
3732   if (!context)
3733     context = g_main_context_default();
3734
3735   LOCK_CONTEXT (context);
3736   retval = g_main_context_iterate (context, FALSE, FALSE, G_THREAD_SELF);
3737   UNLOCK_CONTEXT (context);
3738   
3739   return retval;
3740 }
3741
3742 /**
3743  * g_main_context_iteration:
3744  * @context: (allow-none): a #GMainContext (if %NULL, the default context will be used) 
3745  * @may_block: whether the call may block.
3746  *
3747  * Runs a single iteration for the given main loop. This involves
3748  * checking to see if any event sources are ready to be processed,
3749  * then if no events sources are ready and @may_block is %TRUE, waiting
3750  * for a source to become ready, then dispatching the highest priority
3751  * events sources that are ready. Otherwise, if @may_block is %FALSE
3752  * sources are not waited to become ready, only those highest priority
3753  * events sources will be dispatched (if any), that are ready at this
3754  * given moment without further waiting.
3755  *
3756  * Note that even when @may_block is %TRUE, it is still possible for
3757  * g_main_context_iteration() to return %FALSE, since the wait may
3758  * be interrupted for other reasons than an event source becoming ready.
3759  *
3760  * Return value: %TRUE if events were dispatched.
3761  **/
3762 gboolean
3763 g_main_context_iteration (GMainContext *context, gboolean may_block)
3764 {
3765   gboolean retval;
3766
3767   if (!context)
3768     context = g_main_context_default();
3769   
3770   LOCK_CONTEXT (context);
3771   retval = g_main_context_iterate (context, may_block, TRUE, G_THREAD_SELF);
3772   UNLOCK_CONTEXT (context);
3773   
3774   return retval;
3775 }
3776
3777 /**
3778  * g_main_loop_new:
3779  * @context: (allow-none): a #GMainContext  (if %NULL, the default context will be used).
3780  * @is_running: set to %TRUE to indicate that the loop is running. This
3781  * is not very important since calling g_main_loop_run() will set this to
3782  * %TRUE anyway.
3783  * 
3784  * Creates a new #GMainLoop structure.
3785  * 
3786  * Return value: a new #GMainLoop.
3787  **/
3788 GMainLoop *
3789 g_main_loop_new (GMainContext *context,
3790                  gboolean      is_running)
3791 {
3792   GMainLoop *loop;
3793
3794   if (!context)
3795     context = g_main_context_default();
3796   
3797   g_main_context_ref (context);
3798
3799   loop = g_new0 (GMainLoop, 1);
3800   loop->context = context;
3801   loop->is_running = is_running != FALSE;
3802   loop->ref_count = 1;
3803   
3804   return loop;
3805 }
3806
3807 /**
3808  * g_main_loop_ref:
3809  * @loop: a #GMainLoop
3810  * 
3811  * Increases the reference count on a #GMainLoop object by one.
3812  * 
3813  * Return value: @loop
3814  **/
3815 GMainLoop *
3816 g_main_loop_ref (GMainLoop *loop)
3817 {
3818   g_return_val_if_fail (loop != NULL, NULL);
3819   g_return_val_if_fail (g_atomic_int_get (&loop->ref_count) > 0, NULL);
3820
3821   g_atomic_int_inc (&loop->ref_count);
3822
3823   return loop;
3824 }
3825
3826 /**
3827  * g_main_loop_unref:
3828  * @loop: a #GMainLoop
3829  * 
3830  * Decreases the reference count on a #GMainLoop object by one. If
3831  * the result is zero, free the loop and free all associated memory.
3832  **/
3833 void
3834 g_main_loop_unref (GMainLoop *loop)
3835 {
3836   g_return_if_fail (loop != NULL);
3837   g_return_if_fail (g_atomic_int_get (&loop->ref_count) > 0);
3838
3839   if (!g_atomic_int_dec_and_test (&loop->ref_count))
3840     return;
3841
3842   g_main_context_unref (loop->context);
3843   g_free (loop);
3844 }
3845
3846 /**
3847  * g_main_loop_run:
3848  * @loop: a #GMainLoop
3849  * 
3850  * Runs a main loop until g_main_loop_quit() is called on the loop.
3851  * If this is called for the thread of the loop's #GMainContext,
3852  * it will process events from the loop, otherwise it will
3853  * simply wait.
3854  **/
3855 void 
3856 g_main_loop_run (GMainLoop *loop)
3857 {
3858   GThread *self = G_THREAD_SELF;
3859
3860   g_return_if_fail (loop != NULL);
3861   g_return_if_fail (g_atomic_int_get (&loop->ref_count) > 0);
3862
3863   if (!g_main_context_acquire (loop->context))
3864     {
3865       gboolean got_ownership = FALSE;
3866       
3867       /* Another thread owns this context */
3868       LOCK_CONTEXT (loop->context);
3869
3870       g_atomic_int_inc (&loop->ref_count);
3871
3872       if (!loop->is_running)
3873         loop->is_running = TRUE;
3874
3875       while (loop->is_running && !got_ownership)
3876         got_ownership = g_main_context_wait (loop->context,
3877                                              &loop->context->cond,
3878                                              &loop->context->mutex);
3879       
3880       if (!loop->is_running)
3881         {
3882           UNLOCK_CONTEXT (loop->context);
3883           if (got_ownership)
3884             g_main_context_release (loop->context);
3885           g_main_loop_unref (loop);
3886           return;
3887         }
3888
3889       g_assert (got_ownership);
3890     }
3891   else
3892     LOCK_CONTEXT (loop->context);
3893
3894   if (loop->context->in_check_or_prepare)
3895     {
3896       g_warning ("g_main_loop_run(): called recursively from within a source's "
3897                  "check() or prepare() member, iteration not possible.");
3898       return;
3899     }
3900
3901   g_atomic_int_inc (&loop->ref_count);
3902   loop->is_running = TRUE;
3903   while (loop->is_running)
3904     g_main_context_iterate (loop->context, TRUE, TRUE, self);
3905
3906   UNLOCK_CONTEXT (loop->context);
3907   
3908   g_main_context_release (loop->context);
3909   
3910   g_main_loop_unref (loop);
3911 }
3912
3913 /**
3914  * g_main_loop_quit:
3915  * @loop: a #GMainLoop
3916  * 
3917  * Stops a #GMainLoop from running. Any calls to g_main_loop_run()
3918  * for the loop will return. 
3919  *
3920  * Note that sources that have already been dispatched when 
3921  * g_main_loop_quit() is called will still be executed.
3922  **/
3923 void 
3924 g_main_loop_quit (GMainLoop *loop)
3925 {
3926   g_return_if_fail (loop != NULL);
3927   g_return_if_fail (g_atomic_int_get (&loop->ref_count) > 0);
3928
3929   LOCK_CONTEXT (loop->context);
3930   loop->is_running = FALSE;
3931   g_wakeup_signal (loop->context->wakeup);
3932
3933   g_cond_broadcast (&loop->context->cond);
3934
3935   UNLOCK_CONTEXT (loop->context);
3936 }
3937
3938 /**
3939  * g_main_loop_is_running:
3940  * @loop: a #GMainLoop.
3941  * 
3942  * Checks to see if the main loop is currently being run via g_main_loop_run().
3943  * 
3944  * Return value: %TRUE if the mainloop is currently being run.
3945  **/
3946 gboolean
3947 g_main_loop_is_running (GMainLoop *loop)
3948 {
3949   g_return_val_if_fail (loop != NULL, FALSE);
3950   g_return_val_if_fail (g_atomic_int_get (&loop->ref_count) > 0, FALSE);
3951
3952   return loop->is_running;
3953 }
3954
3955 /**
3956  * g_main_loop_get_context:
3957  * @loop: a #GMainLoop.
3958  * 
3959  * Returns the #GMainContext of @loop.
3960  * 
3961  * Return value: (transfer none): the #GMainContext of @loop
3962  **/
3963 GMainContext *
3964 g_main_loop_get_context (GMainLoop *loop)
3965 {
3966   g_return_val_if_fail (loop != NULL, NULL);
3967   g_return_val_if_fail (g_atomic_int_get (&loop->ref_count) > 0, NULL);
3968  
3969   return loop->context;
3970 }
3971
3972 /* HOLDS: context's lock */
3973 static void
3974 g_main_context_poll (GMainContext *context,
3975                      gint          timeout,
3976                      gint          priority,
3977                      GPollFD      *fds,
3978                      gint          n_fds)
3979 {
3980 #ifdef  G_MAIN_POLL_DEBUG
3981   GTimer *poll_timer;
3982   GPollRec *pollrec;
3983   gint i;
3984 #endif
3985
3986   GPollFunc poll_func;
3987
3988   if (n_fds || timeout != 0)
3989     {
3990 #ifdef  G_MAIN_POLL_DEBUG
3991       if (_g_main_poll_debug)
3992         {
3993           g_print ("polling context=%p n=%d timeout=%d\n",
3994                    context, n_fds, timeout);
3995           poll_timer = g_timer_new ();
3996         }
3997 #endif
3998
3999       LOCK_CONTEXT (context);
4000
4001       poll_func = context->poll_func;
4002       
4003       UNLOCK_CONTEXT (context);
4004       if ((*poll_func) (fds, n_fds, timeout) < 0 && errno != EINTR)
4005         {
4006 #ifndef G_OS_WIN32
4007           g_warning ("poll(2) failed due to: %s.",
4008                      g_strerror (errno));
4009 #else
4010           /* If g_poll () returns -1, it has already called g_warning() */
4011 #endif
4012         }
4013       
4014 #ifdef  G_MAIN_POLL_DEBUG
4015       if (_g_main_poll_debug)
4016         {
4017           LOCK_CONTEXT (context);
4018
4019           g_print ("g_main_poll(%d) timeout: %d - elapsed %12.10f seconds",
4020                    n_fds,
4021                    timeout,
4022                    g_timer_elapsed (poll_timer, NULL));
4023           g_timer_destroy (poll_timer);
4024           pollrec = context->poll_records;
4025
4026           while (pollrec != NULL)
4027             {
4028               i = 0;
4029               while (i < n_fds)
4030                 {
4031                   if (fds[i].fd == pollrec->fd->fd &&
4032                       pollrec->fd->events &&
4033                       fds[i].revents)
4034                     {
4035                       g_print (" [" G_POLLFD_FORMAT " :", fds[i].fd);
4036                       if (fds[i].revents & G_IO_IN)
4037                         g_print ("i");
4038                       if (fds[i].revents & G_IO_OUT)
4039                         g_print ("o");
4040                       if (fds[i].revents & G_IO_PRI)
4041                         g_print ("p");
4042                       if (fds[i].revents & G_IO_ERR)
4043                         g_print ("e");
4044                       if (fds[i].revents & G_IO_HUP)
4045                         g_print ("h");
4046                       if (fds[i].revents & G_IO_NVAL)
4047                         g_print ("n");
4048                       g_print ("]");
4049                     }
4050                   i++;
4051                 }
4052               pollrec = pollrec->next;
4053             }
4054           g_print ("\n");
4055
4056           UNLOCK_CONTEXT (context);
4057         }
4058 #endif
4059     } /* if (n_fds || timeout != 0) */
4060 }
4061
4062 /**
4063  * g_main_context_add_poll:
4064  * @context: (allow-none): a #GMainContext (or %NULL for the default context)
4065  * @fd: a #GPollFD structure holding information about a file
4066  *      descriptor to watch.
4067  * @priority: the priority for this file descriptor which should be
4068  *      the same as the priority used for g_source_attach() to ensure that the
4069  *      file descriptor is polled whenever the results may be needed.
4070  *
4071  * Adds a file descriptor to the set of file descriptors polled for
4072  * this context. This will very seldom be used directly. Instead
4073  * a typical event source will use g_source_add_unix_fd() instead.
4074  **/
4075 void
4076 g_main_context_add_poll (GMainContext *context,
4077                          GPollFD      *fd,
4078                          gint          priority)
4079 {
4080   if (!context)
4081     context = g_main_context_default ();
4082   
4083   g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0);
4084   g_return_if_fail (fd);
4085
4086   LOCK_CONTEXT (context);
4087   g_main_context_add_poll_unlocked (context, priority, fd);
4088   UNLOCK_CONTEXT (context);
4089 }
4090
4091 /* HOLDS: main_loop_lock */
4092 static void 
4093 g_main_context_add_poll_unlocked (GMainContext *context,
4094                                   gint          priority,
4095                                   GPollFD      *fd)
4096 {
4097   GPollRec *prevrec, *nextrec;
4098   GPollRec *newrec = g_slice_new (GPollRec);
4099
4100   /* This file descriptor may be checked before we ever poll */
4101   fd->revents = 0;
4102   newrec->fd = fd;
4103   newrec->priority = priority;
4104
4105   prevrec = context->poll_records_tail;
4106   nextrec = NULL;
4107   while (prevrec && priority < prevrec->priority)
4108     {
4109       nextrec = prevrec;
4110       prevrec = prevrec->prev;
4111     }
4112
4113   if (prevrec)
4114     prevrec->next = newrec;
4115   else
4116     context->poll_records = newrec;
4117
4118   newrec->prev = prevrec;
4119   newrec->next = nextrec;
4120
4121   if (nextrec)
4122     nextrec->prev = newrec;
4123   else 
4124     context->poll_records_tail = newrec;
4125
4126   context->n_poll_records++;
4127
4128   context->poll_changed = TRUE;
4129
4130   /* Now wake up the main loop if it is waiting in the poll() */
4131   g_wakeup_signal (context->wakeup);
4132 }
4133
4134 /**
4135  * g_main_context_remove_poll:
4136  * @context:a #GMainContext 
4137  * @fd: a #GPollFD descriptor previously added with g_main_context_add_poll()
4138  * 
4139  * Removes file descriptor from the set of file descriptors to be
4140  * polled for a particular context.
4141  **/
4142 void
4143 g_main_context_remove_poll (GMainContext *context,
4144                             GPollFD      *fd)
4145 {
4146   if (!context)
4147     context = g_main_context_default ();
4148   
4149   g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0);
4150   g_return_if_fail (fd);
4151
4152   LOCK_CONTEXT (context);
4153   g_main_context_remove_poll_unlocked (context, fd);
4154   UNLOCK_CONTEXT (context);
4155 }
4156
4157 static void
4158 g_main_context_remove_poll_unlocked (GMainContext *context,
4159                                      GPollFD      *fd)
4160 {
4161   GPollRec *pollrec, *prevrec, *nextrec;
4162
4163   prevrec = NULL;
4164   pollrec = context->poll_records;
4165
4166   while (pollrec)
4167     {
4168       nextrec = pollrec->next;
4169       if (pollrec->fd == fd)
4170         {
4171           if (prevrec != NULL)
4172             prevrec->next = nextrec;
4173           else
4174             context->poll_records = nextrec;
4175
4176           if (nextrec != NULL)
4177             nextrec->prev = prevrec;
4178           else
4179             context->poll_records_tail = prevrec;
4180
4181           g_slice_free (GPollRec, pollrec);
4182
4183           context->n_poll_records--;
4184           break;
4185         }
4186       prevrec = pollrec;
4187       pollrec = nextrec;
4188     }
4189
4190   context->poll_changed = TRUE;
4191   
4192   /* Now wake up the main loop if it is waiting in the poll() */
4193   g_wakeup_signal (context->wakeup);
4194 }
4195
4196 /**
4197  * g_source_get_current_time:
4198  * @source:  a #GSource
4199  * @timeval: #GTimeVal structure in which to store current time.
4200  *
4201  * This function ignores @source and is otherwise the same as
4202  * g_get_current_time().
4203  *
4204  * Deprecated: 2.28: use g_source_get_time() instead
4205  **/
4206 void
4207 g_source_get_current_time (GSource  *source,
4208                            GTimeVal *timeval)
4209 {
4210   g_get_current_time (timeval);
4211 }
4212
4213 /**
4214  * g_source_get_time:
4215  * @source: a #GSource
4216  *
4217  * Gets the time to be used when checking this source. The advantage of
4218  * calling this function over calling g_get_monotonic_time() directly is
4219  * that when checking multiple sources, GLib can cache a single value
4220  * instead of having to repeatedly get the system monotonic time.
4221  *
4222  * The time here is the system monotonic time, if available, or some
4223  * other reasonable alternative otherwise.  See g_get_monotonic_time().
4224  *
4225  * Returns: the monotonic time in microseconds
4226  *
4227  * Since: 2.28
4228  **/
4229 gint64
4230 g_source_get_time (GSource *source)
4231 {
4232   GMainContext *context;
4233   gint64 result;
4234
4235   g_return_val_if_fail (source->context != NULL, 0);
4236
4237   context = source->context;
4238
4239   LOCK_CONTEXT (context);
4240
4241   if (!context->time_is_fresh)
4242     {
4243       context->time = g_get_monotonic_time ();
4244       context->time_is_fresh = TRUE;
4245     }
4246
4247   result = context->time;
4248
4249   UNLOCK_CONTEXT (context);
4250
4251   return result;
4252 }
4253
4254 /**
4255  * g_main_context_set_poll_func:
4256  * @context: a #GMainContext
4257  * @func: the function to call to poll all file descriptors
4258  * 
4259  * Sets the function to use to handle polling of file descriptors. It
4260  * will be used instead of the poll() system call 
4261  * (or GLib's replacement function, which is used where 
4262  * poll() isn't available).
4263  *
4264  * This function could possibly be used to integrate the GLib event
4265  * loop with an external event loop.
4266  **/
4267 void
4268 g_main_context_set_poll_func (GMainContext *context,
4269                               GPollFunc     func)
4270 {
4271   if (!context)
4272     context = g_main_context_default ();
4273   
4274   g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0);
4275
4276   LOCK_CONTEXT (context);
4277   
4278   if (func)
4279     context->poll_func = func;
4280   else
4281     context->poll_func = g_poll;
4282
4283   UNLOCK_CONTEXT (context);
4284 }
4285
4286 /**
4287  * g_main_context_get_poll_func:
4288  * @context: a #GMainContext
4289  * 
4290  * Gets the poll function set by g_main_context_set_poll_func().
4291  * 
4292  * Return value: the poll function
4293  **/
4294 GPollFunc
4295 g_main_context_get_poll_func (GMainContext *context)
4296 {
4297   GPollFunc result;
4298   
4299   if (!context)
4300     context = g_main_context_default ();
4301   
4302   g_return_val_if_fail (g_atomic_int_get (&context->ref_count) > 0, NULL);
4303
4304   LOCK_CONTEXT (context);
4305   result = context->poll_func;
4306   UNLOCK_CONTEXT (context);
4307
4308   return result;
4309 }
4310
4311 /**
4312  * g_main_context_wakeup:
4313  * @context: a #GMainContext
4314  * 
4315  * If @context is currently blocking in g_main_context_iteration()
4316  * waiting for a source to become ready, cause it to stop blocking
4317  * and return.  Otherwise, cause the next invocation of
4318  * g_main_context_iteration() to return without blocking.
4319  *
4320  * This API is useful for low-level control over #GMainContext; for
4321  * example, integrating it with main loop implementations such as
4322  * #GMainLoop.
4323  *
4324  * Another related use for this function is when implementing a main
4325  * loop with a termination condition, computed from multiple threads:
4326  *
4327  * |[
4328  *   #define NUM_TASKS 10
4329  *   static volatile gint tasks_remaining = NUM_TASKS;
4330  *   ...
4331  *  
4332  *   while (g_atomic_int_get (&tasks_remaining) != 0)
4333  *     g_main_context_iteration (NULL, TRUE);
4334  * ]|
4335  *  
4336  * Then in a thread:
4337  * |[
4338  *   perform_work();
4339  *
4340  *   if (g_atomic_int_dec_and_test (&tasks_remaining))
4341  *     g_main_context_wakeup (NULL);
4342  * ]|
4343  **/
4344 void
4345 g_main_context_wakeup (GMainContext *context)
4346 {
4347   if (!context)
4348     context = g_main_context_default ();
4349
4350   g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0);
4351
4352   g_wakeup_signal (context->wakeup);
4353 }
4354
4355 /**
4356  * g_main_context_is_owner:
4357  * @context: a #GMainContext
4358  * 
4359  * Determines whether this thread holds the (recursive)
4360  * ownership of this #GMainContext. This is useful to
4361  * know before waiting on another thread that may be
4362  * blocking to get ownership of @context.
4363  *
4364  * Returns: %TRUE if current thread is owner of @context.
4365  *
4366  * Since: 2.10
4367  **/
4368 gboolean
4369 g_main_context_is_owner (GMainContext *context)
4370 {
4371   gboolean is_owner;
4372
4373   if (!context)
4374     context = g_main_context_default ();
4375
4376   LOCK_CONTEXT (context);
4377   is_owner = context->owner == G_THREAD_SELF;
4378   UNLOCK_CONTEXT (context);
4379
4380   return is_owner;
4381 }
4382
4383 /* Timeouts */
4384
4385 static void
4386 g_timeout_set_expiration (GTimeoutSource *timeout_source,
4387                           gint64          current_time)
4388 {
4389   gint64 expiration;
4390
4391   expiration = current_time + (guint64) timeout_source->interval * 1000;
4392
4393   if (timeout_source->seconds)
4394     {
4395       gint64 remainder;
4396       static gint timer_perturb = -1;
4397
4398       if (timer_perturb == -1)
4399         {
4400           /*
4401            * we want a per machine/session unique 'random' value; try the dbus
4402            * address first, that has a UUID in it. If there is no dbus, use the
4403            * hostname for hashing.
4404            */
4405           const char *session_bus_address = g_getenv ("DBUS_SESSION_BUS_ADDRESS");
4406           if (!session_bus_address)
4407             session_bus_address = g_getenv ("HOSTNAME");
4408           if (session_bus_address)
4409             timer_perturb = ABS ((gint) g_str_hash (session_bus_address)) % 1000000;
4410           else
4411             timer_perturb = 0;
4412         }
4413
4414       /* We want the microseconds part of the timeout to land on the
4415        * 'timer_perturb' mark, but we need to make sure we don't try to
4416        * set the timeout in the past.  We do this by ensuring that we
4417        * always only *increase* the expiration time by adding a full
4418        * second in the case that the microsecond portion decreases.
4419        */
4420       expiration -= timer_perturb;
4421
4422       remainder = expiration % 1000000;
4423       if (remainder >= 1000000/4)
4424         expiration += 1000000;
4425
4426       expiration -= remainder;
4427       expiration += timer_perturb;
4428     }
4429
4430   g_source_set_ready_time ((GSource *) timeout_source, expiration);
4431 }
4432
4433 static gboolean
4434 g_timeout_dispatch (GSource     *source,
4435                     GSourceFunc  callback,
4436                     gpointer     user_data)
4437 {
4438   GTimeoutSource *timeout_source = (GTimeoutSource *)source;
4439   gboolean again;
4440
4441   if (!callback)
4442     {
4443       g_warning ("Timeout source dispatched without callback\n"
4444                  "You must call g_source_set_callback().");
4445       return FALSE;
4446     }
4447
4448   again = callback (user_data);
4449
4450   if (again)
4451     g_timeout_set_expiration (timeout_source, g_source_get_time (source));
4452
4453   return again;
4454 }
4455
4456 /**
4457  * g_timeout_source_new:
4458  * @interval: the timeout interval in milliseconds.
4459  * 
4460  * Creates a new timeout source.
4461  *
4462  * The source will not initially be associated with any #GMainContext
4463  * and must be added to one with g_source_attach() before it will be
4464  * executed.
4465  *
4466  * The interval given is in terms of monotonic time, not wall clock
4467  * time.  See g_get_monotonic_time().
4468  * 
4469  * Return value: the newly-created timeout source
4470  **/
4471 GSource *
4472 g_timeout_source_new (guint interval)
4473 {
4474   GSource *source = g_source_new (&g_timeout_funcs, sizeof (GTimeoutSource));
4475   GTimeoutSource *timeout_source = (GTimeoutSource *)source;
4476
4477   timeout_source->interval = interval;
4478   g_timeout_set_expiration (timeout_source, g_get_monotonic_time ());
4479
4480   return source;
4481 }
4482
4483 /**
4484  * g_timeout_source_new_seconds:
4485  * @interval: the timeout interval in seconds
4486  *
4487  * Creates a new timeout source.
4488  *
4489  * The source will not initially be associated with any #GMainContext
4490  * and must be added to one with g_source_attach() before it will be
4491  * executed.
4492  *
4493  * The scheduling granularity/accuracy of this timeout source will be
4494  * in seconds.
4495  *
4496  * The interval given in terms of monotonic time, not wall clock time.
4497  * See g_get_monotonic_time().
4498  *
4499  * Return value: the newly-created timeout source
4500  *
4501  * Since: 2.14  
4502  **/
4503 GSource *
4504 g_timeout_source_new_seconds (guint interval)
4505 {
4506   GSource *source = g_source_new (&g_timeout_funcs, sizeof (GTimeoutSource));
4507   GTimeoutSource *timeout_source = (GTimeoutSource *)source;
4508
4509   timeout_source->interval = 1000 * interval;
4510   timeout_source->seconds = TRUE;
4511
4512   g_timeout_set_expiration (timeout_source, g_get_monotonic_time ());
4513
4514   return source;
4515 }
4516
4517
4518 /**
4519  * g_timeout_add_full:
4520  * @priority: the priority of the timeout source. Typically this will be in
4521  *            the range between #G_PRIORITY_DEFAULT and #G_PRIORITY_HIGH.
4522  * @interval: the time between calls to the function, in milliseconds
4523  *             (1/1000ths of a second)
4524  * @function: function to call
4525  * @data:     data to pass to @function
4526  * @notify: (allow-none): function to call when the timeout is removed, or %NULL
4527  * 
4528  * Sets a function to be called at regular intervals, with the given
4529  * priority.  The function is called repeatedly until it returns
4530  * %FALSE, at which point the timeout is automatically destroyed and
4531  * the function will not be called again.  The @notify function is
4532  * called when the timeout is destroyed.  The first call to the
4533  * function will be at the end of the first @interval.
4534  *
4535  * Note that timeout functions may be delayed, due to the processing of other
4536  * event sources. Thus they should not be relied on for precise timing.
4537  * After each call to the timeout function, the time of the next
4538  * timeout is recalculated based on the current time and the given interval
4539  * (it does not try to 'catch up' time lost in delays).
4540  *
4541  * This internally creates a main loop source using g_timeout_source_new()
4542  * and attaches it to the main loop context using g_source_attach(). You can
4543  * do these steps manually if you need greater control.
4544  *
4545  * The interval given in terms of monotonic time, not wall clock time.
4546  * See g_get_monotonic_time().
4547  * 
4548  * Return value: the ID (greater than 0) of the event source.
4549  * Rename to: g_timeout_add
4550  **/
4551 guint
4552 g_timeout_add_full (gint           priority,
4553                     guint          interval,
4554                     GSourceFunc    function,
4555                     gpointer       data,
4556                     GDestroyNotify notify)
4557 {
4558   GSource *source;
4559   guint id;
4560   
4561   g_return_val_if_fail (function != NULL, 0);
4562
4563   source = g_timeout_source_new (interval);
4564
4565   if (priority != G_PRIORITY_DEFAULT)
4566     g_source_set_priority (source, priority);
4567
4568   g_source_set_callback (source, function, data, notify);
4569   id = g_source_attach (source, NULL);
4570   g_source_unref (source);
4571
4572   return id;
4573 }
4574
4575 /**
4576  * g_timeout_add:
4577  * @interval: the time between calls to the function, in milliseconds
4578  *             (1/1000ths of a second)
4579  * @function: function to call
4580  * @data:     data to pass to @function
4581  * 
4582  * Sets a function to be called at regular intervals, with the default
4583  * priority, #G_PRIORITY_DEFAULT.  The function is called repeatedly
4584  * until it returns %FALSE, at which point the timeout is automatically
4585  * destroyed and the function will not be called again.  The first call
4586  * to the function will be at the end of the first @interval.
4587  *
4588  * Note that timeout functions may be delayed, due to the processing of other
4589  * event sources. Thus they should not be relied on for precise timing.
4590  * After each call to the timeout function, the time of the next
4591  * timeout is recalculated based on the current time and the given interval
4592  * (it does not try to 'catch up' time lost in delays).
4593  *
4594  * If you want to have a timer in the "seconds" range and do not care
4595  * about the exact time of the first call of the timer, use the
4596  * g_timeout_add_seconds() function; this function allows for more
4597  * optimizations and more efficient system power usage.
4598  *
4599  * This internally creates a main loop source using g_timeout_source_new()
4600  * and attaches it to the main loop context using g_source_attach(). You can
4601  * do these steps manually if you need greater control.
4602  * 
4603  * The interval given is in terms of monotonic time, not wall clock
4604  * time.  See g_get_monotonic_time().
4605  * 
4606  * Return value: the ID (greater than 0) of the event source.
4607  **/
4608 guint
4609 g_timeout_add (guint32        interval,
4610                GSourceFunc    function,
4611                gpointer       data)
4612 {
4613   return g_timeout_add_full (G_PRIORITY_DEFAULT, 
4614                              interval, function, data, NULL);
4615 }
4616
4617 /**
4618  * g_timeout_add_seconds_full:
4619  * @priority: the priority of the timeout source. Typically this will be in
4620  *            the range between #G_PRIORITY_DEFAULT and #G_PRIORITY_HIGH.
4621  * @interval: the time between calls to the function, in seconds
4622  * @function: function to call
4623  * @data:     data to pass to @function
4624  * @notify: (allow-none): function to call when the timeout is removed, or %NULL
4625  *
4626  * Sets a function to be called at regular intervals, with @priority.
4627  * The function is called repeatedly until it returns %FALSE, at which
4628  * point the timeout is automatically destroyed and the function will
4629  * not be called again.
4630  *
4631  * Unlike g_timeout_add(), this function operates at whole second granularity.
4632  * The initial starting point of the timer is determined by the implementation
4633  * and the implementation is expected to group multiple timers together so that
4634  * they fire all at the same time.
4635  * To allow this grouping, the @interval to the first timer is rounded
4636  * and can deviate up to one second from the specified interval.
4637  * Subsequent timer iterations will generally run at the specified interval.
4638  *
4639  * Note that timeout functions may be delayed, due to the processing of other
4640  * event sources. Thus they should not be relied on for precise timing.
4641  * After each call to the timeout function, the time of the next
4642  * timeout is recalculated based on the current time and the given @interval
4643  *
4644  * If you want timing more precise than whole seconds, use g_timeout_add()
4645  * instead.
4646  *
4647  * The grouping of timers to fire at the same time results in a more power
4648  * and CPU efficient behavior so if your timer is in multiples of seconds
4649  * and you don't require the first timer exactly one second from now, the
4650  * use of g_timeout_add_seconds() is preferred over g_timeout_add().
4651  *
4652  * This internally creates a main loop source using 
4653  * g_timeout_source_new_seconds() and attaches it to the main loop context 
4654  * using g_source_attach(). You can do these steps manually if you need 
4655  * greater control.
4656  * 
4657  * The interval given is in terms of monotonic time, not wall clock
4658  * time.  See g_get_monotonic_time().
4659  * 
4660  * Return value: the ID (greater than 0) of the event source.
4661  *
4662  * Rename to: g_timeout_add_seconds
4663  * Since: 2.14
4664  **/
4665 guint
4666 g_timeout_add_seconds_full (gint           priority,
4667                             guint32        interval,
4668                             GSourceFunc    function,
4669                             gpointer       data,
4670                             GDestroyNotify notify)
4671 {
4672   GSource *source;
4673   guint id;
4674
4675   g_return_val_if_fail (function != NULL, 0);
4676
4677   source = g_timeout_source_new_seconds (interval);
4678
4679   if (priority != G_PRIORITY_DEFAULT)
4680     g_source_set_priority (source, priority);
4681
4682   g_source_set_callback (source, function, data, notify);
4683   id = g_source_attach (source, NULL);
4684   g_source_unref (source);
4685
4686   return id;
4687 }
4688
4689 /**
4690  * g_timeout_add_seconds:
4691  * @interval: the time between calls to the function, in seconds
4692  * @function: function to call
4693  * @data: data to pass to @function
4694  *
4695  * Sets a function to be called at regular intervals with the default
4696  * priority, #G_PRIORITY_DEFAULT. The function is called repeatedly until
4697  * it returns %FALSE, at which point the timeout is automatically destroyed
4698  * and the function will not be called again.
4699  *
4700  * This internally creates a main loop source using
4701  * g_timeout_source_new_seconds() and attaches it to the main loop context
4702  * using g_source_attach(). You can do these steps manually if you need
4703  * greater control. Also see g_timeout_add_seconds_full().
4704  *
4705  * Note that the first call of the timer may not be precise for timeouts
4706  * of one second. If you need finer precision and have such a timeout,
4707  * you may want to use g_timeout_add() instead.
4708  *
4709  * The interval given is in terms of monotonic time, not wall clock
4710  * time.  See g_get_monotonic_time().
4711  * 
4712  * Return value: the ID (greater than 0) of the event source.
4713  *
4714  * Since: 2.14
4715  **/
4716 guint
4717 g_timeout_add_seconds (guint       interval,
4718                        GSourceFunc function,
4719                        gpointer    data)
4720 {
4721   g_return_val_if_fail (function != NULL, 0);
4722
4723   return g_timeout_add_seconds_full (G_PRIORITY_DEFAULT, interval, function, data, NULL);
4724 }
4725
4726 /* Child watch functions */
4727
4728 #ifdef G_OS_WIN32
4729
4730 static gboolean
4731 g_child_watch_prepare (GSource *source,
4732                        gint    *timeout)
4733 {
4734   *timeout = -1;
4735   return FALSE;
4736 }
4737
4738 static gboolean 
4739 g_child_watch_check (GSource  *source)
4740 {
4741   GChildWatchSource *child_watch_source;
4742   gboolean child_exited;
4743
4744   child_watch_source = (GChildWatchSource *) source;
4745
4746   child_exited = child_watch_source->poll.revents & G_IO_IN;
4747
4748   if (child_exited)
4749     {
4750       DWORD child_status;
4751
4752       /*
4753        * Note: We do _not_ check for the special value of STILL_ACTIVE
4754        * since we know that the process has exited and doing so runs into
4755        * problems if the child process "happens to return STILL_ACTIVE(259)"
4756        * as Microsoft's Platform SDK puts it.
4757        */
4758       if (!GetExitCodeProcess (child_watch_source->pid, &child_status))
4759         {
4760           gchar *emsg = g_win32_error_message (GetLastError ());
4761           g_warning (G_STRLOC ": GetExitCodeProcess() failed: %s", emsg);
4762           g_free (emsg);
4763
4764           child_watch_source->child_status = -1;
4765         }
4766       else
4767         child_watch_source->child_status = child_status;
4768     }
4769
4770   return child_exited;
4771 }
4772
4773 static void
4774 g_child_watch_finalize (GSource *source)
4775 {
4776 }
4777
4778 #else /* G_OS_WIN32 */
4779
4780 static void
4781 wake_source (GSource *source)
4782 {
4783   GMainContext *context;
4784
4785   /* This should be thread-safe:
4786    *
4787    *  - if the source is currently being added to a context, that
4788    *    context will be woken up anyway
4789    *
4790    *  - if the source is currently being destroyed, we simply need not
4791    *    to crash:
4792    *
4793    *    - the memory for the source will remain valid until after the
4794    *      source finalize function was called (which would remove the
4795    *      source from the global list which we are currently holding the
4796    *      lock for)
4797    *
4798    *    - the GMainContext will either be NULL or point to a live
4799    *      GMainContext
4800    *
4801    *    - the GMainContext will remain valid since we hold the
4802    *      main_context_list lock
4803    *
4804    *  Since we are holding a lot of locks here, don't try to enter any
4805    *  more GMainContext functions for fear of dealock -- just hit the
4806    *  GWakeup and run.  Even if that's safe now, it could easily become
4807    *  unsafe with some very minor changes in the future, and signal
4808    *  handling is not the most well-tested codepath.
4809    */
4810   G_LOCK(main_context_list);
4811   context = source->context;
4812   if (context)
4813     g_wakeup_signal (context->wakeup);
4814   G_UNLOCK(main_context_list);
4815 }
4816
4817 static void
4818 dispatch_unix_signals (void)
4819 {
4820   GSList *node;
4821
4822   /* clear this first incase another one arrives while we're processing */
4823   any_unix_signal_pending = FALSE;
4824
4825   G_LOCK(unix_signal_lock);
4826
4827   /* handle GChildWatchSource instances */
4828   if (unix_signal_pending[SIGCHLD])
4829     {
4830       /* The only way we can do this is to scan all of the children.
4831        *
4832        * The docs promise that we will not reap children that we are not
4833        * explicitly watching, so that ties our hands from calling
4834        * waitpid(-1).  We also can't use siginfo's si_pid field since if
4835        * multiple SIGCHLD arrive at the same time, one of them can be
4836        * dropped (since a given UNIX signal can only be pending once).
4837        */
4838       for (node = unix_child_watches; node; node = node->next)
4839         {
4840           GChildWatchSource *source = node->data;
4841
4842           if (!source->child_exited)
4843             {
4844               pid_t pid;
4845               do
4846                 {
4847                   pid = waitpid (source->pid, &source->child_status, WNOHANG);
4848                   if (pid > 0)
4849                     {
4850                       source->child_exited = TRUE;
4851                       wake_source ((GSource *) source);
4852                     }
4853                   else if (pid == -1 && errno == ECHILD)
4854                     {
4855                       g_warning ("GChildWatchSource: Exit status of a child process was requested but ECHILD was received by waitpid(). Most likely the process is ignoring SIGCHLD, or some other thread is invoking waitpid() with a nonpositive first argument; either behavior can break applications that use g_child_watch_add()/g_spawn_sync() either directly or indirectly.");
4856                       source->child_exited = TRUE;
4857                       source->child_status = 0;
4858                       wake_source ((GSource *) source);
4859                     }
4860                 }
4861               while (pid == -1 && errno == EINTR);
4862             }
4863         }
4864     }
4865
4866   /* handle GUnixSignalWatchSource instances */
4867   for (node = unix_signal_watches; node; node = node->next)
4868     {
4869       GUnixSignalWatchSource *source = node->data;
4870
4871       if (!source->pending)
4872         {
4873           if (unix_signal_pending[source->signum])
4874             {
4875               source->pending = TRUE;
4876
4877               wake_source ((GSource *) source);
4878             }
4879         }
4880     }
4881
4882   memset ((void*)unix_signal_pending, 0, sizeof (unix_signal_pending));
4883
4884   G_UNLOCK(unix_signal_lock);
4885 }
4886
4887 static gboolean
4888 g_child_watch_prepare (GSource *source,
4889                        gint    *timeout)
4890 {
4891   GChildWatchSource *child_watch_source;
4892
4893   child_watch_source = (GChildWatchSource *) source;
4894
4895   return child_watch_source->child_exited;
4896 }
4897
4898 static gboolean
4899 g_child_watch_check (GSource *source)
4900 {
4901   GChildWatchSource *child_watch_source;
4902
4903   child_watch_source = (GChildWatchSource *) source;
4904
4905   return child_watch_source->child_exited;
4906 }
4907
4908 static gboolean
4909 g_unix_signal_watch_prepare (GSource *source,
4910                              gint    *timeout)
4911 {
4912   GUnixSignalWatchSource *unix_signal_source;
4913
4914   unix_signal_source = (GUnixSignalWatchSource *) source;
4915
4916   return unix_signal_source->pending;
4917 }
4918
4919 static gboolean
4920 g_unix_signal_watch_check (GSource  *source)
4921 {
4922   GUnixSignalWatchSource *unix_signal_source;
4923
4924   unix_signal_source = (GUnixSignalWatchSource *) source;
4925
4926   return unix_signal_source->pending;
4927 }
4928
4929 static gboolean
4930 g_unix_signal_watch_dispatch (GSource    *source, 
4931                               GSourceFunc callback,
4932                               gpointer    user_data)
4933 {
4934   GUnixSignalWatchSource *unix_signal_source;
4935   gboolean again;
4936
4937   unix_signal_source = (GUnixSignalWatchSource *) source;
4938
4939   if (!callback)
4940     {
4941       g_warning ("Unix signal source dispatched without callback\n"
4942                  "You must call g_source_set_callback().");
4943       return FALSE;
4944     }
4945
4946   again = (callback) (user_data);
4947
4948   unix_signal_source->pending = FALSE;
4949
4950   return again;
4951 }
4952
4953 static void
4954 ref_unix_signal_handler_unlocked (int signum)
4955 {
4956   /* Ensure we have the worker context */
4957   g_get_worker_context ();
4958   unix_signal_refcount[signum]++;
4959   if (unix_signal_refcount[signum] == 1)
4960     {
4961       struct sigaction action;
4962       action.sa_handler = g_unix_signal_handler;
4963       sigemptyset (&action.sa_mask);
4964 #ifdef SA_RESTART
4965       action.sa_flags = SA_RESTART | SA_NOCLDSTOP;
4966 #else
4967       action.sa_flags = SA_NOCLDSTOP;
4968 #endif
4969       sigaction (signum, &action, NULL);
4970     }
4971 }
4972
4973 static void
4974 unref_unix_signal_handler_unlocked (int signum)
4975 {
4976   unix_signal_refcount[signum]--;
4977   if (unix_signal_refcount[signum] == 0)
4978     {
4979       struct sigaction action;
4980       action.sa_handler = SIG_DFL;
4981       sigemptyset (&action.sa_mask);
4982       sigaction (signum, &action, NULL);
4983     }
4984 }
4985
4986 GSource *
4987 _g_main_create_unix_signal_watch (int signum)
4988 {
4989   GSource *source;
4990   GUnixSignalWatchSource *unix_signal_source;
4991
4992   source = g_source_new (&g_unix_signal_funcs, sizeof (GUnixSignalWatchSource));
4993   unix_signal_source = (GUnixSignalWatchSource *) source;
4994
4995   unix_signal_source->signum = signum;
4996   unix_signal_source->pending = FALSE;
4997
4998   G_LOCK (unix_signal_lock);
4999   ref_unix_signal_handler_unlocked (signum);
5000   unix_signal_watches = g_slist_prepend (unix_signal_watches, unix_signal_source);
5001   if (unix_signal_pending[signum])
5002     unix_signal_source->pending = TRUE;
5003   G_UNLOCK (unix_signal_lock);
5004
5005   return source;
5006 }
5007
5008 static void
5009 g_unix_signal_watch_finalize (GSource    *source)
5010 {
5011   GUnixSignalWatchSource *unix_signal_source;
5012
5013   unix_signal_source = (GUnixSignalWatchSource *) source;
5014
5015   G_LOCK (unix_signal_lock);
5016   unref_unix_signal_handler_unlocked (unix_signal_source->signum);
5017   unix_signal_watches = g_slist_remove (unix_signal_watches, source);
5018   G_UNLOCK (unix_signal_lock);
5019 }
5020
5021 static void
5022 g_child_watch_finalize (GSource *source)
5023 {
5024   G_LOCK (unix_signal_lock);
5025   unix_child_watches = g_slist_remove (unix_child_watches, source);
5026   unref_unix_signal_handler_unlocked (SIGCHLD);
5027   G_UNLOCK (unix_signal_lock);
5028 }
5029
5030 #endif /* G_OS_WIN32 */
5031
5032 static gboolean
5033 g_child_watch_dispatch (GSource    *source, 
5034                         GSourceFunc callback,
5035                         gpointer    user_data)
5036 {
5037   GChildWatchSource *child_watch_source;
5038   GChildWatchFunc child_watch_callback = (GChildWatchFunc) callback;
5039
5040   child_watch_source = (GChildWatchSource *) source;
5041
5042   if (!callback)
5043     {
5044       g_warning ("Child watch source dispatched without callback\n"
5045                  "You must call g_source_set_callback().");
5046       return FALSE;
5047     }
5048
5049   (child_watch_callback) (child_watch_source->pid, child_watch_source->child_status, user_data);
5050
5051   /* We never keep a child watch source around as the child is gone */
5052   return FALSE;
5053 }
5054
5055 #ifndef G_OS_WIN32
5056
5057 static void
5058 g_unix_signal_handler (int signum)
5059 {
5060   unix_signal_pending[signum] = TRUE;
5061   any_unix_signal_pending = TRUE;
5062
5063   g_wakeup_signal (glib_worker_context->wakeup);
5064 }
5065
5066 #endif /* !G_OS_WIN32 */
5067
5068 /**
5069  * g_child_watch_source_new:
5070  * @pid: process to watch. On POSIX the pid of a child process. On
5071  * Windows a handle for a process (which doesn't have to be a child).
5072  * 
5073  * Creates a new child_watch source.
5074  *
5075  * The source will not initially be associated with any #GMainContext
5076  * and must be added to one with g_source_attach() before it will be
5077  * executed.
5078  * 
5079  * Note that child watch sources can only be used in conjunction with
5080  * <literal>g_spawn...</literal> when the %G_SPAWN_DO_NOT_REAP_CHILD
5081  * flag is used.
5082  *
5083  * Note that on platforms where #GPid must be explicitly closed
5084  * (see g_spawn_close_pid()) @pid must not be closed while the
5085  * source is still active. Typically, you will want to call
5086  * g_spawn_close_pid() in the callback function for the source.
5087  *
5088  * Note further that using g_child_watch_source_new() is not
5089  * compatible with calling <literal>waitpid</literal> with a
5090  * nonpositive first argument in the application. Calling waitpid()
5091  * for individual pids will still work fine.
5092  * 
5093  * Return value: the newly-created child watch source
5094  *
5095  * Since: 2.4
5096  **/
5097 GSource *
5098 g_child_watch_source_new (GPid pid)
5099 {
5100   GSource *source = g_source_new (&g_child_watch_funcs, sizeof (GChildWatchSource));
5101   GChildWatchSource *child_watch_source = (GChildWatchSource *)source;
5102
5103   child_watch_source->pid = pid;
5104
5105 #ifdef G_OS_WIN32
5106   child_watch_source->poll.fd = (gintptr) pid;
5107   child_watch_source->poll.events = G_IO_IN;
5108
5109   g_source_add_poll (source, &child_watch_source->poll);
5110 #else /* G_OS_WIN32 */
5111   G_LOCK (unix_signal_lock);
5112   ref_unix_signal_handler_unlocked (SIGCHLD);
5113   unix_child_watches = g_slist_prepend (unix_child_watches, child_watch_source);
5114   if (waitpid (pid, &child_watch_source->child_status, WNOHANG) > 0)
5115     child_watch_source->child_exited = TRUE;
5116   G_UNLOCK (unix_signal_lock);
5117 #endif /* G_OS_WIN32 */
5118
5119   return source;
5120 }
5121
5122 /**
5123  * g_child_watch_add_full:
5124  * @priority: the priority of the idle source. Typically this will be in the
5125  *            range between #G_PRIORITY_DEFAULT_IDLE and #G_PRIORITY_HIGH_IDLE.
5126  * @pid:      process to watch. On POSIX the pid of a child process. On
5127  * Windows a handle for a process (which doesn't have to be a child).
5128  * @function: function to call
5129  * @data:     data to pass to @function
5130  * @notify: (allow-none): function to call when the idle is removed, or %NULL
5131  * 
5132  * Sets a function to be called when the child indicated by @pid 
5133  * exits, at the priority @priority.
5134  *
5135  * If you obtain @pid from g_spawn_async() or g_spawn_async_with_pipes() 
5136  * you will need to pass #G_SPAWN_DO_NOT_REAP_CHILD as flag to 
5137  * the spawn function for the child watching to work.
5138  *
5139  * In many programs, you will want to call g_spawn_check_exit_status()
5140  * in the callback to determine whether or not the child exited
5141  * successfully.
5142  * 
5143  * Also, note that on platforms where #GPid must be explicitly closed
5144  * (see g_spawn_close_pid()) @pid must not be closed while the source
5145  * is still active.  Typically, you should invoke g_spawn_close_pid()
5146  * in the callback function for the source.
5147  * 
5148  * GLib supports only a single callback per process id.
5149  *
5150  * This internally creates a main loop source using 
5151  * g_child_watch_source_new() and attaches it to the main loop context 
5152  * using g_source_attach(). You can do these steps manually if you 
5153  * need greater control.
5154  *
5155  * Return value: the ID (greater than 0) of the event source.
5156  *
5157  * Rename to: g_child_watch_add
5158  * Since: 2.4
5159  **/
5160 guint
5161 g_child_watch_add_full (gint            priority,
5162                         GPid            pid,
5163                         GChildWatchFunc function,
5164                         gpointer        data,
5165                         GDestroyNotify  notify)
5166 {
5167   GSource *source;
5168   guint id;
5169   
5170   g_return_val_if_fail (function != NULL, 0);
5171
5172   source = g_child_watch_source_new (pid);
5173
5174   if (priority != G_PRIORITY_DEFAULT)
5175     g_source_set_priority (source, priority);
5176
5177   g_source_set_callback (source, (GSourceFunc) function, data, notify);
5178   id = g_source_attach (source, NULL);
5179   g_source_unref (source);
5180
5181   return id;
5182 }
5183
5184 /**
5185  * g_child_watch_add:
5186  * @pid:      process id to watch. On POSIX the pid of a child process. On
5187  * Windows a handle for a process (which doesn't have to be a child).
5188  * @function: function to call
5189  * @data:     data to pass to @function
5190  * 
5191  * Sets a function to be called when the child indicated by @pid 
5192  * exits, at a default priority, #G_PRIORITY_DEFAULT.
5193  * 
5194  * If you obtain @pid from g_spawn_async() or g_spawn_async_with_pipes() 
5195  * you will need to pass #G_SPAWN_DO_NOT_REAP_CHILD as flag to 
5196  * the spawn function for the child watching to work.
5197  * 
5198  * Note that on platforms where #GPid must be explicitly closed
5199  * (see g_spawn_close_pid()) @pid must not be closed while the
5200  * source is still active. Typically, you will want to call
5201  * g_spawn_close_pid() in the callback function for the source.
5202  *
5203  * GLib supports only a single callback per process id.
5204  *
5205  * This internally creates a main loop source using 
5206  * g_child_watch_source_new() and attaches it to the main loop context 
5207  * using g_source_attach(). You can do these steps manually if you 
5208  * need greater control.
5209  *
5210  * Return value: the ID (greater than 0) of the event source.
5211  *
5212  * Since: 2.4
5213  **/
5214 guint 
5215 g_child_watch_add (GPid            pid,
5216                    GChildWatchFunc function,
5217                    gpointer        data)
5218 {
5219   return g_child_watch_add_full (G_PRIORITY_DEFAULT, pid, function, data, NULL);
5220 }
5221
5222
5223 /* Idle functions */
5224
5225 static gboolean 
5226 g_idle_prepare  (GSource  *source,
5227                  gint     *timeout)
5228 {
5229   *timeout = 0;
5230
5231   return TRUE;
5232 }
5233
5234 static gboolean 
5235 g_idle_check    (GSource  *source)
5236 {
5237   return TRUE;
5238 }
5239
5240 static gboolean
5241 g_idle_dispatch (GSource    *source, 
5242                  GSourceFunc callback,
5243                  gpointer    user_data)
5244 {
5245   if (!callback)
5246     {
5247       g_warning ("Idle source dispatched without callback\n"
5248                  "You must call g_source_set_callback().");
5249       return FALSE;
5250     }
5251   
5252   return callback (user_data);
5253 }
5254
5255 /**
5256  * g_idle_source_new:
5257  * 
5258  * Creates a new idle source.
5259  *
5260  * The source will not initially be associated with any #GMainContext
5261  * and must be added to one with g_source_attach() before it will be
5262  * executed. Note that the default priority for idle sources is
5263  * %G_PRIORITY_DEFAULT_IDLE, as compared to other sources which
5264  * have a default priority of %G_PRIORITY_DEFAULT.
5265  * 
5266  * Return value: the newly-created idle source
5267  **/
5268 GSource *
5269 g_idle_source_new (void)
5270 {
5271   GSource *source;
5272
5273   source = g_source_new (&g_idle_funcs, sizeof (GSource));
5274   g_source_set_priority (source, G_PRIORITY_DEFAULT_IDLE);
5275
5276   return source;
5277 }
5278
5279 /**
5280  * g_idle_add_full:
5281  * @priority: the priority of the idle source. Typically this will be in the
5282  *            range between #G_PRIORITY_DEFAULT_IDLE and #G_PRIORITY_HIGH_IDLE.
5283  * @function: function to call
5284  * @data:     data to pass to @function
5285  * @notify: (allow-none): function to call when the idle is removed, or %NULL
5286  * 
5287  * Adds a function to be called whenever there are no higher priority
5288  * events pending.  If the function returns %FALSE it is automatically
5289  * removed from the list of event sources and will not be called again.
5290  * 
5291  * This internally creates a main loop source using g_idle_source_new()
5292  * and attaches it to the main loop context using g_source_attach(). 
5293  * You can do these steps manually if you need greater control.
5294  * 
5295  * Return value: the ID (greater than 0) of the event source.
5296  * Rename to: g_idle_add
5297  **/
5298 guint 
5299 g_idle_add_full (gint           priority,
5300                  GSourceFunc    function,
5301                  gpointer       data,
5302                  GDestroyNotify notify)
5303 {
5304   GSource *source;
5305   guint id;
5306   
5307   g_return_val_if_fail (function != NULL, 0);
5308
5309   source = g_idle_source_new ();
5310
5311   if (priority != G_PRIORITY_DEFAULT_IDLE)
5312     g_source_set_priority (source, priority);
5313
5314   g_source_set_callback (source, function, data, notify);
5315   id = g_source_attach (source, NULL);
5316   g_source_unref (source);
5317
5318   return id;
5319 }
5320
5321 /**
5322  * g_idle_add:
5323  * @function: function to call 
5324  * @data: data to pass to @function.
5325  * 
5326  * Adds a function to be called whenever there are no higher priority
5327  * events pending to the default main loop. The function is given the
5328  * default idle priority, #G_PRIORITY_DEFAULT_IDLE.  If the function
5329  * returns %FALSE it is automatically removed from the list of event
5330  * sources and will not be called again.
5331  * 
5332  * This internally creates a main loop source using g_idle_source_new()
5333  * and attaches it to the main loop context using g_source_attach(). 
5334  * You can do these steps manually if you need greater control.
5335  * 
5336  * Return value: the ID (greater than 0) of the event source.
5337  **/
5338 guint 
5339 g_idle_add (GSourceFunc    function,
5340             gpointer       data)
5341 {
5342   return g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, function, data, NULL);
5343 }
5344
5345 /**
5346  * g_idle_remove_by_data:
5347  * @data: the data for the idle source's callback.
5348  * 
5349  * Removes the idle function with the given data.
5350  * 
5351  * Return value: %TRUE if an idle source was found and removed.
5352  **/
5353 gboolean
5354 g_idle_remove_by_data (gpointer data)
5355 {
5356   return g_source_remove_by_funcs_user_data (&g_idle_funcs, data);
5357 }
5358
5359 /**
5360  * g_main_context_invoke:
5361  * @context: (allow-none): a #GMainContext, or %NULL
5362  * @function: function to call
5363  * @data: data to pass to @function
5364  *
5365  * Invokes a function in such a way that @context is owned during the
5366  * invocation of @function.
5367  *
5368  * If @context is %NULL then the global default main context — as
5369  * returned by g_main_context_default() — is used.
5370  *
5371  * If @context is owned by the current thread, @function is called
5372  * directly.  Otherwise, if @context is the thread-default main context
5373  * of the current thread and g_main_context_acquire() succeeds, then
5374  * @function is called and g_main_context_release() is called
5375  * afterwards.
5376  *
5377  * In any other case, an idle source is created to call @function and
5378  * that source is attached to @context (presumably to be run in another
5379  * thread).  The idle source is attached with #G_PRIORITY_DEFAULT
5380  * priority.  If you want a different priority, use
5381  * g_main_context_invoke_full().
5382  *
5383  * Note that, as with normal idle functions, @function should probably
5384  * return %FALSE.  If it returns %TRUE, it will be continuously run in a
5385  * loop (and may prevent this call from returning).
5386  *
5387  * Since: 2.28
5388  **/
5389 void
5390 g_main_context_invoke (GMainContext *context,
5391                        GSourceFunc   function,
5392                        gpointer      data)
5393 {
5394   g_main_context_invoke_full (context,
5395                               G_PRIORITY_DEFAULT,
5396                               function, data, NULL);
5397 }
5398
5399 /**
5400  * g_main_context_invoke_full:
5401  * @context: (allow-none): a #GMainContext, or %NULL
5402  * @priority: the priority at which to run @function
5403  * @function: function to call
5404  * @data: data to pass to @function
5405  * @notify: (allow-none): a function to call when @data is no longer in use, or %NULL.
5406  *
5407  * Invokes a function in such a way that @context is owned during the
5408  * invocation of @function.
5409  *
5410  * This function is the same as g_main_context_invoke() except that it
5411  * lets you specify the priority incase @function ends up being
5412  * scheduled as an idle and also lets you give a #GDestroyNotify for @data.
5413  *
5414  * @notify should not assume that it is called from any particular
5415  * thread or with any particular context acquired.
5416  *
5417  * Since: 2.28
5418  **/
5419 void
5420 g_main_context_invoke_full (GMainContext   *context,
5421                             gint            priority,
5422                             GSourceFunc     function,
5423                             gpointer        data,
5424                             GDestroyNotify  notify)
5425 {
5426   g_return_if_fail (function != NULL);
5427
5428   if (!context)
5429     context = g_main_context_default ();
5430
5431   if (g_main_context_is_owner (context))
5432     {
5433       while (function (data));
5434       if (notify != NULL)
5435         notify (data);
5436     }
5437
5438   else
5439     {
5440       GMainContext *thread_default;
5441
5442       thread_default = g_main_context_get_thread_default ();
5443
5444       if (!thread_default)
5445         thread_default = g_main_context_default ();
5446
5447       if (thread_default == context && g_main_context_acquire (context))
5448         {
5449           while (function (data));
5450
5451           g_main_context_release (context);
5452
5453           if (notify != NULL)
5454             notify (data);
5455         }
5456       else
5457         {
5458           GSource *source;
5459
5460           source = g_idle_source_new ();
5461           g_source_set_priority (source, priority);
5462           g_source_set_callback (source, function, data, notify);
5463           g_source_attach (source, context);
5464           g_source_unref (source);
5465         }
5466     }
5467 }
5468
5469 static gpointer
5470 glib_worker_main (gpointer data)
5471 {
5472   while (TRUE)
5473     {
5474       g_main_context_iteration (glib_worker_context, TRUE);
5475
5476 #ifdef G_OS_UNIX
5477       if (any_unix_signal_pending)
5478         dispatch_unix_signals ();
5479 #endif
5480     }
5481
5482   return NULL; /* worst GCC warning message ever... */
5483 }
5484
5485 GMainContext *
5486 g_get_worker_context (void)
5487 {
5488   static gsize initialised;
5489
5490   if (g_once_init_enter (&initialised))
5491     {
5492       /* mask all signals in the worker thread */
5493 #ifdef G_OS_UNIX
5494       sigset_t prev_mask;
5495       sigset_t all;
5496
5497       sigfillset (&all);
5498       pthread_sigmask (SIG_SETMASK, &all, &prev_mask);
5499 #endif
5500       glib_worker_context = g_main_context_new ();
5501       g_thread_new ("gmain", glib_worker_main, NULL);
5502 #ifdef G_OS_UNIX
5503       pthread_sigmask (SIG_SETMASK, &prev_mask, NULL);
5504 #endif
5505       g_once_init_leave (&initialised, TRUE);
5506     }
5507
5508   return glib_worker_context;
5509 }