On 10 September 2014 00:21, Tom Lane <t...@sss.pgh.pa.us> wrote: > Thom Brown <t...@linux.com> writes: > > I find this in pgbench.c: > > > #ifdef FD_SETSIZE > > #define MAXCLIENTS (FD_SETSIZE - 10) > > #else > > #define MAXCLIENTS 1024 > > #endif > > FD_SETSIZE is supposed to be defined, according to the POSIX spec: > > The <sys/select.h> header shall define the following symbolic constant, > which shall have a value suitable for use in #if preprocessing > directives: > > FD_SETSIZE > Maximum number of file descriptors in an fd_set structure. > > It looks like Linux sets it to 1024. On RHEL6, at least, I find this: > > $ grep -r FD_SETSIZE /usr/include > /usr/include/linux/posix_types.h:#undef __FD_SETSIZE > /usr/include/linux/posix_types.h:#define __FD_SETSIZE 1024 > ... > /usr/include/sys/select.h:#define FD_SETSIZE > __FD_SETSIZE > ... >
Ah yes, I have the same on Debian: /usr/include/linux/posix_types.h:#undef __FD_SETSIZE /usr/include/linux/posix_types.h:#define __FD_SETSIZE 1024 ... usr/include/x86_64-linux-gnu/sys/select.h:#define FD_SETSIZE __FD_SETSIZE /usr/include/x86_64-linux-gnu/bits/typesizes.h:#define __FD_SETSIZE 1024 ... I didn't think to look beyond Postgres' code. > > #ifdef WIN32 > > #define FD_SETSIZE 1024 /* set before winsock2.h is > included */ > > #endif /* ! WIN32 */ > > Windows probably hasn't got sys/select.h at all, so it may not provide > this symbol. > > Interestingly, it looks like POSIX also requires <sys/time.h> to define > FD_SETSIZE. I wonder whether Windows has that header? It'd definitely > be better to get this symbol from the system than assume 1024 will work. > Okay, this now makes sense. It just takes the system value and reduces it by 10 to get the MAXCLIENTS value. Thanks for the explanation. Thom