RTEMS
6.3
Toggle main menu visibility
Loading...
Searching...
No Matches
cpukit
include
sys
event.h
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3
*
4
* Copyright (c) 1999,2000,2001 Jonathan Lemon <jlemon@FreeBSD.org>
5
* All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
*
16
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26
* SUCH DAMAGE.
27
*
28
* $FreeBSD: head/sys/sys/event.h 336457 2018-07-18 13:04:03Z dab $
29
*/
30
31
#ifndef _SYS_EVENT_H_
32
#define _SYS_EVENT_H_
33
34
#include <sys/_types.h>
35
#include <sys/queue.h>
36
37
#define EVFILT_READ (-1)
38
#define EVFILT_WRITE (-2)
39
#define EVFILT_AIO (-3)
/* attached to aio requests */
40
#define EVFILT_VNODE (-4)
/* attached to vnodes */
41
#define EVFILT_PROC (-5)
/* attached to struct proc */
42
#define EVFILT_SIGNAL (-6)
/* attached to struct proc */
43
#define EVFILT_TIMER (-7)
/* timers */
44
#define EVFILT_PROCDESC (-8)
/* attached to process descriptors */
45
#define EVFILT_FS (-9)
/* filesystem events */
46
#define EVFILT_LIO (-10)
/* attached to lio requests */
47
#define EVFILT_USER (-11)
/* User events */
48
#define EVFILT_SENDFILE (-12)
/* attached to sendfile requests */
49
#define EVFILT_EMPTY (-13)
/* empty send socket buf */
50
#define EVFILT_SYSCOUNT 13
51
52
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
53
#define EV_SET(kevp_, a, b, c, d, e, f) do { \
54
*(kevp_) = (struct kevent){ \
55
.ident = (a), \
56
.filter = (b), \
57
.flags = (c), \
58
.fflags = (d), \
59
.data = (e), \
60
.udata = (f), \
61
.ext = {0}, \
62
}; \
63
} while(0)
64
#else
/* Pre-C99 or not STDC (e.g., C++) */
65
/* The definition of the local variable kevp could possibly conflict
66
* with a user-defined value passed in parameters a-f.
67
*/
68
#define EV_SET(kevp_, a, b, c, d, e, f) do { \
69
struct kevent *kevp = (kevp_); \
70
(kevp)->ident = (a); \
71
(kevp)->filter = (b); \
72
(kevp)->flags = (c); \
73
(kevp)->fflags = (d); \
74
(kevp)->data = (e); \
75
(kevp)->udata = (f); \
76
(kevp)->ext[0] = 0; \
77
(kevp)->ext[1] = 0; \
78
(kevp)->ext[2] = 0; \
79
(kevp)->ext[3] = 0; \
80
} while(0)
81
#endif
82
83
struct
kevent
{
84
__uintptr_t ident;
/* identifier for this event */
85
short
filter;
/* filter for event */
86
unsigned
short
flags;
/* action flags for kqueue */
87
unsigned
int
fflags;
/* filter flag value */
88
__int64_t data;
/* filter data value */
89
void
*udata;
/* opaque user data identifier */
90
__uint64_t ext[4];
/* extensions */
91
};
92
93
#if defined(_WANT_FREEBSD11_KEVENT)
94
/* Older structure used in FreeBSD 11.x and older. */
95
struct
kevent_freebsd11 {
96
__uintptr_t ident;
/* identifier for this event */
97
short
filter;
/* filter for event */
98
unsigned
short
flags;
99
unsigned
int
fflags;
100
__intptr_t data;
101
void
*udata;
/* opaque user data identifier */
102
};
103
#endif
104
105
#if defined(_WANT_KEVENT32) || (defined(_KERNEL) && defined(__LP64__))
106
struct
kevent32 {
107
uint32_t ident;
/* identifier for this event */
108
short
filter;
/* filter for event */
109
u_short flags;
110
u_int fflags;
111
#ifndef __amd64__
112
uint32_t pad0;
113
#endif
114
int32_t data1, data2;
115
uint32_t udata;
/* opaque user data identifier */
116
#ifndef __amd64__
117
uint32_t pad1;
118
#endif
119
uint32_t ext64[8];
120
};
121
122
#ifdef _WANT_FREEBSD11_KEVENT
123
struct
kevent32_freebsd11 {
124
u_int32_t ident;
/* identifier for this event */
125
short
filter;
/* filter for event */
126
u_short flags;
127
u_int fflags;
128
int32_t data;
129
u_int32_t udata;
/* opaque user data identifier */
130
};
131
#endif
132
#endif
133
134
/* actions */
135
#define EV_ADD 0x0001
/* add event to kq (implies enable) */
136
#define EV_DELETE 0x0002
/* delete event from kq */
137
#define EV_ENABLE 0x0004
/* enable event */
138
#define EV_DISABLE 0x0008
/* disable event (not reported) */
139
#define EV_FORCEONESHOT 0x0100
/* enable _ONESHOT and force trigger */
140
141
/* flags */
142
#define EV_ONESHOT 0x0010
/* only report one occurrence */
143
#define EV_CLEAR 0x0020
/* clear event state after reporting */
144
#define EV_RECEIPT 0x0040
/* force EV_ERROR on success, data=0 */
145
#define EV_DISPATCH 0x0080
/* disable event after reporting */
146
147
#define EV_SYSFLAGS 0xF000
/* reserved by system */
148
#define EV_DROP 0x1000
/* note should be dropped */
149
#define EV_FLAG1 0x2000
/* filter-specific flag */
150
#define EV_FLAG2 0x4000
/* filter-specific flag */
151
152
/* returned values */
153
#define EV_EOF 0x8000
/* EOF detected */
154
#define EV_ERROR 0x4000
/* error, data contains errno */
155
156
/*
157
* data/hint flags/masks for EVFILT_USER, shared with userspace
158
*
159
* On input, the top two bits of fflags specifies how the lower twenty four
160
* bits should be applied to the stored value of fflags.
161
*
162
* On output, the top two bits will always be set to NOTE_FFNOP and the
163
* remaining twenty four bits will contain the stored fflags value.
164
*/
165
#define NOTE_FFNOP 0x00000000
/* ignore input fflags */
166
#define NOTE_FFAND 0x40000000
/* AND fflags */
167
#define NOTE_FFOR 0x80000000
/* OR fflags */
168
#define NOTE_FFCOPY 0xc0000000
/* copy fflags */
169
#define NOTE_FFCTRLMASK 0xc0000000
/* masks for operations */
170
#define NOTE_FFLAGSMASK 0x00ffffff
171
172
#define NOTE_TRIGGER 0x01000000
/* Cause the event to be
173
triggered for output. */
174
175
/*
176
* data/hint flags for EVFILT_{READ|WRITE}, shared with userspace
177
*/
178
#define NOTE_LOWAT 0x0001
/* low water mark */
179
#define NOTE_FILE_POLL 0x0002
/* behave like poll() */
180
181
/*
182
* data/hint flags for EVFILT_VNODE, shared with userspace
183
*/
184
#define NOTE_DELETE 0x0001
/* vnode was removed */
185
#define NOTE_WRITE 0x0002
/* data contents changed */
186
#define NOTE_EXTEND 0x0004
/* size increased */
187
#define NOTE_ATTRIB 0x0008
/* attributes changed */
188
#define NOTE_LINK 0x0010
/* link count changed */
189
#define NOTE_RENAME 0x0020
/* vnode was renamed */
190
#define NOTE_REVOKE 0x0040
/* vnode access was revoked */
191
#define NOTE_OPEN 0x0080
/* vnode was opened */
192
#define NOTE_CLOSE 0x0100
/* file closed, fd did not
193
allowed write */
194
#define NOTE_CLOSE_WRITE 0x0200
/* file closed, fd did allowed
195
write */
196
#define NOTE_READ 0x0400
/* file was read */
197
198
/*
199
* data/hint flags for EVFILT_PROC and EVFILT_PROCDESC, shared with userspace
200
*/
201
#define NOTE_EXIT 0x80000000
/* process exited */
202
#define NOTE_FORK 0x40000000
/* process forked */
203
#define NOTE_EXEC 0x20000000
/* process exec'd */
204
#define NOTE_PCTRLMASK 0xf0000000
/* mask for hint bits */
205
#define NOTE_PDATAMASK 0x000fffff
/* mask for pid */
206
207
/* additional flags for EVFILT_PROC */
208
#define NOTE_TRACK 0x00000001
/* follow across forks */
209
#define NOTE_TRACKERR 0x00000002
/* could not track child */
210
#define NOTE_CHILD 0x00000004
/* am a child process */
211
212
/* additional flags for EVFILT_TIMER */
213
#define NOTE_SECONDS 0x00000001
/* data is seconds */
214
#define NOTE_MSECONDS 0x00000002
/* data is milliseconds */
215
#define NOTE_USECONDS 0x00000004
/* data is microseconds */
216
#define NOTE_NSECONDS 0x00000008
/* data is nanoseconds */
217
#define NOTE_ABSTIME 0x00000010
/* timeout is absolute */
218
219
struct
knote;
220
SLIST_HEAD(klist, knote);
221
struct
kqueue;
222
TAILQ_HEAD(kqlist, kqueue);
223
struct
knlist
{
224
struct
klist kl_list;
225
void (*kl_lock)(
void
*);
/* lock function */
226
void (*kl_unlock)(
void
*);
227
void (*kl_assert_locked)(
void
*);
228
void (*kl_assert_unlocked)(
void
*);
229
void
*kl_lockarg;
/* argument passed to lock functions */
230
int
kl_autodestroy;
231
};
232
233
234
#ifdef _KERNEL
235
236
/*
237
* Flags for knote call
238
*/
239
#define KNF_LISTLOCKED 0x0001
/* knlist is locked */
240
#define KNF_NOKQLOCK 0x0002
/* do not keep KQ_LOCK */
241
242
#define KNOTE(list, hint, flags) knote(list, hint, flags)
243
#define KNOTE_LOCKED(list, hint) knote(list, hint, KNF_LISTLOCKED)
244
#define KNOTE_UNLOCKED(list, hint) knote(list, hint, 0)
245
246
#define KNLIST_EMPTY(list) SLIST_EMPTY(&(list)->kl_list)
247
248
/*
249
* Flag indicating hint is a signal. Used by EVFILT_SIGNAL, and also
250
* shared by EVFILT_PROC (all knotes attached to p->p_klist)
251
*/
252
#define NOTE_SIGNAL 0x08000000
253
254
/*
255
* Hint values for the optional f_touch event filter. If f_touch is not set
256
* to NULL and f_isfd is zero the f_touch filter will be called with the type
257
* argument set to EVENT_REGISTER during a kevent() system call. It is also
258
* called under the same conditions with the type argument set to EVENT_PROCESS
259
* when the event has been triggered.
260
*/
261
#define EVENT_REGISTER 1
262
#define EVENT_PROCESS 2
263
264
struct
filterops {
265
int
f_isfd;
/* true if ident == filedescriptor */
266
int (*f_attach)(
struct
knote *kn);
267
void (*f_detach)(
struct
knote *kn);
268
int (*f_event)(
struct
knote *kn,
long
hint);
269
void (*f_touch)(
struct
knote *kn,
struct
kevent
*kev, u_long type);
270
};
271
272
/*
273
* An in-flux knote cannot be dropped from its kq while the kq is
274
* unlocked. If the KN_SCAN flag is not set, a thread can only set
275
* kn_influx when it is exclusive owner of the knote state, and can
276
* modify kn_status as if it had the KQ lock. KN_SCAN must not be set
277
* on a knote which is already in flux.
278
*
279
* kn_sfflags, kn_sdata, and kn_kevent are protected by the knlist lock.
280
*/
281
struct
knote {
282
SLIST_ENTRY(knote) kn_link;
/* for kq */
283
SLIST_ENTRY(knote) kn_selnext;
/* for struct selinfo */
284
struct
knlist *kn_knlist;
/* f_attach populated */
285
TAILQ_ENTRY(knote) kn_tqe;
286
struct
kqueue *kn_kq;
/* which queue we are on */
287
struct
kevent kn_kevent;
288
void
*kn_hook;
289
int
kn_hookid;
290
int
kn_status;
/* protected by kq lock */
291
#define KN_ACTIVE 0x01
/* event has been triggered */
292
#define KN_QUEUED 0x02
/* event is on queue */
293
#define KN_DISABLED 0x04
/* event is disabled */
294
#define KN_DETACHED 0x08
/* knote is detached */
295
#define KN_MARKER 0x20
/* ignore this knote */
296
#define KN_KQUEUE 0x40
/* this knote belongs to a kq */
297
#define KN_HASKQLOCK 0x80
/* for _inevent */
298
#define KN_SCAN 0x100
/* flux set in kqueue_scan() */
299
int
kn_influx;
300
int
kn_sfflags;
/* saved filter flags */
301
int64_t kn_sdata;
/* saved data field */
302
union
{
303
struct
file *p_fp;
/* file data pointer */
304
struct
proc *p_proc;
/* proc pointer */
305
struct
kaiocb *p_aio;
/* AIO job pointer */
306
struct
aioliojob *p_lio;
/* LIO job pointer */
307
void
*p_v;
/* generic other pointer */
308
} kn_ptr;
309
struct
filterops *kn_fop;
310
311
#define kn_id kn_kevent.ident
312
#define kn_filter kn_kevent.filter
313
#define kn_flags kn_kevent.flags
314
#define kn_fflags kn_kevent.fflags
315
#define kn_data kn_kevent.data
316
#define kn_fp kn_ptr.p_fp
317
};
318
struct
kevent_copyops {
319
void
*arg;
320
int (*k_copyout)(
void
*arg,
struct
kevent *kevp,
int
count);
321
int (*k_copyin)(
void
*arg,
struct
kevent *kevp,
int
count);
322
size_t
kevent_size;
323
};
324
325
struct
thread;
326
struct
proc;
327
struct
knlist
;
328
struct
mtx;
329
struct
rwlock;
330
331
void
knote(
struct
knlist
*list,
long
hint,
int
lockflags);
332
void
knote_fork(
struct
knlist
*list,
int
pid);
333
struct
knlist
*knlist_alloc(
struct
mtx *lock);
334
void
knlist_detach(
struct
knlist
*knl);
335
void
knlist_add(
struct
knlist
*knl,
struct
knote *kn,
int
islocked);
336
void
knlist_remove(
struct
knlist
*knl,
struct
knote *kn,
int
islocked);
337
int
knlist_empty(
struct
knlist
*knl);
338
void
knlist_init(
struct
knlist
*knl,
void
*lock,
void
(*kl_lock)(
void
*),
339
void
(*kl_unlock)(
void
*),
void
(*kl_assert_locked)(
void
*),
340
void
(*kl_assert_unlocked)(
void
*));
341
void
knlist_init_mtx(
struct
knlist
*knl,
struct
mtx *lock);
342
void
knlist_init_rw_reader(
struct
knlist
*knl,
struct
rwlock *lock);
343
void
knlist_destroy(
struct
knlist
*knl);
344
void
knlist_cleardel(
struct
knlist
*knl,
struct
thread *td,
345
int
islocked,
int
killkn);
346
#define knlist_clear(knl, islocked) \
347
knlist_cleardel((knl), NULL, (islocked), 0)
348
#define knlist_delete(knl, td, islocked) \
349
knlist_cleardel((knl), (td), (islocked), 1)
350
void
knote_fdclose(
struct
thread *
p
,
int
fd);
351
int
kqfd_register(
int
fd,
struct
kevent
*kev,
struct
thread *
p
,
352
int
waitok);
353
int
kqueue_add_filteropts(
int
filt,
struct
filterops *filtops);
354
int
kqueue_del_filteropts(
int
filt);
355
356
#else
/* !_KERNEL */
357
358
#include <sys/cdefs.h>
359
struct
timespec;
360
361
__BEGIN_DECLS
362
int
kqueue(
void
);
363
int
kevent
(
int
kq,
const
struct
kevent
*changelist,
int
nchanges,
364
struct
kevent
*eventlist,
int
nevents,
365
const
struct
timespec *timeout);
366
__END_DECLS
367
368
#endif
/* !_KERNEL */
369
370
#endif
/* !_SYS_EVENT_H_ */
kevent
Definition
event.h:83
knlist
Definition
event.h:223
p
unsigned p
Definition
tte.h:17
Generated by
1.18.0