18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Event loop
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2002-2006, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This file defines an event loop interface that supports processing events
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * from registered timeouts (i.e., do something after N seconds), sockets
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * (e.g., a new packet available for reading), and signals. eloop.c is an
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * implementation of this interface using select() and sockets. This is
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * suitable for most UNIX/POSIX systems. When porting to other operating
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * systems, it may be necessary to replace that implementation with OS specific
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * mechanisms.
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef ELOOP_H
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ELOOP_H
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * ELOOP_ALL_CTX - eloop_cancel_timeout() magic number to match all timeouts
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ELOOP_ALL_CTX (void *) -1
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_event_type - eloop socket event type for eloop_register_sock()
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @EVENT_TYPE_READ: Socket has data available for reading
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @EVENT_TYPE_WRITE: Socket has room for new data to be written
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @EVENT_TYPE_EXCEPTION: An exception has been reported
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef enum {
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	EVENT_TYPE_READ = 0,
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	EVENT_TYPE_WRITE,
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	EVENT_TYPE_EXCEPTION
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} eloop_event_type;
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_sock_handler - eloop socket event callback type
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock: File descriptor number for the socket
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_ctx: Registered callback context data (eloop_data)
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock_ctx: Registered callback context data (user_data)
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef void (*eloop_sock_handler)(int sock, void *eloop_ctx, void *sock_ctx);
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_event_handler - eloop generic event callback type
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_ctx: Registered callback context data (eloop_data)
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock_ctx: Registered callback context data (user_data)
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef void (*eloop_event_handler)(void *eloop_data, void *user_ctx);
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_timeout_handler - eloop timeout event callback type
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_ctx: Registered callback context data (eloop_data)
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock_ctx: Registered callback context data (user_data)
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef void (*eloop_timeout_handler)(void *eloop_data, void *user_ctx);
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_signal_handler - eloop signal event callback type
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sig: Signal number
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @signal_ctx: Registered callback context data (user_data from
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_signal(), eloop_register_signal_terminate(), or
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_signal_reconfig() call)
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef void (*eloop_signal_handler)(int sig, void *signal_ctx);
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_init() - Initialize global event loop data
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function must be called before any other eloop_* function.
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_init(void);
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_read_sock - Register handler for read events
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock: File descriptor number for the socket
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Callback function to be called when data is available for reading
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_data: Callback context data (eloop_ctx)
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Callback context data (sock_ctx)
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Register a read socket notifier for the given file descriptor. The handler
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * function will be called whenever data is available for reading from the
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * socket. The handler function is responsible for clearing the event after
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * having processed it in order to avoid eloop from calling the handler again
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * for the same event.
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_register_read_sock(int sock, eloop_sock_handler handler,
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			     void *eloop_data, void *user_data);
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_unregister_read_sock - Unregister handler for read events
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock: File descriptor number for the socket
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Unregister a read socket notifier that was previously registered with
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_read_sock().
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eloop_unregister_read_sock(int sock);
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_sock - Register handler for socket events
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock: File descriptor number for the socket
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: Type of event to wait for
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Callback function to be called when the event is triggered
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_data: Callback context data (eloop_ctx)
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Callback context data (sock_ctx)
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Register an event notifier for the given socket's file descriptor. The
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * handler function will be called whenever the that event is triggered for the
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * socket. The handler function is responsible for clearing the event after
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * having processed it in order to avoid eloop from calling the handler again
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * for the same event.
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_register_sock(int sock, eloop_event_type type,
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			eloop_sock_handler handler,
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			void *eloop_data, void *user_data);
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_unregister_sock - Unregister handler for socket events
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock: File descriptor number for the socket
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: Type of event for which sock was registered
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Unregister a socket event notifier that was previously registered with
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_sock().
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eloop_unregister_sock(int sock, eloop_event_type type);
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_event - Register handler for generic events
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @event: Event to wait (eloop implementation specific)
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @event_size: Size of event data
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Callback function to be called when event is triggered
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_data: Callback context data (eloop_data)
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Callback context data (user_data)
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Register an event handler for the given event. This function is used to
1411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * register eloop implementation specific events which are mainly targeted for
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * operating system specific code (driver interface and l2_packet) since the
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * portable code will not be able to use such an OS-specific call. The handler
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * function will be called whenever the event is triggered. The handler
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * function is responsible for clearing the event after having processed it in
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * order to avoid eloop from calling the handler again for the same event.
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * In case of Windows implementation (eloop_win.c), event pointer is of HANDLE
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * type, i.e., void*. The callers are likely to have 'HANDLE h' type variable,
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * and they would call this function with eloop_register_event(h, sizeof(h),
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * ...).
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_register_event(void *event, size_t event_size,
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			 eloop_event_handler handler,
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			 void *eloop_data, void *user_data);
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_unregister_event - Unregister handler for a generic event
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @event: Event to cancel (eloop implementation specific)
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @event_size: Size of event data
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Unregister a generic event notifier that was previously registered with
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_event().
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eloop_unregister_event(void *event, size_t event_size);
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_timeout - Register timeout
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @secs: Number of seconds to the timeout
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @usecs: Number of microseconds to the timeout
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Callback function to be called when timeout occurs
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_data: Callback context data (eloop_ctx)
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Callback context data (sock_ctx)
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Register a timeout that will cause the handler function to be called after
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * given time.
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_register_timeout(unsigned int secs, unsigned int usecs,
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   eloop_timeout_handler handler,
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   void *eloop_data, void *user_data);
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_cancel_timeout - Cancel timeouts
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Matching callback function
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_data: Matching eloop_data or %ELOOP_ALL_CTX to match all
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Matching user_data or %ELOOP_ALL_CTX to match all
1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Number of cancelled timeouts
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Cancel matching <handler,eloop_data,user_data> timeouts registered with
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_timeout(). ELOOP_ALL_CTX can be used as a wildcard for
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * cancelling all timeouts regardless of eloop_data/user_data.
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_cancel_timeout(eloop_timeout_handler handler,
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			 void *eloop_data, void *user_data);
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1984b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt * eloop_cancel_timeout_one - Cancel a single timeout
1994b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt * @handler: Matching callback function
2004b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt * @eloop_data: Matching eloop_data
2014b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt * @user_data: Matching user_data
2024b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt * @remaining: Time left on the cancelled timer
2034b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt * Returns: Number of cancelled timeouts
2044b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt *
2054b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt * Cancel matching <handler,eloop_data,user_data> timeout registered with
2064b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt * eloop_register_timeout() and return the remaining time left.
2074b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt */
2084b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidtint eloop_cancel_timeout_one(eloop_timeout_handler handler,
2094b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt			     void *eloop_data, void *user_data,
210fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt			     struct os_reltime *remaining);
2114b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt
2124b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt/**
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_is_timeout_registered - Check if a timeout is already registered
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Matching callback function
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_data: Matching eloop_data
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Matching user_data
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 1 if the timeout is registered, 0 if the timeout is not registered
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Determine if a matching <handler,eloop_data,user_data> timeout is registered
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * with eloop_register_timeout().
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_is_timeout_registered(eloop_timeout_handler handler,
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				void *eloop_data, void *user_data);
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
226e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * eloop_deplete_timeout - Deplete a timeout that is already registered
227e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @req_secs: Requested number of seconds to the timeout
228e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @req_usecs: Requested number of microseconds to the timeout
229e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @handler: Matching callback function
230e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @eloop_data: Matching eloop_data
231e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * @user_data: Matching user_data
232fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt * Returns: 1 if the timeout is depleted, 0 if no change is made, -1 if no
233fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt * timeout matched
234e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt *
235e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * Find a registered matching <handler,eloop_data,user_data> timeout. If found,
236e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt * deplete the timeout if remaining time is more than the requested time.
237e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt */
238e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidtint eloop_deplete_timeout(unsigned int req_secs, unsigned int req_usecs,
239e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			  eloop_timeout_handler handler, void *eloop_data,
240e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt			  void *user_data);
241e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
242e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt/**
2435460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt * eloop_replenish_timeout - Replenish a timeout that is already registered
2445460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt * @req_secs: Requested number of seconds to the timeout
2455460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt * @req_usecs: Requested number of microseconds to the timeout
2465460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt * @handler: Matching callback function
2475460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt * @eloop_data: Matching eloop_data
2485460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt * @user_data: Matching user_data
249fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt * Returns: 1 if the timeout is replenished, 0 if no change is made, -1 if no
250fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt * timeout matched
2515460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt *
2525460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt * Find a registered matching <handler,eloop_data,user_data> timeout. If found,
2535460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt * replenish the timeout if remaining time is less than the requested time.
2545460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt */
2555460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidtint eloop_replenish_timeout(unsigned int req_secs, unsigned int req_usecs,
2565460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt			    eloop_timeout_handler handler, void *eloop_data,
2575460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt			    void *user_data);
2585460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt
2595460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt/**
2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_signal - Register handler for signals
2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sig: Signal number (e.g., SIGHUP)
2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Callback function to be called when the signal is received
2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Callback context data (signal_ctx)
2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure
2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Register a callback function that will be called when a signal is received.
2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * The callback function is actually called only after the system signal
2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * handler has returned. This means that the normal limits for sighandlers
2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * (i.e., only "safe functions" allowed) do not apply for the registered
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * callback.
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_register_signal(int sig, eloop_signal_handler handler,
2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  void *user_data);
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_signal_terminate - Register handler for terminate signals
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Callback function to be called when the signal is received
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Callback context data (signal_ctx)
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Register a callback function that will be called when a process termination
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * signal is received. The callback function is actually called only after the
2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * system signal handler has returned. This means that the normal limits for
2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * sighandlers (i.e., only "safe functions" allowed) do not apply for the
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * registered callback.
2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is a more portable version of eloop_register_signal() since
2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * the knowledge of exact details of the signals is hidden in eloop
2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * implementation. In case of operating systems using signal(), this function
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * registers handlers for SIGINT and SIGTERM.
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_register_signal_terminate(eloop_signal_handler handler,
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    void *user_data);
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_signal_reconfig - Register handler for reconfig signals
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Callback function to be called when the signal is received
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Callback context data (signal_ctx)
2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure
3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Register a callback function that will be called when a reconfiguration /
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * hangup signal is received. The callback function is actually called only
3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * after the system signal handler has returned. This means that the normal
3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * limits for sighandlers (i.e., only "safe functions" allowed) do not apply
3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * for the registered callback.
3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is a more portable version of eloop_register_signal() since
3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * the knowledge of exact details of the signals is hidden in eloop
3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * implementation. In case of operating systems using signal(), this function
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * registers a handler for SIGHUP.
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_register_signal_reconfig(eloop_signal_handler handler,
3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   void *user_data);
3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_run - Start the event loop
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Start the event loop and continue running as long as there are any
3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * registered event handlers. This function is run after event loop has been
3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * initialized with event_init() and one or more events have been registered.
3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eloop_run(void);
3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_terminate - Terminate event loop
3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Terminate event loop even if there are registered events. This can be used
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * to request the program to be terminated cleanly.
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eloop_terminate(void);
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_destroy - Free any resources allocated for the event loop
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * After calling eloop_destroy(), other eloop_* functions must not be called
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * before re-running eloop_init().
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eloop_destroy(void);
3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_terminated - Check whether event loop has been terminated
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 1 = event loop terminate, 0 = event loop still running
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function can be used to check whether eloop_terminate() has been called
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * to request termination of the event loop. This is normally used to abort
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * operations that may still be queued to be run when eloop_terminate() was
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * called.
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_terminated(void);
3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_wait_for_read_sock - Wait for a single reader
3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock: File descriptor number for the socket
3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Do a blocking wait for a single read socket.
3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eloop_wait_for_read_sock(int sock);
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ELOOP_H */
360