00001
00025 #ifndef XNSELECT_H
00026 #define XNSELECT_H
00027
00031 #include <nucleus/thread.h>
00032
00033 #define XNSELECT_READ 0
00034 #define XNSELECT_WRITE 1
00035 #define XNSELECT_EXCEPT 2
00036 #define XNSELECT_MAX_TYPES 3
00037
00038 struct xnselector {
00039 xnsynch_t synchbase;
00040 struct fds {
00041 fd_set expected;
00042 fd_set pending;
00043 } fds [XNSELECT_MAX_TYPES];
00044 xnqueue_t bindings;
00045 };
00046
00047 #ifdef CONFIG_XENO_OPT_SELECT
00048
00049 struct xnselect {
00050 xnqueue_t bindings;
00051 };
00052
00053 #define DECLARE_XNSELECT(name) struct xnselect name
00054
00055 struct xnselect_binding {
00056 struct xnselector *selector;
00057 struct xnselect *fd;
00058 unsigned type;
00059 unsigned bit_index;
00060 xnholder_t link;
00061 xnholder_t slink;
00062 };
00063
00064 #ifdef __cplusplus
00065 extern "C" {
00066 #endif
00067
00068 void xnselect_init(struct xnselect *select_block);
00069
00070 int xnselect_bind(struct xnselect *select_block,
00071 struct xnselect_binding *binding,
00072 struct xnselector *selector,
00073 unsigned type,
00074 unsigned bit_index,
00075 unsigned state);
00076
00077 int __xnselect_signal(struct xnselect *select_block, unsigned state);
00078
00089 static inline int
00090 xnselect_signal(struct xnselect *select_block, unsigned state)
00091 {
00092 if (!emptyq_p(&select_block->bindings))
00093 return __xnselect_signal(select_block, state);
00094 return 0;
00095 }
00096
00097 void xnselect_destroy(struct xnselect *select_block);
00098
00099 int xnselector_init(struct xnselector *selector);
00100
00101 int xnselect(struct xnselector *selector,
00102 fd_set *out_fds[XNSELECT_MAX_TYPES],
00103 fd_set *in_fds[XNSELECT_MAX_TYPES],
00104 int nfds,
00105 xnticks_t timeout, xntmode_t timeout_mode);
00106
00107 void xnselector_destroy(struct xnselector *selector);
00108
00109 #ifdef __cplusplus
00110 }
00111 #endif
00112
00113 #else
00114 struct xnselector;
00115 #define DECLARE_XNSELECT(name)
00116 #define xnselect_init(block)
00117 #define xnselect_bind(select_block,binding,selector,type,bit_index,state) \
00118 ({ -EBADF; })
00119 #define xnselect_signal(block, state) ({ int __ret = 0; __ret; })
00120 #define xnselect_destroy(block)
00121 #endif
00122
00125 #endif