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