| 1 | #ifndef foomainloophfoo |
| 2 | #define foomainloophfoo |
| 3 | |
| 4 | /*** |
| 5 | This file is part of PulseAudio. |
| 6 | |
| 7 | Copyright 2004-2006 Lennart Poettering |
| 8 | Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB |
| 9 | |
| 10 | PulseAudio is free software; you can redistribute it and/or modify |
| 11 | it under the terms of the GNU Lesser General Public License as published |
| 12 | by the Free Software Foundation; either version 2.1 of the License, |
| 13 | or (at your option) any later version. |
| 14 | |
| 15 | PulseAudio is distributed in the hope that it will be useful, but |
| 16 | WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 18 | General Public License for more details. |
| 19 | |
| 20 | You should have received a copy of the GNU Lesser General Public License |
| 21 | along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. |
| 22 | ***/ |
| 23 | |
| 24 | #include <pulse/mainloop-api.h> |
| 25 | #include <pulse/cdecl.h> |
| 26 | |
| 27 | PA_C_DECL_BEGIN |
| 28 | |
| 29 | struct pollfd; |
| 30 | |
| 31 | /** \page mainloop Main Loop |
| 32 | * |
| 33 | * \section overv_sec Overview |
| 34 | * |
| 35 | * The built-in main loop implementation is based on the poll() system call. |
| 36 | * It supports the functions defined in the main loop abstraction and very |
| 37 | * little else. |
| 38 | * |
| 39 | * The main loop is created using pa_mainloop_new() and destroyed using |
| 40 | * pa_mainloop_free(). To get access to the main loop abstraction, |
| 41 | * pa_mainloop_get_api() is used. |
| 42 | * |
| 43 | * \section iter_sec Iteration |
| 44 | * |
| 45 | * The main loop is designed around the concept of iterations. Each iteration |
| 46 | * consists of three steps that repeat during the application's entire |
| 47 | * lifetime: |
| 48 | * |
| 49 | * -# Prepare - Build a list of file descriptors |
| 50 | * that need to be monitored and calculate the next timeout. |
| 51 | * -# Poll - Execute the actual poll() system call. |
| 52 | * -# Dispatch - Dispatch any events that have fired. |
| 53 | * |
| 54 | * When using the main loop, the application can either execute each |
| 55 | * iteration, one at a time, using pa_mainloop_iterate(), or let the library |
| 56 | * iterate automatically using pa_mainloop_run(). |
| 57 | * |
| 58 | * \section thread_sec Threads |
| 59 | * |
| 60 | * The main loop functions are designed to be thread safe, but the objects |
| 61 | * are not. What this means is that multiple main loops can be used, but only |
| 62 | * one object per thread. |
| 63 | * |
| 64 | */ |
| 65 | |
| 66 | /** \file |
| 67 | * |
| 68 | * A minimal main loop implementation based on the C library's poll() |
| 69 | * function. Using the routines defined herein you may create a simple |
| 70 | * main loop supporting the generic main loop abstraction layer as |
| 71 | * defined in \ref mainloop-api.h. This implementation is thread safe |
| 72 | * as long as you access the main loop object from a single thread only. |
| 73 | * |
| 74 | * See also \subpage mainloop |
| 75 | */ |
| 76 | |
| 77 | /** An opaque main loop object */ |
| 78 | typedef struct pa_mainloop pa_mainloop; |
| 79 | |
| 80 | /** Allocate a new main loop object. Free with pa_mainloop_free. */ |
| 81 | pa_mainloop *pa_mainloop_new(void); |
| 82 | |
| 83 | /** Free a main loop object */ |
| 84 | void pa_mainloop_free(pa_mainloop* m); |
| 85 | |
| 86 | /** Prepare for a single iteration of the main loop. Returns a negative value |
| 87 | on error or exit request. timeout specifies a maximum timeout for the subsequent |
| 88 | poll, or -1 for blocking behaviour. The timeout is specified in microseconds. */ |
| 89 | int pa_mainloop_prepare(pa_mainloop *m, int timeout); |
| 90 | |
| 91 | /** Execute the previously prepared poll. Returns a negative value on error.*/ |
| 92 | int pa_mainloop_poll(pa_mainloop *m); |
| 93 | |
| 94 | /** Dispatch timeout, io and deferred events from the previously executed poll. Returns |
| 95 | a negative value on error. On success returns the number of source dispatched. */ |
| 96 | int pa_mainloop_dispatch(pa_mainloop *m); |
| 97 | |
| 98 | /** Return the return value as specified with the main loop's quit() routine. */ |
| 99 | int pa_mainloop_get_retval(const pa_mainloop *m); |
| 100 | |
| 101 | /** Run a single iteration of the main loop. This is a convenience function |
| 102 | for pa_mainloop_prepare(), pa_mainloop_poll() and pa_mainloop_dispatch(). |
| 103 | Returns a negative value on error or exit request. If block is nonzero, |
| 104 | block for events if none are queued. Optionally return the return value as |
| 105 | specified with the main loop's quit() routine in the integer variable retval points |
| 106 | to. On success returns the number of sources dispatched in this iteration. */ |
| 107 | int pa_mainloop_iterate(pa_mainloop *m, int block, int *retval); |
| 108 | |
| 109 | /** Run unlimited iterations of the main loop object until the main loop's |
| 110 | quit() routine is called. Returns a negative value on error. Optionally return |
| 111 | the return value as specified with the main loop's quit() routine in the integer |
| 112 | variable retval points to. */ |
| 113 | int pa_mainloop_run(pa_mainloop *m, int *retval); |
| 114 | |
| 115 | /** Return the abstract main loop abstraction layer vtable for this |
| 116 | main loop. No need to free the API as it is owned by the loop |
| 117 | and is destroyed when the loop is freed. */ |
| 118 | pa_mainloop_api* pa_mainloop_get_api(pa_mainloop*m); |
| 119 | |
| 120 | /** Shutdown the main loop with the specified return value */ |
| 121 | void pa_mainloop_quit(pa_mainloop *m, int retval); |
| 122 | |
| 123 | /** Interrupt a running poll (for threaded systems) */ |
| 124 | void pa_mainloop_wakeup(pa_mainloop *m); |
| 125 | |
| 126 | /** Generic prototype of a poll() like function */ |
| 127 | typedef int (*pa_poll_func)(struct pollfd *ufds, unsigned long nfds, int timeout, void*userdata); |
| 128 | |
| 129 | /** Change the poll() implementation */ |
| 130 | void pa_mainloop_set_poll_func(pa_mainloop *m, pa_poll_func poll_func, void *userdata); |
| 131 | |
| 132 | PA_C_DECL_END |
| 133 | |
| 134 | #endif |
| 135 | |