windows: Adjust FD_SETSIZE via commandline define
authorAndres Freund <andres@anarazel.de>
Thu, 6 Oct 2022 20:03:31 +0000 (13:03 -0700)
committerAndres Freund <andres@anarazel.de>
Thu, 6 Oct 2022 20:09:57 +0000 (13:09 -0700)
When using precompiled headers, we cannot pre-define macros for the system
headers from within .c files, as headers are already processed before
the #define in the C file is reached. But we can pre-define using
-DFD_SETSIZE, as long as that's also used when building the precompiled header.

A few files #define FD_SETSIZE 1024 on windows, as the default is only 64. I
am hesitant to change FD_SETSIZE globally on windows, due to
src/backend/port/win32/socket.c using it to size on-stack arrays. Instead add
-DFD_SETSIZE=1024 when building the specific targets needing it.

We likely should move away from using select() in those places, but that's a
larger change.

Reviewed-by: Thomas Munro <thomas.munro@gmail.com>
Reviewed-by: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
Reviewed-by: Justin Pryzby <pryzby@telsasoft.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/20221005190829.lda7ttalh4mzrvf4@awork3.anarazel.de
Discussion: https://postgr.es/m/CA+hUKG+50eOUbN++ocDc0Qnp9Pvmou23DSXu=ZA6fepOcftKqA@mail.gmail.com
Discussion: https://postgr.es/m/20190826054000.GE7005%40paquier.xyz

src/bin/pgbench/Makefile
src/bin/pgbench/meson.build
src/bin/pgbench/pgbench.c
src/fe_utils/Makefile
src/fe_utils/meson.build
src/fe_utils/parallel_slot.c
src/tools/msvc/Mkvcbuild.pm

index 6647c9fe97d2764d90a6dc7374a711132eda480f..68b6eb0376e8d140cb6bc686ceef8c6a4c255143 100644 (file)
@@ -18,6 +18,8 @@ LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
 
 ifneq ($(PORTNAME), win32)
 override CFLAGS += $(PTHREAD_CFLAGS)
+else
+override CPPFLAGS += -DFD_SETSIZE=1024
 endif
 LIBS += $(PTHREAD_LIBS)
 
index a32eb51fe070f4a21ca1d311c0fdb0f395a133a9..3cc393d17eacf841a01e0c30dbd74232bc763e5e 100644 (file)
@@ -27,6 +27,7 @@ pgbench = executable('pgbench',
   pgbench_sources,
   dependencies: [frontend_code, libpq, thread_dep],
   include_directories: include_directories('.'),
+  c_args: host_system == 'windows' ? ['-DFD_SETSIZE=1024'] : [],
   kwargs: default_bin_args,
 )
 bin_targets += pgbench
index 33f2836e3579de963d9d5ecc08d051c0932f15cb..b208d74767f197b603aef1e1370496d550c0b330 100644 (file)
@@ -27,8 +27,8 @@
  *
  */
 
-#ifdef WIN32
-#define FD_SETSIZE 1024                        /* must set before winsock2.h is included */
+#if defined(WIN32) && FD_SETSIZE < 1024
+#error FD_SETSIZE needs to have been increased
 #endif
 
 #include "postgres_fe.h"
index 44bc7a1215d49c79dea0b0648d144cb76c084158..72966769a521fc6c6be9109c2fb2ec26ff151f4d 100644 (file)
@@ -34,6 +34,10 @@ OBJS = \
        simple_list.o \
        string_utils.o
 
+ifeq ($(PORTNAME), win32)
+override CPPFLAGS += -DFD_SETSIZE=1024
+endif
+
 all: libpgfeutils.a
 
 libpgfeutils.a: $(OBJS)
index b6bf8e1ca21321c28662e7365e492fb9b53bda75..3e226c260acd8b50172e42672d01db11bd4f5893 100644 (file)
@@ -24,6 +24,7 @@ fe_utils_sources += psqlscan
 fe_utils = static_library('libpgfeutils',
   fe_utils_sources + generated_headers,
   include_directories: [postgres_inc, libpq_inc],
+  c_args: host_system == 'windows' ? ['-DFD_SETSIZE=1024'] : [],
   dependencies: frontend_common_code,
   kwargs: default_lib_args,
 )
index 2be2903c9c686c6bc201adf1d8f6ee16cfb533d3..767256757f264f6477a78c64088d3ae3ba867ffd 100644 (file)
@@ -12,8 +12,8 @@
  *-------------------------------------------------------------------------
  */
 
-#ifdef WIN32
-#define FD_SETSIZE 1024                        /* must set before winsock2.h is included */
+#if defined(WIN32) && FD_SETSIZE < 1024
+#error FD_SETSIZE needs to have been increased
 #endif
 
 #include "postgres_fe.h"
index ddb4f25eb1242806f3d74081f7ae69271ef95143..83a3e404254cbfaeba2ee1ef06a14a8ddf8bc41d 100644 (file)
@@ -35,6 +35,7 @@ my $libpq;
 my @unlink_on_exit;
 
 # Set of variables for modules in contrib/ and src/test/modules/
+my $contrib_defines        = {};
 my @contrib_uselibpq       = ();
 my @contrib_uselibpgport   = ();
 my @contrib_uselibpgcommon = ();
@@ -52,6 +53,7 @@ my @contrib_excludes       = (
        'unsafe_tests');
 
 # Set of variables for frontend modules
+my $frontend_defines = { 'pgbench' => 'FD_SETSIZE=1024' };
 my @frontend_uselibpq =
   ('pg_amcheck', 'pg_ctl', 'pg_upgrade', 'pgbench', 'psql', 'initdb');
 my @frontend_uselibpgport = (
@@ -175,6 +177,7 @@ sub mkvcbuild
 
        $libpgfeutils = $solution->AddProject('libpgfeutils', 'lib', 'misc');
        $libpgfeutils->AddDefine('FRONTEND');
+       $libpgfeutils->AddDefine('FD_SETSIZE=1024');
        $libpgfeutils->AddIncludeDir('src/interfaces/libpq');
        $libpgfeutils->AddFiles('src/fe_utils', @pgfeutilsfiles);
 
@@ -1120,10 +1123,10 @@ sub AdjustContribProj
 {
        my $proj = shift;
        AdjustModule(
-               $proj,                  \@contrib_uselibpq,
-               \@contrib_uselibpgport, \@contrib_uselibpgcommon,
-               $contrib_extralibs,     $contrib_extrasource,
-               $contrib_extraincludes);
+               $proj,                    $contrib_defines,
+               \@contrib_uselibpq,       \@contrib_uselibpgport,
+               \@contrib_uselibpgcommon, $contrib_extralibs,
+               $contrib_extrasource,     $contrib_extraincludes);
        return;
 }
 
@@ -1131,16 +1134,17 @@ sub AdjustFrontendProj
 {
        my $proj = shift;
        AdjustModule(
-               $proj,                   \@frontend_uselibpq,
-               \@frontend_uselibpgport, \@frontend_uselibpgcommon,
-               $frontend_extralibs,     $frontend_extrasource,
-               $frontend_extraincludes);
+               $proj,                     $frontend_defines,
+               \@frontend_uselibpq,       \@frontend_uselibpgport,
+               \@frontend_uselibpgcommon, $frontend_extralibs,
+               $frontend_extrasource,     $frontend_extraincludes);
        return;
 }
 
 sub AdjustModule
 {
        my $proj                  = shift;
+       my $module_defines        = shift;
        my $module_uselibpq       = shift;
        my $module_uselibpgport   = shift;
        my $module_uselibpgcommon = shift;
@@ -1149,6 +1153,13 @@ sub AdjustModule
        my $module_extraincludes  = shift;
        my $n                     = $proj->{name};
 
+       if ($module_defines->{$n})
+       {
+               foreach my $d ($module_defines->{$n})
+               {
+                       $proj->AddDefine($d);
+               }
+       }
        if (grep { /^$n$/ } @{$module_uselibpq})
        {
                $proj->AddIncludeDir('src\interfaces\libpq');