event.h

Go to the documentation of this file.
00001 /*-
00002  * Copyright (c) 1999,2000,2001 Jonathan Lemon <[email protected]>
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  *
00014  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
00015  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00016  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00017  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
00018  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00019  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00020  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00021  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00022  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00023  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00024  * SUCH DAMAGE.
00025  * © Portions copyright (c) 2007 Symbian Software Ltd. All rights reserved.
00026  * $FreeBSD: src/sys/sys/event.h,v 1.32 2005/07/01 16:28:32 ssouhlal Exp $
00027  */
00028 
00029 #ifndef _SYS_EVENT_H_
00030 #define _SYS_EVENT_H_
00031 
00032 #define EVFILT_READ             (-1)
00033 #define EVFILT_WRITE            (-2)
00034 #define EVFILT_AIO              (-3)    /* attached to aio requests */
00035 #define EVFILT_VNODE            (-4)    /* attached to vnodes */
00036 #define EVFILT_PROC             (-5)    /* attached to struct proc */
00037 #define EVFILT_SIGNAL           (-6)    /* attached to struct proc */
00038 #define EVFILT_TIMER            (-7)    /* timers */
00039 #define EVFILT_NETDEV           (-8)    /* network devices */
00040 #define EVFILT_FS               (-9)    /* filesystem events */
00041 
00042 #define EVFILT_SYSCOUNT         9
00043 
00044 #define EV_SET(kevp_, a, b, c, d, e, f) do {    \
00045         struct kevent *kevp = (kevp_);          \
00046         (kevp)->ident = (a);                    \
00047         (kevp)->filter = (b);                   \
00048         (kevp)->flags = (c);                    \
00049         (kevp)->fflags = (d);                   \
00050         (kevp)->data = (e);                     \
00051         (kevp)->udata = (f);                    \
00052 } while(0)
00053 
00054 struct kevent {
00055         uintptr_t       ident;          /* identifier for this event */
00056         short           filter;         /* filter for event */
00057         u_short         flags;
00058         u_int           fflags;
00059         intptr_t        data;
00060         void            *udata;         /* opaque user data identifier */
00061 };
00062 
00063 /* actions */
00064 #define EV_ADD          0x0001          /* add event to kq (implies enable) */
00065 #define EV_DELETE       0x0002          /* delete event from kq */
00066 #define EV_ENABLE       0x0004          /* enable event */
00067 #define EV_DISABLE      0x0008          /* disable event (not reported) */
00068 
00069 /* flags */
00070 #define EV_ONESHOT      0x0010          /* only report one occurrence */
00071 #define EV_CLEAR        0x0020          /* clear event state after reporting */
00072 
00073 #define EV_SYSFLAGS     0xF000          /* reserved by system */
00074 #define EV_FLAG1        0x2000          /* filter-specific flag */
00075 
00076 /* returned values */
00077 #define EV_EOF          0x8000          /* EOF detected */
00078 #define EV_ERROR        0x4000          /* error, data contains errno */
00079 
00080 /*
00081  * data/hint flags for EVFILT_{READ|WRITE}, shared with userspace
00082  */
00083 #define NOTE_LOWAT      0x0001                  /* low water mark */
00084 
00085 /*
00086  * data/hint flags for EVFILT_VNODE, shared with userspace
00087  */
00088 #define NOTE_DELETE     0x0001                  /* vnode was removed */
00089 #define NOTE_WRITE      0x0002                  /* data contents changed */
00090 #define NOTE_EXTEND     0x0004                  /* size increased */
00091 #define NOTE_ATTRIB     0x0008                  /* attributes changed */
00092 #define NOTE_LINK       0x0010                  /* link count changed */
00093 #define NOTE_RENAME     0x0020                  /* vnode was renamed */
00094 #define NOTE_REVOKE     0x0040                  /* vnode access was revoked */
00095 
00096 /*
00097  * data/hint flags for EVFILT_PROC, shared with userspace
00098  */
00099 #define NOTE_EXIT       0x80000000              /* process exited */
00100 #define NOTE_FORK       0x40000000              /* process forked */
00101 #define NOTE_EXEC       0x20000000              /* process exec'd */
00102 #define NOTE_PCTRLMASK  0xf0000000              /* mask for hint bits */
00103 #define NOTE_PDATAMASK  0x000fffff              /* mask for pid */
00104 
00105 /* additional flags for EVFILT_PROC */
00106 #define NOTE_TRACK      0x00000001              /* follow across forks */
00107 #define NOTE_TRACKERR   0x00000002              /* could not track child */
00108 #define NOTE_CHILD      0x00000004              /* am a child process */
00109 
00110 /*
00111  * data/hint flags for EVFILT_NETDEV, shared with userspace
00112  */
00113 #define NOTE_LINKUP     0x0001                  /* link is up */
00114 #define NOTE_LINKDOWN   0x0002                  /* link is down */
00115 #define NOTE_LINKINV    0x0004                  /* link state is invalid */
00116 
00117 /*
00118  * This is currently visible to userland to work around broken
00119  * programs which pull in <sys/proc.h>.
00120  */
00121 #include <sys/queue.h> 
00122 #include <sys/_lock.h>
00123 #include <sys/_mutex.h>
00124 struct knote;
00125 struct kqueue;
00126 struct knlist {
00127         struct  klist   kl_list;
00128         void    (*kl_lock)(void *);     /* lock function */
00129         void    (*kl_unlock)(void *);
00130         int    (*kl_locked)(void *);
00131         void *kl_lockarg;               /* argument passed to kl_lockf() */
00132 };
00133 
00134 
00135 #ifdef _KERNEL
00136 
00137 #define KNLIST_EMPTY(list)              SLIST_EMPTY(&(list)->kl_list)
00138 
00139 /*
00140  * Flag indicating hint is a signal.  Used by EVFILT_SIGNAL, and also
00141  * shared by EVFILT_PROC  (all knotes attached to p->p_klist)
00142  */
00143 #define NOTE_SIGNAL     0x08000000
00144 
00145 struct filterops {
00146         int     f_isfd;         /* true if ident == filedescriptor */
00147         int     (*f_attach)(struct knote *kn);
00148         void    (*f_detach)(struct knote *kn);
00149         int     (*f_event)(struct knote *kn, long hint);
00150 };
00151 
00152 /*
00153  * Setting the KN_INFLUX flag enables you to unlock the kq that this knote
00154  * is on, and modify kn_status as if you had the KQ lock.
00155  *
00156  * kn_sfflags, kn_sdata, and kn_kevent are protected by the knlist lock.
00157  */
00158 struct knote {
00159         SLIST_ENTRY(knote)      kn_link;        /* for kq */
00160         SLIST_ENTRY(knote)      kn_selnext;     /* for struct selinfo */
00161         struct                  knlist *kn_knlist;      /* f_attach populated */
00162         TAILQ_ENTRY(knote)      kn_tqe;
00163         struct                  kqueue *kn_kq;  /* which queue we are on */
00164         struct                  kevent kn_kevent;
00165         int                     kn_status;      /* protected by kq lock */
00166 #define KN_ACTIVE       0x01                    /* event has been triggered */
00167 #define KN_QUEUED       0x02                    /* event is on queue */
00168 #define KN_DISABLED     0x04                    /* event is disabled */
00169 #define KN_DETACHED     0x08                    /* knote is detached */
00170 #define KN_INFLUX       0x10                    /* knote is in flux */
00171 #define KN_MARKER       0x20                    /* ignore this knote */
00172 #define KN_KQUEUE       0x40                    /* this knote belongs to a kq */
00173 #define KN_HASKQLOCK    0x80                    /* for _inevent */
00174         int                     kn_sfflags;     /* saved filter flags */
00175         intptr_t                kn_sdata;       /* saved data field */
00176         union {
00177                 struct          file *p_fp;     /* file data pointer */
00178                 struct          proc *p_proc;   /* proc pointer */
00179         } kn_ptr;
00180         struct                  filterops *kn_fop;
00181         void                    *kn_hook;
00182 
00183 #define kn_id           kn_kevent.ident
00184 #define kn_filter       kn_kevent.filter
00185 #define kn_flags        kn_kevent.flags
00186 #define kn_fflags       kn_kevent.fflags
00187 #define kn_data         kn_kevent.data
00188 #define kn_fp           kn_ptr.p_fp
00189 };
00190 struct kevent_copyops {
00191         void    *arg;
00192         int     (*k_copyout)(void *arg, struct kevent *kevp, int count);
00193         int     (*k_copyin)(void *arg, struct kevent *kevp, int count);
00194 };
00195 
00196 struct thread;
00197 struct proc;
00198 struct knlist;
00199 
00200 #endif /* !_KERNEL */
00201 
00202 #endif /* !_SYS_EVENT_H_ */

Copyright © Nokia Corporation 2001-2008
Back to top