event.h revision 1.6
1/*	$NetBSD: event.h,v 1.6 2003/02/04 09:02:04 jdolecek Exp $	*/
2/*-
3 * Copyright (c) 1999,2000,2001 Jonathan Lemon <jlemon@FreeBSD.org>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 *	$FreeBSD: src/sys/sys/event.h,v 1.12 2001/02/24 01:44:03 jlemon Exp $
28 */
29
30#ifndef _SYS_EVENT_H_
31#define	_SYS_EVENT_H_
32
33#include <sys/inttypes.h>		/* for uintptr_t */
34#include <sys/null.h>			/* for NULL */
35
36#define	EVFILT_READ		0
37#define	EVFILT_WRITE		1
38#define	EVFILT_AIO		2	/* attached to aio requests */
39#define	EVFILT_VNODE		3	/* attached to vnodes */
40#define	EVFILT_PROC		4	/* attached to struct proc */
41#define	EVFILT_SIGNAL		5	/* attached to struct proc */
42#define	EVFILT_TIMER		6	/* arbitrary timer (in ms) */
43#define	EVFILT_SYSCOUNT		7	/* number of filters */
44
45#define	EV_SET(kevp, a, b, c, d, e, f)					\
46do {									\
47	(kevp)->ident = (a);						\
48	(kevp)->filter = (b);						\
49	(kevp)->flags = (c);						\
50	(kevp)->fflags = (d);						\
51	(kevp)->data = (e);						\
52	(kevp)->udata = (f);						\
53} while (/* CONSTCOND */ 0)
54
55
56struct kevent {
57	uintptr_t	ident;		/* identifier for this event */
58	uint32_t	filter;		/* filter for event */
59	uint32_t	flags;		/* action flags for kqueue */
60	uint32_t	fflags;		/* filter flag value */
61	int64_t		data;		/* filter data value */
62	intptr_t	udata;		/* opaque user data identifier */
63};
64
65/* actions */
66#define	EV_ADD		0x0001		/* add event to kq (implies ENABLE) */
67#define	EV_DELETE	0x0002		/* delete event from kq */
68#define	EV_ENABLE	0x0004		/* enable event */
69#define	EV_DISABLE	0x0008		/* disable event (not reported) */
70
71/* flags */
72#define	EV_ONESHOT	0x0010		/* only report one occurrence */
73#define	EV_CLEAR	0x0020		/* clear event state after reporting */
74
75#define	EV_SYSFLAGS	0xF000		/* reserved by system */
76#define	EV_FLAG1	0x2000		/* filter-specific flag */
77
78/* returned values */
79#define	EV_EOF		0x8000		/* EOF detected */
80#define	EV_ERROR	0x4000		/* error, data contains errno */
81
82/*
83 * data/hint flags for EVFILT_{READ|WRITE}, shared with userspace
84 */
85#define	NOTE_LOWAT	0x0001		/* low water mark */
86
87/*
88 * data/hint flags for EVFILT_VNODE, shared with userspace
89 */
90#define	NOTE_DELETE	0x0001			/* vnode was removed */
91#define	NOTE_WRITE	0x0002			/* data contents changed */
92#define	NOTE_EXTEND	0x0004			/* size increased */
93#define	NOTE_ATTRIB	0x0008			/* attributes changed */
94#define	NOTE_LINK	0x0010			/* link count changed */
95#define	NOTE_RENAME	0x0020			/* vnode was renamed */
96#define	NOTE_REVOKE	0x0040			/* vnode access was revoked */
97
98/*
99 * data/hint flags for EVFILT_PROC, shared with userspace
100 */
101#define	NOTE_EXIT	0x80000000		/* process exited */
102#define	NOTE_FORK	0x40000000		/* process forked */
103#define	NOTE_EXEC	0x20000000		/* process exec'd */
104#define	NOTE_PCTRLMASK	0xf0000000		/* mask for hint bits */
105#define	NOTE_PDATAMASK	0x000fffff		/* mask for pid */
106
107/* additional flags for EVFILT_PROC */
108#define	NOTE_TRACK	0x00000001		/* follow across forks */
109#define	NOTE_TRACKERR	0x00000002		/* could not track child */
110#define	NOTE_CHILD	0x00000004		/* am a child process */
111
112/*
113 * This is currently visible to userland to work around broken
114 * programs which pull in <sys/proc.h> or <sys/select.h>.
115 */
116#include <sys/queue.h>
117struct knote;
118SLIST_HEAD(klist, knote);
119
120
121/*
122 * ioctl(2)s supported on kqueue descriptors.
123 */
124#include <sys/ioctl.h>
125
126struct kfilter_mapping {
127	char		*name;		/* name to lookup or return */
128	size_t		len;		/* length of name */
129	uint32_t	filter;		/* filter to lookup or return */
130};
131
132/* map filter to name (max size len) */
133#define KFILTER_BYFILTER	_IOWR('k', 0, struct kfilter_mapping)
134/* map name to filter (len ignored) */
135#define KFILTER_BYNAME		_IOWR('k', 1, struct kfilter_mapping)
136
137#ifdef _KERNEL
138#include <sys/mallocvar.h>		/* for malloc types */
139
140MALLOC_DECLARE(M_KEVENT);
141
142#define	KNOTE(list, hint)	if (!SLIST_EMPTY(list)) knote(list, hint)
143
144/*
145 * Flag indicating hint is a signal.  Used by EVFILT_SIGNAL, and also
146 * shared by EVFILT_PROC  (all knotes attached to p->p_klist)
147 */
148#define	NOTE_SIGNAL	0x08000000
149
150/*
151 * Callback methods for each filter type.
152 */
153struct filterops {
154	int	f_isfd;			/* true if ident == filedescriptor */
155	int	(*f_attach)	__P((struct knote *kn));
156					/* called when knote is ADDed */
157	void	(*f_detach)	__P((struct knote *kn));
158					/* called when knote is DELETEd */
159	int	(*f_event)	__P((struct knote *kn, long hint));
160					/* called when event is triggered */
161};
162
163struct knote {
164	SLIST_ENTRY(knote)	kn_link;	/* for fd */
165	SLIST_ENTRY(knote)	kn_selnext;	/* for struct selinfo */
166	TAILQ_ENTRY(knote)	kn_tqe;
167	struct kqueue		*kn_kq;		/* which queue we are on */
168	struct kevent		kn_kevent;
169	uint32_t		kn_status;
170	uint32_t		kn_sfflags;	/* saved filter flags */
171	uintptr_t		kn_sdata;	/* saved data field */
172	union {
173		struct file	*p_fp;		/* file data pointer */
174		struct proc	*p_proc;	/* proc pointer */
175		void		*p_opaque;	/* opaque/misc pointer */
176	} kn_ptr;
177	const struct filterops	*kn_fop;
178	void 			*kn_hook;
179
180#define	KN_ACTIVE	0x01			/* event has been triggered */
181#define	KN_QUEUED	0x02			/* event is on queue */
182#define	KN_DISABLED	0x04			/* event is disabled */
183#define	KN_DETACHED	0x08			/* knote is detached */
184
185#define	kn_id		kn_kevent.ident
186#define	kn_filter	kn_kevent.filter
187#define	kn_flags	kn_kevent.flags
188#define	kn_fflags	kn_kevent.fflags
189#define	kn_data		kn_kevent.data
190#define	kn_fp		kn_ptr.p_fp
191};
192
193struct proc;
194
195void		kqueue_init(void);
196
197void	knote(struct klist *list, long hint);
198void	knote_remove(struct proc *p, struct klist *list);
199void	knote_fdclose(struct proc *p, int fd);
200int 	kqueue_register(struct kqueue *kq,
201		    struct kevent *kev, struct proc *p);
202
203int	kfilter_register(const char *name,
204		    const struct filterops *filtops, int *retfilter);
205int	kfilter_unregister(const char *name);
206
207int	filt_seltrue(struct knote *kn, long hint);
208int	seltrue_kqfilter(dev_t dev, struct knote *kn);
209
210#else 	/* !_KERNEL */
211
212#include <sys/cdefs.h>
213struct timespec;
214
215__BEGIN_DECLS
216#if !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)
217int	kqueue __P((void));
218int	kevent __P((int kq, const struct kevent *changelist, size_t nchanges,
219		    struct kevent *eventlist, size_t nevents,
220		    const struct timespec *timeout));
221#endif /* !_POSIX_C_SOURCE */
222__END_DECLS
223
224#endif /* !_KERNEL */
225
226#endif /* !_SYS_EVENT_H_ */
227