1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright © 2016 Keith Packard 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Permission to use, copy, modify, distribute, and sell this software and its 5*4882a593Smuzhiyun * documentation for any purpose is hereby granted without fee, provided that 6*4882a593Smuzhiyun * the above copyright notice appear in all copies and that both that copyright 7*4882a593Smuzhiyun * notice and this permission notice appear in supporting documentation, and 8*4882a593Smuzhiyun * that the name of the copyright holders not be used in advertising or 9*4882a593Smuzhiyun * publicity pertaining to distribution of the software without specific, 10*4882a593Smuzhiyun * written prior permission. The copyright holders make no representations 11*4882a593Smuzhiyun * about the suitability of this software for any purpose. It is provided "as 12*4882a593Smuzhiyun * is" without express or implied warranty. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15*4882a593Smuzhiyun * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16*4882a593Smuzhiyun * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17*4882a593Smuzhiyun * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18*4882a593Smuzhiyun * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19*4882a593Smuzhiyun * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 20*4882a593Smuzhiyun * OF THIS SOFTWARE. 21*4882a593Smuzhiyun */ 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #ifndef _OSPOLL_H_ 24*4882a593Smuzhiyun #define _OSPOLL_H_ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* Forward declaration */ 27*4882a593Smuzhiyun struct ospoll; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /** 30*4882a593Smuzhiyun * ospoll_wait trigger mode 31*4882a593Smuzhiyun * 32*4882a593Smuzhiyun * @ospoll_trigger_edge 33*4882a593Smuzhiyun * Trigger only when going from no data available 34*4882a593Smuzhiyun * to data available. 35*4882a593Smuzhiyun * 36*4882a593Smuzhiyun * @ospoll_trigger_level 37*4882a593Smuzhiyun * Trigger whenever there is data available 38*4882a593Smuzhiyun */ 39*4882a593Smuzhiyun enum ospoll_trigger { 40*4882a593Smuzhiyun ospoll_trigger_edge, 41*4882a593Smuzhiyun ospoll_trigger_level 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /** 45*4882a593Smuzhiyun * Create a new ospoll structure 46*4882a593Smuzhiyun */ 47*4882a593Smuzhiyun struct ospoll * 48*4882a593Smuzhiyun ospoll_create(void); 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /** 51*4882a593Smuzhiyun * Destroy an ospoll structure 52*4882a593Smuzhiyun * 53*4882a593Smuzhiyun * @param ospoll ospoll to destroy 54*4882a593Smuzhiyun */ 55*4882a593Smuzhiyun void 56*4882a593Smuzhiyun ospoll_destroy(struct ospoll *ospoll); 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /** 59*4882a593Smuzhiyun * Add a file descriptor to monitor 60*4882a593Smuzhiyun * 61*4882a593Smuzhiyun * @param ospoll ospoll to add to 62*4882a593Smuzhiyun * @param fd File descriptor to monitor 63*4882a593Smuzhiyun * @param trigger Trigger mode for ospoll_wait 64*4882a593Smuzhiyun * @param callback Function to call when triggered 65*4882a593Smuzhiyun * @param data Extra data to pass callback 66*4882a593Smuzhiyun */ 67*4882a593Smuzhiyun Bool 68*4882a593Smuzhiyun ospoll_add(struct ospoll *ospoll, int fd, 69*4882a593Smuzhiyun enum ospoll_trigger trigger, 70*4882a593Smuzhiyun void (*callback)(int fd, int xevents, void *data), 71*4882a593Smuzhiyun void *data); 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /** 74*4882a593Smuzhiyun * Remove a monitored file descriptor 75*4882a593Smuzhiyun * 76*4882a593Smuzhiyun * @param ospoll ospoll to remove from 77*4882a593Smuzhiyun * @param fd File descriptor to stop monitoring 78*4882a593Smuzhiyun */ 79*4882a593Smuzhiyun void 80*4882a593Smuzhiyun ospoll_remove(struct ospoll *ospoll, int fd); 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /** 83*4882a593Smuzhiyun * Listen on additional events 84*4882a593Smuzhiyun * 85*4882a593Smuzhiyun * @param ospoll ospoll monitoring fd 86*4882a593Smuzhiyun * @param fd File descriptor to change 87*4882a593Smuzhiyun * @param events Additional events to trigger on 88*4882a593Smuzhiyun */ 89*4882a593Smuzhiyun void 90*4882a593Smuzhiyun ospoll_listen(struct ospoll *ospoll, int fd, int xevents); 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun /** 93*4882a593Smuzhiyun * Stop listening on events 94*4882a593Smuzhiyun * 95*4882a593Smuzhiyun * @param ospoll ospoll monitoring fd 96*4882a593Smuzhiyun * @param fd File descriptor to change 97*4882a593Smuzhiyun * @param events events to stop triggering on 98*4882a593Smuzhiyun */ 99*4882a593Smuzhiyun void 100*4882a593Smuzhiyun ospoll_mute(struct ospoll *ospoll, int fd, int xevents); 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun /** 103*4882a593Smuzhiyun * Wait for events 104*4882a593Smuzhiyun * 105*4882a593Smuzhiyun * @param ospoll ospoll to wait on 106*4882a593Smuzhiyun * @param timeout < 0 wait forever 107*4882a593Smuzhiyun * = 0 check and return 108*4882a593Smuzhiyun * > 0 timeout in milliseconds 109*4882a593Smuzhiyun * @return < 0 error 110*4882a593Smuzhiyun * = 0 timeout 111*4882a593Smuzhiyun * > 0 number of events delivered 112*4882a593Smuzhiyun */ 113*4882a593Smuzhiyun int 114*4882a593Smuzhiyun ospoll_wait(struct ospoll *ospoll, int timeout); 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun /** 117*4882a593Smuzhiyun * Reset edge trigger status 118*4882a593Smuzhiyun * 119*4882a593Smuzhiyun * @param ospoll ospoll monitoring fd 120*4882a593Smuzhiyun * @param fd file descriptor 121*4882a593Smuzhiyun * 122*4882a593Smuzhiyun * ospoll_reset_events resets the state of an edge-triggered 123*4882a593Smuzhiyun * fd so that ospoll_wait calls will report events again. 124*4882a593Smuzhiyun * 125*4882a593Smuzhiyun * Call this after a read/recv operation reports no more data available. 126*4882a593Smuzhiyun */ 127*4882a593Smuzhiyun void 128*4882a593Smuzhiyun ospoll_reset_events(struct ospoll *ospoll, int fd); 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun /** 131*4882a593Smuzhiyun * Fetch the data associated with an fd 132*4882a593Smuzhiyun * 133*4882a593Smuzhiyun * @param ospoll ospoll monitoring fd 134*4882a593Smuzhiyun * @param fd file descriptor 135*4882a593Smuzhiyun * 136*4882a593Smuzhiyun * @return data parameter passed to ospoll_add call on 137*4882a593Smuzhiyun * this file descriptor 138*4882a593Smuzhiyun */ 139*4882a593Smuzhiyun void * 140*4882a593Smuzhiyun ospoll_data(struct ospoll *ospoll, int fd); 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun #endif /* _OSPOLL_H_ */ 143