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

Reply via email to