File indexing completed on 2025-05-11 08:24:14
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 #ifndef _SYS_EVENT_H_
0032 #define _SYS_EVENT_H_
0033
0034 #include <sys/_types.h>
0035 #include <sys/queue.h>
0036
0037 #define EVFILT_READ (-1)
0038 #define EVFILT_WRITE (-2)
0039 #define EVFILT_AIO (-3)
0040 #define EVFILT_VNODE (-4)
0041 #define EVFILT_PROC (-5)
0042 #define EVFILT_SIGNAL (-6)
0043 #define EVFILT_TIMER (-7)
0044 #define EVFILT_PROCDESC (-8)
0045 #define EVFILT_FS (-9)
0046 #define EVFILT_LIO (-10)
0047 #define EVFILT_USER (-11)
0048 #define EVFILT_SENDFILE (-12)
0049 #define EVFILT_EMPTY (-13)
0050 #define EVFILT_SYSCOUNT 13
0051
0052 #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
0053 #define EV_SET(kevp_, a, b, c, d, e, f) do { \
0054 *(kevp_) = (struct kevent){ \
0055 .ident = (a), \
0056 .filter = (b), \
0057 .flags = (c), \
0058 .fflags = (d), \
0059 .data = (e), \
0060 .udata = (f), \
0061 .ext = {0}, \
0062 }; \
0063 } while(0)
0064 #else
0065
0066
0067
0068 #define EV_SET(kevp_, a, b, c, d, e, f) do { \
0069 struct kevent *kevp = (kevp_); \
0070 (kevp)->ident = (a); \
0071 (kevp)->filter = (b); \
0072 (kevp)->flags = (c); \
0073 (kevp)->fflags = (d); \
0074 (kevp)->data = (e); \
0075 (kevp)->udata = (f); \
0076 (kevp)->ext[0] = 0; \
0077 (kevp)->ext[1] = 0; \
0078 (kevp)->ext[2] = 0; \
0079 (kevp)->ext[3] = 0; \
0080 } while(0)
0081 #endif
0082
0083 struct kevent {
0084 __uintptr_t ident;
0085 short filter;
0086 unsigned short flags;
0087 unsigned int fflags;
0088 __int64_t data;
0089 void *udata;
0090 __uint64_t ext[4];
0091 };
0092
0093 #if defined(_WANT_FREEBSD11_KEVENT)
0094
0095 struct kevent_freebsd11 {
0096 __uintptr_t ident;
0097 short filter;
0098 unsigned short flags;
0099 unsigned int fflags;
0100 __intptr_t data;
0101 void *udata;
0102 };
0103 #endif
0104
0105 #if defined(_WANT_KEVENT32) || (defined(_KERNEL) && defined(__LP64__))
0106 struct kevent32 {
0107 uint32_t ident;
0108 short filter;
0109 u_short flags;
0110 u_int fflags;
0111 #ifndef __amd64__
0112 uint32_t pad0;
0113 #endif
0114 int32_t data1, data2;
0115 uint32_t udata;
0116 #ifndef __amd64__
0117 uint32_t pad1;
0118 #endif
0119 uint32_t ext64[8];
0120 };
0121
0122 #ifdef _WANT_FREEBSD11_KEVENT
0123 struct kevent32_freebsd11 {
0124 u_int32_t ident;
0125 short filter;
0126 u_short flags;
0127 u_int fflags;
0128 int32_t data;
0129 u_int32_t udata;
0130 };
0131 #endif
0132 #endif
0133
0134
0135 #define EV_ADD 0x0001
0136 #define EV_DELETE 0x0002
0137 #define EV_ENABLE 0x0004
0138 #define EV_DISABLE 0x0008
0139 #define EV_FORCEONESHOT 0x0100
0140
0141
0142 #define EV_ONESHOT 0x0010
0143 #define EV_CLEAR 0x0020
0144 #define EV_RECEIPT 0x0040
0145 #define EV_DISPATCH 0x0080
0146
0147 #define EV_SYSFLAGS 0xF000
0148 #define EV_DROP 0x1000
0149 #define EV_FLAG1 0x2000
0150 #define EV_FLAG2 0x4000
0151
0152
0153 #define EV_EOF 0x8000
0154 #define EV_ERROR 0x4000
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165 #define NOTE_FFNOP 0x00000000
0166 #define NOTE_FFAND 0x40000000
0167 #define NOTE_FFOR 0x80000000
0168 #define NOTE_FFCOPY 0xc0000000
0169 #define NOTE_FFCTRLMASK 0xc0000000
0170 #define NOTE_FFLAGSMASK 0x00ffffff
0171
0172 #define NOTE_TRIGGER 0x01000000
0173
0174
0175
0176
0177
0178 #define NOTE_LOWAT 0x0001
0179 #define NOTE_FILE_POLL 0x0002
0180
0181
0182
0183
0184 #define NOTE_DELETE 0x0001
0185 #define NOTE_WRITE 0x0002
0186 #define NOTE_EXTEND 0x0004
0187 #define NOTE_ATTRIB 0x0008
0188 #define NOTE_LINK 0x0010
0189 #define NOTE_RENAME 0x0020
0190 #define NOTE_REVOKE 0x0040
0191 #define NOTE_OPEN 0x0080
0192 #define NOTE_CLOSE 0x0100
0193
0194 #define NOTE_CLOSE_WRITE 0x0200
0195
0196 #define NOTE_READ 0x0400
0197
0198
0199
0200
0201 #define NOTE_EXIT 0x80000000
0202 #define NOTE_FORK 0x40000000
0203 #define NOTE_EXEC 0x20000000
0204 #define NOTE_PCTRLMASK 0xf0000000
0205 #define NOTE_PDATAMASK 0x000fffff
0206
0207
0208 #define NOTE_TRACK 0x00000001
0209 #define NOTE_TRACKERR 0x00000002
0210 #define NOTE_CHILD 0x00000004
0211
0212
0213 #define NOTE_SECONDS 0x00000001
0214 #define NOTE_MSECONDS 0x00000002
0215 #define NOTE_USECONDS 0x00000004
0216 #define NOTE_NSECONDS 0x00000008
0217 #define NOTE_ABSTIME 0x00000010
0218
0219 struct knote;
0220 SLIST_HEAD(klist, knote);
0221 struct kqueue;
0222 TAILQ_HEAD(kqlist, kqueue);
0223 struct knlist {
0224 struct klist kl_list;
0225 void (*kl_lock)(void *);
0226 void (*kl_unlock)(void *);
0227 void (*kl_assert_locked)(void *);
0228 void (*kl_assert_unlocked)(void *);
0229 void *kl_lockarg;
0230 int kl_autodestroy;
0231 };
0232
0233
0234 #ifdef _KERNEL
0235
0236
0237
0238
0239 #define KNF_LISTLOCKED 0x0001
0240 #define KNF_NOKQLOCK 0x0002
0241
0242 #define KNOTE(list, hint, flags) knote(list, hint, flags)
0243 #define KNOTE_LOCKED(list, hint) knote(list, hint, KNF_LISTLOCKED)
0244 #define KNOTE_UNLOCKED(list, hint) knote(list, hint, 0)
0245
0246 #define KNLIST_EMPTY(list) SLIST_EMPTY(&(list)->kl_list)
0247
0248
0249
0250
0251
0252 #define NOTE_SIGNAL 0x08000000
0253
0254
0255
0256
0257
0258
0259
0260
0261 #define EVENT_REGISTER 1
0262 #define EVENT_PROCESS 2
0263
0264 struct filterops {
0265 int f_isfd;
0266 int (*f_attach)(struct knote *kn);
0267 void (*f_detach)(struct knote *kn);
0268 int (*f_event)(struct knote *kn, long hint);
0269 void (*f_touch)(struct knote *kn, struct kevent *kev, u_long type);
0270 };
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281 struct knote {
0282 SLIST_ENTRY(knote) kn_link;
0283 SLIST_ENTRY(knote) kn_selnext;
0284 struct knlist *kn_knlist;
0285 TAILQ_ENTRY(knote) kn_tqe;
0286 struct kqueue *kn_kq;
0287 struct kevent kn_kevent;
0288 void *kn_hook;
0289 int kn_hookid;
0290 int kn_status;
0291 #define KN_ACTIVE 0x01
0292 #define KN_QUEUED 0x02
0293 #define KN_DISABLED 0x04
0294 #define KN_DETACHED 0x08
0295 #define KN_MARKER 0x20
0296 #define KN_KQUEUE 0x40
0297 #define KN_HASKQLOCK 0x80
0298 #define KN_SCAN 0x100
0299 int kn_influx;
0300 int kn_sfflags;
0301 int64_t kn_sdata;
0302 union {
0303 struct file *p_fp;
0304 struct proc *p_proc;
0305 struct kaiocb *p_aio;
0306 struct aioliojob *p_lio;
0307 void *p_v;
0308 } kn_ptr;
0309 struct filterops *kn_fop;
0310
0311 #define kn_id kn_kevent.ident
0312 #define kn_filter kn_kevent.filter
0313 #define kn_flags kn_kevent.flags
0314 #define kn_fflags kn_kevent.fflags
0315 #define kn_data kn_kevent.data
0316 #define kn_fp kn_ptr.p_fp
0317 };
0318 struct kevent_copyops {
0319 void *arg;
0320 int (*k_copyout)(void *arg, struct kevent *kevp, int count);
0321 int (*k_copyin)(void *arg, struct kevent *kevp, int count);
0322 size_t kevent_size;
0323 };
0324
0325 struct thread;
0326 struct proc;
0327 struct knlist;
0328 struct mtx;
0329 struct rwlock;
0330
0331 void knote(struct knlist *list, long hint, int lockflags);
0332 void knote_fork(struct knlist *list, int pid);
0333 struct knlist *knlist_alloc(struct mtx *lock);
0334 void knlist_detach(struct knlist *knl);
0335 void knlist_add(struct knlist *knl, struct knote *kn, int islocked);
0336 void knlist_remove(struct knlist *knl, struct knote *kn, int islocked);
0337 int knlist_empty(struct knlist *knl);
0338 void knlist_init(struct knlist *knl, void *lock, void (*kl_lock)(void *),
0339 void (*kl_unlock)(void *), void (*kl_assert_locked)(void *),
0340 void (*kl_assert_unlocked)(void *));
0341 void knlist_init_mtx(struct knlist *knl, struct mtx *lock);
0342 void knlist_init_rw_reader(struct knlist *knl, struct rwlock *lock);
0343 void knlist_destroy(struct knlist *knl);
0344 void knlist_cleardel(struct knlist *knl, struct thread *td,
0345 int islocked, int killkn);
0346 #define knlist_clear(knl, islocked) \
0347 knlist_cleardel((knl), NULL, (islocked), 0)
0348 #define knlist_delete(knl, td, islocked) \
0349 knlist_cleardel((knl), (td), (islocked), 1)
0350 void knote_fdclose(struct thread *p, int fd);
0351 int kqfd_register(int fd, struct kevent *kev, struct thread *p,
0352 int waitok);
0353 int kqueue_add_filteropts(int filt, struct filterops *filtops);
0354 int kqueue_del_filteropts(int filt);
0355
0356 #else
0357
0358 #include <sys/cdefs.h>
0359 struct timespec;
0360
0361 __BEGIN_DECLS
0362 int kqueue(void);
0363 int kevent(int kq, const struct kevent *changelist, int nchanges,
0364 struct kevent *eventlist, int nevents,
0365 const struct timespec *timeout);
0366 __END_DECLS
0367
0368 #endif
0369
0370 #endif