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