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