dfs_select.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #ifndef DFS_SELECT_H__
  2. #define DFS_SELECT_H__
  3. #ifdef RT_USING_LWIP
  4. /* we use lwIP's structure definitions. */
  5. #include <lwip/sockets.h>
  6. #elif defined(RT_USING_POSIX)
  7. #ifndef FD_SET
  8. /* Get the total number of descriptors that we will have to support */
  9. #define FD_SETSIZE (12)
  10. /* We will use a 32-bit bitsets to represent the set of descriptors. How
  11. * many uint32_t's do we need to span all descriptors?
  12. */
  13. #if FD_SETSIZE <= 32
  14. # define __SELECT_NUINT32 1
  15. #elif FD_SETSIZE <= 64
  16. # define __SELECT_NUINT32 2
  17. #elif FD_SETSIZE <= 96
  18. # define __SELECT_NUINT32 3
  19. #elif FD_SETSIZE <= 128
  20. # define __SELECT_NUINT32 4
  21. #elif FD_SETSIZE <= 160
  22. # define __SELECT_NUINT32 5
  23. #elif FD_SETSIZE <= 192
  24. # define __SELECT_NUINT32 6
  25. #elif FD_SETSIZE <= 224
  26. # define __SELECT_NUINT32 7
  27. #elif FD_SETSIZE <= 256
  28. # define __SELECT_NUINT32 8
  29. #else
  30. # warning "Larger fd_set needed"
  31. #endif
  32. /* These macros map a file descriptor to an index and bit number */
  33. #define _FD_NDX(fd) ((fd) >> 5)
  34. #define _FD_BIT(fd) ((fd) & 0x1f)
  35. /* Standard helper macros */
  36. #define FD_CLR(fd,set) \
  37. ((((fd_set*)(set))->arr)[_FD_NDX(fd)] &= ~(1 << _FD_BIT(fd)))
  38. #define FD_SET(fd,set) \
  39. ((((fd_set*)(set))->arr)[_FD_NDX(fd)] |= (1 << _FD_BIT(fd)))
  40. #define FD_ISSET(fd,set) \
  41. (((((fd_set*)(set))->arr)[_FD_NDX(fd)] & (1 << _FD_BIT(fd))) != 0)
  42. #define FD_ZERO(set) \
  43. memset((set), 0, sizeof(fd_set))
  44. typedef struct
  45. {
  46. uint32_t arr[__SELECT_NUINT32];
  47. }fd_set;
  48. #endif
  49. int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
  50. #endif /* end of RT_USING_LWIP */
  51. #endif