diff options
| author | bernard <[email protected]> | 2017-10-17 22:27:06 +0800 |
|---|---|---|
| committer | bernard <[email protected]> | 2017-10-17 22:27:06 +0800 |
| commit | 8a38307e2cce628017e9eb7153ae7a2430a3d9ef (patch) | |
| tree | 1eb4cfdceddb9c542806acf226d463de62271abb /components/dfs/include/dfs_select.h | |
| parent | 947d8aa4d2d0742eb5ac1968406893f4e58a279b (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.h | 65 |
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 |
