1*4126Szf162725 /* 2*4126Szf162725 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 3*4126Szf162725 * Use is subject to license terms. 4*4126Szf162725 */ 5*4126Szf162725 6*4126Szf162725 /* 7*4126Szf162725 * Copyright (c) 2003-2004, Jouni Malinen <jkmaline@cc.hut.fi> 8*4126Szf162725 * Sun elects to license this software under the BSD license. 9*4126Szf162725 * See README for more details. 10*4126Szf162725 */ 11*4126Szf162725 #ifndef __ELOOP_H 12*4126Szf162725 #define __ELOOP_H 13*4126Szf162725 14*4126Szf162725 #pragma ident "%Z%%M% %I% %E% SMI" 15*4126Szf162725 16*4126Szf162725 #ifdef __cplusplus 17*4126Szf162725 extern "C" { 18*4126Szf162725 #endif 19*4126Szf162725 20*4126Szf162725 #ifndef timersub 21*4126Szf162725 #define timersub(tvp, uvp, vvp) \ 22*4126Szf162725 do \ 23*4126Szf162725 { \ 24*4126Szf162725 (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ 25*4126Szf162725 (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ 26*4126Szf162725 if ((vvp)->tv_usec < 0) \ 27*4126Szf162725 { \ 28*4126Szf162725 (vvp)->tv_sec--; \ 29*4126Szf162725 (vvp)->tv_usec += 1000000; \ 30*4126Szf162725 } \ 31*4126Szf162725 } while (0) 32*4126Szf162725 #endif /* !timersub */ 33*4126Szf162725 34*4126Szf162725 #ifndef timeradd 35*4126Szf162725 #define timeradd(tvp, uvp, vvp) \ 36*4126Szf162725 do \ 37*4126Szf162725 { \ 38*4126Szf162725 (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ 39*4126Szf162725 (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ 40*4126Szf162725 if ((vvp)->tv_usec >= 1000000) \ 41*4126Szf162725 { \ 42*4126Szf162725 (vvp)->tv_sec++; \ 43*4126Szf162725 (vvp)->tv_usec -= 1000000; \ 44*4126Szf162725 } \ 45*4126Szf162725 } while (0) 46*4126Szf162725 #endif /* !timeradd */ 47*4126Szf162725 48*4126Szf162725 /* Magic number for eloop_cancel_timeout() */ 49*4126Szf162725 #define ELOOP_ALL_CTX (void *) -1 50*4126Szf162725 #define MAX_POLLFDS 32 51*4126Szf162725 52*4126Szf162725 struct eloop_sock { 53*4126Szf162725 int sock; 54*4126Szf162725 void *eloop_data; 55*4126Szf162725 void *user_data; 56*4126Szf162725 void (*handler)(int, void *, void *); 57*4126Szf162725 }; 58*4126Szf162725 59*4126Szf162725 struct eloop_timeout { 60*4126Szf162725 struct timeval time; 61*4126Szf162725 void *eloop_data; 62*4126Szf162725 void *user_data; 63*4126Szf162725 void (*handler)(void *, void *); 64*4126Szf162725 struct eloop_timeout *next; 65*4126Szf162725 }; 66*4126Szf162725 67*4126Szf162725 struct eloop_signal { 68*4126Szf162725 int sig; 69*4126Szf162725 void *user_data; 70*4126Szf162725 void (*handler)(int, void *, void *); 71*4126Szf162725 int signaled; 72*4126Szf162725 }; 73*4126Szf162725 74*4126Szf162725 struct eloop_data { 75*4126Szf162725 void *user_data; 76*4126Szf162725 77*4126Szf162725 int max_sock, reader_count; 78*4126Szf162725 struct eloop_sock *readers; 79*4126Szf162725 80*4126Szf162725 struct eloop_timeout *timeout; 81*4126Szf162725 82*4126Szf162725 int signal_count; 83*4126Szf162725 struct eloop_signal *signals; 84*4126Szf162725 int signaled; 85*4126Szf162725 86*4126Szf162725 int terminate; 87*4126Szf162725 }; 88*4126Szf162725 89*4126Szf162725 void eloop_init(void *); 90*4126Szf162725 91*4126Szf162725 int eloop_register_read_sock(int, 92*4126Szf162725 void (*handler)(int, void *, void *), void *, void *); 93*4126Szf162725 94*4126Szf162725 void eloop_unregister_read_sock(int); 95*4126Szf162725 96*4126Szf162725 int eloop_register_timeout(unsigned int, unsigned int, 97*4126Szf162725 void (*handler)(void *, void *), void *, void *); 98*4126Szf162725 99*4126Szf162725 void eloop_cancel_timeout(void (*handler)(void *, void *), void *, void *); 100*4126Szf162725 int eloop_register_signal(int, void (*handler)(int, void *, void *), void *); 101*4126Szf162725 102*4126Szf162725 void eloop_run(void); 103*4126Szf162725 void eloop_terminate(void); 104*4126Szf162725 void eloop_destroy(void); 105*4126Szf162725 106*4126Szf162725 #ifdef __cplusplus 107*4126Szf162725 } 108*4126Szf162725 #endif 109*4126Szf162725 110*4126Szf162725 #endif /* __ELOOP_H */ 111