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
> 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
Ah yes, I have the same on Debian:
/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.