event.h revision 1.1
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 *
26 *	$FreeBSD: src/sys/sys/event.h,v 1.12 2001/02/24 01:44:03 jlemon 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
39#define EVFILT_SYSCOUNT		6
40
41#define EV_SET(kevp, a, b, c, d, e, f) do {	\
42	(kevp)->ident = (a);			\
43	(kevp)->filter = (b);			\
44	(kevp)->flags = (c);			\
45	(kevp)->fflags = (d);			\
46	(kevp)->data = (e);			\
47	(kevp)->udata = (f);			\
48} while(0)
49
50struct kevent {
51	uintptr_t	ident;		/* identifier for this event */
52	short		filter;		/* filter for event */
53	u_short		flags;
54	u_int		fflags;
55	intptr_t	data;
56	void		*udata;		/* opaque user data identifier */
57};
58
59/* actions */
60#define EV_ADD		0x0001		/* add event to kq (implies enable) */
61#define EV_DELETE	0x0002		/* delete event from kq */
62#define EV_ENABLE	0x0004		/* enable event */
63#define EV_DISABLE	0x0008		/* disable event (not reported) */
64
65/* flags */
66#define EV_ONESHOT	0x0010		/* only report one occurrence */
67#define EV_CLEAR	0x0020		/* clear event state after reporting */
68
69#define EV_SYSFLAGS	0xF000		/* reserved by system */
70#define EV_FLAG1	0x2000		/* filter-specific flag */
71
72/* returned values */
73#define EV_EOF		0x8000		/* EOF detected */
74#define EV_ERROR	0x4000		/* error, data contains errno */
75
76/*
77 * data/hint flags for EVFILT_{READ|WRITE}, shared with userspace
78 */
79#define NOTE_LOWAT	0x0001			/* low water mark */
80
81/*
82 * data/hint flags for EVFILT_VNODE, shared with userspace
83 */
84#define	NOTE_DELETE	0x0001			/* vnode was removed */
85#define	NOTE_WRITE	0x0002			/* data contents changed */
86#define	NOTE_EXTEND	0x0004			/* size increased */
87#define	NOTE_ATTRIB	0x0008			/* attributes changed */
88#define	NOTE_LINK	0x0010			/* link count changed */
89#define	NOTE_RENAME	0x0020			/* vnode was renamed */
90#define	NOTE_REVOKE	0x0040			/* vnode access was revoked */
91
92/*
93 * data/hint flags for EVFILT_PROC, shared with userspace
94 */
95#define	NOTE_EXIT	0x80000000		/* process exited */
96#define	NOTE_FORK	0x40000000		/* process forked */
97#define	NOTE_EXEC	0x20000000		/* process exec'd */
98#define	NOTE_PCTRLMASK	0xf0000000		/* mask for hint bits */
99#define	NOTE_PDATAMASK	0x000fffff		/* mask for pid */
100
101/* additional flags for EVFILT_PROC */
102#define	NOTE_TRACK	0x00000001		/* follow across forks */
103#define	NOTE_TRACKERR	0x00000002		/* could not track child */
104#define	NOTE_CHILD	0x00000004		/* am a child process */
105
106/*
107 * This is currently visible to userland to work around broken
108 * programs which pull in <sys/proc.h> or <sys/select.h>.
109 */
110#include <sys/queue.h>
111struct knote;
112SLIST_HEAD(klist, knote);
113
114#ifdef _KERNEL
115
116#define KNOTE(list, hint)	if ((list) != NULL) knote(list, hint)
117
118/*
119 * Flag indicating hint is a signal.  Used by EVFILT_SIGNAL, and also
120 * shared by EVFILT_PROC  (all knotes attached to p->p_klist)
121 */
122#define NOTE_SIGNAL	0x08000000
123
124struct filterops {
125	int	f_isfd;		/* true if ident == filedescriptor */
126	int	(*f_attach)	__P((struct knote *kn));
127	void	(*f_detach)	__P((struct knote *kn));
128	int	(*f_event)	__P((struct knote *kn, long hint));
129};
130
131struct knote {
132	SLIST_ENTRY(knote)	kn_link;	/* for fd */
133	SLIST_ENTRY(knote)	kn_selnext;	/* for struct selinfo */
134	TAILQ_ENTRY(knote)	kn_tqe;
135	struct			kqueue *kn_kq;	/* which queue we are on */
136	struct 			kevent kn_kevent;
137	int			kn_status;
138	int			kn_sfflags;	/* saved filter flags */
139	intptr_t		kn_sdata;	/* saved data field */
140	union {
141		struct		file *p_fp;	/* file data pointer */
142		struct		proc *p_proc;	/* proc pointer */
143	} kn_ptr;
144	struct			filterops *kn_fop;
145	caddr_t			kn_hook;
146#define KN_ACTIVE	0x01			/* event has been triggered */
147#define KN_QUEUED	0x02			/* event is on queue */
148#define KN_DISABLED	0x04			/* event is disabled */
149#define KN_DETACHED	0x08			/* knote is detached */
150
151#define kn_id		kn_kevent.ident
152#define kn_filter	kn_kevent.filter
153#define kn_flags	kn_kevent.flags
154#define kn_fflags	kn_kevent.fflags
155#define kn_data		kn_kevent.data
156#define kn_fp		kn_ptr.p_fp
157};
158
159struct proc;
160
161extern void	knote(struct klist *list, long hint);
162extern void	knote_remove(struct proc *p, struct klist *list);
163extern void	knote_fdclose(struct proc *p, int fd);
164extern int 	kqueue_register(struct kqueue *kq,
165		    struct kevent *kev, struct proc *p);
166
167#else 	/* !_KERNEL */
168
169#include <sys/cdefs.h>
170struct timespec;
171
172__BEGIN_DECLS
173int     kqueue __P((void));
174int     kevent __P((int kq, const struct kevent *changelist, int nchanges,
175		    struct kevent *eventlist, int nevents,
176		    const struct timespec *timeout));
177__END_DECLS
178
179#endif /* !_KERNEL */
180
181#endif /* !_SYS_EVENT_H_ */
182