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