sl@0: /*- sl@0: * Copyright (c) 1999,2000,2001 Jonathan Lemon sl@0: * All rights reserved. sl@0: * sl@0: * Redistribution and use in source and binary forms, with or without sl@0: * modification, are permitted provided that the following conditions sl@0: * are met: sl@0: * 1. Redistributions of source code must retain the above copyright sl@0: * notice, this list of conditions and the following disclaimer. sl@0: * 2. Redistributions in binary form must reproduce the above copyright sl@0: * notice, this list of conditions and the following disclaimer in the sl@0: * documentation and/or other materials provided with the distribution. sl@0: * sl@0: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND sl@0: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE sl@0: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE sl@0: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE sl@0: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL sl@0: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS sl@0: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) sl@0: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT sl@0: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY sl@0: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF sl@0: * SUCH DAMAGE. sl@0: * Portions Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. sl@0: * $FreeBSD: src/sys/sys/event.h,v 1.32 2005/07/01 16:28:32 ssouhlal Exp $ sl@0: */ sl@0: sl@0: #ifndef _SYS_EVENT_H_ sl@0: #define _SYS_EVENT_H_ sl@0: sl@0: #define EVFILT_READ (-1) sl@0: #define EVFILT_WRITE (-2) sl@0: #define EVFILT_AIO (-3) /* attached to aio requests */ sl@0: #define EVFILT_VNODE (-4) /* attached to vnodes */ sl@0: #define EVFILT_PROC (-5) /* attached to struct proc */ sl@0: #define EVFILT_SIGNAL (-6) /* attached to struct proc */ sl@0: #define EVFILT_TIMER (-7) /* timers */ sl@0: #define EVFILT_NETDEV (-8) /* network devices */ sl@0: #define EVFILT_FS (-9) /* filesystem events */ sl@0: sl@0: #define EVFILT_SYSCOUNT 9 sl@0: sl@0: #define EV_SET(kevp_, a, b, c, d, e, f) do { \ sl@0: struct kevent *kevp = (kevp_); \ sl@0: (kevp)->ident = (a); \ sl@0: (kevp)->filter = (b); \ sl@0: (kevp)->flags = (c); \ sl@0: (kevp)->fflags = (d); \ sl@0: (kevp)->data = (e); \ sl@0: (kevp)->udata = (f); \ sl@0: } while(0) sl@0: sl@0: struct kevent { sl@0: uintptr_t ident; /* identifier for this event */ sl@0: short filter; /* filter for event */ sl@0: u_short flags; sl@0: u_int fflags; sl@0: intptr_t data; sl@0: void *udata; /* opaque user data identifier */ sl@0: }; sl@0: sl@0: /* actions */ sl@0: #define EV_ADD 0x0001 /* add event to kq (implies enable) */ sl@0: #define EV_DELETE 0x0002 /* delete event from kq */ sl@0: #define EV_ENABLE 0x0004 /* enable event */ sl@0: #define EV_DISABLE 0x0008 /* disable event (not reported) */ sl@0: sl@0: /* flags */ sl@0: #define EV_ONESHOT 0x0010 /* only report one occurrence */ sl@0: #define EV_CLEAR 0x0020 /* clear event state after reporting */ sl@0: sl@0: #define EV_SYSFLAGS 0xF000 /* reserved by system */ sl@0: #define EV_FLAG1 0x2000 /* filter-specific flag */ sl@0: sl@0: /* returned values */ sl@0: #define EV_EOF 0x8000 /* EOF detected */ sl@0: #define EV_ERROR 0x4000 /* error, data contains errno */ sl@0: sl@0: /* sl@0: * data/hint flags for EVFILT_{READ|WRITE}, shared with userspace sl@0: */ sl@0: #define NOTE_LOWAT 0x0001 /* low water mark */ sl@0: sl@0: /* sl@0: * data/hint flags for EVFILT_VNODE, shared with userspace sl@0: */ sl@0: #define NOTE_DELETE 0x0001 /* vnode was removed */ sl@0: #define NOTE_WRITE 0x0002 /* data contents changed */ sl@0: #define NOTE_EXTEND 0x0004 /* size increased */ sl@0: #define NOTE_ATTRIB 0x0008 /* attributes changed */ sl@0: #define NOTE_LINK 0x0010 /* link count changed */ sl@0: #define NOTE_RENAME 0x0020 /* vnode was renamed */ sl@0: #define NOTE_REVOKE 0x0040 /* vnode access was revoked */ sl@0: sl@0: /* sl@0: * data/hint flags for EVFILT_PROC, shared with userspace sl@0: */ sl@0: #define NOTE_EXIT 0x80000000 /* process exited */ sl@0: #define NOTE_FORK 0x40000000 /* process forked */ sl@0: #define NOTE_EXEC 0x20000000 /* process exec'd */ sl@0: #define NOTE_PCTRLMASK 0xf0000000 /* mask for hint bits */ sl@0: #define NOTE_PDATAMASK 0x000fffff /* mask for pid */ sl@0: sl@0: /* additional flags for EVFILT_PROC */ sl@0: #define NOTE_TRACK 0x00000001 /* follow across forks */ sl@0: #define NOTE_TRACKERR 0x00000002 /* could not track child */ sl@0: #define NOTE_CHILD 0x00000004 /* am a child process */ sl@0: sl@0: /* sl@0: * data/hint flags for EVFILT_NETDEV, shared with userspace sl@0: */ sl@0: #define NOTE_LINKUP 0x0001 /* link is up */ sl@0: #define NOTE_LINKDOWN 0x0002 /* link is down */ sl@0: #define NOTE_LINKINV 0x0004 /* link state is invalid */ sl@0: sl@0: /* sl@0: * This is currently visible to userland to work around broken sl@0: * programs which pull in . sl@0: */ sl@0: #include sl@0: #include sl@0: #include sl@0: struct knote; sl@0: struct kqueue; sl@0: struct knlist { sl@0: struct klist kl_list; sl@0: void (*kl_lock)(void *); /* lock function */ sl@0: void (*kl_unlock)(void *); sl@0: int (*kl_locked)(void *); sl@0: void *kl_lockarg; /* argument passed to kl_lockf() */ sl@0: }; sl@0: sl@0: sl@0: #ifdef _KERNEL sl@0: sl@0: #define KNLIST_EMPTY(list) SLIST_EMPTY(&(list)->kl_list) sl@0: sl@0: /* sl@0: * Flag indicating hint is a signal. Used by EVFILT_SIGNAL, and also sl@0: * shared by EVFILT_PROC (all knotes attached to p->p_klist) sl@0: */ sl@0: #define NOTE_SIGNAL 0x08000000 sl@0: sl@0: struct filterops { sl@0: int f_isfd; /* true if ident == filedescriptor */ sl@0: int (*f_attach)(struct knote *kn); sl@0: void (*f_detach)(struct knote *kn); sl@0: int (*f_event)(struct knote *kn, long hint); sl@0: }; sl@0: sl@0: /* sl@0: * Setting the KN_INFLUX flag enables you to unlock the kq that this knote sl@0: * is on, and modify kn_status as if you had the KQ lock. sl@0: * sl@0: * kn_sfflags, kn_sdata, and kn_kevent are protected by the knlist lock. sl@0: */ sl@0: struct knote { sl@0: SLIST_ENTRY(knote) kn_link; /* for kq */ sl@0: SLIST_ENTRY(knote) kn_selnext; /* for struct selinfo */ sl@0: struct knlist *kn_knlist; /* f_attach populated */ sl@0: TAILQ_ENTRY(knote) kn_tqe; sl@0: struct kqueue *kn_kq; /* which queue we are on */ sl@0: struct kevent kn_kevent; sl@0: int kn_status; /* protected by kq lock */ sl@0: #define KN_ACTIVE 0x01 /* event has been triggered */ sl@0: #define KN_QUEUED 0x02 /* event is on queue */ sl@0: #define KN_DISABLED 0x04 /* event is disabled */ sl@0: #define KN_DETACHED 0x08 /* knote is detached */ sl@0: #define KN_INFLUX 0x10 /* knote is in flux */ sl@0: #define KN_MARKER 0x20 /* ignore this knote */ sl@0: #define KN_KQUEUE 0x40 /* this knote belongs to a kq */ sl@0: #define KN_HASKQLOCK 0x80 /* for _inevent */ sl@0: int kn_sfflags; /* saved filter flags */ sl@0: intptr_t kn_sdata; /* saved data field */ sl@0: union { sl@0: struct file *p_fp; /* file data pointer */ sl@0: struct proc *p_proc; /* proc pointer */ sl@0: } kn_ptr; sl@0: struct filterops *kn_fop; sl@0: void *kn_hook; sl@0: sl@0: #define kn_id kn_kevent.ident sl@0: #define kn_filter kn_kevent.filter sl@0: #define kn_flags kn_kevent.flags sl@0: #define kn_fflags kn_kevent.fflags sl@0: #define kn_data kn_kevent.data sl@0: #define kn_fp kn_ptr.p_fp sl@0: }; sl@0: struct kevent_copyops { sl@0: void *arg; sl@0: int (*k_copyout)(void *arg, struct kevent *kevp, int count); sl@0: int (*k_copyin)(void *arg, struct kevent *kevp, int count); sl@0: }; sl@0: sl@0: struct thread; sl@0: struct proc; sl@0: struct knlist; sl@0: sl@0: #endif /* !_KERNEL */ sl@0: sl@0: #endif /* !_SYS_EVENT_H_ */