diff options
author | paulcantrell <paulcantrell> | 2007-12-10 21:59:20 +0000 |
---|---|---|
committer | paulcantrell <paulcantrell> | 2007-12-10 21:59:20 +0000 |
commit | 2ee4787d1df9784d40a7eda91e61691da3d56f74 (patch) | |
tree | 0947afb6c37ffeb4ae193401a187255cf27b0ed3 /syspoll.h | |
download | videoteco-fork-2ee4787d1df9784d40a7eda91e61691da3d56f74.tar.gz |
Initial revision
Diffstat (limited to 'syspoll.h')
-rw-r--r-- | syspoll.h | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/syspoll.h b/syspoll.h new file mode 100644 index 0000000..68e4884 --- /dev/null +++ b/syspoll.h @@ -0,0 +1,153 @@ +/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ +/* All Rights Reserved */ + +/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */ +/* The copyright notice above does not evidence any */ +/* actual or intended publication of such source code. */ + +/* + * Copyright (c) 1995 by Sun Microsystems, Inc. + * All rights reserved. + */ + +#ifndef _SYS_POLL_H +#define _SYS_POLL_H + +#pragma ident "@(#)poll.h 1.24 97/04/18 SMI" /* SVr4.0 11.9 */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Structure of file descriptor/event pairs supplied in + * the poll arrays. + */ +typedef struct pollfd { + int fd; /* file desc to poll */ + short events; /* events of interest on fd */ + short revents; /* events that occurred on fd */ +} pollfd_t; + +typedef unsigned long nfds_t; + +/* + * Testable select events + */ +#define POLLIN 0x0001 /* fd is readable */ +#define POLLPRI 0x0002 /* high priority info at fd */ +#define POLLOUT 0x0004 /* fd is writeable (won't block) */ +#define POLLRDNORM 0x0040 /* normal data is readable */ +#define POLLWRNORM POLLOUT +#define POLLRDBAND 0x0080 /* out-of-band data is readable */ +#define POLLWRBAND 0x0100 /* out-of-band data is writeable */ + +#define POLLNORM POLLRDNORM + +/* + * Non-testable poll events (may not be specified in events field, + * but may be returned in revents field). + */ +#define POLLERR 0x0008 /* fd has error condition */ +#define POLLHUP 0x0010 /* fd has been hung up on */ +#define POLLNVAL 0x0020 /* invalid pollfd entry */ + +#ifdef _KERNEL + +/* + * Additional private poll flags supported only by strpoll(). + * Must be bit-wise distinct from the above POLL flags. + */ +#define POLLRDDATA 0x200 /* Wait for M_DATA; ignore M_PROTO only msgs */ +#define POLLNOERR 0x400 /* Ignore POLLERR conditions */ + +#endif /* _KERNEL */ + +#if defined(_KERNEL) || defined(_KMEMUSER) + +#include <sys/t_lock.h> +#include <sys/thread.h> + +/* + * Poll list head structure. A pointer to this is passed to + * pollwakeup() from the caller indicating an event has occurred. + * Only the ph_list field is used, but for DDI compliance, we can't + * change the size of the structure. + */ +typedef struct pollhead { + struct polldat *ph_list; /* list of pollers */ + struct polldat *ph_dummy; /* unused -- see above */ + short ph_events; /* unused -- see above */ +} pollhead_t; + +/* + * Data necessary to notify process sleeping in poll(2) + * when an event has occurred. + */ +typedef struct polldat { + kthread_t *pd_thread; /* thread doing poll */ + int pd_events; /* events being polled */ + struct polldat *pd_next; /* next in poll list */ + struct polldat *pd_prev; /* previous in poll list */ + struct pollhead *pd_headp; /* backpointer to head of list */ + struct pollhead *pd_sphp; /* stored pollhead struct pointer */ +} polldat_t; + +/* + * State information kept by each polling thread + */ +typedef struct pollstate { + int ps_nfds; + int ps_flag; + pollfd_t *ps_pollfd; + polldat_t *ps_polldat; + kmutex_t ps_lock; /* mutex for the polling thread */ + kmutex_t ps_no_exit; /* protects ps_busy*, can't be nested */ + int ps_busy; /* can only exit when its 0 */ + kcondvar_t ps_busy_cv; /* cv to wait on if ps_busy != 0 */ + kcondvar_t ps_cv; /* cv to wait on if needed */ +} pollstate_t; + +/* ps_flag */ +#define T_POLLTIME 0x01 /* poll timeout pending */ +#define T_POLLWAKE 0x02 /* pollwakeup() occurred */ + +#if defined(_KERNEL) + +/* + * Routine called to notify a process of the occurrence + * of an event. + */ +extern void pollwakeup(pollhead_t *, short); +/* + * pollwakeup_safe will replace pollwakeup when the support + * for unsafe drivers is removed. + */ +extern void pollwakeup_safe(pollhead_t *, short); + +/* + * Internal routines. + */ +extern void polltime(kthread_t *); +extern void pollrun(kthread_t *); +extern void polldel(pollstate_t *); +extern void polllock(pollhead_t *, kmutex_t *); +extern int pollunlock(pollhead_t *); +extern void pollrelock(pollhead_t *, int); +extern void pollcleanup(kthread_t *); + +extern void ppwaitemptylist(pollhead_t *); + +#endif /* defined(_KERNEL) */ + +#endif /* defined(_KERNEL) || defined(_KMEMUSER) */ + +#if defined(__STDC__) && !defined(_KERNEL) +int poll(struct pollfd *, nfds_t, int); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _SYS_POLL_H */ |