xref: /f-stack/lib/ff_event.h (revision e7dcc16e)
1a9643ea8Slogwang /*
22317ada5Sfengbojiang  * Copyright (C) 2017-2021 THL A29 Limited, a Tencent company.
3a9643ea8Slogwang  * All rights reserved.
4a9643ea8Slogwang  *
5a9643ea8Slogwang  * Redistribution and use in source and binary forms, with or without
6a9643ea8Slogwang  * modification, are permitted provided that the following conditions are met:
7a9643ea8Slogwang  *
8a9643ea8Slogwang  * 1. Redistributions of source code must retain the above copyright notice, this
9a9643ea8Slogwang  *   list of conditions and the following disclaimer.
10a9643ea8Slogwang  * 2. Redistributions in binary form must reproduce the above copyright notice,
11a9643ea8Slogwang  *   this list of conditions and the following disclaimer in the documentation
12a9643ea8Slogwang  *   and/or other materials provided with the distribution.
13a9643ea8Slogwang  *
14a9643ea8Slogwang  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15a9643ea8Slogwang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16a9643ea8Slogwang  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17a9643ea8Slogwang  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
18a9643ea8Slogwang  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19a9643ea8Slogwang  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20a9643ea8Slogwang  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21a9643ea8Slogwang  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22a9643ea8Slogwang  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23a9643ea8Slogwang  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24a9643ea8Slogwang  *
25a9643ea8Slogwang  */
26a9643ea8Slogwang 
27a9643ea8Slogwang #ifndef _FSTACK_EVENT_H
28a9643ea8Slogwang #define _FSTACK_EVENT_H
29a9643ea8Slogwang 
307f4229eaSlogwang #ifdef __cplusplus
317f4229eaSlogwang extern "C" {
327f4229eaSlogwang #endif
337f4229eaSlogwang 
34a9643ea8Slogwang #ifndef _KERNEL
35a9643ea8Slogwang 
36a9643ea8Slogwang #include <stdint.h>
37a9643ea8Slogwang #include <sys/queue.h>
38a9643ea8Slogwang 
39a9643ea8Slogwang #define EVFILT_READ        (-1)
40a9643ea8Slogwang #define EVFILT_WRITE       (-2)
41a9643ea8Slogwang #define EVFILT_AIO         (-3)    /* attached to aio requests */
42a9643ea8Slogwang #define EVFILT_VNODE       (-4)    /* attached to vnodes */
43a9643ea8Slogwang #define EVFILT_PROC        (-5)    /* attached to struct proc */
44a9643ea8Slogwang #define EVFILT_SIGNAL      (-6)    /* attached to struct proc */
45a9643ea8Slogwang #define EVFILT_TIMER       (-7)    /* timers */
4610c1fea8Sfengbojiang #define EVFILT_PROCDESC    (-8)    /* attached to process descriptors */
47a9643ea8Slogwang #define EVFILT_FS          (-9)    /* filesystem events */
48a9643ea8Slogwang #define EVFILT_LIO         (-10)    /* attached to lio requests */
49a9643ea8Slogwang #define EVFILT_USER        (-11)    /* User events */
5010c1fea8Sfengbojiang #define EVFILT_SENDFILE    (-12)    /* attached to sendfile requests */
5110c1fea8Sfengbojiang #define EVFILT_EMPTY       (-13)    /* empty send socket buf */
5210c1fea8Sfengbojiang #define EVFILT_SYSCOUNT    13
53a9643ea8Slogwang 
5410c1fea8Sfengbojiang #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
5510c1fea8Sfengbojiang #define	EV_SET(kevp_, a, b, c, d, e, f) do {	\
5610c1fea8Sfengbojiang     *(kevp_) = (struct kevent){     \
5710c1fea8Sfengbojiang         .ident = (a),           \
5810c1fea8Sfengbojiang         .filter = (b),          \
5910c1fea8Sfengbojiang         .flags = (c),           \
6010c1fea8Sfengbojiang         .fflags = (d),          \
6110c1fea8Sfengbojiang         .data = (e),            \
6210c1fea8Sfengbojiang         .udata = (f),           \
6310c1fea8Sfengbojiang         .ext = {0},             \
6410c1fea8Sfengbojiang     };                  \
6510c1fea8Sfengbojiang } while(0)
6610c1fea8Sfengbojiang #else /* Pre-C99 or not STDC (e.g., C++) */
6710c1fea8Sfengbojiang /* The definition of the local variable kevp could possibly conflict
6810c1fea8Sfengbojiang  * with a user-defined value passed in parameters a-f.
6910c1fea8Sfengbojiang  */
70a9643ea8Slogwang #define EV_SET(kevp_, a, b, c, d, e, f) do {	\
71a9643ea8Slogwang     struct kevent *kevp = (kevp_);      \
72a9643ea8Slogwang     (kevp)->ident = (a);            \
73a9643ea8Slogwang     (kevp)->filter = (b);           \
74a9643ea8Slogwang     (kevp)->flags = (c);            \
75a9643ea8Slogwang     (kevp)->fflags = (d);           \
76a9643ea8Slogwang     (kevp)->data = (e);         \
77a9643ea8Slogwang     (kevp)->udata = (f);            \
7810c1fea8Sfengbojiang     (kevp)->ext[0] = 0;         \
7910c1fea8Sfengbojiang     (kevp)->ext[1] = 0;         \
8010c1fea8Sfengbojiang     (kevp)->ext[2] = 0;         \
8110c1fea8Sfengbojiang     (kevp)->ext[3] = 0;         \
82a9643ea8Slogwang } while(0)
8310c1fea8Sfengbojiang #endif
84a9643ea8Slogwang 
85a9643ea8Slogwang struct kevent {
86*e7dcc16eSfengbojiang     uintptr_t ident;      /* identifier for this event */
8710c1fea8Sfengbojiang     short filter;           /* filter for event */
8810c1fea8Sfengbojiang     unsigned short flags;   /* action flags for kqueue */
8910c1fea8Sfengbojiang     unsigned int fflags;    /* filter flag value */
9010c1fea8Sfengbojiang     __int64_t data;         /* filter data value */
9110c1fea8Sfengbojiang     void *udata;            /* opaque user data identifier */
9210c1fea8Sfengbojiang     __uint64_t ext[4];      /* extensions */
9310c1fea8Sfengbojiang };
9410c1fea8Sfengbojiang 
9510c1fea8Sfengbojiang #if defined(_WANT_FREEBSD11_KEVENT)
9610c1fea8Sfengbojiang /* Older structure used in FreeBSD 11.x and older. */
9710c1fea8Sfengbojiang struct kevent_freebsd11 {
98*e7dcc16eSfengbojiang     uintptr_t ident;      /* identifier for this event */
9910c1fea8Sfengbojiang     short filter;           /* filter for event */
10010c1fea8Sfengbojiang     unsigned short flags;
10110c1fea8Sfengbojiang     unsigned int fflags;
10210c1fea8Sfengbojiang     __intptr_t data;
10310c1fea8Sfengbojiang     void *udata;        /* opaque user data identifier */
10410c1fea8Sfengbojiang };
10510c1fea8Sfengbojiang #endif
10610c1fea8Sfengbojiang 
10710c1fea8Sfengbojiang #if defined(_WANT_KEVENT32) || (defined(_KERNEL) && defined(__LP64__))
10810c1fea8Sfengbojiang struct kevent32 {
10910c1fea8Sfengbojiang     uint32_t ident;     /* identifier for this event */
110a9643ea8Slogwang     short filter;       /* filter for event */
111a9643ea8Slogwang     u_short flags;
112a9643ea8Slogwang     u_int fflags;
11310c1fea8Sfengbojiang #ifndef __amd64__
11410c1fea8Sfengbojiang     uint32_t pad0;
11510c1fea8Sfengbojiang #endif
11610c1fea8Sfengbojiang     uint32_t data1, data2;
11710c1fea8Sfengbojiang     uint32_t udata;     /* opaque user data identifier */
11810c1fea8Sfengbojiang #ifndef __amd64__
11910c1fea8Sfengbojiang     uint32_t pad1;
12010c1fea8Sfengbojiang #endif
12110c1fea8Sfengbojiang     uint32_t ext64[8];
122a9643ea8Slogwang     };
123a9643ea8Slogwang 
12410c1fea8Sfengbojiang #ifdef _WANT_FREEBSD11_KEVENT
12510c1fea8Sfengbojiang     struct kevent32_freebsd11 {
12610c1fea8Sfengbojiang     u_int32_t ident;        /* identifier for this event */
12710c1fea8Sfengbojiang     short filter;           /* filter for event */
12810c1fea8Sfengbojiang     u_short flags;
12910c1fea8Sfengbojiang     u_int fflags;
13010c1fea8Sfengbojiang     int32_t data;
13110c1fea8Sfengbojiang     u_int32_t udata;        /* opaque user data identifier */
13210c1fea8Sfengbojiang     };
13310c1fea8Sfengbojiang #endif
13410c1fea8Sfengbojiang #endif
13510c1fea8Sfengbojiang 
136a9643ea8Slogwang /* actions */
137a9643ea8Slogwang #define EV_ADD        0x0001        /* add event to kq (implies enable) */
138a9643ea8Slogwang #define EV_DELETE     0x0002        /* delete event from kq */
139a9643ea8Slogwang #define EV_ENABLE     0x0004        /* enable event */
140a9643ea8Slogwang #define EV_DISABLE    0x0008        /* disable event (not reported) */
14110c1fea8Sfengbojiang #define EV_FORCEONESHOT 0x0100      /* enable _ONESHOT and force trigger */
142a9643ea8Slogwang 
143a9643ea8Slogwang /* flags */
144a9643ea8Slogwang #define EV_ONESHOT    0x0010        /* only report one occurrence */
145a9643ea8Slogwang #define EV_CLEAR      0x0020        /* clear event state after reporting */
146a9643ea8Slogwang #define EV_RECEIPT    0x0040        /* force EV_ERROR on success, data=0 */
147a9643ea8Slogwang #define EV_DISPATCH   0x0080        /* disable event after reporting */
148a9643ea8Slogwang 
149a9643ea8Slogwang #define EV_SYSFLAGS   0xF000        /* reserved by system */
150a9643ea8Slogwang #define EV_DROP       0x1000        /* note should be dropped */
151a9643ea8Slogwang #define EV_FLAG1      0x2000        /* filter-specific flag */
15210c1fea8Sfengbojiang #define EV_FLAG2      0x4000        /* filter-specific flag */
153a9643ea8Slogwang 
154a9643ea8Slogwang /* returned values */
155a9643ea8Slogwang #define EV_EOF        0x8000        /* EOF detected */
156a9643ea8Slogwang #define EV_ERROR      0x4000        /* error, data contains errno */
157a9643ea8Slogwang 
158a9643ea8Slogwang  /*
159a9643ea8Slogwang   * data/hint flags/masks for EVFILT_USER, shared with userspace
160a9643ea8Slogwang   *
161a9643ea8Slogwang   * On input, the top two bits of fflags specifies how the lower twenty four
162a9643ea8Slogwang   * bits should be applied to the stored value of fflags.
163a9643ea8Slogwang   *
164a9643ea8Slogwang   * On output, the top two bits will always be set to NOTE_FFNOP and the
165a9643ea8Slogwang   * remaining twenty four bits will contain the stored fflags value.
166a9643ea8Slogwang   */
167a9643ea8Slogwang #define NOTE_FFNOP         0x00000000        /* ignore input fflags */
168a9643ea8Slogwang #define NOTE_FFAND         0x40000000        /* AND fflags */
169a9643ea8Slogwang #define NOTE_FFOR          0x80000000        /* OR fflags */
170a9643ea8Slogwang #define NOTE_FFCOPY        0xc0000000        /* copy fflags */
171a9643ea8Slogwang #define NOTE_FFCTRLMASK    0xc0000000        /* masks for operations */
172a9643ea8Slogwang #define NOTE_FFLAGSMASK    0x00ffffff
173a9643ea8Slogwang 
174a9643ea8Slogwang #define NOTE_TRIGGER       0x01000000        /* Cause the event to be
175a9643ea8Slogwang                            triggered for output. */
176a9643ea8Slogwang 
177a9643ea8Slogwang /*
178a9643ea8Slogwang  * data/hint flags for EVFILT_{READ|WRITE}, shared with userspace
179a9643ea8Slogwang  */
180a9643ea8Slogwang #define NOTE_LOWAT        0x0001            /* low water mark */
18110c1fea8Sfengbojiang #define NOTE_FILE_POLL    0x0002            /* behave like poll() */
182a9643ea8Slogwang 
183a9643ea8Slogwang /*
184a9643ea8Slogwang  * data/hint flags for EVFILT_VNODE, shared with userspace
185a9643ea8Slogwang  */
186a9643ea8Slogwang #define NOTE_DELETE    0x0001            /* vnode was removed */
187a9643ea8Slogwang #define NOTE_WRITE     0x0002            /* data contents changed */
188a9643ea8Slogwang #define NOTE_EXTEND    0x0004            /* size increased */
189a9643ea8Slogwang #define NOTE_ATTRIB    0x0008            /* attributes changed */
190a9643ea8Slogwang #define NOTE_LINK      0x0010            /* link count changed */
191a9643ea8Slogwang #define NOTE_RENAME    0x0020            /* vnode was renamed */
192a9643ea8Slogwang #define NOTE_REVOKE    0x0040            /* vnode access was revoked */
19310c1fea8Sfengbojiang #define	NOTE_OPEN      0x0080            /* vnode was opened */
19410c1fea8Sfengbojiang #define	NOTE_CLOSE     0x0100            /* file closed, fd did not
19510c1fea8Sfengbojiang                            allowed write */
19610c1fea8Sfengbojiang #define	NOTE_CLOSE_WRITE 0x0200          /* file closed, fd did allowed
19710c1fea8Sfengbojiang                            write */
19810c1fea8Sfengbojiang #define	NOTE_READ      0x0400            /* file was read */
199a9643ea8Slogwang 
200a9643ea8Slogwang /*
20110c1fea8Sfengbojiang  * data/hint flags for EVFILT_PROC and EVFILT_PROCDESC, shared with userspace
202a9643ea8Slogwang  */
203a9643ea8Slogwang #define NOTE_EXIT         0x80000000        /* process exited */
204a9643ea8Slogwang #define NOTE_FORK         0x40000000        /* process forked */
205a9643ea8Slogwang #define NOTE_EXEC         0x20000000        /* process exec'd */
206a9643ea8Slogwang #define NOTE_PCTRLMASK    0xf0000000        /* mask for hint bits */
207a9643ea8Slogwang #define NOTE_PDATAMASK    0x000fffff        /* mask for pid */
208a9643ea8Slogwang 
209a9643ea8Slogwang /* additional flags for EVFILT_PROC */
210a9643ea8Slogwang #define NOTE_TRACK        0x00000001        /* follow across forks */
211a9643ea8Slogwang #define NOTE_TRACKERR     0x00000002        /* could not track child */
212a9643ea8Slogwang #define NOTE_CHILD        0x00000004        /* am a child process */
213a9643ea8Slogwang 
21410c1fea8Sfengbojiang /* additional flags for EVFILT_TIMER */
21510c1fea8Sfengbojiang #define NOTE_SECONDS		0x00000001	/* data is seconds */
21610c1fea8Sfengbojiang #define NOTE_MSECONDS		0x00000002	/* data is milliseconds */
21710c1fea8Sfengbojiang #define NOTE_USECONDS		0x00000004	/* data is microseconds */
21810c1fea8Sfengbojiang #define NOTE_NSECONDS		0x00000008	/* data is nanoseconds */
21910c1fea8Sfengbojiang #define	NOTE_ABSTIME		0x00000010	/* timeout is absolute */
22010c1fea8Sfengbojiang 
221a9643ea8Slogwang struct knote;
222a9643ea8Slogwang SLIST_HEAD(klist, knote);
223a9643ea8Slogwang struct kqueue;
224a9643ea8Slogwang TAILQ_HEAD(kqlist, kqueue);
225a9643ea8Slogwang struct knlist {
226a9643ea8Slogwang     struct klist kl_list;
227a9643ea8Slogwang     void (*kl_lock)(void *);    /* lock function */
228a9643ea8Slogwang     void (*kl_unlock)(void *);
22910c1fea8Sfengbojiang     void (*kl_assert_lock)(void *, int);
23010c1fea8Sfengbojiang     void *kl_lockarg;           /* argument passed to lock functions */
23110c1fea8Sfengbojiang     int kl_autodestroy;
232a9643ea8Slogwang };
233a9643ea8Slogwang 
234a9643ea8Slogwang #endif
2357f4229eaSlogwang 
2367f4229eaSlogwang #ifdef __cplusplus
2377f4229eaSlogwang }
2387f4229eaSlogwang #endif
239a9643ea8Slogwang #endif
240a9643ea8Slogwang 
241