1 event.h |
1 /*- |
|
2 * Copyright (c) 1999,2000,2001 Jonathan Lemon <jlemon@FreeBSD.org> |
|
3 * All rights reserved. |
|
4 * |
|
5 * Redistribution and use in source and binary forms, with or without |
|
6 * modification, are permitted provided that the following conditions |
|
7 * are met: |
|
8 * 1. Redistributions of source code must retain the above copyright |
|
9 * notice, this list of conditions and the following disclaimer. |
|
10 * 2. Redistributions in binary form must reproduce the above copyright |
|
11 * notice, this list of conditions and the following disclaimer in the |
|
12 * documentation and/or other materials provided with the distribution. |
|
13 * |
|
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
|
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
|
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
|
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
|
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
|
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
|
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
|
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|
24 * SUCH DAMAGE. |
|
25 * © Portions copyright (c) 2007 Symbian Software Ltd. All rights reserved. |
|
26 * $FreeBSD: src/sys/sys/event.h,v 1.32 2005/07/01 16:28:32 ssouhlal Exp $ |
|
27 */ |
|
28 |
|
29 #ifndef _SYS_EVENT_H_ |
|
30 #define _SYS_EVENT_H_ |
|
31 |
|
32 #define EVFILT_READ (-1) |
|
33 #define EVFILT_WRITE (-2) |
|
34 #define EVFILT_AIO (-3) /* attached to aio requests */ |
|
35 #define EVFILT_VNODE (-4) /* attached to vnodes */ |
|
36 #define EVFILT_PROC (-5) /* attached to struct proc */ |
|
37 #define EVFILT_SIGNAL (-6) /* attached to struct proc */ |
|
38 #define EVFILT_TIMER (-7) /* timers */ |
|
39 #define EVFILT_NETDEV (-8) /* network devices */ |
|
40 #define EVFILT_FS (-9) /* filesystem events */ |
|
41 |
|
42 #define EVFILT_SYSCOUNT 9 |
|
43 |
|
44 #define EV_SET(kevp_, a, b, c, d, e, f) do { \ |
|
45 struct kevent *kevp = (kevp_); \ |
|
46 (kevp)->ident = (a); \ |
|
47 (kevp)->filter = (b); \ |
|
48 (kevp)->flags = (c); \ |
|
49 (kevp)->fflags = (d); \ |
|
50 (kevp)->data = (e); \ |
|
51 (kevp)->udata = (f); \ |
|
52 } while(0) |
|
53 |
|
54 struct kevent { |
|
55 uintptr_t ident; /* identifier for this event */ |
|
56 short filter; /* filter for event */ |
|
57 u_short flags; |
|
58 u_int fflags; |
|
59 intptr_t data; |
|
60 void *udata; /* opaque user data identifier */ |
|
61 }; |
|
62 |
|
63 /* actions */ |
|
64 #define EV_ADD 0x0001 /* add event to kq (implies enable) */ |
|
65 #define EV_DELETE 0x0002 /* delete event from kq */ |
|
66 #define EV_ENABLE 0x0004 /* enable event */ |
|
67 #define EV_DISABLE 0x0008 /* disable event (not reported) */ |
|
68 |
|
69 /* flags */ |
|
70 #define EV_ONESHOT 0x0010 /* only report one occurrence */ |
|
71 #define EV_CLEAR 0x0020 /* clear event state after reporting */ |
|
72 |
|
73 #define EV_SYSFLAGS 0xF000 /* reserved by system */ |
|
74 #define EV_FLAG1 0x2000 /* filter-specific flag */ |
|
75 |
|
76 /* returned values */ |
|
77 #define EV_EOF 0x8000 /* EOF detected */ |
|
78 #define EV_ERROR 0x4000 /* error, data contains errno */ |
|
79 |
|
80 /* |
|
81 * data/hint flags for EVFILT_{READ|WRITE}, shared with userspace |
|
82 */ |
|
83 #define NOTE_LOWAT 0x0001 /* low water mark */ |
|
84 |
|
85 /* |
|
86 * data/hint flags for EVFILT_VNODE, shared with userspace |
|
87 */ |
|
88 #define NOTE_DELETE 0x0001 /* vnode was removed */ |
|
89 #define NOTE_WRITE 0x0002 /* data contents changed */ |
|
90 #define NOTE_EXTEND 0x0004 /* size increased */ |
|
91 #define NOTE_ATTRIB 0x0008 /* attributes changed */ |
|
92 #define NOTE_LINK 0x0010 /* link count changed */ |
|
93 #define NOTE_RENAME 0x0020 /* vnode was renamed */ |
|
94 #define NOTE_REVOKE 0x0040 /* vnode access was revoked */ |
|
95 |
|
96 /* |
|
97 * data/hint flags for EVFILT_PROC, shared with userspace |
|
98 */ |
|
99 #define NOTE_EXIT 0x80000000 /* process exited */ |
|
100 #define NOTE_FORK 0x40000000 /* process forked */ |
|
101 #define NOTE_EXEC 0x20000000 /* process exec'd */ |
|
102 #define NOTE_PCTRLMASK 0xf0000000 /* mask for hint bits */ |
|
103 #define NOTE_PDATAMASK 0x000fffff /* mask for pid */ |
|
104 |
|
105 /* additional flags for EVFILT_PROC */ |
|
106 #define NOTE_TRACK 0x00000001 /* follow across forks */ |
|
107 #define NOTE_TRACKERR 0x00000002 /* could not track child */ |
|
108 #define NOTE_CHILD 0x00000004 /* am a child process */ |
|
109 |
|
110 /* |
|
111 * data/hint flags for EVFILT_NETDEV, shared with userspace |
|
112 */ |
|
113 #define NOTE_LINKUP 0x0001 /* link is up */ |
|
114 #define NOTE_LINKDOWN 0x0002 /* link is down */ |
|
115 #define NOTE_LINKINV 0x0004 /* link state is invalid */ |
|
116 |
|
117 /* |
|
118 * This is currently visible to userland to work around broken |
|
119 * programs which pull in <sys/proc.h>. |
|
120 */ |
|
121 #include <sys/queue.h> |
|
122 #include <sys/_lock.h> |
|
123 #include <sys/_mutex.h> |
|
124 struct knote; |
|
125 struct kqueue; |
|
126 struct knlist { |
|
127 struct klist kl_list; |
|
128 void (*kl_lock)(void *); /* lock function */ |
|
129 void (*kl_unlock)(void *); |
|
130 int (*kl_locked)(void *); |
|
131 void *kl_lockarg; /* argument passed to kl_lockf() */ |
|
132 }; |
|
133 |
|
134 |
|
135 #ifdef _KERNEL |
|
136 |
|
137 #define KNLIST_EMPTY(list) SLIST_EMPTY(&(list)->kl_list) |
|
138 |
|
139 /* |
|
140 * Flag indicating hint is a signal. Used by EVFILT_SIGNAL, and also |
|
141 * shared by EVFILT_PROC (all knotes attached to p->p_klist) |
|
142 */ |
|
143 #define NOTE_SIGNAL 0x08000000 |
|
144 |
|
145 struct filterops { |
|
146 int f_isfd; /* true if ident == filedescriptor */ |
|
147 int (*f_attach)(struct knote *kn); |
|
148 void (*f_detach)(struct knote *kn); |
|
149 int (*f_event)(struct knote *kn, long hint); |
|
150 }; |
|
151 |
|
152 /* |
|
153 * Setting the KN_INFLUX flag enables you to unlock the kq that this knote |
|
154 * is on, and modify kn_status as if you had the KQ lock. |
|
155 * |
|
156 * kn_sfflags, kn_sdata, and kn_kevent are protected by the knlist lock. |
|
157 */ |
|
158 struct knote { |
|
159 SLIST_ENTRY(knote) kn_link; /* for kq */ |
|
160 SLIST_ENTRY(knote) kn_selnext; /* for struct selinfo */ |
|
161 struct knlist *kn_knlist; /* f_attach populated */ |
|
162 TAILQ_ENTRY(knote) kn_tqe; |
|
163 struct kqueue *kn_kq; /* which queue we are on */ |
|
164 struct kevent kn_kevent; |
|
165 int kn_status; /* protected by kq lock */ |
|
166 #define KN_ACTIVE 0x01 /* event has been triggered */ |
|
167 #define KN_QUEUED 0x02 /* event is on queue */ |
|
168 #define KN_DISABLED 0x04 /* event is disabled */ |
|
169 #define KN_DETACHED 0x08 /* knote is detached */ |
|
170 #define KN_INFLUX 0x10 /* knote is in flux */ |
|
171 #define KN_MARKER 0x20 /* ignore this knote */ |
|
172 #define KN_KQUEUE 0x40 /* this knote belongs to a kq */ |
|
173 #define KN_HASKQLOCK 0x80 /* for _inevent */ |
|
174 int kn_sfflags; /* saved filter flags */ |
|
175 intptr_t kn_sdata; /* saved data field */ |
|
176 union { |
|
177 struct file *p_fp; /* file data pointer */ |
|
178 struct proc *p_proc; /* proc pointer */ |
|
179 } kn_ptr; |
|
180 struct filterops *kn_fop; |
|
181 void *kn_hook; |
|
182 |
|
183 #define kn_id kn_kevent.ident |
|
184 #define kn_filter kn_kevent.filter |
|
185 #define kn_flags kn_kevent.flags |
|
186 #define kn_fflags kn_kevent.fflags |
|
187 #define kn_data kn_kevent.data |
|
188 #define kn_fp kn_ptr.p_fp |
|
189 }; |
|
190 struct kevent_copyops { |
|
191 void *arg; |
|
192 int (*k_copyout)(void *arg, struct kevent *kevp, int count); |
|
193 int (*k_copyin)(void *arg, struct kevent *kevp, int count); |
|
194 }; |
|
195 |
|
196 struct thread; |
|
197 struct proc; |
|
198 struct knlist; |
|
199 |
|
200 #endif /* !_KERNEL */ |
|
201 |
|
202 #endif /* !_SYS_EVENT_H_ */ |