From 4289263cf263ba36e474728f4a02ceb086903f81 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 6 Oct 2022 13:03:31 -0700 Subject: [PATCH] windows: Adjust FD_SETSIZE via commandline define 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 Reviewed-by: Peter Eisentraut Reviewed-by: Justin Pryzby Reviewed-by: Tom Lane 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 | 2 ++ src/bin/pgbench/meson.build | 1 + src/bin/pgbench/pgbench.c | 4 ++-- src/fe_utils/Makefile | 4 ++++ src/fe_utils/meson.build | 1 + src/fe_utils/parallel_slot.c | 4 ++-- src/tools/msvc/Mkvcbuild.pm | 27 +++++++++++++++++++-------- 7 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/bin/pgbench/Makefile b/src/bin/pgbench/Makefile index 6647c9fe97..68b6eb0376 100644 --- a/src/bin/pgbench/Makefile +++ b/src/bin/pgbench/Makefile @@ -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) diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build index a32eb51fe0..3cc393d17e 100644 --- a/src/bin/pgbench/meson.build +++ b/src/bin/pgbench/meson.build @@ -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 diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 33f2836e35..b208d74767 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -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" diff --git a/src/fe_utils/Makefile b/src/fe_utils/Makefile index 44bc7a1215..72966769a5 100644 --- a/src/fe_utils/Makefile +++ b/src/fe_utils/Makefile @@ -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) diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build index b6bf8e1ca2..3e226c260a 100644 --- a/src/fe_utils/meson.build +++ b/src/fe_utils/meson.build @@ -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, ) diff --git a/src/fe_utils/parallel_slot.c b/src/fe_utils/parallel_slot.c index 2be2903c9c..767256757f 100644 --- a/src/fe_utils/parallel_slot.c +++ b/src/fe_utils/parallel_slot.c @@ -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" diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm index ddb4f25eb1..83a3e40425 100644 --- a/src/tools/msvc/Mkvcbuild.pm +++ b/src/tools/msvc/Mkvcbuild.pm @@ -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'); -- 2.39.5