/**************************************************************************** * include/sys/select.h * * Copyright (C) 2008-2009, 2011, 2015 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * 3. Neither the name NuttX nor the names of its contributors may be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************/ #ifndef __INCLUDE_SYS_SELECT_H #define __INCLUDE_SYS_SELECT_H /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include #include #if CONFIG_NFILE_DESCRIPTORS > 0 || CONFIG_NSOCKET_DESCRIPTORS > 0 /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ /* Get the total number of descriptors that we will have to support */ #define FD_SETSIZE (CONFIG_NFILE_DESCRIPTORS + CONFIG_NSOCKET_DESCRIPTORS) /* 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)) /**************************************************************************** * Type Definitions ****************************************************************************/ struct fd_set_s { uint32_t arr[__SELECT_NUINT32]; }; typedef struct fd_set_s fd_set; /**************************************************************************** * Public Function Prototypes ****************************************************************************/ #undef EXTERN #if defined(__cplusplus) #define EXTERN extern "C" extern "C" { #else #define EXTERN extern #endif struct timeval; int select(int nfds, FAR fd_set *readfds, FAR fd_set *writefds, FAR fd_set *exceptfds, FAR struct timeval *timeout); int pselect(int nfds, FAR fd_set *readfds, FAR fd_set *writefds, FAR fd_set *exceptfds, FAR const struct timespec *timeout, FAR const sigset_t *sigmask); #undef EXTERN #if defined(__cplusplus) } #endif #endif /* CONFIG_NFILE_DESCRIPTORS || CONFIG_NSOCKET_DESCRIPTORS */ #endif /* __INCLUDE_SYS_SELECT_H */