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 xnholder_t destroy_link;
00045 xnqueue_t bindings;
00046 };
00047
00048 #ifdef CONFIG_XENO_OPT_SELECT
00049
00050 struct xnselect {
00051 xnqueue_t bindings;
00052 };
00053
00054 #define DECLARE_XNSELECT(name) struct xnselect name
00055
00056 struct xnselect_binding {
00057 struct xnselector *selector;
00058 struct xnselect *fd;
00059 unsigned type;
00060 unsigned bit_index;
00061 xnholder_t link;
00062 xnholder_t slink;
00063 };
00064
00065 #ifdef __cplusplus
00066 extern "C" {
00067 #endif
00068
00069 void xnselect_init(struct xnselect *select_block);
00070
00071 int xnselect_bind(struct xnselect *select_block,
00072 struct xnselect_binding *binding,
00073 struct xnselector *selector,
00074 unsigned type,
00075 unsigned bit_index,
00076 unsigned state);
00077
00078 int __xnselect_signal(struct xnselect *select_block, unsigned state);
00079
00090 static inline int
00091 xnselect_signal(struct xnselect *select_block, unsigned state)
00092 {
00093 if (!emptyq_p(&select_block->bindings))
00094 return __xnselect_signal(select_block, state);
00095 return 0;
00096 }
00097
00098 void xnselect_destroy(struct xnselect *select_block);
00099
00100 int xnselector_init(struct xnselector *selector);
00101
00102 int xnselect(struct xnselector *selector,
00103 fd_set *out_fds[XNSELECT_MAX_TYPES],
00104 fd_set *in_fds[XNSELECT_MAX_TYPES],
00105 int nfds,
00106 xnticks_t timeout, xntmode_t timeout_mode);
00107
00108 void xnselector_destroy(struct xnselector *selector);
00109
00110 int xnselect_mount(void);
00111
00112 int xnselect_umount(void);
00113
00114 #ifdef __cplusplus
00115 }
00116 #endif
00117
00118 #else
00119 struct xnselector;
00120 #define DECLARE_XNSELECT(name)
00121 #define xnselect_init(block)
00122 #define xnselect_bind(select_block,binding,selector,type,bit_index,state) \
00123 ({ -EBADF; })
00124 #define xnselect_signal(block, state) ({ int __ret = 0; __ret; })
00125 #define xnselect_destroy(block)
00126 #endif
00127
00130 #endif