xref: /dflybsd-src/contrib/wpa_supplicant/src/utils/eloop.h (revision 3a84a4273475ed07d0ab1c2dfeffdfedef35d9cd)
16d49e1aeSJan Lentfer /*
26d49e1aeSJan Lentfer  * Event loop
36d49e1aeSJan Lentfer  * Copyright (c) 2002-2006, Jouni Malinen <j@w1.fi>
46d49e1aeSJan Lentfer  *
53ff40c12SJohn Marino  * This software may be distributed under the terms of the BSD license.
63ff40c12SJohn Marino  * See README for more details.
76d49e1aeSJan Lentfer  *
86d49e1aeSJan Lentfer  * This file defines an event loop interface that supports processing events
96d49e1aeSJan Lentfer  * from registered timeouts (i.e., do something after N seconds), sockets
106d49e1aeSJan Lentfer  * (e.g., a new packet available for reading), and signals. eloop.c is an
116d49e1aeSJan Lentfer  * implementation of this interface using select() and sockets. This is
126d49e1aeSJan Lentfer  * suitable for most UNIX/POSIX systems. When porting to other operating
136d49e1aeSJan Lentfer  * systems, it may be necessary to replace that implementation with OS specific
146d49e1aeSJan Lentfer  * mechanisms.
156d49e1aeSJan Lentfer  */
166d49e1aeSJan Lentfer 
176d49e1aeSJan Lentfer #ifndef ELOOP_H
186d49e1aeSJan Lentfer #define ELOOP_H
196d49e1aeSJan Lentfer 
206d49e1aeSJan Lentfer /**
216d49e1aeSJan Lentfer  * ELOOP_ALL_CTX - eloop_cancel_timeout() magic number to match all timeouts
226d49e1aeSJan Lentfer  */
236d49e1aeSJan Lentfer #define ELOOP_ALL_CTX (void *) -1
246d49e1aeSJan Lentfer 
256d49e1aeSJan Lentfer /**
266d49e1aeSJan Lentfer  * eloop_event_type - eloop socket event type for eloop_register_sock()
276d49e1aeSJan Lentfer  * @EVENT_TYPE_READ: Socket has data available for reading
286d49e1aeSJan Lentfer  * @EVENT_TYPE_WRITE: Socket has room for new data to be written
296d49e1aeSJan Lentfer  * @EVENT_TYPE_EXCEPTION: An exception has been reported
306d49e1aeSJan Lentfer  */
316d49e1aeSJan Lentfer typedef enum {
326d49e1aeSJan Lentfer 	EVENT_TYPE_READ = 0,
336d49e1aeSJan Lentfer 	EVENT_TYPE_WRITE,
346d49e1aeSJan Lentfer 	EVENT_TYPE_EXCEPTION
356d49e1aeSJan Lentfer } eloop_event_type;
366d49e1aeSJan Lentfer 
376d49e1aeSJan Lentfer /**
386d49e1aeSJan Lentfer  * eloop_sock_handler - eloop socket event callback type
396d49e1aeSJan Lentfer  * @sock: File descriptor number for the socket
406d49e1aeSJan Lentfer  * @eloop_ctx: Registered callback context data (eloop_data)
416d49e1aeSJan Lentfer  * @sock_ctx: Registered callback context data (user_data)
426d49e1aeSJan Lentfer  */
436d49e1aeSJan Lentfer typedef void (*eloop_sock_handler)(int sock, void *eloop_ctx, void *sock_ctx);
446d49e1aeSJan Lentfer 
456d49e1aeSJan Lentfer /**
466d49e1aeSJan Lentfer  * eloop_event_handler - eloop generic event callback type
476d49e1aeSJan Lentfer  * @eloop_ctx: Registered callback context data (eloop_data)
48*a1157835SDaniel Fojt  * @user_ctx: Registered callback context data (user_data)
496d49e1aeSJan Lentfer  */
50*a1157835SDaniel Fojt typedef void (*eloop_event_handler)(void *eloop_ctx, void *user_ctx);
516d49e1aeSJan Lentfer 
526d49e1aeSJan Lentfer /**
536d49e1aeSJan Lentfer  * eloop_timeout_handler - eloop timeout event callback type
546d49e1aeSJan Lentfer  * @eloop_ctx: Registered callback context data (eloop_data)
55*a1157835SDaniel Fojt  * @user_ctx: Registered callback context data (user_data)
566d49e1aeSJan Lentfer  */
57*a1157835SDaniel Fojt typedef void (*eloop_timeout_handler)(void *eloop_ctx, void *user_ctx);
586d49e1aeSJan Lentfer 
596d49e1aeSJan Lentfer /**
606d49e1aeSJan Lentfer  * eloop_signal_handler - eloop signal event callback type
616d49e1aeSJan Lentfer  * @sig: Signal number
626d49e1aeSJan Lentfer  * @signal_ctx: Registered callback context data (user_data from
636d49e1aeSJan Lentfer  * eloop_register_signal(), eloop_register_signal_terminate(), or
646d49e1aeSJan Lentfer  * eloop_register_signal_reconfig() call)
656d49e1aeSJan Lentfer  */
663ff40c12SJohn Marino typedef void (*eloop_signal_handler)(int sig, void *signal_ctx);
676d49e1aeSJan Lentfer 
686d49e1aeSJan Lentfer /**
696d49e1aeSJan Lentfer  * eloop_init() - Initialize global event loop data
706d49e1aeSJan Lentfer  * Returns: 0 on success, -1 on failure
716d49e1aeSJan Lentfer  *
723ff40c12SJohn Marino  * This function must be called before any other eloop_* function.
736d49e1aeSJan Lentfer  */
743ff40c12SJohn Marino int eloop_init(void);
756d49e1aeSJan Lentfer 
766d49e1aeSJan Lentfer /**
776d49e1aeSJan Lentfer  * eloop_register_read_sock - Register handler for read events
786d49e1aeSJan Lentfer  * @sock: File descriptor number for the socket
796d49e1aeSJan Lentfer  * @handler: Callback function to be called when data is available for reading
806d49e1aeSJan Lentfer  * @eloop_data: Callback context data (eloop_ctx)
816d49e1aeSJan Lentfer  * @user_data: Callback context data (sock_ctx)
826d49e1aeSJan Lentfer  * Returns: 0 on success, -1 on failure
836d49e1aeSJan Lentfer  *
846d49e1aeSJan Lentfer  * Register a read socket notifier for the given file descriptor. The handler
856d49e1aeSJan Lentfer  * function will be called whenever data is available for reading from the
866d49e1aeSJan Lentfer  * socket. The handler function is responsible for clearing the event after
876d49e1aeSJan Lentfer  * having processed it in order to avoid eloop from calling the handler again
886d49e1aeSJan Lentfer  * for the same event.
896d49e1aeSJan Lentfer  */
906d49e1aeSJan Lentfer int eloop_register_read_sock(int sock, eloop_sock_handler handler,
916d49e1aeSJan Lentfer 			     void *eloop_data, void *user_data);
926d49e1aeSJan Lentfer 
936d49e1aeSJan Lentfer /**
946d49e1aeSJan Lentfer  * eloop_unregister_read_sock - Unregister handler for read events
956d49e1aeSJan Lentfer  * @sock: File descriptor number for the socket
966d49e1aeSJan Lentfer  *
976d49e1aeSJan Lentfer  * Unregister a read socket notifier that was previously registered with
986d49e1aeSJan Lentfer  * eloop_register_read_sock().
996d49e1aeSJan Lentfer  */
1006d49e1aeSJan Lentfer void eloop_unregister_read_sock(int sock);
1016d49e1aeSJan Lentfer 
1026d49e1aeSJan Lentfer /**
1036d49e1aeSJan Lentfer  * eloop_register_sock - Register handler for socket events
1046d49e1aeSJan Lentfer  * @sock: File descriptor number for the socket
1056d49e1aeSJan Lentfer  * @type: Type of event to wait for
1066d49e1aeSJan Lentfer  * @handler: Callback function to be called when the event is triggered
1076d49e1aeSJan Lentfer  * @eloop_data: Callback context data (eloop_ctx)
1086d49e1aeSJan Lentfer  * @user_data: Callback context data (sock_ctx)
1096d49e1aeSJan Lentfer  * Returns: 0 on success, -1 on failure
1106d49e1aeSJan Lentfer  *
1116d49e1aeSJan Lentfer  * Register an event notifier for the given socket's file descriptor. The
1126d49e1aeSJan Lentfer  * handler function will be called whenever the that event is triggered for the
1136d49e1aeSJan Lentfer  * socket. The handler function is responsible for clearing the event after
1146d49e1aeSJan Lentfer  * having processed it in order to avoid eloop from calling the handler again
1156d49e1aeSJan Lentfer  * for the same event.
1166d49e1aeSJan Lentfer  */
1176d49e1aeSJan Lentfer int eloop_register_sock(int sock, eloop_event_type type,
1186d49e1aeSJan Lentfer 			eloop_sock_handler handler,
1196d49e1aeSJan Lentfer 			void *eloop_data, void *user_data);
1206d49e1aeSJan Lentfer 
1216d49e1aeSJan Lentfer /**
1226d49e1aeSJan Lentfer  * eloop_unregister_sock - Unregister handler for socket events
1236d49e1aeSJan Lentfer  * @sock: File descriptor number for the socket
1246d49e1aeSJan Lentfer  * @type: Type of event for which sock was registered
1256d49e1aeSJan Lentfer  *
1266d49e1aeSJan Lentfer  * Unregister a socket event notifier that was previously registered with
1276d49e1aeSJan Lentfer  * eloop_register_sock().
1286d49e1aeSJan Lentfer  */
1296d49e1aeSJan Lentfer void eloop_unregister_sock(int sock, eloop_event_type type);
1306d49e1aeSJan Lentfer 
1316d49e1aeSJan Lentfer /**
1326d49e1aeSJan Lentfer  * eloop_register_event - Register handler for generic events
1336d49e1aeSJan Lentfer  * @event: Event to wait (eloop implementation specific)
1346d49e1aeSJan Lentfer  * @event_size: Size of event data
1356d49e1aeSJan Lentfer  * @handler: Callback function to be called when event is triggered
1366d49e1aeSJan Lentfer  * @eloop_data: Callback context data (eloop_data)
1376d49e1aeSJan Lentfer  * @user_data: Callback context data (user_data)
1386d49e1aeSJan Lentfer  * Returns: 0 on success, -1 on failure
1396d49e1aeSJan Lentfer  *
1406d49e1aeSJan Lentfer  * Register an event handler for the given event. This function is used to
1413ff40c12SJohn Marino  * register eloop implementation specific events which are mainly targeted for
1426d49e1aeSJan Lentfer  * operating system specific code (driver interface and l2_packet) since the
1436d49e1aeSJan Lentfer  * portable code will not be able to use such an OS-specific call. The handler
1446d49e1aeSJan Lentfer  * function will be called whenever the event is triggered. The handler
1456d49e1aeSJan Lentfer  * function is responsible for clearing the event after having processed it in
1466d49e1aeSJan Lentfer  * order to avoid eloop from calling the handler again for the same event.
1476d49e1aeSJan Lentfer  *
1486d49e1aeSJan Lentfer  * In case of Windows implementation (eloop_win.c), event pointer is of HANDLE
1496d49e1aeSJan Lentfer  * type, i.e., void*. The callers are likely to have 'HANDLE h' type variable,
1506d49e1aeSJan Lentfer  * and they would call this function with eloop_register_event(h, sizeof(h),
1516d49e1aeSJan Lentfer  * ...).
1526d49e1aeSJan Lentfer  */
1536d49e1aeSJan Lentfer int eloop_register_event(void *event, size_t event_size,
1546d49e1aeSJan Lentfer 			 eloop_event_handler handler,
1556d49e1aeSJan Lentfer 			 void *eloop_data, void *user_data);
1566d49e1aeSJan Lentfer 
1576d49e1aeSJan Lentfer /**
1586d49e1aeSJan Lentfer  * eloop_unregister_event - Unregister handler for a generic event
1596d49e1aeSJan Lentfer  * @event: Event to cancel (eloop implementation specific)
1606d49e1aeSJan Lentfer  * @event_size: Size of event data
1616d49e1aeSJan Lentfer  *
1626d49e1aeSJan Lentfer  * Unregister a generic event notifier that was previously registered with
1636d49e1aeSJan Lentfer  * eloop_register_event().
1646d49e1aeSJan Lentfer  */
1656d49e1aeSJan Lentfer void eloop_unregister_event(void *event, size_t event_size);
1666d49e1aeSJan Lentfer 
1676d49e1aeSJan Lentfer /**
1686d49e1aeSJan Lentfer  * eloop_register_timeout - Register timeout
1696d49e1aeSJan Lentfer  * @secs: Number of seconds to the timeout
1706d49e1aeSJan Lentfer  * @usecs: Number of microseconds to the timeout
1716d49e1aeSJan Lentfer  * @handler: Callback function to be called when timeout occurs
1726d49e1aeSJan Lentfer  * @eloop_data: Callback context data (eloop_ctx)
1736d49e1aeSJan Lentfer  * @user_data: Callback context data (sock_ctx)
1746d49e1aeSJan Lentfer  * Returns: 0 on success, -1 on failure
1756d49e1aeSJan Lentfer  *
1766d49e1aeSJan Lentfer  * Register a timeout that will cause the handler function to be called after
1776d49e1aeSJan Lentfer  * given time.
1786d49e1aeSJan Lentfer  */
1796d49e1aeSJan Lentfer int eloop_register_timeout(unsigned int secs, unsigned int usecs,
1806d49e1aeSJan Lentfer 			   eloop_timeout_handler handler,
1816d49e1aeSJan Lentfer 			   void *eloop_data, void *user_data);
1826d49e1aeSJan Lentfer 
1836d49e1aeSJan Lentfer /**
1846d49e1aeSJan Lentfer  * eloop_cancel_timeout - Cancel timeouts
1856d49e1aeSJan Lentfer  * @handler: Matching callback function
1866d49e1aeSJan Lentfer  * @eloop_data: Matching eloop_data or %ELOOP_ALL_CTX to match all
1876d49e1aeSJan Lentfer  * @user_data: Matching user_data or %ELOOP_ALL_CTX to match all
1886d49e1aeSJan Lentfer  * Returns: Number of cancelled timeouts
1896d49e1aeSJan Lentfer  *
1906d49e1aeSJan Lentfer  * Cancel matching <handler,eloop_data,user_data> timeouts registered with
1916d49e1aeSJan Lentfer  * eloop_register_timeout(). ELOOP_ALL_CTX can be used as a wildcard for
1926d49e1aeSJan Lentfer  * cancelling all timeouts regardless of eloop_data/user_data.
1936d49e1aeSJan Lentfer  */
1946d49e1aeSJan Lentfer int eloop_cancel_timeout(eloop_timeout_handler handler,
1956d49e1aeSJan Lentfer 			 void *eloop_data, void *user_data);
1966d49e1aeSJan Lentfer 
1976d49e1aeSJan Lentfer /**
1983ff40c12SJohn Marino  * eloop_cancel_timeout_one - Cancel a single timeout
1993ff40c12SJohn Marino  * @handler: Matching callback function
2003ff40c12SJohn Marino  * @eloop_data: Matching eloop_data
2013ff40c12SJohn Marino  * @user_data: Matching user_data
2023ff40c12SJohn Marino  * @remaining: Time left on the cancelled timer
2033ff40c12SJohn Marino  * Returns: Number of cancelled timeouts
2043ff40c12SJohn Marino  *
2053ff40c12SJohn Marino  * Cancel matching <handler,eloop_data,user_data> timeout registered with
2063ff40c12SJohn Marino  * eloop_register_timeout() and return the remaining time left.
2073ff40c12SJohn Marino  */
2083ff40c12SJohn Marino int eloop_cancel_timeout_one(eloop_timeout_handler handler,
2093ff40c12SJohn Marino 			     void *eloop_data, void *user_data,
2103ff40c12SJohn Marino 			     struct os_reltime *remaining);
2113ff40c12SJohn Marino 
2123ff40c12SJohn Marino /**
2136d49e1aeSJan Lentfer  * eloop_is_timeout_registered - Check if a timeout is already registered
2146d49e1aeSJan Lentfer  * @handler: Matching callback function
2156d49e1aeSJan Lentfer  * @eloop_data: Matching eloop_data
2166d49e1aeSJan Lentfer  * @user_data: Matching user_data
2176d49e1aeSJan Lentfer  * Returns: 1 if the timeout is registered, 0 if the timeout is not registered
2186d49e1aeSJan Lentfer  *
2196d49e1aeSJan Lentfer  * Determine if a matching <handler,eloop_data,user_data> timeout is registered
2206d49e1aeSJan Lentfer  * with eloop_register_timeout().
2216d49e1aeSJan Lentfer  */
2226d49e1aeSJan Lentfer int eloop_is_timeout_registered(eloop_timeout_handler handler,
2236d49e1aeSJan Lentfer 				void *eloop_data, void *user_data);
2246d49e1aeSJan Lentfer 
2256d49e1aeSJan Lentfer /**
2263ff40c12SJohn Marino  * eloop_deplete_timeout - Deplete a timeout that is already registered
2273ff40c12SJohn Marino  * @req_secs: Requested number of seconds to the timeout
2283ff40c12SJohn Marino  * @req_usecs: Requested number of microseconds to the timeout
2293ff40c12SJohn Marino  * @handler: Matching callback function
2303ff40c12SJohn Marino  * @eloop_data: Matching eloop_data
2313ff40c12SJohn Marino  * @user_data: Matching user_data
2323ff40c12SJohn Marino  * Returns: 1 if the timeout is depleted, 0 if no change is made, -1 if no
2333ff40c12SJohn Marino  * timeout matched
2343ff40c12SJohn Marino  *
2353ff40c12SJohn Marino  * Find a registered matching <handler,eloop_data,user_data> timeout. If found,
2363ff40c12SJohn Marino  * deplete the timeout if remaining time is more than the requested time.
2373ff40c12SJohn Marino  */
2383ff40c12SJohn Marino int eloop_deplete_timeout(unsigned int req_secs, unsigned int req_usecs,
2393ff40c12SJohn Marino 			  eloop_timeout_handler handler, void *eloop_data,
2403ff40c12SJohn Marino 			  void *user_data);
2413ff40c12SJohn Marino 
2423ff40c12SJohn Marino /**
2433ff40c12SJohn Marino  * eloop_replenish_timeout - Replenish a timeout that is already registered
2443ff40c12SJohn Marino  * @req_secs: Requested number of seconds to the timeout
2453ff40c12SJohn Marino  * @req_usecs: Requested number of microseconds to the timeout
2463ff40c12SJohn Marino  * @handler: Matching callback function
2473ff40c12SJohn Marino  * @eloop_data: Matching eloop_data
2483ff40c12SJohn Marino  * @user_data: Matching user_data
2493ff40c12SJohn Marino  * Returns: 1 if the timeout is replenished, 0 if no change is made, -1 if no
2503ff40c12SJohn Marino  * timeout matched
2513ff40c12SJohn Marino  *
2523ff40c12SJohn Marino  * Find a registered matching <handler,eloop_data,user_data> timeout. If found,
2533ff40c12SJohn Marino  * replenish the timeout if remaining time is less than the requested time.
2543ff40c12SJohn Marino  */
2553ff40c12SJohn Marino int eloop_replenish_timeout(unsigned int req_secs, unsigned int req_usecs,
2563ff40c12SJohn Marino 			    eloop_timeout_handler handler, void *eloop_data,
2573ff40c12SJohn Marino 			    void *user_data);
2583ff40c12SJohn Marino 
2593ff40c12SJohn Marino /**
2606d49e1aeSJan Lentfer  * eloop_register_signal - Register handler for signals
2616d49e1aeSJan Lentfer  * @sig: Signal number (e.g., SIGHUP)
2626d49e1aeSJan Lentfer  * @handler: Callback function to be called when the signal is received
2636d49e1aeSJan Lentfer  * @user_data: Callback context data (signal_ctx)
2646d49e1aeSJan Lentfer  * Returns: 0 on success, -1 on failure
2656d49e1aeSJan Lentfer  *
2666d49e1aeSJan Lentfer  * Register a callback function that will be called when a signal is received.
2676d49e1aeSJan Lentfer  * The callback function is actually called only after the system signal
2686d49e1aeSJan Lentfer  * handler has returned. This means that the normal limits for sighandlers
2696d49e1aeSJan Lentfer  * (i.e., only "safe functions" allowed) do not apply for the registered
2706d49e1aeSJan Lentfer  * callback.
2716d49e1aeSJan Lentfer  */
2726d49e1aeSJan Lentfer int eloop_register_signal(int sig, eloop_signal_handler handler,
2736d49e1aeSJan Lentfer 			  void *user_data);
2746d49e1aeSJan Lentfer 
2756d49e1aeSJan Lentfer /**
2766d49e1aeSJan Lentfer  * eloop_register_signal_terminate - Register handler for terminate signals
2776d49e1aeSJan Lentfer  * @handler: Callback function to be called when the signal is received
2786d49e1aeSJan Lentfer  * @user_data: Callback context data (signal_ctx)
2796d49e1aeSJan Lentfer  * Returns: 0 on success, -1 on failure
2806d49e1aeSJan Lentfer  *
2816d49e1aeSJan Lentfer  * Register a callback function that will be called when a process termination
2826d49e1aeSJan Lentfer  * signal is received. The callback function is actually called only after the
2836d49e1aeSJan Lentfer  * system signal handler has returned. This means that the normal limits for
2846d49e1aeSJan Lentfer  * sighandlers (i.e., only "safe functions" allowed) do not apply for the
2856d49e1aeSJan Lentfer  * registered callback.
2866d49e1aeSJan Lentfer  *
2876d49e1aeSJan Lentfer  * This function is a more portable version of eloop_register_signal() since
2886d49e1aeSJan Lentfer  * the knowledge of exact details of the signals is hidden in eloop
2896d49e1aeSJan Lentfer  * implementation. In case of operating systems using signal(), this function
2906d49e1aeSJan Lentfer  * registers handlers for SIGINT and SIGTERM.
2916d49e1aeSJan Lentfer  */
2926d49e1aeSJan Lentfer int eloop_register_signal_terminate(eloop_signal_handler handler,
2936d49e1aeSJan Lentfer 				    void *user_data);
2946d49e1aeSJan Lentfer 
2956d49e1aeSJan Lentfer /**
2966d49e1aeSJan Lentfer  * eloop_register_signal_reconfig - Register handler for reconfig signals
2976d49e1aeSJan Lentfer  * @handler: Callback function to be called when the signal is received
2986d49e1aeSJan Lentfer  * @user_data: Callback context data (signal_ctx)
2996d49e1aeSJan Lentfer  * Returns: 0 on success, -1 on failure
3006d49e1aeSJan Lentfer  *
3016d49e1aeSJan Lentfer  * Register a callback function that will be called when a reconfiguration /
3026d49e1aeSJan Lentfer  * hangup signal is received. The callback function is actually called only
3036d49e1aeSJan Lentfer  * after the system signal handler has returned. This means that the normal
3046d49e1aeSJan Lentfer  * limits for sighandlers (i.e., only "safe functions" allowed) do not apply
3056d49e1aeSJan Lentfer  * for the registered callback.
3066d49e1aeSJan Lentfer  *
3076d49e1aeSJan Lentfer  * This function is a more portable version of eloop_register_signal() since
3086d49e1aeSJan Lentfer  * the knowledge of exact details of the signals is hidden in eloop
3096d49e1aeSJan Lentfer  * implementation. In case of operating systems using signal(), this function
3106d49e1aeSJan Lentfer  * registers a handler for SIGHUP.
3116d49e1aeSJan Lentfer  */
3126d49e1aeSJan Lentfer int eloop_register_signal_reconfig(eloop_signal_handler handler,
3136d49e1aeSJan Lentfer 				   void *user_data);
3146d49e1aeSJan Lentfer 
3156d49e1aeSJan Lentfer /**
316*a1157835SDaniel Fojt  * eloop_sock_requeue - Requeue sockets
317*a1157835SDaniel Fojt  *
318*a1157835SDaniel Fojt  * Requeue sockets after forking because some implementations require this,
319*a1157835SDaniel Fojt  * such as epoll and kqueue.
320*a1157835SDaniel Fojt  */
321*a1157835SDaniel Fojt int eloop_sock_requeue(void);
322*a1157835SDaniel Fojt 
323*a1157835SDaniel Fojt /**
3246d49e1aeSJan Lentfer  * eloop_run - Start the event loop
3256d49e1aeSJan Lentfer  *
3266d49e1aeSJan Lentfer  * Start the event loop and continue running as long as there are any
3276d49e1aeSJan Lentfer  * registered event handlers. This function is run after event loop has been
3286d49e1aeSJan Lentfer  * initialized with event_init() and one or more events have been registered.
3296d49e1aeSJan Lentfer  */
3306d49e1aeSJan Lentfer void eloop_run(void);
3316d49e1aeSJan Lentfer 
3326d49e1aeSJan Lentfer /**
3336d49e1aeSJan Lentfer  * eloop_terminate - Terminate event loop
3346d49e1aeSJan Lentfer  *
3356d49e1aeSJan Lentfer  * Terminate event loop even if there are registered events. This can be used
3366d49e1aeSJan Lentfer  * to request the program to be terminated cleanly.
3376d49e1aeSJan Lentfer  */
3386d49e1aeSJan Lentfer void eloop_terminate(void);
3396d49e1aeSJan Lentfer 
3406d49e1aeSJan Lentfer /**
3416d49e1aeSJan Lentfer  * eloop_destroy - Free any resources allocated for the event loop
3426d49e1aeSJan Lentfer  *
3436d49e1aeSJan Lentfer  * After calling eloop_destroy(), other eloop_* functions must not be called
3446d49e1aeSJan Lentfer  * before re-running eloop_init().
3456d49e1aeSJan Lentfer  */
3466d49e1aeSJan Lentfer void eloop_destroy(void);
3476d49e1aeSJan Lentfer 
3486d49e1aeSJan Lentfer /**
3496d49e1aeSJan Lentfer  * eloop_terminated - Check whether event loop has been terminated
3506d49e1aeSJan Lentfer  * Returns: 1 = event loop terminate, 0 = event loop still running
3516d49e1aeSJan Lentfer  *
3526d49e1aeSJan Lentfer  * This function can be used to check whether eloop_terminate() has been called
3536d49e1aeSJan Lentfer  * to request termination of the event loop. This is normally used to abort
3546d49e1aeSJan Lentfer  * operations that may still be queued to be run when eloop_terminate() was
3556d49e1aeSJan Lentfer  * called.
3566d49e1aeSJan Lentfer  */
3576d49e1aeSJan Lentfer int eloop_terminated(void);
3586d49e1aeSJan Lentfer 
3596d49e1aeSJan Lentfer /**
3606d49e1aeSJan Lentfer  * eloop_wait_for_read_sock - Wait for a single reader
3616d49e1aeSJan Lentfer  * @sock: File descriptor number for the socket
3626d49e1aeSJan Lentfer  *
3636d49e1aeSJan Lentfer  * Do a blocking wait for a single read socket.
3646d49e1aeSJan Lentfer  */
3656d49e1aeSJan Lentfer void eloop_wait_for_read_sock(int sock);
3666d49e1aeSJan Lentfer 
3676d49e1aeSJan Lentfer #endif /* ELOOP_H */
368