summaryrefslogtreecommitdiff
path: root/xserver/os/ospoll.h
blob: cdc45f4d946c9247971ac0294f180ce5a849c23e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
 * Copyright © 2016 Keith Packard
 *
 * Permission to use, copy, modify, distribute, and sell this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * the above copyright notice appear in all copies and that both that copyright
 * notice and this permission notice appear in supporting documentation, and
 * that the name of the copyright holders not be used in advertising or
 * publicity pertaining to distribution of the software without specific,
 * written prior permission.  The copyright holders make no representations
 * about the suitability of this software for any purpose.  It is provided "as
 * is" without express or implied warranty.
 *
 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
 * OF THIS SOFTWARE.
 */

#ifndef _OSPOLL_H_
#define _OSPOLL_H_

/* Forward declaration */
struct ospoll;

/**
 * ospoll_wait trigger mode
 *
 * @ospoll_trigger_edge
 *      Trigger only when going from no data available
 *      to data available.
 *
 * @ospoll_trigger_level
 *      Trigger whenever there is data available
 */
enum ospoll_trigger {
    ospoll_trigger_edge,
    ospoll_trigger_level
};

/**
 * Create a new ospoll structure
 */
struct ospoll *
ospoll_create(void);

/**
 * Destroy an ospoll structure
 *
 * @param       ospoll          ospoll to destroy
 */
void
ospoll_destroy(struct ospoll *ospoll);

/**
 * Add a file descriptor to monitor
 *
 * @param       ospoll          ospoll to add to
 * @param       fd              File descriptor to monitor
 * @param       trigger         Trigger mode for ospoll_wait
 * @param       callback        Function to call when triggered
 * @param       data            Extra data to pass callback
 */
Bool
ospoll_add(struct ospoll *ospoll, int fd,
           enum ospoll_trigger trigger,
           void (*callback)(int fd, int xevents, void *data),
           void *data);

/**
 * Remove a monitored file descriptor
 *
 * @param       ospoll          ospoll to remove from
 * @param       fd              File descriptor to stop monitoring
 */
void
ospoll_remove(struct ospoll *ospoll, int fd);

/**
 * Listen on additional events
 *
 * @param       ospoll          ospoll monitoring fd
 * @param       fd              File descriptor to change
 * @param       events          Additional events to trigger on
 */
void
ospoll_listen(struct ospoll *ospoll, int fd, int xevents);

/**
 * Stop listening on events
 *
 * @param       ospoll          ospoll monitoring fd
 * @param       fd              File descriptor to change
 * @param       events          events to stop triggering on
 */
void
ospoll_mute(struct ospoll *ospoll, int fd, int xevents);

/**
 * Wait for events
 *
 * @param       ospoll          ospoll to wait on
 * @param       timeout         < 0 wait forever
 *                              = 0 check and return
 *                              > 0 timeout in milliseconds
 * @return      < 0 error
 *              = 0 timeout
 *              > 0 number of events delivered
 */
int
ospoll_wait(struct ospoll *ospoll, int timeout);

/**
 * Reset edge trigger status
 *
 * @param       ospoll          ospoll monitoring fd
 * @param       fd              file descriptor
 *
 * ospoll_reset_events resets the state of an edge-triggered
 * fd so that ospoll_wait calls will report events again.
 *
 * Call this after a read/recv operation reports no more data available.
 */
void
ospoll_reset_events(struct ospoll *ospoll, int fd);

/**
 * Fetch the data associated with an fd
 *
 * @param       ospoll          ospoll monitoring fd
 * @param       fd              file descriptor
 *
 * @return      data parameter passed to ospoll_add call on
 *              this file descriptor
 */
void *
ospoll_data(struct ospoll *ospoll, int fd);

#endif /* _OSPOLL_H_ */