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