Free the callback (g_source_set_callback): Initialize the callback
[platform/upstream/glib.git] / 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
36 /* uncomment the next line to get poll() debugging info */
37 /* #define G_MAIN_POLL_DEBUG */
38
39 #include "glib.h"
40 #include <sys/types.h>
41 #include <time.h>
42 #ifdef HAVE_SYS_TIME_H
43 #include <sys/time.h>
44 #endif /* HAVE_SYS_TIME_H */
45 #ifdef GLIB_HAVE_SYS_POLL_H
46 #  include <sys/poll.h>
47 #  undef events  /* AIX 4.1.5 & 4.3.2 define this for SVR3,4 compatibility */
48 #  undef revents /* AIX 4.1.5 & 4.3.2 define this for SVR3,4 compatibility */
49 #endif /* GLIB_HAVE_SYS_POLL_H */
50 #ifdef HAVE_UNISTD_H
51 #include <unistd.h>
52 #endif /* HAVE_UNISTD_H */
53 #include <errno.h>
54
55 #ifdef G_OS_WIN32
56 #define STRICT
57 #include <windows.h>
58 #endif /* G_OS_WIN32 */
59
60 #ifdef G_OS_BEOS
61 #include <net/socket.h>
62 #endif /* G_OS_BEOS */
63
64 /* Types */
65
66 typedef struct _GTimeoutSource GTimeoutSource;
67 typedef struct _GPollRec GPollRec;
68 typedef struct _GSourceCallback GSourceCallback;
69
70 typedef enum
71 {
72   G_SOURCE_READY = 1 << G_HOOK_FLAG_USER_SHIFT,
73   G_SOURCE_CAN_RECURSE = 1 << (G_HOOK_FLAG_USER_SHIFT + 1)
74 } GSourceFlags;
75
76 struct _GMainContext
77 {
78 #ifdef G_THREADS_ENABLED
79   /* The following lock is used for both the list of sources
80    * and the list of poll records
81    */
82   GMutex *mutex;
83   GThread *thread;
84 #endif  
85
86   GPtrArray *pending_dispatches;
87   gint timeout;                 /* Timeout for current iteration */
88
89   guint next_id;
90   GSource *source_list;
91   gint in_check_or_prepare;
92
93   GPollRec *poll_records;
94   GPollRec *poll_free_list;
95   GMemChunk *poll_chunk;
96   guint n_poll_records;
97   GPollFD *cached_poll_array;
98   gint cached_poll_array_size;
99
100 #ifdef G_THREADS_ENABLED  
101 #ifndef G_OS_WIN32
102 /* this pipe is used to wake up the main loop when a source is added.
103  */
104   gint wake_up_pipe[2];
105 #else /* G_OS_WIN32 */
106   HANDLE wake_up_semaphore;
107 #endif /* G_OS_WIN32 */
108
109   GPollFD wake_up_rec;
110   gboolean poll_waiting;
111
112 /* Flag indicating whether the set of fd's changed during a poll */
113   gboolean poll_changed;
114 #endif /* G_THREADS_ENABLED */
115
116   GPollFunc poll_func;
117
118   GTimeVal current_time;
119   gboolean time_is_current;
120 };
121
122 struct _GSourceCallback
123 {
124   guint ref_count;
125   GSourceFunc func;
126   gpointer    data;
127   GDestroyNotify notify;
128 };
129
130 struct _GMainLoop
131 {
132   GMainContext *context;
133   gboolean is_running;
134   guint ref_count;
135
136 #ifdef G_THREADS_ENABLED
137   GMutex *mutex;
138   GCond *sem_cond;
139 #endif /* G_THREADS_ENABLED */
140 };
141
142 struct _GTimeoutSource
143 {
144   GSource     source;
145   GTimeVal    expiration;
146   gint        interval;
147 };
148
149 struct _GPollRec
150 {
151   gint priority;
152   GPollFD *fd;
153   GPollRec *next;
154 };
155
156 #ifdef G_THREADS_ENABLED
157 #define LOCK_CONTEXT(context) g_mutex_lock(context->mutex)
158 #define UNLOCK_CONTEXT(context) g_mutex_unlock(context->mutex)
159 #define LOCK_LOOP(loop) g_mutex_lock(loop->mutex)
160 #define UNLOCK_LOOP(loop) g_mutex_unlock(loop->mutex)
161 #else
162 #define LOCK_CONTEXT(context) (void)0
163 #define UNLOCK_CONTEXT(context) (void)0
164 #define LOCK_LOOP(context) (void)0
165 #define UNLOCK_LOOP(context) (void)0
166 #endif
167
168 #define SOURCE_DESTROYED(source) (((source)->flags & G_HOOK_FLAG_ACTIVE) == 0)
169
170 #define SOURCE_UNREF(source, context)                       \
171    G_STMT_START {                                           \
172     if ((source)->ref_count > 1)                            \
173       (source)->ref_count--;                                \
174     else                                                    \
175       g_source_unref_internal ((source), (context), TRUE);  \
176    } G_STMT_END
177
178
179 /* Forward declarations */
180
181 static void g_source_unref_internal             (GSource      *source,
182                                                  GMainContext *context,
183                                                  gboolean      have_lock);
184 static void g_source_destroy_internal           (GSource      *source,
185                                                  GMainContext *context,
186                                                  gboolean      have_lock);
187 static void g_main_context_poll                 (GMainContext *context,
188                                                  gint          timeout,
189                                                  gint          priority,
190                                                  GPollFD      *fds,
191                                                  gint          n_fds);
192 static void g_main_context_add_poll_unlocked    (GMainContext *context,
193                                                  gint          priority,
194                                                  GPollFD      *fd);
195 static void g_main_context_remove_poll_unlocked (GMainContext *context,
196                                                  GPollFD      *fd);
197 static void g_main_context_wakeup               (GMainContext *context);
198
199 static gboolean g_timeout_prepare  (GSource     *source,
200                                     gint        *timeout);
201 static gboolean g_timeout_check    (GSource     *source);
202 static gboolean g_timeout_dispatch (GSource     *source,
203                                     GSourceFunc  callback,
204                                     gpointer     user_data);
205 static gboolean g_idle_prepare     (GSource     *source,
206                                     gint        *timeout);
207 static gboolean g_idle_check       (GSource     *source);
208 static gboolean g_idle_dispatch    (GSource     *source,
209                                     GSourceFunc  callback,
210                                     gpointer     user_data);
211
212 G_LOCK_DEFINE_STATIC (main_loop);
213 static GMainContext *default_main_context;
214
215 static GSourceFuncs timeout_funcs =
216 {
217   g_timeout_prepare,
218   g_timeout_check,
219   g_timeout_dispatch,
220   NULL
221 };
222
223 static GSourceFuncs idle_funcs =
224 {
225   g_idle_prepare,
226   g_idle_check,
227   g_idle_dispatch,
228   NULL
229 };
230
231 #ifdef HAVE_POLL
232 /* SunOS has poll, but doesn't provide a prototype. */
233 #  if defined (sun) && !defined (__SVR4)
234 extern gint poll (GPollFD *ufds, guint nfsd, gint timeout);
235 #  endif  /* !sun */
236 #else   /* !HAVE_POLL */
237
238 #ifdef G_OS_WIN32
239
240 static gint
241 g_poll (GPollFD *fds,
242         guint    nfds,
243         gint     timeout)
244 {
245   HANDLE handles[MAXIMUM_WAIT_OBJECTS];
246   gboolean poll_msgs = FALSE;
247   GPollFD *f;
248   DWORD ready;
249   MSG msg;
250   UINT timer;
251   gint nhandles = 0;
252
253   for (f = fds; f < &fds[nfds]; ++f)
254     if (f->fd >= 0)
255       {
256         if (f->events & G_IO_IN)
257           {
258             if (f->fd == G_WIN32_MSG_HANDLE)
259               poll_msgs = TRUE;
260             else
261               {
262 #ifdef G_MAIN_POLL_DEBUG
263                 g_print ("g_poll: waiting for %#x\n", f->fd);
264 #endif
265                 handles[nhandles++] = (HANDLE) f->fd;
266               }
267           }
268       }
269
270   if (timeout == -1)
271     timeout = INFINITE;
272
273   if (poll_msgs)
274     {
275       /* Waiting for messages, and maybe events */
276       if (nhandles == 0)
277         {
278           if (timeout == INFINITE)
279             {
280               /* Waiting just for messages, infinite timeout
281                * -> Use PeekMessage, then WaitMessage
282                */
283 #ifdef G_MAIN_POLL_DEBUG
284               g_print ("PeekMessage, then WaitMessage\n");
285 #endif
286               if (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
287                 ready = WAIT_OBJECT_0;
288               else if (!WaitMessage ())
289                 g_warning ("g_poll: WaitMessage failed");
290               ready = WAIT_OBJECT_0;
291             }
292           else if (timeout == 0)
293             {
294               /* Waiting just for messages, zero timeout
295                * -> Use PeekMessage
296                */
297 #ifdef G_MAIN_POLL_DEBUG
298               g_print ("PeekMessage\n");
299 #endif
300               if (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
301                 ready = WAIT_OBJECT_0;
302               else
303                 ready = WAIT_TIMEOUT;
304             }
305           else
306             {
307               /* Waiting just for messages, some timeout
308                * -> First try PeekMessage, then set a timer, wait for message,
309                * kill timer, use PeekMessage
310                */
311 #ifdef G_MAIN_POLL_DEBUG
312               g_print ("PeekMessage\n");
313 #endif
314               if (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
315                 ready = WAIT_OBJECT_0;
316               else if ((timer = SetTimer (NULL, 0, timeout, NULL)) == 0)
317                 g_warning ("g_poll: SetTimer failed");
318               else
319                 {
320 #ifdef G_MAIN_POLL_DEBUG
321                   g_print ("WaitMessage\n");
322 #endif
323                   WaitMessage ();
324                   KillTimer (NULL, timer);
325                   if (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)
326                       && msg.message != WM_TIMER)
327                     ready = WAIT_OBJECT_0;
328                   else
329                     ready = WAIT_TIMEOUT;
330                 }
331             }
332         }
333       else
334         {
335           /* Wait for either message or event
336            * -> Use MsgWaitForMultipleObjects
337            */
338 #ifdef G_MAIN_POLL_DEBUG
339           g_print ("MsgWaitForMultipleObjects(%d, %d)\n", nhandles, timeout);
340 #endif
341           ready = MsgWaitForMultipleObjects (nhandles, handles, FALSE,
342                                              timeout, QS_ALLINPUT);
343
344           if (ready == WAIT_FAILED)
345             g_warning ("g_poll: MsgWaitForMultipleObjects failed");
346         }
347     }
348   else if (nhandles == 0)
349     {
350       /* Wait for nothing (huh?) */
351       return 0;
352     }
353   else
354     {
355       /* Wait for just events
356        * -> Use WaitForMultipleObjects
357        */
358 #ifdef G_MAIN_POLL_DEBUG
359       g_print ("WaitForMultipleObjects(%d, %d)\n", nhandles, timeout);
360 #endif
361       ready = WaitForMultipleObjects (nhandles, handles, FALSE, timeout);
362       if (ready == WAIT_FAILED)
363         g_warning ("g_poll: WaitForMultipleObjects failed");
364     }
365
366   for (f = fds; f < &fds[nfds]; ++f)
367     f->revents = 0;
368
369   if (ready == WAIT_FAILED)
370     return -1;
371   else if (ready == WAIT_TIMEOUT)
372     return 0;
373   else if (poll_msgs && ready == WAIT_OBJECT_0 + nhandles)
374     {
375       for (f = fds; f < &fds[nfds]; ++f)
376         if (f->fd >= 0)
377           {
378             if (f->events & G_IO_IN)
379               if (f->fd == G_WIN32_MSG_HANDLE)
380                 f->revents |= G_IO_IN;
381           }
382     }
383   else if (ready >= WAIT_OBJECT_0 && ready < WAIT_OBJECT_0 + nhandles)
384     for (f = fds; f < &fds[nfds]; ++f)
385       {
386         if ((f->events & G_IO_IN)
387             && f->fd == (gint) handles[ready - WAIT_OBJECT_0])
388           {
389             f->revents |= G_IO_IN;
390 #ifdef G_MAIN_POLL_DEBUG
391             g_print ("g_poll: got event %#x\n", f->fd);
392 #endif
393 #if 0
394             ResetEvent ((HANDLE) f->fd);
395 #endif
396           }
397       }
398     
399   if (ready >= WAIT_OBJECT_0 && ready < WAIT_OBJECT_0 + nhandles)
400     return ready - WAIT_OBJECT_0 + 1;
401   else
402     return 0;
403 }
404
405 #else  /* !G_OS_WIN32 */
406
407 /* The following implementation of poll() comes from the GNU C Library.
408  * Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc.
409  */
410
411 #include <string.h> /* for bzero on BSD systems */
412
413 #ifdef HAVE_SYS_SELECT_H
414 #include <sys/select.h>
415 #endif /* HAVE_SYS_SELECT_H */
416
417 #ifdef G_OS_BEOS
418 #undef NO_FD_SET
419 #endif /* G_OS_BEOS */
420
421 #ifndef NO_FD_SET
422 #  define SELECT_MASK fd_set
423 #else /* !NO_FD_SET */
424 #  ifndef _AIX
425 typedef long fd_mask;
426 #  endif /* _AIX */
427 #  ifdef _IBMR2
428 #    define SELECT_MASK void
429 #  else /* !_IBMR2 */
430 #    define SELECT_MASK int
431 #  endif /* !_IBMR2 */
432 #endif /* !NO_FD_SET */
433
434 static gint 
435 g_poll (GPollFD *fds,
436         guint    nfds,
437         gint     timeout)
438 {
439   struct timeval tv;
440   SELECT_MASK rset, wset, xset;
441   GPollFD *f;
442   int ready;
443   int maxfd = 0;
444
445   FD_ZERO (&rset);
446   FD_ZERO (&wset);
447   FD_ZERO (&xset);
448
449   for (f = fds; f < &fds[nfds]; ++f)
450     if (f->fd >= 0)
451       {
452         if (f->events & G_IO_IN)
453           FD_SET (f->fd, &rset);
454         if (f->events & G_IO_OUT)
455           FD_SET (f->fd, &wset);
456         if (f->events & G_IO_PRI)
457           FD_SET (f->fd, &xset);
458         if (f->fd > maxfd && (f->events & (G_IO_IN|G_IO_OUT|G_IO_PRI)))
459           maxfd = f->fd;
460       }
461
462   tv.tv_sec = timeout / 1000;
463   tv.tv_usec = (timeout % 1000) * 1000;
464
465   ready = select (maxfd + 1, &rset, &wset, &xset,
466                   timeout == -1 ? NULL : &tv);
467   if (ready > 0)
468     for (f = fds; f < &fds[nfds]; ++f)
469       {
470         f->revents = 0;
471         if (f->fd >= 0)
472           {
473             if (FD_ISSET (f->fd, &rset))
474               f->revents |= G_IO_IN;
475             if (FD_ISSET (f->fd, &wset))
476               f->revents |= G_IO_OUT;
477             if (FD_ISSET (f->fd, &xset))
478               f->revents |= G_IO_PRI;
479           }
480       }
481
482   return ready;
483 }
484
485 #endif /* !G_OS_WIN32 */
486
487 #endif  /* !HAVE_POLL */
488
489 /* Called to clean up when a thread terminates
490  */
491 static void
492 g_main_context_destroy (GMainContext *context)
493 {
494   GSource *source;
495
496   /* We need the lock here only because g_source_destroy expects
497    * to be able to unlock when destroying the source's data
498    */
499   LOCK_CONTEXT (context);
500   source = context->source_list;
501   while (source)
502     {
503       GSource *next = source->next;
504       g_source_destroy_internal (source, context, TRUE);
505       source = next;
506     }
507   UNLOCK_CONTEXT (context);
508
509 #ifdef G_THREADS_ENABLED  
510   g_mutex_free (context->mutex);
511 #endif
512
513   g_ptr_array_free (context->pending_dispatches, TRUE);
514   g_free (context->cached_poll_array);
515   
516   g_mem_chunk_destroy (context->poll_chunk);
517
518 #ifdef G_THREADS_ENABLED
519   if (g_thread_supported())
520     {
521 #ifndef G_OS_WIN32
522       close (context->wake_up_pipe[0]);
523       close (context->wake_up_pipe[1]);
524 #else
525       CloseHandle (context->wake_up_semaphore);
526 #endif
527     }
528 #endif
529   
530   g_free (context);
531 }
532
533 /**
534  * g_main_context_get:
535  * @thread: a #GThread
536  * 
537  * Retrieves the main loop context for a particular thread. This
538  * will create the main context for the thread if none previously
539  * existed. The context will exist until the thread terminates.
540  * 
541  * Return value: the main loop context for @thread.
542  **/
543 GMainContext *
544 g_main_context_get (GThread *thread)
545 {
546   static GStaticPrivate private_key = G_STATIC_PRIVATE_INIT;
547   GMainContext *context;
548
549   g_return_val_if_fail (thread != NULL, NULL);
550
551   if (g_thread_supported ())
552     context = g_static_private_get_for_thread (&private_key, thread);
553   else
554     context = default_main_context;
555
556   if (!context)
557     {
558       context = g_new0 (GMainContext, 1);
559
560 #ifdef G_THREADS_ENABLED
561       if (g_thread_supported ())
562         context->mutex = g_mutex_new();
563
564       context->thread = thread;
565 #endif
566       
567       context->next_id = 1;
568       
569       context->source_list = NULL;
570
571 #if HAVE_POLL
572       context->poll_func = (GPollFunc)poll;
573 #else
574       context->poll_func = g_poll;
575 #endif
576
577       context->cached_poll_array = NULL;
578       context->cached_poll_array_size = 0;
579       
580       context->pending_dispatches = g_ptr_array_new ();
581       
582       context->time_is_current = FALSE;
583
584 #ifdef G_THREADS_ENABLED
585       if (g_thread_supported ())
586         {
587 #ifndef G_OS_WIN32
588           if (pipe (context->wake_up_pipe) < 0)
589             g_error ("Cannot create pipe main loop wake-up: %s\n",
590                      g_strerror (errno));
591           
592           context->wake_up_rec.fd = context->wake_up_pipe[0];
593           context->wake_up_rec.events = G_IO_IN;
594           g_main_context_add_poll_unlocked (context, 0, &context->wake_up_rec);
595 #else
596           if ((context->wake_up_semaphore = CreateSemaphore (NULL, 0, 100, NULL)) == NULL)
597             g_error ("Cannot create wake-up semaphore: %s", g_win32_error_message (GetLastError ()));
598           context->wake_up_rec.fd = (gint) context->wake_up_semaphore;
599           context->wake_up_rec.events = G_IO_IN;
600 #ifdef G_MAIN_POLL_DEBUG
601           g_print ("wake-up semaphore: %#x\n", (guint) context->wake_up_semaphore);
602 #endif
603           g_main_context_add_poll_unlocked (context, 0, &context->wake_up_rec);
604 #endif
605         }
606 #endif
607
608       if (g_thread_supported ())
609         g_static_private_set_for_thread (&private_key, thread,
610                                          context,
611                                          (GDestroyNotify)g_main_context_destroy);
612       else
613         default_main_context = context;
614     }
615
616   return context;
617 }
618
619 /**
620  * g_main_context_default:
621  * 
622  * Return the default main context. This is the main context used
623  * for main loop functions when a main loop is not explicitly
624  * specified.
625  * 
626  * Return value: the default main context.
627  **/
628 GMainContext *
629 g_main_context_default (void)
630 {
631   /* Slow, but safe */
632   
633   G_LOCK (main_loop);
634
635   if (!default_main_context)
636     default_main_context = g_main_context_get (g_thread_self ());
637
638   G_UNLOCK (main_loop);
639
640   return default_main_context;
641 }
642
643 /* Hooks for adding to the main loop */
644
645 /**
646  * g_source_new:
647  * @source_funcs: structure containing functions that implement
648  *                the sources behavior.
649  * @struct_size: size of the #GSource structure to create
650  * 
651  * Create a new GSource structure. The size is specified to
652  * allow creating structures derived from GSource that contain
653  * additional data. The size passed in must be at least
654  * sizeof(GSource).
655  * 
656  * The source will not initially be associated with any #GMainContext
657  * and must be added to one with g_source_add() before it will be
658  * executed.
659  * 
660  * Return value: the newly create #GSource
661  **/
662 GSource *
663 g_source_new (GSourceFuncs *source_funcs,
664               guint         struct_size)
665 {
666   GSource *source;
667
668   g_return_val_if_fail (source_funcs != NULL, NULL);
669   g_return_val_if_fail (struct_size >= sizeof (GSource), NULL);
670   
671   source = (GSource*) g_malloc0 (struct_size);
672
673   source->source_funcs = source_funcs;
674   source->ref_count = 1;
675   
676   source->priority = G_PRIORITY_DEFAULT;
677
678   source->flags = G_HOOK_FLAG_ACTIVE;
679
680   /* NULL/0 initialization for all other fields */
681   
682   return source;
683 }
684
685 /* Holds context's lock
686  */
687 static void
688 g_source_list_add (GSource      *source,
689                    GMainContext *context)
690 {
691   GSource *tmp_source, *last_source;
692   
693   last_source = NULL;
694   tmp_source = context->source_list;
695   while (tmp_source && tmp_source->priority <= source->priority)
696     {
697       last_source = tmp_source;
698       tmp_source = tmp_source->next;
699     }
700
701   source->next = tmp_source;
702   if (tmp_source)
703     tmp_source->prev = source;
704   
705   source->prev = last_source;
706   if (last_source)
707     last_source->next = source;
708   else
709     context->source_list = source;
710 }
711
712 /* Holds context's lock
713  */
714 static void
715 g_source_list_remove (GSource      *source,
716                       GMainContext *context)
717 {
718   if (source->prev)
719     source->prev->next = source->next;
720   else
721     context->source_list = source->next;
722
723   if (source->next)
724     source->next->prev = source->prev;
725
726   source->prev = NULL;
727   source->next = NULL;
728 }
729
730 /**
731  * g_source_attach:
732  * @source: a #GSource
733  * @context: a #GMainContext (if %NULL, the default context will be used)
734  * 
735  * Adds a #GSource to a @context so that it will be executed within
736  * that context.
737  *
738  * Return value: the ID for the source within the #GMainContext
739  **/
740 guint
741 g_source_attach (GSource      *source,
742                  GMainContext *context)
743 {
744   guint result = 0;
745   GSList *tmp_list;
746
747   g_return_val_if_fail (source->context == NULL, 0);
748   g_return_val_if_fail (!SOURCE_DESTROYED (source), 0);
749   
750   if (!context)
751     context = g_main_context_default ();
752
753   LOCK_CONTEXT (context);
754
755   source->context = context;
756   result = source->id = context->next_id++;
757
758   source->ref_count++;
759   g_source_list_add (source, context);
760
761   tmp_list = source->poll_fds;
762   while (tmp_list)
763     {
764       g_main_context_add_poll_unlocked (context, source->priority, tmp_list->data);
765       tmp_list = tmp_list->next;
766     }
767
768 #ifdef G_THREADS_ENABLED
769   /* Now wake up the main loop if it is waiting in the poll() */
770   g_main_context_wakeup (context);
771 #endif
772
773   UNLOCK_CONTEXT (context);
774
775   return result;
776 }
777
778 static void
779 g_source_destroy_internal (GSource      *source,
780                            GMainContext *context,
781                            gboolean      have_lock)
782 {
783   if (!have_lock)
784     LOCK_CONTEXT (context);
785   
786   if (!SOURCE_DESTROYED (source))
787     {
788       GSList *tmp_list;
789       gpointer old_cb_data;
790       GSourceCallbackFuncs *old_cb_funcs;
791       
792       source->flags &= ~G_HOOK_FLAG_ACTIVE;
793
794       old_cb_data = source->callback_data;
795       old_cb_funcs = source->callback_funcs;
796
797       source->callback_data = NULL;
798       source->callback_funcs = NULL;
799
800       if (old_cb_funcs)
801         {
802           UNLOCK_CONTEXT (context);
803           old_cb_funcs->unref (old_cb_data);
804           LOCK_CONTEXT (context);
805         }
806       
807       tmp_list = source->poll_fds;
808       while (tmp_list)
809         {
810           g_main_context_remove_poll_unlocked (context, tmp_list->data);
811           tmp_list = tmp_list->next;
812         }
813       
814       g_source_unref_internal (source, context, TRUE);
815     }
816
817   if (!have_lock)
818     UNLOCK_CONTEXT (context);
819 }
820
821 /**
822  * g_source_destroy:
823  * @source: a #GSource
824  * 
825  * Remove a source from its #GMainContext, if any, and mark it as
826  * destroyed.  The source cannot be subsequently added to another
827  * context.
828  **/
829 void
830 g_source_destroy (GSource *source)
831 {
832   GMainContext *context;
833   
834   g_return_if_fail (source != NULL);
835   
836   context = source->context;
837   
838   if (context)
839     g_source_destroy_internal (source, context, FALSE);
840   else
841     source->flags &= ~G_HOOK_FLAG_ACTIVE;
842 }
843
844 /**
845  * g_source_get_id:
846  * @source: a #GSource
847  * 
848  * Return the numeric ID for a particular source. The ID of a source
849  * is unique within a particular main loop context. The reverse
850  * mapping from ID to source is done by g_main_context_find_source_by_id().
851  *
852  * Return value: the ID for the source
853  **/
854 guint
855 g_source_get_id (GSource *source)
856 {
857   guint result;
858   
859   g_return_val_if_fail (source != NULL, 0);
860   g_return_val_if_fail (source->context != NULL, 0);
861
862   LOCK_CONTEXT (source->context);
863   result = source->id;
864   UNLOCK_CONTEXT (source->context);
865   
866   return result;
867 }
868
869 /**
870  * g_source_get_context:
871  * @source: a #GSource
872  * 
873  * Get the #GMainContext with which the source is associated.
874  * Calling this function on a destroyed source is an error.
875  * 
876  * Return value: the #GMainContext with which the source is associated,
877  *               or %NULL if the context has not yet been added
878  *               to a source.
879  **/
880 GMainContext *
881 g_source_get_context (GSource *source)
882 {
883   g_return_val_if_fail (!SOURCE_DESTROYED (source), NULL);
884
885   return source->context;
886 }
887
888 /**
889  * g_main_source_add_poll:
890  * @source:a #GSource 
891  * @fd: a #GPollFD structure holding information about a file
892  *      descriptor to watch.
893  * 
894  * Add a file descriptor to the set of file descriptors polled * for
895  * this source. This is usually combined with g_source_new() to add an
896  * event source. The event source's check function will typically test
897  * the revents field in the #GPollFD struct and return %TRUE if events need
898  * to be processed.
899  **/
900 void
901 g_source_add_poll (GSource *source,
902                    GPollFD *fd)
903 {
904   GMainContext *context;
905   
906   g_return_if_fail (source != NULL);
907   g_return_if_fail (fd != NULL);
908   g_return_if_fail (!SOURCE_DESTROYED (source));
909   
910   context = source->context;
911
912   if (context)
913     LOCK_CONTEXT (context);
914   
915   source->poll_fds = g_slist_prepend (source->poll_fds, fd);
916
917   if (context)
918     {
919       g_main_context_add_poll_unlocked (context, source->priority, fd);
920       UNLOCK_CONTEXT (context);
921     }
922 }
923
924 /**
925  * g_source_set_callback_indirect:
926  * @source: the source
927  * @callback_data: pointer to callback data "object"
928  * @callback_funcs: functions for reference counting callback_data
929  *                  and getting the callback and data
930  * 
931  * Set the callback function storing the data as a refcounted callback
932  * "object". This is used to implement g_source_set_callback_closure()
933  * and internally. Note that calling g_source_set_callback_indirect() assumes
934  * an initial reference count on @callback_data, and thus
935  * @callback_funcs->unref will eventually be called once more
936  * than @callback_funcs->ref.
937  **/
938 void
939 g_source_set_callback_indirect (GSource              *source,
940                                 gpointer              callback_data,
941                                 GSourceCallbackFuncs *callback_funcs)
942 {
943   GMainContext *context;
944   gpointer old_cb_data;
945   GSourceCallbackFuncs *old_cb_funcs;
946   
947   g_return_if_fail (source != NULL);
948   g_return_if_fail (callback_funcs != NULL || callback_data == NULL);
949
950   context = source->context;
951
952   if (context)
953     LOCK_CONTEXT (context);
954
955   old_cb_data = source->callback_data;
956   old_cb_funcs = source->callback_funcs;
957
958   source->callback_data = callback_data;
959   source->callback_funcs = callback_funcs;
960   
961   if (context)
962     UNLOCK_CONTEXT (context);
963   
964   if (old_cb_funcs)
965     old_cb_funcs->unref (old_cb_data);
966 }
967
968 static void
969 g_source_callback_ref (gpointer cb_data)
970 {
971   GSourceCallback *callback = cb_data;
972
973   callback->ref_count++;
974 }
975
976
977 static void
978 g_source_callback_unref (gpointer cb_data)
979 {
980   GSourceCallback *callback = cb_data;
981
982   callback->ref_count--;
983   if (callback->ref_count == 0)
984     {
985       if (callback->notify)
986         callback->notify (callback->data);
987       g_free (callback);
988     }
989 }
990
991 static void
992 g_source_callback_get (gpointer     cb_data,
993                        GSourceFunc *func,
994                        gpointer    *data)
995 {
996   GSourceCallback *callback = cb_data;
997
998   *func = callback->func;
999   *data = callback->data;
1000 }
1001
1002 static GSourceCallbackFuncs g_source_callback_funcs = {
1003   g_source_callback_ref,
1004   g_source_callback_unref,
1005   g_source_callback_get,
1006 };
1007
1008 /**
1009  * g_source_set_callback:
1010  * @source: the source
1011  * @func: a callback function
1012  * @data: the data to pass to callback function
1013  * @notify: a function to call when @data is no longer in use, or %NULL.
1014  * 
1015  * Set the callback function for a source.
1016  **/
1017 void
1018 g_source_set_callback (GSource        *source,
1019                        GSourceFunc     func,
1020                        gpointer        data,
1021                        GDestroyNotify  notify)
1022 {
1023   GSourceCallback *new_callback;
1024
1025   g_return_if_fail (source != NULL);
1026
1027   new_callback = g_new (GSourceCallback, 1);
1028
1029   new_callback->ref_count = 1;
1030   new_callback->func = func;
1031   new_callback->data = data;
1032   new_callback->notify = notify;
1033
1034   g_source_set_callback_indirect (source, new_callback, &g_source_callback_funcs);
1035 }
1036
1037 /**
1038  * g_source_set_priority:
1039  * @source: a #GSource
1040  * @priority: the new priority.
1041  * 
1042  * Set the priority of a source. While the main loop is being
1043  * run, a source will 
1044  **/
1045 void
1046 g_source_set_priority (GSource  *source,
1047                        gint      priority)
1048 {
1049   GSList *tmp_list;
1050   GMainContext *context;
1051   
1052   g_return_if_fail (source != NULL);
1053
1054   context = source->context;
1055
1056   if (context)
1057     LOCK_CONTEXT (context);
1058   
1059   source->priority = priority;
1060
1061   if (context)
1062     {
1063       source->next = NULL;
1064       source->prev = NULL;
1065       
1066       tmp_list = source->poll_fds;
1067       while (tmp_list)
1068         {
1069           g_main_context_remove_poll_unlocked (context, tmp_list->data);
1070           g_main_context_add_poll_unlocked (context, priority, tmp_list->data);
1071       
1072           tmp_list = tmp_list->next;
1073         }
1074       
1075       UNLOCK_CONTEXT (source->context);
1076     }
1077 }
1078
1079 /**
1080  * g_source_get_priority:
1081  * @source: a #GSource
1082  * 
1083  * Gets the priority of a surce
1084  * 
1085  * Return value: the priority of the source
1086  **/
1087 gint
1088 g_source_get_priority (GSource *source)
1089 {
1090   g_return_val_if_fail (source != NULL, 0);
1091
1092   return source->priority;
1093 }
1094
1095 /**
1096  * g_source_set_can_recurse:
1097  * @source: a #GSource
1098  * @can_recurse: whether recursion is allowed for this source
1099  * 
1100  * Sets whether a source can be called recursively. If @can_recurse is
1101  * %TRUE, then while the source is being dispatched then this source
1102  * will be processed normally. Otherwise, all processing of this
1103  * source is blocked until the dispatch function returns.
1104  **/
1105 void
1106 g_source_set_can_recurse (GSource  *source,
1107                           gboolean  can_recurse)
1108 {
1109   GMainContext *context;
1110   
1111   g_return_if_fail (source != NULL);
1112
1113   context = source->context;
1114
1115   if (context)
1116     LOCK_CONTEXT (context);
1117   
1118   if (can_recurse)
1119     source->flags |= G_SOURCE_CAN_RECURSE;
1120   else
1121     source->flags &= ~G_SOURCE_CAN_RECURSE;
1122
1123   if (context)
1124     UNLOCK_CONTEXT (context);
1125 }
1126
1127 /**
1128  * g_source_get_can_recurse:
1129  * @source: a #GSource
1130  * 
1131  * Checks whether a source is allowed to be called recursively.
1132  * see g_source_set_can_recurse.
1133  * 
1134  * Return value: whether recursion is allowed.
1135  **/
1136 gboolean
1137 g_source_get_can_recurse (GSource  *source)
1138 {
1139   g_return_val_if_fail (source != NULL, FALSE);
1140   
1141   return (source->flags & G_SOURCE_CAN_RECURSE) != 0;
1142 }
1143
1144 /**
1145  * g_source_ref:
1146  * @source: a #GSource
1147  * 
1148  * Increases the reference count on a source by one.
1149  * 
1150  * Return value: @source
1151  **/
1152 GSource *
1153 g_source_ref (GSource *source)
1154 {
1155   GMainContext *context;
1156   
1157   g_return_val_if_fail (source != NULL, NULL);
1158
1159   context = source->context;
1160
1161   if (context)
1162     LOCK_CONTEXT (context);
1163
1164   source->ref_count++;
1165
1166   if (context)
1167     UNLOCK_CONTEXT (context);
1168
1169   return source;
1170 }
1171
1172 /* g_source_unref() but possible to call within context lock
1173  */
1174 static void
1175 g_source_unref_internal (GSource      *source,
1176                          GMainContext *context,
1177                          gboolean      have_lock)
1178 {
1179   gpointer old_cb_data = NULL;
1180   GSourceCallbackFuncs *old_cb_funcs = NULL;
1181
1182   g_return_if_fail (source != NULL);
1183   
1184   if (!have_lock && context)
1185     LOCK_CONTEXT (context);
1186
1187   source->ref_count--;
1188   if (source->ref_count == 0)
1189     {
1190       old_cb_data = source->callback_data;
1191       old_cb_funcs = source->callback_funcs;
1192
1193       source->callback_data = NULL;
1194       source->callback_funcs = NULL;
1195
1196       if (context && !SOURCE_DESTROYED (source))
1197         {
1198           g_warning (G_STRLOC ": ref_count == 0, but source is still attached to a context!");
1199           source->ref_count++;
1200         }
1201       else if (context)
1202         g_source_list_remove (source, context);
1203
1204       if (source->source_funcs->destroy)
1205         source->source_funcs->destroy (source);
1206       
1207       g_slist_free (source->poll_fds);
1208       source->poll_fds = NULL;
1209       g_free (source);
1210     }
1211   
1212   if (!have_lock && context)
1213     UNLOCK_CONTEXT (context);
1214
1215   if (old_cb_funcs)
1216     {
1217       if (have_lock)
1218         UNLOCK_CONTEXT (context);
1219       
1220       old_cb_funcs->unref (old_cb_data);
1221
1222       if (have_lock)
1223         LOCK_CONTEXT (context);
1224     }
1225 }
1226
1227 /**
1228  * g_source_unref:
1229  * @source: a #GSource
1230  * 
1231  * Decreases the reference count of a source by one. If the
1232  * resulting reference count is zero the source and associated
1233  * memory will be destroyed. 
1234  **/
1235 void
1236 g_source_unref (GSource *source)
1237 {
1238   g_return_if_fail (source != NULL);
1239
1240   g_source_unref_internal (source, source->context, FALSE);
1241 }
1242
1243 /**
1244  * g_main_context_find_source_by_id:
1245  * @context: a #GMainContext (if %NULL, the default context will be used)
1246  * @id: the source ID, as returned by g_source_get_id()
1247  * 
1248  * Finds a #GSource given a pair of context and ID
1249  * 
1250  * Return value: the #GSource if found, otherwise, %NULL
1251  **/
1252 GSource *
1253 g_main_context_find_source_by_id (GMainContext *context,
1254                                   guint         id)
1255 {
1256   GSource *source;
1257   
1258   g_return_val_if_fail (id > 0, FALSE);
1259
1260   if (context == NULL)
1261     context = g_main_context_default ();
1262   
1263   LOCK_CONTEXT (context);
1264   
1265   source = context->source_list;
1266   while (source)
1267     {
1268       if (!SOURCE_DESTROYED (source) &&
1269           source->id == id)
1270         break;
1271       source = source->next;
1272     }
1273
1274   UNLOCK_CONTEXT (context);
1275
1276   return source;
1277 }
1278
1279 /**
1280  * g_main_context_find_source_by_funcs_user_data:
1281  * @context: a #GMainContext (if %NULL, the default context will be used).
1282  * @funcs: the @source_funcs passed to g_source_new().
1283  * @user_data: the user data from the callback.
1284  * 
1285  * Finds a source with the given source functions and user data.  If
1286  * multiple sources exist with the same source function and user data,
1287  * the first one found will be returned.
1288  * 
1289  * Return value: the source, if one was found, otherwise %NULL
1290  **/
1291 GSource *
1292 g_main_context_find_source_by_funcs_user_data (GMainContext *context,
1293                                                GSourceFuncs *funcs,
1294                                                gpointer      user_data)
1295 {
1296   GSource *source;
1297   
1298   g_return_val_if_fail (funcs != NULL, FALSE);
1299
1300   if (context == NULL)
1301     context = g_main_context_default ();
1302   
1303   LOCK_CONTEXT (context);
1304
1305   source = context->source_list;
1306   while (source)
1307     {
1308       if (!SOURCE_DESTROYED (source) &&
1309           source->source_funcs == funcs &&
1310           source->callback_data == user_data)
1311         break;
1312       source = source->next;
1313     }
1314
1315   UNLOCK_CONTEXT (context);
1316
1317   return source;
1318 }
1319
1320 /**
1321  * g_main_context_find_source_by_user_data:
1322  * @context: a #GMainContext
1323  * @user_data: the user_data for the callback.
1324  * 
1325  * Finds a source with the given user data for the callback.  If
1326  * multiple sources exist with the same user data, the first
1327  * one found will be returned.
1328  * 
1329  * Return value: the source, if one was found, otherwise %NULL
1330  **/
1331 GSource *
1332 g_main_context_find_source_by_user_data (GMainContext *context,
1333                                          gpointer      user_data)
1334 {
1335   GSource *source;
1336   
1337   if (context == NULL)
1338     context = g_main_context_default ();
1339   
1340   LOCK_CONTEXT (context);
1341
1342   source = context->source_list;
1343   while (source)
1344     {
1345       if (!SOURCE_DESTROYED (source) &&
1346           source->callback_data == user_data)
1347         break;
1348       source = source->next;
1349     }
1350
1351   UNLOCK_CONTEXT (context);
1352
1353   return source;
1354 }
1355
1356 /**
1357  * g_source_remove:
1358  * @tag: the id of the source to remove.
1359  * 
1360  * Removes the source with the given id from the default main
1361  * context. The id of a #GSource is given by g_source_get_id(),
1362  * or will be returned by the functions g_source_attach(),
1363  * g_idle_add(), g_idle_add_full(), g_timeout_add(),
1364  * g_timeout_add_full(), g_io_add_watch, and g_io_add_watch_full().
1365  *
1366  * See also g_source_destroy().
1367  *
1368  * Return value: %TRUE if the source was found and removed.
1369  **/
1370 gboolean
1371 g_source_remove (guint tag)
1372 {
1373   GSource *source;
1374   
1375   g_return_val_if_fail (tag > 0, FALSE);
1376
1377   source = g_main_context_find_source_by_id (NULL, tag);
1378   if (source)
1379     g_source_destroy (source);
1380
1381   return source != NULL;
1382 }
1383
1384 /**
1385  * g_source_remove_by_user_data:
1386  * @user_data: the user_data for the callback.
1387  * 
1388  * Removes a source from the default main loop context given the user
1389  * data for the callback. If multiple sources exist with the same user
1390  * data, only one will be destroyed.
1391  * 
1392  * Return value: %TRUE if a source was found and removed. 
1393  **/
1394 gboolean
1395 g_source_remove_by_user_data (gpointer user_data)
1396 {
1397   GSource *source;
1398   
1399   source = g_main_context_find_source_by_user_data (NULL, user_data);
1400   if (source)
1401     {
1402       g_source_destroy (source);
1403       return TRUE;
1404     }
1405   else
1406     return FALSE;
1407 }
1408
1409 /**
1410  * g_source_remove_by_funcs_user_data:
1411  * @funcs: The @source_funcs passed to g_source_new()
1412  * @user_data: the user data for the callback
1413  * 
1414  * Removes a source from the default main loop context given the
1415  * source functions and user data. If multiple sources exist with the
1416  * same source functions and user data, only one will be destroyed.
1417  * 
1418  * Return value: %TRUE if a source was found and removed. 
1419  **/
1420 gboolean
1421 g_source_remove_by_funcs_user_data (GSourceFuncs *funcs,
1422                                     gpointer      user_data)
1423 {
1424   GSource *source;
1425
1426   g_return_val_if_fail (funcs != NULL, FALSE);
1427
1428   source = g_main_context_find_source_by_funcs_user_data (NULL, funcs, user_data);
1429   if (source)
1430     {
1431       g_source_destroy (source);
1432       return TRUE;
1433     }
1434   else
1435     return FALSE;
1436 }
1437
1438 /**
1439  * g_get_current_time:
1440  * @result: #GTimeVal structure in which to store current time.
1441  * 
1442  * Equivalent to Unix's <function>gettimeofday()</function>, but portable
1443  **/
1444 void
1445 g_get_current_time (GTimeVal *result)
1446 {
1447 #ifndef G_OS_WIN32
1448   struct timeval r;
1449
1450   g_return_if_fail (result != NULL);
1451
1452   /*this is required on alpha, there the timeval structs are int's
1453     not longs and a cast only would fail horribly*/
1454   gettimeofday (&r, NULL);
1455   result->tv_sec = r.tv_sec;
1456   result->tv_usec = r.tv_usec;
1457 #else
1458   /* Avoid calling time() except for the first time.
1459    * GetTickCount() should be pretty fast and low-level?
1460    * I could also use ftime() but it seems unnecessarily overheady.
1461    */
1462   static DWORD start_tick = 0;
1463   static time_t start_time;
1464   DWORD tick;
1465
1466   g_return_if_fail (result != NULL);
1467  
1468   if (start_tick == 0)
1469     {
1470       start_tick = GetTickCount ();
1471       time (&start_time);
1472     }
1473
1474   tick = GetTickCount ();
1475
1476   result->tv_sec = (tick - start_tick) / 1000 + start_time;
1477   result->tv_usec = ((tick - start_tick) % 1000) * 1000;
1478 #endif
1479 }
1480
1481 /* Running the main loop */
1482
1483 /* HOLDS: context's lock */
1484 static void
1485 g_main_dispatch (GMainContext *context)
1486 {
1487   gint i;
1488
1489   for (i = 0; i < context->pending_dispatches->len; i++)
1490     {
1491       GSource *source = context->pending_dispatches->pdata[i];
1492
1493       context->pending_dispatches->pdata[i] = NULL;
1494       g_assert (source);
1495
1496       source->flags &= ~G_SOURCE_READY;
1497
1498       if (!SOURCE_DESTROYED (source))
1499         {
1500           gboolean was_in_call;
1501           gpointer user_data = NULL;
1502           GSourceFunc callback = NULL;
1503           GSourceCallbackFuncs *cb_funcs;
1504           gpointer cb_data;
1505           gboolean need_destroy;
1506
1507           gboolean (*dispatch) (GSource *,
1508                                 GSourceFunc,
1509                                 gpointer);
1510
1511           dispatch = source->source_funcs->dispatch;
1512           cb_funcs = source->callback_funcs;
1513           cb_data = source->callback_data;
1514
1515           if (cb_funcs)
1516             cb_funcs->ref (cb_data);
1517           
1518           was_in_call = source->flags & G_HOOK_FLAG_IN_CALL;
1519           source->flags |= G_HOOK_FLAG_IN_CALL;
1520
1521           UNLOCK_CONTEXT (context);
1522
1523           if (cb_funcs)
1524             cb_funcs->get (cb_data, &callback, &user_data);
1525
1526           need_destroy = ! dispatch (source,
1527                                      callback,
1528                                      user_data);
1529           LOCK_CONTEXT (context);
1530
1531           if (cb_funcs)
1532             cb_funcs->unref (cb_data);
1533
1534          if (!was_in_call)
1535             source->flags &= ~G_HOOK_FLAG_IN_CALL;
1536
1537           /* Note: this depends on the fact that we can't switch
1538            * sources from one main context to another
1539            */
1540           if (need_destroy && !SOURCE_DESTROYED (source))
1541             {
1542               g_assert (source->context == context);
1543               g_source_destroy_internal (source, context, TRUE);
1544             }
1545         }
1546       
1547       SOURCE_UNREF (source, context);
1548     }
1549
1550   g_ptr_array_set_size (context->pending_dispatches, 0);
1551 }
1552
1553 /* Holds context's lock */
1554 static inline GSource *
1555 next_valid_source (GMainContext *context,
1556                    GSource      *source)
1557 {
1558   GSource *new_source = source ? source->next : context->source_list;
1559
1560   while (new_source)
1561     {
1562       if (!SOURCE_DESTROYED (new_source))
1563         {
1564           new_source->ref_count++;
1565           break;
1566         }
1567       
1568       new_source = new_source->next;
1569     }
1570
1571   if (source)
1572     SOURCE_UNREF (source, context);
1573           
1574   return new_source;
1575 }
1576
1577
1578 /**
1579  * g_main_context_prepare:
1580  * @context: a #GMainContext
1581  * @priority: location to store priority of highest priority
1582  *            source already ready.
1583  * 
1584  * Prepares to poll sources within a main loop. The resulting information
1585  * for polling is determined by calling g_main_context_query ().
1586  * 
1587  * Return value: %TRUE if some source is ready to be dispatched
1588  *               prior to polling.
1589  **/
1590 gboolean
1591 g_main_context_prepare (GMainContext *context,
1592                         gint         *priority)
1593 {
1594   gint n_ready = 0;
1595   gint current_priority = G_MAXINT;
1596   GSource *source;
1597
1598   if (context == NULL)
1599     context = g_main_context_default ();
1600   
1601   LOCK_CONTEXT (context);
1602
1603   context->time_is_current = FALSE;
1604
1605   if (context->in_check_or_prepare)
1606     {
1607       g_warning ("g_main_context_prepare() called recursively from within a source's check() or "
1608                  "prepare() member.");
1609       return FALSE;
1610     }
1611
1612 #ifdef G_THREADS_ENABLED
1613   if (context->poll_waiting)
1614     {
1615       g_warning("g_main_context_prepare(): main loop already active in another thread");
1616       UNLOCK_CONTEXT (context);
1617       return FALSE;
1618     }
1619   
1620   context->poll_waiting = TRUE;
1621 #endif /* G_THREADS_ENABLED */
1622
1623 #if 0
1624   /* If recursing, finish up current dispatch, before starting over */
1625   if (context->pending_dispatches)
1626     {
1627       if (dispatch)
1628         g_main_dispatch (context, &current_time);
1629       
1630       UNLOCK_CONTEXT (context);
1631       return TRUE;
1632     }
1633 #endif
1634
1635   /* If recursing, clear list of pending dispatches */
1636   g_ptr_array_set_size (context->pending_dispatches, 0);
1637   
1638   /* Prepare all sources */
1639
1640   context->timeout = -1;
1641   
1642   source = next_valid_source (context, NULL);
1643   while (source)
1644     {
1645       gint source_timeout = -1;
1646
1647       if ((n_ready > 0) && (source->priority > current_priority))
1648         {
1649           SOURCE_UNREF (source, context);
1650           break;
1651         }
1652       if ((source->flags & G_HOOK_FLAG_IN_CALL) && !(source->flags & G_SOURCE_CAN_RECURSE))
1653         goto next;
1654
1655       if (!(source->flags & G_SOURCE_READY))
1656         {
1657           gboolean result;
1658           gboolean (*prepare)  (GSource  *source, 
1659                                 gint     *timeout);
1660
1661           prepare = source->source_funcs->prepare;
1662           context->in_check_or_prepare++;
1663           UNLOCK_CONTEXT (context);
1664
1665           result = (*prepare) (source, &source_timeout);
1666
1667           LOCK_CONTEXT (context);
1668           context->in_check_or_prepare--;
1669
1670           if (result)
1671             source->flags |= G_SOURCE_READY;
1672         }
1673
1674       if (source->flags & G_SOURCE_READY)
1675         {
1676           n_ready++;
1677           current_priority = source->priority;
1678           context->timeout = 0;
1679         }
1680       
1681       if (source_timeout >= 0)
1682         {
1683           if (context->timeout < 0)
1684             context->timeout = source_timeout;
1685           else
1686             context->timeout = MIN (context->timeout, source_timeout);
1687         }
1688
1689     next:
1690       source = next_valid_source (context, source);
1691     }
1692
1693   UNLOCK_CONTEXT (context);
1694   
1695   if (priority)
1696     *priority = current_priority;
1697   
1698   return (n_ready > 0);
1699 }
1700
1701 /**
1702  * g_main_context_query:
1703  * @context: a #GMainContext
1704  * @max_priority: maximum priority source to check
1705  * @timeout: location to store timeout to be used in polling
1706  * @fds: location to store #GPollFD records that need to be polled.
1707  * @n_fds: length of @fds.
1708  * 
1709  * Determines information necessary to poll this main loop.
1710  * 
1711  * Return value: 
1712  **/
1713 gint
1714 g_main_context_query (GMainContext *context,
1715                       gint          max_priority,
1716                       gint         *timeout,
1717                       GPollFD      *fds,
1718                       gint          n_fds)
1719 {
1720   gint n_poll;
1721   GPollRec *pollrec;
1722   
1723   LOCK_CONTEXT (context);
1724
1725   pollrec = context->poll_records;
1726   n_poll = 0;
1727   while (pollrec && max_priority >= pollrec->priority)
1728     {
1729       if (pollrec->fd->events)
1730         {
1731           if (n_poll < n_fds)
1732             {
1733               fds[n_poll].fd = pollrec->fd->fd;
1734               /* In direct contradiction to the Unix98 spec, IRIX runs into
1735                * difficulty if you pass in POLLERR, POLLHUP or POLLNVAL
1736                * flags in the events field of the pollfd while it should
1737                * just ignoring them. So we mask them out here.
1738                */
1739               fds[n_poll].events = pollrec->fd->events & ~(G_IO_ERR|G_IO_HUP|G_IO_NVAL);
1740               fds[n_poll].revents = 0;
1741             }
1742           n_poll++;
1743         }
1744       
1745       pollrec = pollrec->next;
1746     }
1747
1748 #ifdef G_THREADS_ENABLED
1749   context->poll_changed = FALSE;
1750 #endif
1751   
1752   if (timeout)
1753     {
1754       *timeout = context->timeout;
1755       if (timeout != 0)
1756         context->time_is_current = FALSE;
1757     }
1758   
1759   UNLOCK_CONTEXT (context);
1760
1761   return n_poll;
1762 }
1763
1764 /**
1765  * g_main_context_check:
1766  * @context: a #GMainContext
1767  * @max_priority: the maximum numerical priority of sources to check
1768  * @fds: array of #GPollFD's that was passed to the last call to
1769  *       g_main_context_query()
1770  * @n_fds: return value of g_main_context_query()
1771  * 
1772  * Pass the results of polling back to the main loop.
1773  * 
1774  * Return value: %TRUE if some sources are ready to be dispatched.
1775  **/
1776 gboolean
1777 g_main_context_check (GMainContext *context,
1778                       gint          max_priority,
1779                       GPollFD      *fds,
1780                       gint          n_fds)
1781 {
1782   GSource *source;
1783   GPollRec *pollrec;
1784   gint n_ready = 0;
1785   gint i;
1786   
1787   LOCK_CONTEXT (context);
1788
1789   if (context->in_check_or_prepare)
1790     {
1791       g_warning ("g_main_context_check() called recursively from within a source's check() or "
1792                  "prepare() member.");
1793       return FALSE;
1794     }
1795   
1796 #ifdef G_THREADS_ENABLED
1797   if (!context->poll_waiting)
1798     {
1799 #ifndef G_OS_WIN32
1800       gchar c;
1801       read (context->wake_up_pipe[0], &c, 1);
1802 #endif
1803     }
1804   else
1805     context->poll_waiting = FALSE;
1806
1807   /* If the set of poll file descriptors changed, bail out
1808    * and let the main loop rerun
1809    */
1810   if (context->poll_changed)
1811     return 0;
1812 #endif /* G_THREADS_ENABLED */
1813   
1814   pollrec = context->poll_records;
1815   i = 0;
1816   while (i < n_fds)
1817     {
1818       if (pollrec->fd->events)
1819         {
1820           pollrec->fd->revents = fds[i].revents;
1821           i++;
1822         }
1823       pollrec = pollrec->next;
1824     }
1825
1826   source = next_valid_source (context, NULL);
1827   while (source)
1828     {
1829       if ((n_ready > 0) && (source->priority > max_priority))
1830         {
1831           SOURCE_UNREF (source, context);
1832           break;
1833         }
1834       if ((source->flags & G_HOOK_FLAG_IN_CALL) && !(source->flags & G_SOURCE_CAN_RECURSE))
1835         goto next;
1836
1837       if (!(source->flags & G_SOURCE_READY))
1838         {
1839           gboolean result;
1840           gboolean (*check) (GSource  *source);
1841
1842           check = source->source_funcs->check;
1843           
1844           context->in_check_or_prepare++;
1845           UNLOCK_CONTEXT (context);
1846           
1847           result = (*check) (source);
1848           
1849           LOCK_CONTEXT (context);
1850           context->in_check_or_prepare--;
1851           
1852           if (result)
1853             source->flags |= G_SOURCE_READY;
1854         }
1855
1856       if (source->flags & G_SOURCE_READY)
1857         {
1858           source->ref_count++;
1859           g_ptr_array_add (context->pending_dispatches, source);
1860
1861           n_ready++;
1862         }
1863
1864     next:
1865       source = next_valid_source (context, source);
1866     }
1867
1868   UNLOCK_CONTEXT (context);
1869
1870   return n_ready > 0;
1871 }
1872
1873 /**
1874  * g_main_context_dispatch:
1875  * @context: a #GMainContext
1876  * 
1877  * Dispatch all pending sources()
1878  **/
1879 void
1880 g_main_context_dispatch (GMainContext *context)
1881 {
1882   LOCK_CONTEXT (context);
1883
1884   if (context->pending_dispatches->len > 0)
1885     {
1886       g_main_dispatch (context);
1887     }
1888
1889   UNLOCK_CONTEXT (context);
1890 }
1891
1892 static gboolean
1893 g_main_context_iterate (GMainContext *context,
1894                         gboolean      block,
1895                         gboolean      dispatch)
1896 {
1897   gint max_priority;
1898   gint timeout;
1899   gboolean some_ready;
1900   gint nfds, new_nfds;
1901   GPollFD *fds;
1902   
1903   some_ready = g_main_context_prepare (context, &max_priority);
1904
1905   do
1906     {
1907       LOCK_CONTEXT (context);
1908
1909       if (context->cached_poll_array)
1910         {
1911           nfds = context->cached_poll_array_size;
1912           fds = context->cached_poll_array;
1913           context->cached_poll_array = NULL;
1914         }
1915       else
1916         {
1917           nfds = context->cached_poll_array_size = context->n_poll_records;
1918           fds = g_new (GPollFD, nfds);
1919         }
1920
1921       UNLOCK_CONTEXT (context);
1922   
1923       new_nfds = g_main_context_query (context, max_priority,
1924                                        &timeout, fds, nfds);
1925     }
1926   while (new_nfds > nfds);
1927
1928   if (!block)
1929     timeout = 0;
1930   
1931   g_main_context_poll (context, timeout, max_priority,
1932                        fds, new_nfds);
1933
1934   g_main_context_check (context,
1935                         max_priority,
1936                         fds, new_nfds);
1937
1938   LOCK_CONTEXT (context);
1939
1940   g_assert (!context->cached_poll_array);
1941   
1942   context->cached_poll_array = fds;
1943   context->cached_poll_array_size = nfds;
1944
1945   UNLOCK_CONTEXT (context);
1946   
1947   if (dispatch)
1948     g_main_context_dispatch (context);
1949
1950   return some_ready;
1951 }
1952
1953 /**
1954  * g_main_context_pending:
1955  * @context: a #GMainContext (if %NULL, the default context will be used)
1956  *
1957  * Check if any sources have pending events for the given context.
1958  * 
1959  * Return value: %TRUE if events are pending.
1960  **/
1961 gboolean 
1962 g_main_context_pending (GMainContext *context)
1963 {
1964   if (!context)
1965     context = g_main_context_default();
1966   
1967   return g_main_context_iterate (context, FALSE, FALSE);
1968 }
1969
1970 /**
1971  * g_main_context_iteration:
1972  * @context: a #GMainContext (if %NULL, the default context will be used) 
1973  * @may_block: whether the call may block.
1974  * 
1975  * Run a single iteration for the given main loop. This involves
1976  * checking to see if any event sources are ready to be processed,
1977  * then if no events sources are ready and @may_block is %TRUE, waiting
1978  * for a source to become ready, then dispatching the highest priority
1979  * events sources that are ready. Note that even when @may_block is %TRUE,
1980  * it is still possible for g_main_context_iteration() to return
1981  * %FALSE, since the the wait may be interrupted for other
1982  * reasons than an event source becoming ready.
1983  * 
1984  * Return value: %TRUE if events were dispatched.
1985  **/
1986 gboolean
1987 g_main_context_iteration (GMainContext *context, gboolean may_block)
1988 {
1989   if (!context)
1990     context = g_main_context_default();
1991   
1992   return g_main_context_iterate (context, may_block, TRUE);
1993 }
1994
1995 /**
1996  * g_main_loop_new:
1997  * @context: a #GMainContext  (if %NULL, the default context will be used).
1998  * @is_running: set to TRUE to indicate that the loop is running. This
1999  * is not very important since calling g_main_run() will set this to
2000  * TRUE anyway.
2001  * 
2002  * Create a new #GMainLoop structure
2003  * 
2004  * Return value: 
2005  **/
2006 GMainLoop *
2007 g_main_loop_new (GMainContext *context,
2008                  gboolean      is_running)
2009 {
2010   GMainLoop *loop;
2011   
2012   if (!context)
2013     context = g_main_context_default();
2014   
2015   loop = g_new0 (GMainLoop, 1);
2016   loop->context = context;
2017   loop->is_running = is_running != FALSE;
2018   loop->ref_count = 1;
2019   
2020 #ifdef G_THREADS_ENABLED
2021   if (g_thread_supported ())
2022     loop->mutex = g_mutex_new ();
2023   else
2024     loop->mutex = NULL;
2025   loop->sem_cond = NULL;
2026 #endif /* G_THREADS_ENABLED */
2027
2028   return loop;
2029 }
2030
2031 /**
2032  * g_main_loop_ref:
2033  * @loop: a #GMainLoop
2034  * 
2035  * Increase the reference count on a #GMainLoop object by one.
2036  * 
2037  * Return value: @loop
2038  **/
2039 GMainLoop *
2040 g_main_loop_ref (GMainLoop *loop)
2041 {
2042   g_return_val_if_fail (loop != NULL, NULL);
2043
2044   LOCK_LOOP (loop);
2045   loop->ref_count++;
2046   UNLOCK_LOOP (loop);
2047
2048   return loop;
2049 }
2050
2051 static void
2052 main_loop_destroy (GMainLoop *loop)
2053 {
2054 #ifdef G_THREADS_ENABLED
2055   g_mutex_free (loop->mutex);
2056   if (loop->sem_cond)
2057     g_cond_free (loop->sem_cond);
2058 #endif /* G_THREADS_ENABLED */  
2059   
2060   g_free (loop);
2061 }
2062
2063 /**
2064  * g_main_loop_unref:
2065  * @loop: a #GMainLoop
2066  * 
2067  * Decreases the reference count on a #GMainLoop object by one. If
2068  * the result is zero, free the loop and free all associated memory.
2069  **/
2070 void
2071 g_main_loop_unref (GMainLoop *loop)
2072 {
2073   g_return_if_fail (loop != NULL);
2074   g_return_if_fail (loop->ref_count > 0);
2075
2076   LOCK_LOOP (loop);
2077   
2078   loop->ref_count--;
2079   if (loop->ref_count == 0)
2080     {
2081       /* When the ref_count is 0, there can be nobody else using the
2082        * loop, so it is safe to unlock before destroying.
2083        */
2084       UNLOCK_LOOP (loop);
2085       main_loop_destroy (loop);
2086     }
2087   else
2088     UNLOCK_LOOP (loop);
2089 }
2090
2091 /**
2092  * g_main_loop_run:
2093  * @loop: a #GMainLoop
2094  * 
2095  * Run a main loop until g_main_quit() is called on the loop.
2096  * If this is called for the thread of the loop's #GMainContext,
2097  * it will process events from the loop, otherwise it will
2098  * simply wait.
2099  **/
2100 void 
2101 g_main_loop_run (GMainLoop *loop)
2102 {
2103   g_return_if_fail (loop != NULL);
2104
2105   /* The assumption here is that a reference is held to the loop
2106    * until we recursively iterate
2107    */
2108 #ifdef G_THREADS_ENABLED
2109   if (loop->context->thread != g_thread_self ())
2110     {
2111       LOCK_LOOP (loop);
2112
2113       loop->ref_count++;
2114       
2115       if (!g_thread_supported ())
2116         {
2117           g_warning ("g_main_loop_run() was called from second thread but"
2118                      "g_thread_init() was never called.");
2119         }
2120       else
2121         {
2122           if (!loop->sem_cond)
2123             loop->sem_cond = g_cond_new ();
2124           
2125           if (!loop->is_running)
2126             loop->is_running = TRUE;
2127           
2128           while (loop->is_running)
2129             g_cond_wait (loop->sem_cond, loop->mutex);
2130         }
2131     }
2132   else
2133 #endif /* G_THREADS_ENABLED */    
2134     {
2135       LOCK_CONTEXT (loop->context);
2136       if (loop->context->in_check_or_prepare)
2137         {
2138           g_warning ("g_main_run(): called recursively from within a source's check() or "
2139                      "prepare() member, iteration not possible.");
2140           return;
2141         }
2142       UNLOCK_CONTEXT (loop->context);
2143       
2144       LOCK_LOOP (loop);
2145
2146       loop->ref_count++;
2147       loop->is_running = TRUE;
2148       while (loop->is_running)
2149         {
2150           UNLOCK_LOOP (loop);
2151           g_main_context_iterate (loop->context, TRUE, TRUE);
2152           LOCK_LOOP (loop);
2153         }
2154     }
2155
2156   /* We inline this here rather than calling g_main_loop_unref() to
2157    * avoid an extra unlock/lock.
2158    */
2159   loop->ref_count--;
2160   if (loop->ref_count == 0)
2161     {
2162       UNLOCK_LOOP (loop);
2163       main_loop_destroy (loop);
2164     }
2165   else
2166     UNLOCK_LOOP (loop);
2167 }
2168
2169 /**
2170  * g_main_loop_quit:
2171  * @loop: a #GMainLoop
2172  * 
2173  * Stops a #GMainLoop from running. Any calls to g_main_loop_run()
2174  * for the loop will return.
2175  **/
2176 void 
2177 g_main_loop_quit (GMainLoop *loop)
2178 {
2179   g_return_if_fail (loop != NULL);
2180
2181   LOCK_LOOP (loop);
2182   loop->is_running = FALSE;
2183
2184 #ifdef G_THREADS_ENABLED
2185   if (loop->sem_cond)
2186     g_cond_broadcast (loop->sem_cond);
2187 #endif
2188   
2189   UNLOCK_LOOP (loop);
2190
2191   LOCK_CONTEXT (loop->context);
2192   
2193   g_main_context_wakeup (loop->context);
2194   UNLOCK_CONTEXT (loop->context);
2195 }
2196
2197 /**
2198  * g_main_loop_is_running:
2199  * @loop: a #GMainLoop.
2200  * 
2201  * Check to see if the main loop is currently being run via g_main_run()
2202  * 
2203  * Return value: %TRUE if the mainloop is currently being run.
2204  **/
2205 gboolean
2206 g_main_loop_is_running (GMainLoop *loop)
2207 {
2208   gboolean result;
2209   
2210   g_return_val_if_fail (loop != NULL, FALSE);
2211
2212   LOCK_LOOP (loop);
2213   result = loop->is_running;
2214   UNLOCK_LOOP (loop);
2215
2216   return result;
2217 }
2218
2219 /* HOLDS: context's lock */
2220 static void
2221 g_main_context_poll (GMainContext *context,
2222                      gint          timeout,
2223                      gint          priority,
2224                      GPollFD      *fds,
2225                      gint          n_fds)
2226 {
2227 #ifdef  G_MAIN_POLL_DEBUG
2228   GTimer *poll_timer;
2229   GPollRec *pollrec;
2230   gint i;
2231 #endif
2232
2233   GPollFunc poll_func;
2234
2235   if (n_fds || timeout != 0)
2236     {
2237 #ifdef  G_MAIN_POLL_DEBUG
2238       g_print ("g_main_poll(%d) timeout: %d\n", n_fds, timeout);
2239       poll_timer = g_timer_new ();
2240 #endif
2241
2242       LOCK_CONTEXT (context);
2243
2244       poll_func = context->poll_func;
2245       
2246       UNLOCK_CONTEXT (context);
2247       if ((*poll_func) (fds, n_fds, timeout) < 0 && errno != EINTR)
2248         g_warning ("poll(2) failed due to: %s.",
2249                    g_strerror (errno));
2250       
2251 #ifdef  G_MAIN_POLL_DEBUG
2252       LOCK_CONTEXT (context);
2253
2254       g_print ("g_main_poll(%d) timeout: %d - elapsed %12.10f seconds",
2255                n_fds,
2256                timeout,
2257                g_timer_elapsed (poll_timer, NULL));
2258       g_timer_destroy (poll_timer);
2259       pollrec = context->poll_records;
2260       i = 0;
2261       while (i < n_fds)
2262         {
2263           if (pollrec->fd->events)
2264             {
2265               if (fds[i].revents)
2266                 {
2267                   g_print (" [%d:", fds[i].fd);
2268                   if (fds[i].revents & G_IO_IN)
2269                     g_print ("i");
2270                   if (fds[i].revents & G_IO_OUT)
2271                     g_print ("o");
2272                   if (fds[i].revents & G_IO_PRI)
2273                     g_print ("p");
2274                   if (fds[i].revents & G_IO_ERR)
2275                     g_print ("e");
2276                   if (fds[i].revents & G_IO_HUP)
2277                     g_print ("h");
2278                   if (fds[i].revents & G_IO_NVAL)
2279                     g_print ("n");
2280                   g_print ("]");
2281                 }
2282               i++;
2283             }
2284           pollrec = pollrec->next;
2285         }
2286       g_print ("\n");
2287       
2288       UNLOCK_CONTEXT (context);
2289 #endif
2290     } /* if (n_fds || timeout != 0) */
2291 }
2292
2293 /**
2294  * g_main_context_add_poll:
2295  * @context: a #GMainContext (or %NULL for the default context)
2296  * @fd: a #GPollFD structure holding information about a file
2297  *      descriptor to watch.
2298  * @priority: the priority for this file descriptor which should be
2299  *      the same as the priority used for g_source_attach() to ensure that the
2300  *      file descriptor is polled whenever the results may be needed.
2301  * 
2302  * Add a file descriptor to the set of file descriptors polled * for
2303  * this context. This will very seldom be used directly. Instead
2304  * a typical event source will use g_source_add_poll() instead.
2305  **/
2306 void
2307 g_main_context_add_poll (GMainContext *context,
2308                          GPollFD      *fd,
2309                          gint          priority)
2310 {
2311   if (!context)
2312     context = g_main_context_default ();
2313   
2314   LOCK_CONTEXT (context);
2315   g_main_context_add_poll_unlocked (context, priority, fd);
2316   UNLOCK_CONTEXT (context);
2317 }
2318
2319 /* HOLDS: main_loop_lock */
2320 static void 
2321 g_main_context_add_poll_unlocked (GMainContext *context,
2322                                   gint          priority,
2323                                   GPollFD      *fd)
2324 {
2325   GPollRec *lastrec, *pollrec, *newrec;
2326
2327   if (!context->poll_chunk)
2328     context->poll_chunk = g_mem_chunk_create (GPollRec, 32, G_ALLOC_ONLY);
2329
2330   if (context->poll_free_list)
2331     {
2332       newrec = context->poll_free_list;
2333       context->poll_free_list = newrec->next;
2334     }
2335   else
2336     newrec = g_chunk_new (GPollRec, context->poll_chunk);
2337
2338   /* This file descriptor may be checked before we ever poll */
2339   fd->revents = 0;
2340   newrec->fd = fd;
2341   newrec->priority = priority;
2342
2343   lastrec = NULL;
2344   pollrec = context->poll_records;
2345   while (pollrec && priority >= pollrec->priority)
2346     {
2347       lastrec = pollrec;
2348       pollrec = pollrec->next;
2349     }
2350   
2351   if (lastrec)
2352     lastrec->next = newrec;
2353   else
2354     context->poll_records = newrec;
2355
2356   newrec->next = pollrec;
2357
2358   context->n_poll_records++;
2359   if (context->cached_poll_array &&
2360       context->cached_poll_array_size < context->n_poll_records)
2361     {
2362       g_free (context->cached_poll_array);
2363       context->cached_poll_array = NULL;
2364     }
2365
2366 #ifdef G_THREADS_ENABLED
2367   context->poll_changed = TRUE;
2368
2369   /* Now wake up the main loop if it is waiting in the poll() */
2370   g_main_context_wakeup (context);
2371 #endif
2372 }
2373
2374 /**
2375  * g_main_context_remove_poll:
2376  * @context:a #GMainContext 
2377  * @fd: a #GPollFD descriptor previously added with g_main_context_add_poll()
2378  * 
2379  * Remove file descriptor from the set of file descriptors to be
2380  * polled for a particular context.
2381  **/
2382 void
2383 g_main_context_remove_poll (GMainContext *context,
2384                             GPollFD      *fd)
2385 {
2386   if (!context)
2387     context = g_main_context_default ();
2388   
2389   LOCK_CONTEXT (context);
2390
2391   g_main_context_remove_poll_unlocked (context, fd);
2392   
2393   UNLOCK_CONTEXT (context);
2394 }
2395
2396 static void
2397 g_main_context_remove_poll_unlocked (GMainContext *context,
2398                                      GPollFD      *fd)
2399 {
2400   GPollRec *pollrec, *lastrec;
2401
2402   lastrec = NULL;
2403   pollrec = context->poll_records;
2404
2405   while (pollrec)
2406     {
2407       if (pollrec->fd == fd)
2408         {
2409           if (lastrec != NULL)
2410             lastrec->next = pollrec->next;
2411           else
2412             context->poll_records = pollrec->next;
2413
2414 #ifdef ENABLE_GC_FRIENDLY
2415           pollrec->fd = NULL;  
2416 #endif /* ENABLE_GC_FRIENDLY */
2417
2418           pollrec->next = context->poll_free_list;
2419           context->poll_free_list = pollrec;
2420
2421           context->n_poll_records--;
2422           break;
2423         }
2424       lastrec = pollrec;
2425       pollrec = pollrec->next;
2426     }
2427
2428 #ifdef G_THREADS_ENABLED
2429   context->poll_changed = TRUE;
2430   
2431   /* Now wake up the main loop if it is waiting in the poll() */
2432   g_main_context_wakeup (context);
2433 #endif
2434 }
2435
2436 /**
2437  * g_source_get_current_time:
2438  * @source:  a #GSource
2439  * @timeval: #GTimeVal structure in which to store current time.
2440  * 
2441  * Gets the "current time" to be used when checking 
2442  * this source. The advantage of calling this function over
2443  * calling g_get_current_time() directly is that when 
2444  * checking multiple sources, GLib can cache a single value
2445  * instead of having to repeatedly get the system time.
2446  **/
2447 void
2448 g_source_get_current_time (GSource  *source,
2449                            GTimeVal *timeval)
2450 {
2451   GMainContext *context;
2452   
2453   g_return_if_fail (source->context != NULL);
2454  
2455   context = source->context;
2456
2457   LOCK_CONTEXT (context);
2458
2459   if (!context->time_is_current)
2460     {
2461       g_get_current_time (&context->current_time);
2462       context->time_is_current = TRUE;
2463     }
2464   
2465   *timeval = context->current_time;
2466   
2467   UNLOCK_CONTEXT (context);
2468 }
2469
2470 /**
2471  * g_main_context_set_poll_func:
2472  * @context: a #GMainContext
2473  * @func: the function to call to poll all file descriptors
2474  * 
2475  * Sets the function to use to handle polling of file descriptors. It
2476  * will be used instead of the poll() system call (or GLib's
2477  * replacement function, which is used where poll() isn't available).
2478  *
2479  * This function could possibly be used to integrate the GLib event
2480  * loop with an external event loop.
2481  **/
2482 void
2483 g_main_context_set_poll_func (GMainContext *context,
2484                               GPollFunc     func)
2485 {
2486   if (!context)
2487     context = g_main_context_default ();
2488   
2489   LOCK_CONTEXT (context);
2490   
2491   if (func)
2492     context->poll_func = func;
2493   else
2494     {
2495 #ifdef HAVE_POLL
2496       context->poll_func = (GPollFunc) poll;
2497 #else
2498       context->poll_func = (GPollFunc) g_poll;
2499 #endif
2500     }
2501
2502   UNLOCK_CONTEXT (context);
2503 }
2504
2505 /**
2506  * g_main_context_get_poll_func:
2507  * @context: a #GMainContext
2508  * 
2509  * Gets the poll function set by g_main_context_set_poll_func()
2510  * 
2511  * Return value: the poll function
2512  **/
2513 GPollFunc
2514 g_main_context_get_poll_func (GMainContext *context)
2515 {
2516   GPollFunc result;
2517   
2518   if (!context)
2519     context = g_main_context_default ();
2520   
2521   LOCK_CONTEXT (context);
2522   result = context->poll_func;
2523   UNLOCK_CONTEXT (context);
2524
2525   return result;
2526 }
2527
2528 /* HOLDS: context's lock */
2529 /* Wake the main loop up from a poll() */
2530 static void
2531 g_main_context_wakeup (GMainContext *context)
2532 {
2533 #ifdef G_THREADS_ENABLED
2534   if (g_thread_supported() && context->poll_waiting)
2535     {
2536       context->poll_waiting = FALSE;
2537 #ifndef G_OS_WIN32
2538       write (context->wake_up_pipe[1], "A", 1);
2539 #else
2540       ReleaseSemaphore (context->wake_up_semaphore, 1, NULL);
2541 #endif
2542     }
2543 #endif
2544 }
2545
2546 /* Timeouts */
2547
2548 static void
2549 g_timeout_set_expiration (GTimeoutSource *timeout_source,
2550                           GTimeVal       *current_time)
2551 {
2552   guint seconds = timeout_source->interval / 1000;
2553   guint msecs = timeout_source->interval - seconds * 1000;
2554
2555   timeout_source->expiration.tv_sec = current_time->tv_sec + seconds;
2556   timeout_source->expiration.tv_usec = current_time->tv_usec + msecs * 1000;
2557   if (timeout_source->expiration.tv_usec >= 1000000)
2558     {
2559       timeout_source->expiration.tv_usec -= 1000000;
2560       timeout_source->expiration.tv_sec++;
2561     }
2562 }
2563
2564 static gboolean
2565 g_timeout_prepare  (GSource  *source,
2566                     gint     *timeout)
2567 {
2568   glong msec;
2569   GTimeVal current_time;
2570   
2571   GTimeoutSource *timeout_source = (GTimeoutSource *)source;
2572
2573   g_source_get_current_time (source, &current_time);
2574   
2575   msec = ((timeout_source->expiration.tv_sec  - current_time.tv_sec) * 1000 +
2576           (timeout_source->expiration.tv_usec - current_time.tv_usec) / 1000);
2577
2578   if (msec < 0)
2579     msec = 0;
2580   else if (msec > timeout_source->interval)
2581     {
2582       /* The system time has been set backwards, so we
2583        * reset the expiration time to now + timeout_source->interval;
2584        * this at least avoids hanging for long periods of time.
2585        */
2586       g_timeout_set_expiration (timeout_source, &current_time);
2587       msec = timeout_source->interval;
2588     }
2589   
2590   *timeout = msec;
2591   
2592   return msec == 0;
2593 }
2594
2595 static gboolean 
2596 g_timeout_check (GSource  *source)
2597 {
2598   GTimeVal current_time;
2599   GTimeoutSource *timeout_source = (GTimeoutSource *)source;
2600
2601   g_source_get_current_time (source, &current_time);
2602   
2603   return ((timeout_source->expiration.tv_sec < current_time.tv_sec) ||
2604           ((timeout_source->expiration.tv_sec == current_time.tv_sec) &&
2605            (timeout_source->expiration.tv_usec <= current_time.tv_usec)));
2606 }
2607
2608 static gboolean
2609 g_timeout_dispatch (GSource    *source,
2610                     GSourceFunc callback,
2611                     gpointer    user_data)
2612 {
2613   GTimeoutSource *timeout_source = (GTimeoutSource *)source;
2614
2615   if (!callback)
2616     {
2617       g_warning ("Timeout source dispatched without callback\n"
2618                  "You must call g_source_set_callback().");
2619       return FALSE;
2620     }
2621  
2622   if (callback (user_data))
2623     {
2624       GTimeVal current_time;
2625
2626       g_source_get_current_time (source, &current_time);
2627       g_timeout_set_expiration (timeout_source, &current_time);
2628
2629       return TRUE;
2630     }
2631   else
2632     return FALSE;
2633 }
2634
2635 /**
2636  * g_timeout_source_new:
2637  * @interval: the timeout interval in milliseconds.
2638  * 
2639  * Create a new timeout source.
2640  *
2641  * The source will not initially be associated with any #GMainContext
2642  * and must be added to one with g_source_attach() before it will be
2643  * executed.
2644  * 
2645  * Return value: the newly create timeout source
2646  **/
2647 GSource *
2648 g_timeout_source_new (guint interval)
2649 {
2650   GSource *source = g_source_new (&timeout_funcs, sizeof (GTimeoutSource));
2651   GTimeoutSource *timeout_source = (GTimeoutSource *)source;
2652   GTimeVal current_time;
2653
2654   timeout_source->interval = interval;
2655
2656   g_get_current_time (&current_time);
2657   g_timeout_set_expiration (timeout_source, &current_time);
2658   
2659   return source;
2660 }
2661
2662 /**
2663  * g_timeout_add_full:
2664  * @priority: the priority of the idle source. Typically this will be in the
2665  *            range btweeen #G_PRIORITY_DEFAULT_IDLE and #G_PRIORITY_HIGH_IDLE.
2666  * @interval: the time between calls to the function, in milliseconds
2667  *             (1/1000ths of a second.)
2668  * @function: function to call
2669  * @data:     data to pass to @function
2670  * @notify:   function to call when the idle is removed, or %NULL
2671  * 
2672  * Sets a function to be called at regular intervals, with the given
2673  * priority.  The function is called repeatedly until it returns
2674  * FALSE, at which point the timeout is automatically destroyed and
2675  * the function will not be called again.  The @notify function is
2676  * called when the timeout is destroyed.  The first call to the
2677  * function will be at the end of the first @interval.
2678  *
2679  * Note that timeout functions may be delayed, due to the processing of other
2680  * event sources. Thus they should not be relied on for precise timing.
2681  * After each call to the timeout function, the time of the next
2682  * timeout is recalculated based on the current time and the given interval
2683  * (it does not try to 'catch up' time lost in delays).
2684  * 
2685  * Return value: the id of event source.
2686  **/
2687 guint
2688 g_timeout_add_full (gint           priority,
2689                     guint          interval,
2690                     GSourceFunc    function,
2691                     gpointer       data,
2692                     GDestroyNotify notify)
2693 {
2694   GSource *source;
2695   guint id;
2696   
2697   g_return_val_if_fail (function != NULL, 0);
2698
2699   source = g_timeout_source_new (interval);
2700
2701   if (priority != G_PRIORITY_DEFAULT)
2702     g_source_set_priority (source, priority);
2703
2704   g_source_set_callback (source, function, data, notify);
2705   id = g_source_attach (source, NULL);
2706   g_source_unref (source);
2707
2708   return id;
2709 }
2710
2711 /**
2712  * g_timeout_add:
2713  * @interval: the time between calls to the function, in milliseconds
2714  *             (1/1000ths of a second.)
2715  * @function: function to call
2716  * @data:     data to pass to @function
2717  * 
2718  * Sets a function to be called at regular intervals, with the default
2719  * priority, #G_PRIORITY_DEFAULT.  The function is called repeatedly
2720  * until it returns FALSE, at which point the timeout is automatically
2721  * destroyed and the function will not be called again.  The @notify
2722  * function is called when the timeout is destroyed.  The first call
2723  * to the function will be at the end of the first @interval.
2724  *
2725  * Note that timeout functions may be delayed, due to the processing of other
2726  * event sources. Thus they should not be relied on for precise timing.
2727  * After each call to the timeout function, the time of the next
2728  * timeout is recalculated based on the current time and the given interval
2729  * (it does not try to 'catch up' time lost in delays).
2730  * 
2731  * Return value: the id of event source.
2732  **/
2733 guint 
2734 g_timeout_add (guint32        interval,
2735                GSourceFunc    function,
2736                gpointer       data)
2737 {
2738   return g_timeout_add_full (G_PRIORITY_DEFAULT, 
2739                              interval, function, data, NULL);
2740 }
2741
2742 /* Idle functions */
2743
2744 static gboolean 
2745 g_idle_prepare  (GSource  *source,
2746                  gint     *timeout)
2747 {
2748   *timeout = 0;
2749
2750   return TRUE;
2751 }
2752
2753 static gboolean 
2754 g_idle_check    (GSource  *source)
2755 {
2756   return TRUE;
2757 }
2758
2759 static gboolean
2760 g_idle_dispatch (GSource    *source, 
2761                  GSourceFunc callback,
2762                  gpointer    user_data)
2763 {
2764   if (!callback)
2765     {
2766       g_warning ("Idle source dispatched without callback\n"
2767                  "You must call g_source_set_callback().");
2768       return FALSE;
2769     }
2770   
2771   return callback (user_data);
2772 }
2773
2774 /**
2775  * g_idle_source_new:
2776  * 
2777  * Create a new idle source.
2778  *
2779  * The source will not initially be associated with any #GMainContext
2780  * and must be added to one with g_source_attach() before it will be
2781  * executed.
2782  * 
2783  * Return value: the newly created idle source
2784  **/
2785 GSource *
2786 g_idle_source_new (void)
2787 {
2788   return g_source_new (&idle_funcs, sizeof (GSource));
2789 }
2790
2791 /**
2792  * g_idle_add_full:
2793  * @priority: the priority of the idle source. Typically this will be in the
2794  *            range btweeen #G_PRIORITY_DEFAULT_IDLE and #G_PRIORITY_HIGH_IDLE.
2795  * @function: function to call
2796  * @data:     data to pass to @function
2797  * @notify:   function to call when the idle is removed, or %NULL
2798  * 
2799  * Adds a function to be called whenever there are no higher priority
2800  * events pending.  If the function returns FALSE it is automatically
2801  * removed from the list of event sources and will not be called again.
2802  * 
2803  * Return value: the id of the event source.
2804  **/
2805 guint 
2806 g_idle_add_full (gint           priority,
2807                  GSourceFunc    function,
2808                  gpointer       data,
2809                  GDestroyNotify notify)
2810 {
2811   GSource *source;
2812   guint id;
2813   
2814   g_return_val_if_fail (function != NULL, 0);
2815
2816   source = g_idle_source_new ();
2817
2818   if (priority != G_PRIORITY_DEFAULT)
2819     g_source_set_priority (source, priority);
2820
2821   g_source_set_callback (source, function, data, notify);
2822   id = g_source_attach (source, NULL);
2823   g_source_unref (source);
2824
2825   return id;
2826 }
2827
2828 /**
2829  * g_idle_add:
2830  * @function: function to call 
2831  * @data: data to pass to @function.
2832  * 
2833  * Adds a function to be called whenever there are no higher priority
2834  * events pending to the default main loop. The function is given the
2835  * default idle priority, #G_PRIORITY_DEFAULT_IDLE.  If the function
2836  * returns FALSE it is automatically removed from the list of event
2837  * sources and will not be called again.
2838  * 
2839  * Return value: the id of the event source.
2840  **/
2841 guint 
2842 g_idle_add (GSourceFunc    function,
2843             gpointer       data)
2844 {
2845   return g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, function, data, NULL);
2846 }
2847
2848 /**
2849  * g_idle_remove_by_data:
2850  * @data: the data for the idle source's callback.
2851  * 
2852  * Removes the idle function with the given data.
2853  * 
2854  * Return value: %TRUE if an idle source was found and removed.
2855  **/
2856 gboolean
2857 g_idle_remove_by_data (gpointer data)
2858 {
2859   return g_source_remove_by_funcs_user_data (&idle_funcs, data);
2860 }
2861