1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/ossrv/genericopenlibs/openenvcore/include/sys/event.h Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,202 @@
1.4 +/*-
1.5 + * Copyright (c) 1999,2000,2001 Jonathan Lemon <jlemon@FreeBSD.org>
1.6 + * All rights reserved.
1.7 + *
1.8 + * Redistribution and use in source and binary forms, with or without
1.9 + * modification, are permitted provided that the following conditions
1.10 + * are met:
1.11 + * 1. Redistributions of source code must retain the above copyright
1.12 + * notice, this list of conditions and the following disclaimer.
1.13 + * 2. Redistributions in binary form must reproduce the above copyright
1.14 + * notice, this list of conditions and the following disclaimer in the
1.15 + * documentation and/or other materials provided with the distribution.
1.16 + *
1.17 + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1.18 + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1.19 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1.20 + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1.21 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1.22 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1.23 + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1.24 + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1.25 + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1.26 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1.27 + * SUCH DAMAGE.
1.28 + * Portions Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
1.29 + * $FreeBSD: src/sys/sys/event.h,v 1.32 2005/07/01 16:28:32 ssouhlal Exp $
1.30 + */
1.31 +
1.32 +#ifndef _SYS_EVENT_H_
1.33 +#define _SYS_EVENT_H_
1.34 +
1.35 +#define EVFILT_READ (-1)
1.36 +#define EVFILT_WRITE (-2)
1.37 +#define EVFILT_AIO (-3) /* attached to aio requests */
1.38 +#define EVFILT_VNODE (-4) /* attached to vnodes */
1.39 +#define EVFILT_PROC (-5) /* attached to struct proc */
1.40 +#define EVFILT_SIGNAL (-6) /* attached to struct proc */
1.41 +#define EVFILT_TIMER (-7) /* timers */
1.42 +#define EVFILT_NETDEV (-8) /* network devices */
1.43 +#define EVFILT_FS (-9) /* filesystem events */
1.44 +
1.45 +#define EVFILT_SYSCOUNT 9
1.46 +
1.47 +#define EV_SET(kevp_, a, b, c, d, e, f) do { \
1.48 + struct kevent *kevp = (kevp_); \
1.49 + (kevp)->ident = (a); \
1.50 + (kevp)->filter = (b); \
1.51 + (kevp)->flags = (c); \
1.52 + (kevp)->fflags = (d); \
1.53 + (kevp)->data = (e); \
1.54 + (kevp)->udata = (f); \
1.55 +} while(0)
1.56 +
1.57 +struct kevent {
1.58 + uintptr_t ident; /* identifier for this event */
1.59 + short filter; /* filter for event */
1.60 + u_short flags;
1.61 + u_int fflags;
1.62 + intptr_t data;
1.63 + void *udata; /* opaque user data identifier */
1.64 +};
1.65 +
1.66 +/* actions */
1.67 +#define EV_ADD 0x0001 /* add event to kq (implies enable) */
1.68 +#define EV_DELETE 0x0002 /* delete event from kq */
1.69 +#define EV_ENABLE 0x0004 /* enable event */
1.70 +#define EV_DISABLE 0x0008 /* disable event (not reported) */
1.71 +
1.72 +/* flags */
1.73 +#define EV_ONESHOT 0x0010 /* only report one occurrence */
1.74 +#define EV_CLEAR 0x0020 /* clear event state after reporting */
1.75 +
1.76 +#define EV_SYSFLAGS 0xF000 /* reserved by system */
1.77 +#define EV_FLAG1 0x2000 /* filter-specific flag */
1.78 +
1.79 +/* returned values */
1.80 +#define EV_EOF 0x8000 /* EOF detected */
1.81 +#define EV_ERROR 0x4000 /* error, data contains errno */
1.82 +
1.83 +/*
1.84 + * data/hint flags for EVFILT_{READ|WRITE}, shared with userspace
1.85 + */
1.86 +#define NOTE_LOWAT 0x0001 /* low water mark */
1.87 +
1.88 +/*
1.89 + * data/hint flags for EVFILT_VNODE, shared with userspace
1.90 + */
1.91 +#define NOTE_DELETE 0x0001 /* vnode was removed */
1.92 +#define NOTE_WRITE 0x0002 /* data contents changed */
1.93 +#define NOTE_EXTEND 0x0004 /* size increased */
1.94 +#define NOTE_ATTRIB 0x0008 /* attributes changed */
1.95 +#define NOTE_LINK 0x0010 /* link count changed */
1.96 +#define NOTE_RENAME 0x0020 /* vnode was renamed */
1.97 +#define NOTE_REVOKE 0x0040 /* vnode access was revoked */
1.98 +
1.99 +/*
1.100 + * data/hint flags for EVFILT_PROC, shared with userspace
1.101 + */
1.102 +#define NOTE_EXIT 0x80000000 /* process exited */
1.103 +#define NOTE_FORK 0x40000000 /* process forked */
1.104 +#define NOTE_EXEC 0x20000000 /* process exec'd */
1.105 +#define NOTE_PCTRLMASK 0xf0000000 /* mask for hint bits */
1.106 +#define NOTE_PDATAMASK 0x000fffff /* mask for pid */
1.107 +
1.108 +/* additional flags for EVFILT_PROC */
1.109 +#define NOTE_TRACK 0x00000001 /* follow across forks */
1.110 +#define NOTE_TRACKERR 0x00000002 /* could not track child */
1.111 +#define NOTE_CHILD 0x00000004 /* am a child process */
1.112 +
1.113 +/*
1.114 + * data/hint flags for EVFILT_NETDEV, shared with userspace
1.115 + */
1.116 +#define NOTE_LINKUP 0x0001 /* link is up */
1.117 +#define NOTE_LINKDOWN 0x0002 /* link is down */
1.118 +#define NOTE_LINKINV 0x0004 /* link state is invalid */
1.119 +
1.120 +/*
1.121 + * This is currently visible to userland to work around broken
1.122 + * programs which pull in <sys/proc.h>.
1.123 + */
1.124 +#include <sys/queue.h>
1.125 +#include <sys/_lock.h>
1.126 +#include <sys/_mutex.h>
1.127 +struct knote;
1.128 +struct kqueue;
1.129 +struct knlist {
1.130 + struct klist kl_list;
1.131 + void (*kl_lock)(void *); /* lock function */
1.132 + void (*kl_unlock)(void *);
1.133 + int (*kl_locked)(void *);
1.134 + void *kl_lockarg; /* argument passed to kl_lockf() */
1.135 +};
1.136 +
1.137 +
1.138 +#ifdef _KERNEL
1.139 +
1.140 +#define KNLIST_EMPTY(list) SLIST_EMPTY(&(list)->kl_list)
1.141 +
1.142 +/*
1.143 + * Flag indicating hint is a signal. Used by EVFILT_SIGNAL, and also
1.144 + * shared by EVFILT_PROC (all knotes attached to p->p_klist)
1.145 + */
1.146 +#define NOTE_SIGNAL 0x08000000
1.147 +
1.148 +struct filterops {
1.149 + int f_isfd; /* true if ident == filedescriptor */
1.150 + int (*f_attach)(struct knote *kn);
1.151 + void (*f_detach)(struct knote *kn);
1.152 + int (*f_event)(struct knote *kn, long hint);
1.153 +};
1.154 +
1.155 +/*
1.156 + * Setting the KN_INFLUX flag enables you to unlock the kq that this knote
1.157 + * is on, and modify kn_status as if you had the KQ lock.
1.158 + *
1.159 + * kn_sfflags, kn_sdata, and kn_kevent are protected by the knlist lock.
1.160 + */
1.161 +struct knote {
1.162 + SLIST_ENTRY(knote) kn_link; /* for kq */
1.163 + SLIST_ENTRY(knote) kn_selnext; /* for struct selinfo */
1.164 + struct knlist *kn_knlist; /* f_attach populated */
1.165 + TAILQ_ENTRY(knote) kn_tqe;
1.166 + struct kqueue *kn_kq; /* which queue we are on */
1.167 + struct kevent kn_kevent;
1.168 + int kn_status; /* protected by kq lock */
1.169 +#define KN_ACTIVE 0x01 /* event has been triggered */
1.170 +#define KN_QUEUED 0x02 /* event is on queue */
1.171 +#define KN_DISABLED 0x04 /* event is disabled */
1.172 +#define KN_DETACHED 0x08 /* knote is detached */
1.173 +#define KN_INFLUX 0x10 /* knote is in flux */
1.174 +#define KN_MARKER 0x20 /* ignore this knote */
1.175 +#define KN_KQUEUE 0x40 /* this knote belongs to a kq */
1.176 +#define KN_HASKQLOCK 0x80 /* for _inevent */
1.177 + int kn_sfflags; /* saved filter flags */
1.178 + intptr_t kn_sdata; /* saved data field */
1.179 + union {
1.180 + struct file *p_fp; /* file data pointer */
1.181 + struct proc *p_proc; /* proc pointer */
1.182 + } kn_ptr;
1.183 + struct filterops *kn_fop;
1.184 + void *kn_hook;
1.185 +
1.186 +#define kn_id kn_kevent.ident
1.187 +#define kn_filter kn_kevent.filter
1.188 +#define kn_flags kn_kevent.flags
1.189 +#define kn_fflags kn_kevent.fflags
1.190 +#define kn_data kn_kevent.data
1.191 +#define kn_fp kn_ptr.p_fp
1.192 +};
1.193 +struct kevent_copyops {
1.194 + void *arg;
1.195 + int (*k_copyout)(void *arg, struct kevent *kevp, int count);
1.196 + int (*k_copyin)(void *arg, struct kevent *kevp, int count);
1.197 +};
1.198 +
1.199 +struct thread;
1.200 +struct proc;
1.201 +struct knlist;
1.202 +
1.203 +#endif /* !_KERNEL */
1.204 +
1.205 +#endif /* !_SYS_EVENT_H_ */