source: rtems/cpukit/include/sys/event.h @ bf026dd4

Last change on this file since bf026dd4 was bf026dd4, checked in by pfg <pfg@…>, on Nov 27, 2017 at 3:01:59 PM

sys/sys: further adoption of SPDX licensing ID tags.

Mainly focus on files that use BSD 2-Clause license, however the tool I
was using misidentified many licenses so this was mostly a manual - error
prone - task.

The Software Package Data Exchange (SPDX) group provides a specification
to make it easier for automated tools to detect and summarize well known
opensource licenses. We are gradually adopting the specification, noting
that the tags are considered only advisory and do not, in any way,
superceed or replace the license texts.

  • Property mode set to 100644
File size: 12.2 KB
Line 
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 313704 2017-02-13 19:00:09Z ed $
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#define EV_SET(kevp_, a, b, c, d, e, f) do {    \
53        struct kevent *kevp = (kevp_);          \
54        (kevp)->ident = (a);                    \
55        (kevp)->filter = (b);                   \
56        (kevp)->flags = (c);                    \
57        (kevp)->fflags = (d);                   \
58        (kevp)->data = (e);                     \
59        (kevp)->udata = (f);                    \
60        (kevp)->ext[0] = 0;                     \
61        (kevp)->ext[1] = 0;                     \
62        (kevp)->ext[2] = 0;                     \
63        (kevp)->ext[3] = 0;                     \
64} while(0)
65
66struct kevent {
67        __uintptr_t     ident;          /* identifier for this event */
68        short           filter;         /* filter for event */
69        unsigned short  flags;
70        unsigned int    fflags;
71        __int64_t       data;
72        void            *udata;         /* opaque user data identifier */
73        __uint64_t      ext[4];
74};
75
76#if defined(_WANT_FREEBSD11_KEVENT)
77/* Older structure used in FreeBSD 11.x and older. */
78struct kevent_freebsd11 {
79        __uintptr_t     ident;          /* identifier for this event */
80        short           filter;         /* filter for event */
81        unsigned short  flags;
82        unsigned int    fflags;
83        __intptr_t      data;
84        void            *udata;         /* opaque user data identifier */
85};
86#endif
87
88#if defined(_WANT_KEVENT32) || (defined(_KERNEL) && defined(__LP64__))
89struct kevent32 {
90        uint32_t        ident;          /* identifier for this event */
91        short           filter;         /* filter for event */
92        u_short         flags;
93        u_int           fflags;
94#ifndef __amd64__
95        uint32_t        pad0;
96#endif
97        int32_t         data1, data2;
98        uint32_t        udata;          /* opaque user data identifier */
99#ifndef __amd64__
100        uint32_t        pad1;
101#endif
102        uint32_t        ext64[8];
103};
104
105#ifdef _WANT_FREEBSD11_KEVENT
106struct kevent32_freebsd11 {
107        u_int32_t       ident;          /* identifier for this event */
108        short           filter;         /* filter for event */
109        u_short         flags;
110        u_int           fflags;
111        int32_t         data;
112        u_int32_t       udata;          /* opaque user data identifier */
113};
114#endif
115#endif
116
117/* actions */
118#define EV_ADD          0x0001          /* add event to kq (implies enable) */
119#define EV_DELETE       0x0002          /* delete event from kq */
120#define EV_ENABLE       0x0004          /* enable event */
121#define EV_DISABLE      0x0008          /* disable event (not reported) */
122#define EV_FORCEONESHOT 0x0100          /* enable _ONESHOT and force trigger */
123
124/* flags */
125#define EV_ONESHOT      0x0010          /* only report one occurrence */
126#define EV_CLEAR        0x0020          /* clear event state after reporting */
127#define EV_RECEIPT      0x0040          /* force EV_ERROR on success, data=0 */
128#define EV_DISPATCH     0x0080          /* disable event after reporting */
129
130#define EV_SYSFLAGS     0xF000          /* reserved by system */
131#define EV_DROP         0x1000          /* note should be dropped */
132#define EV_FLAG1        0x2000          /* filter-specific flag */
133#define EV_FLAG2        0x4000          /* filter-specific flag */
134
135/* returned values */
136#define EV_EOF          0x8000          /* EOF detected */
137#define EV_ERROR        0x4000          /* error, data contains errno */
138
139 /*
140  * data/hint flags/masks for EVFILT_USER, shared with userspace
141  *
142  * On input, the top two bits of fflags specifies how the lower twenty four
143  * bits should be applied to the stored value of fflags.
144  *
145  * On output, the top two bits will always be set to NOTE_FFNOP and the
146  * remaining twenty four bits will contain the stored fflags value.
147  */
148#define NOTE_FFNOP      0x00000000              /* ignore input fflags */
149#define NOTE_FFAND      0x40000000              /* AND fflags */
150#define NOTE_FFOR       0x80000000              /* OR fflags */
151#define NOTE_FFCOPY     0xc0000000              /* copy fflags */
152#define NOTE_FFCTRLMASK 0xc0000000              /* masks for operations */
153#define NOTE_FFLAGSMASK 0x00ffffff
154
155#define NOTE_TRIGGER    0x01000000              /* Cause the event to be
156                                                   triggered for output. */
157
158/*
159 * data/hint flags for EVFILT_{READ|WRITE}, shared with userspace
160 */
161#define NOTE_LOWAT      0x0001                  /* low water mark */
162#define NOTE_FILE_POLL  0x0002                  /* behave like poll() */
163
164/*
165 * data/hint flags for EVFILT_VNODE, shared with userspace
166 */
167#define NOTE_DELETE     0x0001                  /* vnode was removed */
168#define NOTE_WRITE      0x0002                  /* data contents changed */
169#define NOTE_EXTEND     0x0004                  /* size increased */
170#define NOTE_ATTRIB     0x0008                  /* attributes changed */
171#define NOTE_LINK       0x0010                  /* link count changed */
172#define NOTE_RENAME     0x0020                  /* vnode was renamed */
173#define NOTE_REVOKE     0x0040                  /* vnode access was revoked */
174#define NOTE_OPEN       0x0080                  /* vnode was opened */
175#define NOTE_CLOSE      0x0100                  /* file closed, fd did not
176                                                   allowed write */
177#define NOTE_CLOSE_WRITE 0x0200                 /* file closed, fd did allowed
178                                                   write */
179#define NOTE_READ       0x0400                  /* file was read */
180
181/*
182 * data/hint flags for EVFILT_PROC and EVFILT_PROCDESC, shared with userspace
183 */
184#define NOTE_EXIT       0x80000000              /* process exited */
185#define NOTE_FORK       0x40000000              /* process forked */
186#define NOTE_EXEC       0x20000000              /* process exec'd */
187#define NOTE_PCTRLMASK  0xf0000000              /* mask for hint bits */
188#define NOTE_PDATAMASK  0x000fffff              /* mask for pid */
189
190/* additional flags for EVFILT_PROC */
191#define NOTE_TRACK      0x00000001              /* follow across forks */
192#define NOTE_TRACKERR   0x00000002              /* could not track child */
193#define NOTE_CHILD      0x00000004              /* am a child process */
194
195/* additional flags for EVFILT_TIMER */
196#define NOTE_SECONDS            0x00000001      /* data is seconds */
197#define NOTE_MSECONDS           0x00000002      /* data is milliseconds */
198#define NOTE_USECONDS           0x00000004      /* data is microseconds */
199#define NOTE_NSECONDS           0x00000008      /* data is nanoseconds */
200#define NOTE_ABSTIME            0x00000010      /* timeout is absolute */
201
202struct knote;
203SLIST_HEAD(klist, knote);
204struct kqueue;
205TAILQ_HEAD(kqlist, kqueue);
206struct knlist {
207        struct  klist   kl_list;
208        void    (*kl_lock)(void *);     /* lock function */
209        void    (*kl_unlock)(void *);
210        void    (*kl_assert_locked)(void *);
211        void    (*kl_assert_unlocked)(void *);
212        void    *kl_lockarg;            /* argument passed to lock functions */
213        int     kl_autodestroy;
214};
215
216
217#ifdef _KERNEL
218
219/*
220 * Flags for knote call
221 */
222#define KNF_LISTLOCKED  0x0001                  /* knlist is locked */
223#define KNF_NOKQLOCK    0x0002                  /* do not keep KQ_LOCK */
224
225#define KNOTE(list, hint, flags)        knote(list, hint, flags)
226#define KNOTE_LOCKED(list, hint)        knote(list, hint, KNF_LISTLOCKED)
227#define KNOTE_UNLOCKED(list, hint)      knote(list, hint, 0)
228
229#define KNLIST_EMPTY(list)              SLIST_EMPTY(&(list)->kl_list)
230
231/*
232 * Flag indicating hint is a signal.  Used by EVFILT_SIGNAL, and also
233 * shared by EVFILT_PROC  (all knotes attached to p->p_klist)
234 */
235#define NOTE_SIGNAL     0x08000000
236
237/*
238 * Hint values for the optional f_touch event filter.  If f_touch is not set
239 * to NULL and f_isfd is zero the f_touch filter will be called with the type
240 * argument set to EVENT_REGISTER during a kevent() system call.  It is also
241 * called under the same conditions with the type argument set to EVENT_PROCESS
242 * when the event has been triggered.
243 */
244#define EVENT_REGISTER  1
245#define EVENT_PROCESS   2
246
247struct filterops {
248        int     f_isfd;         /* true if ident == filedescriptor */
249        int     (*f_attach)(struct knote *kn);
250        void    (*f_detach)(struct knote *kn);
251        int     (*f_event)(struct knote *kn, long hint);
252        void    (*f_touch)(struct knote *kn, struct kevent *kev, u_long type);
253};
254
255/*
256 * An in-flux knote cannot be dropped from its kq while the kq is
257 * unlocked.  If the KN_SCAN flag is not set, a thread can only set
258 * kn_influx when it is exclusive owner of the knote state, and can
259 * modify kn_status as if it had the KQ lock.  KN_SCAN must not be set
260 * on a knote which is already in flux.
261 *
262 * kn_sfflags, kn_sdata, and kn_kevent are protected by the knlist lock.
263 */
264struct knote {
265        SLIST_ENTRY(knote)      kn_link;        /* for kq */
266        SLIST_ENTRY(knote)      kn_selnext;     /* for struct selinfo */
267        struct                  knlist *kn_knlist;      /* f_attach populated */
268        TAILQ_ENTRY(knote)      kn_tqe;
269        struct                  kqueue *kn_kq;  /* which queue we are on */
270        struct                  kevent kn_kevent;
271        void                    *kn_hook;
272        int                     kn_hookid;
273        int                     kn_status;      /* protected by kq lock */
274#define KN_ACTIVE       0x01                    /* event has been triggered */
275#define KN_QUEUED       0x02                    /* event is on queue */
276#define KN_DISABLED     0x04                    /* event is disabled */
277#define KN_DETACHED     0x08                    /* knote is detached */
278#define KN_MARKER       0x20                    /* ignore this knote */
279#define KN_KQUEUE       0x40                    /* this knote belongs to a kq */
280#define KN_HASKQLOCK    0x80                    /* for _inevent */
281#define KN_SCAN         0x100                   /* flux set in kqueue_scan() */
282        int                     kn_influx;
283        int                     kn_sfflags;     /* saved filter flags */
284        int64_t                 kn_sdata;       /* saved data field */
285        union {
286                struct          file *p_fp;     /* file data pointer */
287                struct          proc *p_proc;   /* proc pointer */
288                struct          kaiocb *p_aio;  /* AIO job pointer */
289                struct          aioliojob *p_lio;       /* LIO job pointer */
290                void            *p_v;           /* generic other pointer */
291        } kn_ptr;
292        struct                  filterops *kn_fop;
293
294#define kn_id           kn_kevent.ident
295#define kn_filter       kn_kevent.filter
296#define kn_flags        kn_kevent.flags
297#define kn_fflags       kn_kevent.fflags
298#define kn_data         kn_kevent.data
299#define kn_fp           kn_ptr.p_fp
300};
301struct kevent_copyops {
302        void    *arg;
303        int     (*k_copyout)(void *arg, struct kevent *kevp, int count);
304        int     (*k_copyin)(void *arg, struct kevent *kevp, int count);
305        size_t  kevent_size;
306};
307
308struct thread;
309struct proc;
310struct knlist;
311struct mtx;
312struct rwlock;
313
314void    knote(struct knlist *list, long hint, int lockflags);
315void    knote_fork(struct knlist *list, int pid);
316struct knlist *knlist_alloc(struct mtx *lock);
317void    knlist_detach(struct knlist *knl);
318void    knlist_add(struct knlist *knl, struct knote *kn, int islocked);
319void    knlist_remove(struct knlist *knl, struct knote *kn, int islocked);
320int     knlist_empty(struct knlist *knl);
321void    knlist_init(struct knlist *knl, void *lock, void (*kl_lock)(void *),
322            void (*kl_unlock)(void *), void (*kl_assert_locked)(void *),
323            void (*kl_assert_unlocked)(void *));
324void    knlist_init_mtx(struct knlist *knl, struct mtx *lock);
325void    knlist_init_rw_reader(struct knlist *knl, struct rwlock *lock);
326void    knlist_destroy(struct knlist *knl);
327void    knlist_cleardel(struct knlist *knl, struct thread *td,
328            int islocked, int killkn);
329#define knlist_clear(knl, islocked)                             \
330        knlist_cleardel((knl), NULL, (islocked), 0)
331#define knlist_delete(knl, td, islocked)                        \
332        knlist_cleardel((knl), (td), (islocked), 1)
333void    knote_fdclose(struct thread *p, int fd);
334int     kqfd_register(int fd, struct kevent *kev, struct thread *p,
335            int waitok);
336int     kqueue_add_filteropts(int filt, struct filterops *filtops);
337int     kqueue_del_filteropts(int filt);
338
339#else   /* !_KERNEL */
340
341#include <sys/cdefs.h>
342struct timespec;
343
344__BEGIN_DECLS
345int     kqueue(void);
346int     kevent(int kq, const struct kevent *changelist, int nchanges,
347            struct kevent *eventlist, int nevents,
348            const struct timespec *timeout);
349__END_DECLS
350
351#endif /* !_KERNEL */
352
353#endif /* !_SYS_EVENT_H_ */
Note: See TracBrowser for help on using the repository browser.