summaryrefslogtreecommitdiff
path: root/components/dfs/include/dfs_select.h
diff options
context:
space:
mode:
authorbernard <[email protected]>2017-10-17 22:27:06 +0800
committerbernard <[email protected]>2017-10-17 22:27:06 +0800
commit8a38307e2cce628017e9eb7153ae7a2430a3d9ef (patch)
tree1eb4cfdceddb9c542806acf226d463de62271abb /components/dfs/include/dfs_select.h
parent947d8aa4d2d0742eb5ac1968406893f4e58a279b (diff)
[libc] Add RT_USING_POSIX macro.
1. Add macro check in rtdebug.h; 2. Use RT_USING_POSIX for poll/select, stdin etc. 3. Split dfs_posix.h to dfs_posix.h, dfs_poll.h and dfs_select.h;
Diffstat (limited to 'components/dfs/include/dfs_select.h')
-rw-r--r--components/dfs/include/dfs_select.h65
1 files changed, 65 insertions, 0 deletions
diff --git a/components/dfs/include/dfs_select.h b/components/dfs/include/dfs_select.h
new file mode 100644
index 0000000000..0b5d6cef17
--- /dev/null
+++ b/components/dfs/include/dfs_select.h
@@ -0,0 +1,65 @@
+#ifndef DFS_SELECT_H__
+#define DFS_SELECT_H__
+
+#ifdef RT_USING_LWIP
+/* we use lwIP's structure definitions. */
+#include <lwip/sockets.h>
+#elif defined(RT_USING_POSIX)
+
+#ifndef FD_SET
+
+/* Get the total number of descriptors that we will have to support */
+
+#define FD_SETSIZE (12)
+
+/* We will use a 32-bit bitsets to represent the set of descriptors. How
+ * many uint32_t's do we need to span all descriptors?
+ */
+
+#if FD_SETSIZE <= 32
+# define __SELECT_NUINT32 1
+#elif FD_SETSIZE <= 64
+# define __SELECT_NUINT32 2
+#elif FD_SETSIZE <= 96
+# define __SELECT_NUINT32 3
+#elif FD_SETSIZE <= 128
+# define __SELECT_NUINT32 4
+#elif FD_SETSIZE <= 160
+# define __SELECT_NUINT32 5
+#elif FD_SETSIZE <= 192
+# define __SELECT_NUINT32 6
+#elif FD_SETSIZE <= 224
+# define __SELECT_NUINT32 7
+#elif FD_SETSIZE <= 256
+# define __SELECT_NUINT32 8
+#else
+# warning "Larger fd_set needed"
+#endif
+
+/* These macros map a file descriptor to an index and bit number */
+
+#define _FD_NDX(fd) ((fd) >> 5)
+#define _FD_BIT(fd) ((fd) & 0x1f)
+
+/* Standard helper macros */
+
+#define FD_CLR(fd,set) \
+ ((((fd_set*)(set))->arr)[_FD_NDX(fd)] &= ~(1 << _FD_BIT(fd)))
+#define FD_SET(fd,set) \
+ ((((fd_set*)(set))->arr)[_FD_NDX(fd)] |= (1 << _FD_BIT(fd)))
+#define FD_ISSET(fd,set) \
+ (((((fd_set*)(set))->arr)[_FD_NDX(fd)] & (1 << _FD_BIT(fd))) != 0)
+#define FD_ZERO(set) \
+ memset((set), 0, sizeof(fd_set))
+
+typedef struct
+{
+ uint32_t arr[__SELECT_NUINT32];
+}fd_set;
+#endif
+
+int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
+
+#endif /* end of RT_USING_LWIP */
+
+#endif