xref: /OK3568_Linux_fs/external/xserver/os/ospoll.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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