|
|
1.1 ! root 1: #ifndef __SYS_POLL_H__ ! 2: #define __SYS_POLL_H__ ! 3: ! 4: /* ! 5: * This header defines prototypes for functions that manipulate the structures ! 6: * used to support device polling in the kernel. definitions from this file ! 7: * are imported by <poll.h> ! 8: */ ! 9: /* ! 10: *-IMPORTS: ! 11: * <common/ccompat.h> ! 12: * __EXTERN_C_BEGIN__ ! 13: * __EXTERN_C_END__ ! 14: * __PROTO () ! 15: */ ! 16: ! 17: #if _DDI_DKI ! 18: ! 19: #include <common/feature.h> ! 20: #include <common/ccompat.h> ! 21: ! 22: ! 23: /* ! 24: * The contents of the "pollhead" structure used in System V polling are not ! 25: * specified here, or indeed anywhere else outside of the file which ! 26: * implements the routines whose prototypes are given below. ! 27: * ! 28: * The "pollhead" structure is intended to be totally opaque. Instances must ! 29: * be allocated and freed with the functions given, and no access to the ! 30: * internal structure of this item is permissible. ! 31: * ! 32: * It is worthwhile for implementations to note several facts about System V ! 33: * polling, however; consider the extra difficulties involved in preventing ! 34: * race conditions in polling when the system is multithreaded. The chpoll () ! 35: * entry point is required to never sleep, or call a function such that it ! 36: * might sleep (which means that calling "phalloc (KM_SLEEP)" is not permitted ! 37: * in that context), implying that an implementation may hold a basic lock to ! 38: * limit race conditions. Essentially, implementations should spend as little ! 39: * time as possible in the chpoll () entry point. ! 40: */ ! 41: ! 42: __EXTERN_C_BEGIN__ ! 43: ! 44: struct pollhead * phalloc __PROTO ((int _flag)); ! 45: void phfree __PROTO ((struct pollhead * _php)); ! 46: void pollwakeup __PROTO ((struct pollhead * _php, ! 47: short _event)); ! 48: ! 49: __EXTERN_C_END__ ! 50: ! 51: #endif /* _DDI_DKI */ ! 52: ! 53: #if _OLD_COH_POLLING || (__COHERENT__ && __KERNEL__) ! 54: ! 55: #include <common/_poll.h> ! 56: ! 57: ! 58: /* ! 59: * The following structure is defined by the implementation code in the ! 60: * Coherent kernel, so we define it so that this header can replace that one. ! 61: * ! 62: * We keep the old structure name, and also preserve the name of one of the ! 63: * structure members. That's about it, though. The *only* field that old-style ! 64: * Coherent drivers were allowed documented access to is e_procp, and then ! 65: * only as a test to see whether pollwake () needed to be called at all, which ! 66: * was unnecessary. ! 67: */ ! 68: ! 69: typedef struct event event_t; ! 70: ! 71: struct event { ! 72: #if ! _OLD_COH_POLLING ! 73: event_t * e_pnext; ! 74: event_t * e_dnext; ! 75: event_t * e_dlast; ! 76: struct proc * e_procp; ! 77: #else ! 78: poll_t e_node; /* for circular list management */ ! 79: __VOID__ * e_reserved; /* unused, for binary compatibility */ ! 80: __VOID__ * e_procp; /* drivers can test this for != 0 */ ! 81: #endif ! 82: }; ! 83: ! 84: ! 85: __EXTERN_C_BEGIN__ ! 86: ! 87: void pollopen __PROTO ((event_t * _elistp)); ! 88: void pollwake __PROTO ((event_t * _elistp)); ! 89: ! 90: __EXTERN_C_END__ ! 91: ! 92: /* ! 93: * Declare the existence of the 'event_t' hack to code that wants to work ! 94: * either with or without it. ! 95: */ ! 96: ! 97: #ifndef _OLD_COH_POLLING ! 98: #define _OLD_COH_POLLING 1 ! 99: #endif ! 100: ! 101: #endif /* _OLD_COH_POLLING || (__COHERENT__ && __KERNEL__) */ ! 102: ! 103: ! 104: /* ! 105: * Here we put an enumeration which defines the common elements of the event ! 106: * masks used in <poll.h> for poll (), and <stropts.h> for the I_SETSIG ! 107: * ioctl (). Mostly, the two masks match; the bits where they differ do not ! 108: * conflict in key routines because the events they match in <stropts.h> ! 109: * cannot be polled for. ! 110: * ! 111: * The exact numeric values used here can be found in the System V ABI. ! 112: */ ! 113: ! 114: enum { ! 115: __POLL_INPUT = 0x0001, /* any message other than M_PCPROTO */ ! 116: __POLL_HIPRI = 0x0002, /* a high priority message has arrived */ ! 117: __POLL_OUTPUT = 0x0004, /* the write queue is no longer full */ ! 118: __POLL_008 = 0x0008, /* a SIGPOLL signal message has arrived */ ! 119: /* -or- fatal error on stream */ ! 120: __POLL_010 = 0x0010, /* an M_ERROR message has arrived */ ! 121: /* -or- stream is hung up */ ! 122: __POLL_020 = 0x0020, /* an M_HANGUP message has arrived */ ! 123: /* -or- file descriptor invalid */ ! 124: __POLL_RDNORM = 0x0040, /* a non-priority message has arrived */ ! 125: __POLL_WRNORM = __POLL_OUTPUT,/* alias for S_OUTPUT */ ! 126: __POLL_RDBAND = 0x0080, /* a priority band message has arrived */ ! 127: __POLL_WRBAND = 0x0100, /* a priority band is writeable */ ! 128: __POLL_BANDURG = 0x0200, /* request SIGURG rather than SIGPOLL */ ! 129: __POLL_MASK = 0x02FF /* MASK FOR I_SETSIG */ ! 130: }; ! 131: ! 132: enum { ! 133: /* ! 134: * Definitions for events that may be polled for. ! 135: */ ! 136: ! 137: POLLIN = __POLL_INPUT, /* ready message, not M_PCPROTO */ ! 138: POLLPRI = __POLL_HIPRI, /* ready message type M_PCPROTO */ ! 139: POLLOUT = __POLL_OUTPUT,/* normal band is writeable */ ! 140: POLLRDNORM = __POLL_RDNORM,/* normal message is ready */ ! 141: POLLWRNORM = __POLL_OUTPUT,/* same as POLLOUT */ ! 142: POLLRDBAND = __POLL_RDBAND,/* ready message in band > 0 */ ! 143: POLLWRBAND = __POLL_WRBAND,/* band > 0 downstream is writeable */ ! 144: ! 145: /* ! 146: * Definitions for additional events that may not be polled for but which may ! 147: * be returned anyway. ! 148: */ ! 149: ! 150: POLLERR = __POLL_008, /* fatal error on stream */ ! 151: POLLHUP = __POLL_010, /* stream is hung up */ ! 152: POLLNVAL = __POLL_020 /* fd not associated with a stream */ ! 153: ! 154: /* value 0x0200 is reserved for BANDURG flag in <stropts.h> */ ! 155: }; ! 156: ! 157: #endif /* ! defined (__SYS_POLL_H__) */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.