Here's a more finalized version of this. There are two main interesting changes here:
1. postgres_fe.h includes common/fe_memutils.h This means all frontend programs get the #include without having to do it explicitely by themselves. postgres.h includes utils/palloc.h which I used as precendent for this. 2. fe_memutils.h includes utils/palloc.h This means all frontend programs get the palloc() et al prototypes. Some other things of note: a. pg_upgrade was using postgres.h all over the place instead of postgres_fe.h. There's no reason for this AFAICS so I changed it. No warnings, make check passes. b. pg_resetxlog is the only frontend place that uses pg_malloc() and which needs to #include postgres.h instead of postgres_fe.h, so it's the only place that needs to include fe_memutils.h directly. (pg_controldata is the other place that includes postgres.h, but it doesn't need the pg_malloc etc declarations). c. I added the MSVC bits. I tested that most of it works, but the various regress executables as well as zic failed to build due to lack of libpgcommon at link time. I think I fixed it; I'm waiting on new tests to run. (This patch is the fixed version). -- Álvaro Herrera http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
*** a/contrib/oid2name/oid2name.c --- b/contrib/oid2name/oid2name.c *************** *** 50,58 **** struct options /* function prototypes */ static void help(const char *progname); void get_opts(int, char **, struct options *); - void *pg_malloc(size_t size); - void *pg_realloc(void *ptr, size_t size); - char *pg_strdup(const char *str); void add_one_elt(char *eltname, eary *eary); char *get_comma_elts(eary *eary); PGconn *sql_conn(struct options *); --- 50,55 ---- *************** *** 201,253 **** help(const char *progname) progname, progname); } - void * - pg_malloc(size_t size) - { - void *ptr; - - /* Avoid unportable behavior of malloc(0) */ - if (size == 0) - size = 1; - ptr = malloc(size); - if (!ptr) - { - fprintf(stderr, "out of memory\n"); - exit(1); - } - return ptr; - } - - void * - pg_realloc(void *ptr, size_t size) - { - void *result; - - /* Avoid unportable behavior of realloc(NULL, 0) */ - if (ptr == NULL && size == 0) - size = 1; - result = realloc(ptr, size); - if (!result) - { - fprintf(stderr, "out of memory\n"); - exit(1); - } - return result; - } - - char * - pg_strdup(const char *str) - { - char *result = strdup(str); - - if (!result) - { - fprintf(stderr, "out of memory\n"); - exit(1); - } - return result; - } - /* * add_one_elt * --- 198,203 ---- *** a/contrib/pg_upgrade/check.c --- b/contrib/pg_upgrade/check.c *************** *** 7,13 **** * contrib/pg_upgrade/check.c */ ! #include "postgres.h" #include "pg_upgrade.h" --- 7,13 ---- * contrib/pg_upgrade/check.c */ ! #include "postgres_fe.h" #include "pg_upgrade.h" *** a/contrib/pg_upgrade/controldata.c --- b/contrib/pg_upgrade/controldata.c *************** *** 7,13 **** * contrib/pg_upgrade/controldata.c */ ! #include "postgres.h" #include "pg_upgrade.h" --- 7,13 ---- * contrib/pg_upgrade/controldata.c */ ! #include "postgres_fe.h" #include "pg_upgrade.h" *** a/contrib/pg_upgrade/dump.c --- b/contrib/pg_upgrade/dump.c *************** *** 7,13 **** * contrib/pg_upgrade/dump.c */ ! #include "postgres.h" #include "pg_upgrade.h" --- 7,13 ---- * contrib/pg_upgrade/dump.c */ ! #include "postgres_fe.h" #include "pg_upgrade.h" *** a/contrib/pg_upgrade/exec.c --- b/contrib/pg_upgrade/exec.c *************** *** 7,13 **** * contrib/pg_upgrade/exec.c */ ! #include "postgres.h" #include "pg_upgrade.h" --- 7,13 ---- * contrib/pg_upgrade/exec.c */ ! #include "postgres_fe.h" #include "pg_upgrade.h" *** a/contrib/pg_upgrade/file.c --- b/contrib/pg_upgrade/file.c *************** *** 7,13 **** * contrib/pg_upgrade/file.c */ ! #include "postgres.h" #include "pg_upgrade.h" --- 7,13 ---- * contrib/pg_upgrade/file.c */ ! #include "postgres_fe.h" #include "pg_upgrade.h" *** a/contrib/pg_upgrade/function.c --- b/contrib/pg_upgrade/function.c *************** *** 7,13 **** * contrib/pg_upgrade/function.c */ ! #include "postgres.h" #include "pg_upgrade.h" --- 7,13 ---- * contrib/pg_upgrade/function.c */ ! #include "postgres_fe.h" #include "pg_upgrade.h" *** a/contrib/pg_upgrade/info.c --- b/contrib/pg_upgrade/info.c *************** *** 7,13 **** * contrib/pg_upgrade/info.c */ ! #include "postgres.h" #include "pg_upgrade.h" --- 7,13 ---- * contrib/pg_upgrade/info.c */ ! #include "postgres_fe.h" #include "pg_upgrade.h" *** a/contrib/pg_upgrade/option.c --- b/contrib/pg_upgrade/option.c *************** *** 7,13 **** * contrib/pg_upgrade/option.c */ ! #include "postgres.h" #include "miscadmin.h" --- 7,13 ---- * contrib/pg_upgrade/option.c */ ! #include "postgres_fe.h" #include "miscadmin.h" *** a/contrib/pg_upgrade/page.c --- b/contrib/pg_upgrade/page.c *************** *** 7,13 **** * contrib/pg_upgrade/page.c */ ! #include "postgres.h" #include "pg_upgrade.h" --- 7,13 ---- * contrib/pg_upgrade/page.c */ ! #include "postgres_fe.h" #include "pg_upgrade.h" *** a/contrib/pg_upgrade/parallel.c --- b/contrib/pg_upgrade/parallel.c *************** *** 7,13 **** * contrib/pg_upgrade/parallel.c */ ! #include "postgres.h" #include "pg_upgrade.h" --- 7,13 ---- * contrib/pg_upgrade/parallel.c */ ! #include "postgres_fe.h" #include "pg_upgrade.h" *** a/contrib/pg_upgrade/pg_upgrade.c --- b/contrib/pg_upgrade/pg_upgrade.c *************** *** 35,41 **** ! #include "postgres.h" #include "pg_upgrade.h" --- 35,41 ---- ! #include "postgres_fe.h" #include "pg_upgrade.h" *** a/contrib/pg_upgrade/pg_upgrade.h --- b/contrib/pg_upgrade/pg_upgrade.h *************** *** 451,460 **** void prep_status(const char *fmt,...) __attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2))); void check_ok(void); - char *pg_strdup(const char *s); - void *pg_malloc(size_t size); - void *pg_realloc(void *ptr, size_t size); - void pg_free(void *ptr); const char *getErrorText(int errNum); unsigned int str2uint(const char *str); void pg_putenv(const char *var, const char *val); --- 451,456 ---- *** a/contrib/pg_upgrade/relfilenode.c --- b/contrib/pg_upgrade/relfilenode.c *************** *** 7,13 **** * contrib/pg_upgrade/relfilenode.c */ ! #include "postgres.h" #include "pg_upgrade.h" --- 7,13 ---- * contrib/pg_upgrade/relfilenode.c */ ! #include "postgres_fe.h" #include "pg_upgrade.h" *** a/contrib/pg_upgrade/server.c --- b/contrib/pg_upgrade/server.c *************** *** 7,13 **** * contrib/pg_upgrade/server.c */ ! #include "postgres.h" #include "pg_upgrade.h" --- 7,13 ---- * contrib/pg_upgrade/server.c */ ! #include "postgres_fe.h" #include "pg_upgrade.h" *** a/contrib/pg_upgrade/tablespace.c --- b/contrib/pg_upgrade/tablespace.c *************** *** 7,13 **** * contrib/pg_upgrade/tablespace.c */ ! #include "postgres.h" #include "pg_upgrade.h" --- 7,13 ---- * contrib/pg_upgrade/tablespace.c */ ! #include "postgres_fe.h" #include "pg_upgrade.h" *** a/contrib/pg_upgrade/util.c --- b/contrib/pg_upgrade/util.c *************** *** 7,13 **** * contrib/pg_upgrade/util.c */ ! #include "postgres.h" #include "pg_upgrade.h" --- 7,13 ---- * contrib/pg_upgrade/util.c */ ! #include "postgres_fe.h" #include "pg_upgrade.h" *************** *** 213,267 **** get_user_info(char **user_name) } - void * - pg_malloc(size_t size) - { - void *p; - - /* Avoid unportable behavior of malloc(0) */ - if (size == 0) - size = 1; - p = malloc(size); - if (p == NULL) - pg_log(PG_FATAL, "%s: out of memory\n", os_info.progname); - return p; - } - - void * - pg_realloc(void *ptr, size_t size) - { - void *p; - - /* Avoid unportable behavior of realloc(NULL, 0) */ - if (ptr == NULL && size == 0) - size = 1; - p = realloc(ptr, size); - if (p == NULL) - pg_log(PG_FATAL, "%s: out of memory\n", os_info.progname); - return p; - } - - - void - pg_free(void *ptr) - { - if (ptr != NULL) - free(ptr); - } - - - char * - pg_strdup(const char *s) - { - char *result = strdup(s); - - if (result == NULL) - pg_log(PG_FATAL, "%s: out of memory\n", os_info.progname); - - return result; - } - - /* * getErrorText() * --- 213,218 ---- *** a/contrib/pg_upgrade/version.c --- b/contrib/pg_upgrade/version.c *************** *** 7,13 **** * contrib/pg_upgrade/version.c */ ! #include "postgres.h" #include "pg_upgrade.h" --- 7,13 ---- * contrib/pg_upgrade/version.c */ ! #include "postgres_fe.h" #include "pg_upgrade.h" *** a/contrib/pg_upgrade/version_old_8_3.c --- b/contrib/pg_upgrade/version_old_8_3.c *************** *** 7,13 **** * contrib/pg_upgrade/version_old_8_3.c */ ! #include "postgres.h" #include "pg_upgrade.h" --- 7,13 ---- * contrib/pg_upgrade/version_old_8_3.c */ ! #include "postgres_fe.h" #include "pg_upgrade.h" *** a/contrib/pgbench/pgbench.c --- b/contrib/pgbench/pgbench.c *************** *** 320,378 **** static char *select_only = { static void setalarm(int seconds); static void *threadRun(void *arg); - - /* - * routines to check mem allocations and fail noisily. - */ - static void * - pg_malloc(size_t size) - { - void *result; - - /* Avoid unportable behavior of malloc(0) */ - if (size == 0) - size = 1; - result = malloc(size); - if (!result) - { - fprintf(stderr, "out of memory\n"); - exit(1); - } - return result; - } - - static void * - pg_realloc(void *ptr, size_t size) - { - void *result; - - /* Avoid unportable behavior of realloc(NULL, 0) */ - if (ptr == NULL && size == 0) - size = 1; - result = realloc(ptr, size); - if (!result) - { - fprintf(stderr, "out of memory\n"); - exit(1); - } - return result; - } - - static char * - pg_strdup(const char *s) - { - char *result; - - result = strdup(s); - if (!result) - { - fprintf(stderr, "out of memory\n"); - exit(1); - } - return result; - } - - static void usage(void) { --- 320,325 ---- *** a/src/Makefile --- b/src/Makefile *************** *** 13,18 **** top_builddir = .. --- 13,19 ---- include Makefile.global SUBDIRS = \ + common \ port \ timezone \ backend \ *** a/src/Makefile.global.in --- b/src/Makefile.global.in *************** *** 243,256 **** LD = @LD@ with_gnu_ld = @with_gnu_ld@ ld_R_works = @ld_R_works@ ! # We want -L for libpgport.a to be first in LDFLAGS. We also need LDFLAGS ! # to be a "recursively expanded" variable, else adjustments to rpathdir ! # don't work right. So we must NOT do LDFLAGS := something, meaning this has ! # to be done first and elsewhere we must only do LDFLAGS += something. ifdef PGXS LDFLAGS = -L$(libdir) else ! LDFLAGS = -L$(top_builddir)/src/port endif LDFLAGS += @LDFLAGS@ --- 243,257 ---- with_gnu_ld = @with_gnu_ld@ ld_R_works = @ld_R_works@ ! # We want -L for libpgport.a and libpgcommon.a to be first in LDFLAGS. We ! # also need LDFLAGS to be a "recursively expanded" variable, else adjustments ! # to rpathdir don't work right. So we must NOT do LDFLAGS := something, ! # meaning this has to be done first and elsewhere we must only do LDFLAGS += ! # something. ifdef PGXS LDFLAGS = -L$(libdir) else ! LDFLAGS = -L$(top_builddir)/src/port -L$(top_builddir)/src/common endif LDFLAGS += @LDFLAGS@ *************** *** 400,415 **** endif libpq = -L$(libpq_builddir) -lpq # This macro is for use by client executables (not libraries) that use libpq. ! # We force clients to pull symbols from the non-shared library libpgport ! # rather than pulling some libpgport symbols from libpq just because ! # libpq uses those functions too. This makes applications less # dependent on changes in libpq's usage of pgport. To do this we link to # pgport before libpq. This does cause duplicate -lpgport's to appear # on client link lines. ifdef PGXS ! libpq_pgport = -L$(libdir) -lpgport $(libpq) else ! libpq_pgport = -L$(top_builddir)/src/port -lpgport $(libpq) endif --- 401,417 ---- libpq = -L$(libpq_builddir) -lpq # This macro is for use by client executables (not libraries) that use libpq. ! # We force clients to pull symbols from the non-shared libraries libpgport ! # and libpgcommon rather than pulling some libpgport symbols from libpq just ! # because libpq uses those functions too. This makes applications less # dependent on changes in libpq's usage of pgport. To do this we link to # pgport before libpq. This does cause duplicate -lpgport's to appear # on client link lines. ifdef PGXS ! libpq_pgport = -L$(libdir) -lpgport -lpgcommon $(libpq) else ! libpq_pgport = -L$(top_builddir)/src/port -lpgport \ ! -L$(top_builddir)/src/common -lpgcommon $(libpq) endif *************** *** 418,423 **** submake-libpq: --- 420,426 ---- submake-libpgport: $(MAKE) -C $(top_builddir)/src/port all + $(MAKE) -C $(top_builddir)/src/common all .PHONY: submake-libpq submake-libpgport *************** *** 496,502 **** endif LIBOBJS = @LIBOBJS@ ! LIBS := -lpgport $(LIBS) # to make ws2_32.lib the last library, and always link with shfolder, # so SHGetFolderName isn't picked up from shell32.dll --- 499,505 ---- LIBOBJS = @LIBOBJS@ ! LIBS := -lpgport -lpgcommon $(LIBS) # to make ws2_32.lib the last library, and always link with shfolder, # so SHGetFolderName isn't picked up from shell32.dll *** a/src/backend/storage/file/copydir.c --- b/src/backend/storage/file/copydir.c *************** *** 26,42 **** #include "storage/fd.h" #include "miscadmin.h" - /* - * On Windows, call non-macro versions of palloc; we can't reference - * CurrentMemoryContext in this file because of PGDLLIMPORT conflict. - */ - #if defined(WIN32) || defined(__CYGWIN__) - #undef palloc - #undef pstrdup - #define palloc(sz) pgport_palloc(sz) - #define pstrdup(str) pgport_pstrdup(str) - #endif - static void fsync_fname(char *fname, bool isdir); --- 26,31 ---- *** a/src/backend/utils/mmgr/mcxt.c --- b/src/backend/utils/mmgr/mcxt.c *************** *** 634,639 **** MemoryContextAllocZeroAligned(MemoryContext context, Size size) --- 634,675 ---- return ret; } + void * + palloc(Size size) + { + /* duplicates MemoryContextAlloc to avoid increased overhead */ + AssertArg(MemoryContextIsValid(CurrentMemoryContext)); + + if (!AllocSizeIsValid(size)) + elog(ERROR, "invalid memory alloc request size %lu", + (unsigned long) size); + + CurrentMemoryContext->isReset = false; + + return (*CurrentMemoryContext->methods->alloc) (CurrentMemoryContext, size); + } + + void * + palloc0(Size size) + { + /* duplicates MemoryContextAllocZero to avoid increased overhead */ + void *ret; + + AssertArg(MemoryContextIsValid(CurrentMemoryContext)); + + if (!AllocSizeIsValid(size)) + elog(ERROR, "invalid memory alloc request size %lu", + (unsigned long) size); + + CurrentMemoryContext->isReset = false; + + ret = (*CurrentMemoryContext->methods->alloc) (CurrentMemoryContext, size); + + MemSetAligned(ret, 0, size); + + return ret; + } + /* * pfree * Release an allocated chunk. *************** *** 715,720 **** MemoryContextStrdup(MemoryContext context, const char *string) --- 751,762 ---- return nstr; } + char * + pstrdup(const char *in) + { + return MemoryContextStrdup(CurrentMemoryContext, in); + } + /* * pnstrdup * Like pstrdup(), but append null byte to a *************** *** 729,767 **** pnstrdup(const char *in, Size len) out[len] = '\0'; return out; } - - - #if defined(WIN32) || defined(__CYGWIN__) - /* - * Memory support routines for libpgport on Win32 - * - * Win32 can't load a library that PGDLLIMPORTs a variable - * if the link object files also PGDLLIMPORT the same variable. - * For this reason, libpgport can't reference CurrentMemoryContext - * in the palloc macro calls. - * - * To fix this, we create several functions here that allow us to - * manage memory without doing the inline in libpgport. - */ - void * - pgport_palloc(Size sz) - { - return palloc(sz); - } - - - char * - pgport_pstrdup(const char *str) - { - return pstrdup(str); - } - - - /* Doesn't reference a PGDLLIMPORT variable, but here for completeness. */ - void - pgport_pfree(void *pointer) - { - pfree(pointer); - } - - #endif --- 771,773 ---- *** a/src/bin/initdb/initdb.c --- b/src/bin/initdb/initdb.c *************** *** 200,207 **** const char *subdirs[] = { static char bin_path[MAXPGPATH]; static char backend_exec[MAXPGPATH]; - static void *pg_malloc(size_t size); - static char *pg_strdup(const char *s); static char **replace_token(char **lines, const char *token, const char *replacement); --- 200,205 ---- *************** *** 317,359 **** do { \ #define DIR_SEP "\\" #endif - /* - * routines to check mem allocations and fail noisily. - * - * Note that we can't call exit_nicely() on a memory failure, as it calls - * rmtree() which needs memory allocation. So we just exit with a bang. - */ - static void * - pg_malloc(size_t size) - { - void *result; - - /* Avoid unportable behavior of malloc(0) */ - if (size == 0) - size = 1; - result = malloc(size); - if (!result) - { - fprintf(stderr, _("%s: out of memory\n"), progname); - exit(1); - } - return result; - } - - static char * - pg_strdup(const char *s) - { - char *result; - - result = strdup(s); - if (!result) - { - fprintf(stderr, _("%s: out of memory\n"), progname); - exit(1); - } - return result; - } - static char * escape_quotes(const char *src) { --- 315,320 ---- *** a/src/bin/pg_basebackup/streamutil.c --- b/src/bin/pg_basebackup/streamutil.c *************** *** 26,68 **** static char *dbpassword = NULL; PGconn *conn = NULL; /* - * strdup() and malloc() replacements that print an error and exit - * if something goes wrong. Can never return NULL. - */ - char * - pg_strdup(const char *s) - { - char *result; - - result = strdup(s); - if (!result) - { - fprintf(stderr, _("%s: out of memory\n"), progname); - exit(1); - } - return result; - } - - void * - pg_malloc0(size_t size) - { - void *result; - - /* Avoid unportable behavior of malloc(0) */ - if (size == 0) - size = 1; - result = malloc(size); - if (!result) - { - fprintf(stderr, _("%s: out of memory\n"), progname); - exit(1); - } - MemSet(result, 0, size); - return result; - } - - - /* * Connect to the server. Returns a valid PGconn pointer if connected, * or NULL on non-permanent error. On permanent error, the function will * call exit(1) directly. --- 26,31 ---- *** a/src/bin/pg_basebackup/streamutil.h --- b/src/bin/pg_basebackup/streamutil.h *************** *** 15,22 **** extern PGconn *conn; exit(code); \ } - - extern char *pg_strdup(const char *s); - extern void *pg_malloc0(size_t size); - extern PGconn *GetConnection(void); --- 15,18 ---- *** a/src/bin/pg_ctl/pg_ctl.c --- b/src/bin/pg_ctl/pg_ctl.c *************** *** 118,125 **** write_stderr(const char *fmt,...) /* This extension allows gcc to check the format string for consistency with the supplied arguments. */ __attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2))); - static void *pg_malloc(size_t size); - static char *pg_strdup(const char *s); static void do_advice(void); static void do_help(void); static void set_mode(char *modeopt); --- 118,123 ---- *************** *** 226,267 **** write_stderr(const char *fmt,...) } /* - * routines to check memory allocations and fail noisily. - */ - - static void * - pg_malloc(size_t size) - { - void *result; - - /* Avoid unportable behavior of malloc(0) */ - if (size == 0) - size = 1; - result = malloc(size); - if (!result) - { - write_stderr(_("%s: out of memory\n"), progname); - exit(1); - } - return result; - } - - - static char * - pg_strdup(const char *s) - { - char *result; - - result = strdup(s); - if (!result) - { - write_stderr(_("%s: out of memory\n"), progname); - exit(1); - } - return result; - } - - /* * Given an already-localized string, print it to stdout unless the * user has specified that no messages should be printed. */ --- 224,229 ---- *** a/src/bin/pg_dump/Makefile --- b/src/bin/pg_dump/Makefile *************** *** 20,26 **** override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) OBJS= pg_backup_archiver.o pg_backup_db.o pg_backup_custom.o \ pg_backup_null.o pg_backup_tar.o \ ! pg_backup_directory.o dumpmem.o dumputils.o compress_io.o $(WIN32RES) KEYWRDOBJS = keywords.o kwlookup.o --- 20,26 ---- OBJS= pg_backup_archiver.o pg_backup_db.o pg_backup_custom.o \ pg_backup_null.o pg_backup_tar.o \ ! pg_backup_directory.o dumputils.o compress_io.o $(WIN32RES) KEYWRDOBJS = keywords.o kwlookup.o *************** *** 35,42 **** pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) $(KEYWRDOBJS) | submake-libpq pg_restore: pg_restore.o $(OBJS) $(KEYWRDOBJS) | submake-libpq submake-libpgport $(CC) $(CFLAGS) pg_restore.o $(KEYWRDOBJS) $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) ! pg_dumpall: pg_dumpall.o dumputils.o dumpmem.o $(KEYWRDOBJS) | submake-libpq submake-libpgport ! $(CC) $(CFLAGS) pg_dumpall.o dumputils.o dumpmem.o $(KEYWRDOBJS) $(WIN32RES) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) install: all installdirs $(INSTALL_PROGRAM) pg_dump$(X) '$(DESTDIR)$(bindir)'/pg_dump$(X) --- 35,42 ---- pg_restore: pg_restore.o $(OBJS) $(KEYWRDOBJS) | submake-libpq submake-libpgport $(CC) $(CFLAGS) pg_restore.o $(KEYWRDOBJS) $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) ! pg_dumpall: pg_dumpall.o dumputils.o $(KEYWRDOBJS) | submake-libpq submake-libpgport ! $(CC) $(CFLAGS) pg_dumpall.o dumputils.o $(KEYWRDOBJS) $(WIN32RES) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) install: all installdirs $(INSTALL_PROGRAM) pg_dump$(X) '$(DESTDIR)$(bindir)'/pg_dump$(X) *** a/src/bin/pg_dump/common.c --- b/src/bin/pg_dump/common.c *************** *** 18,25 **** #include <ctype.h> #include "catalog/pg_class.h" - #include "dumpmem.h" - #include "dumputils.h" /* --- 18,23 ---- *** a/src/bin/pg_dump/compress_io.c --- b/src/bin/pg_dump/compress_io.c *************** *** 53,59 **** */ #include "compress_io.h" - #include "dumpmem.h" #include "dumputils.h" /*---------------------- --- 53,58 ---- *** a/src/bin/pg_dump/dumpmem.c --- /dev/null *************** *** 1,76 **** - /*------------------------------------------------------------------------- - * - * dumpmem.c - * Memory allocation routines used by pg_dump, pg_dumpall, and pg_restore - * - * Portions Copyright (c) 1996-2013, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * - * IDENTIFICATION - * src/bin/pg_dump/dumpmem.c - * - *------------------------------------------------------------------------- - */ - #include "postgres_fe.h" - - #include "dumputils.h" - #include "dumpmem.h" - - - /* - * Safer versions of some standard C library functions. If an - * out-of-memory condition occurs, these functions will bail out via exit(); - *therefore, their return value is guaranteed to be non-NULL. - */ - - char * - pg_strdup(const char *string) - { - char *tmp; - - if (!string) - exit_horribly(NULL, "cannot duplicate null pointer\n"); - tmp = strdup(string); - if (!tmp) - exit_horribly(NULL, "out of memory\n"); - return tmp; - } - - void * - pg_malloc(size_t size) - { - void *tmp; - - /* Avoid unportable behavior of malloc(0) */ - if (size == 0) - size = 1; - tmp = malloc(size); - if (!tmp) - exit_horribly(NULL, "out of memory\n"); - return tmp; - } - - void * - pg_malloc0(size_t size) - { - void *tmp; - - tmp = pg_malloc(size); - MemSet(tmp, 0, size); - return tmp; - } - - void * - pg_realloc(void *ptr, size_t size) - { - void *tmp; - - /* Avoid unportable behavior of realloc(NULL, 0) */ - if (ptr == NULL && size == 0) - size = 1; - tmp = realloc(ptr, size); - if (!tmp) - exit_horribly(NULL, "out of memory\n"); - return tmp; - } --- 0 ---- *** a/src/bin/pg_dump/dumpmem.h --- /dev/null *************** *** 1,22 **** - /*------------------------------------------------------------------------- - * - * dumpmem.h - * Memory allocation routines used by pg_dump, pg_dumpall, and pg_restore - * - * Portions Copyright (c) 1996-2013, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * src/bin/pg_dump/dumpmem.h - * - *------------------------------------------------------------------------- - */ - - #ifndef DUMPMEM_H - #define DUMPMEM_H - - extern char *pg_strdup(const char *string); - extern void *pg_malloc(size_t size); - extern void *pg_malloc0(size_t size); - extern void *pg_realloc(void *ptr, size_t size); - - #endif /* DUMPMEM_H */ --- 0 ---- *** a/src/bin/pg_dump/dumputils.c --- b/src/bin/pg_dump/dumputils.c *************** *** 17,23 **** #include <ctype.h> #include "dumputils.h" - #include "dumpmem.h" #include "parser/keywords.h" --- 17,22 ---- *** a/src/bin/pg_dump/nls.mk --- b/src/bin/pg_dump/nls.mk *************** *** 3,9 **** CATALOG_NAME = pg_dump AVAIL_LANGUAGES = de es fr it ja ko pt_BR sv tr zh_CN zh_TW GETTEXT_FILES = pg_backup_archiver.c pg_backup_db.c pg_backup_custom.c \ pg_backup_null.c pg_backup_tar.c \ ! pg_backup_directory.c dumpmem.c dumputils.c compress_io.c \ pg_dump.c common.c pg_dump_sort.c \ pg_restore.c pg_dumpall.c \ ../../port/exec.c --- 3,9 ---- AVAIL_LANGUAGES = de es fr it ja ko pt_BR sv tr zh_CN zh_TW GETTEXT_FILES = pg_backup_archiver.c pg_backup_db.c pg_backup_custom.c \ pg_backup_null.c pg_backup_tar.c \ ! pg_backup_directory.c dumputils.c compress_io.c \ pg_dump.c common.c pg_dump_sort.c \ pg_restore.c pg_dumpall.c \ ../../port/exec.c *** a/src/bin/pg_dump/pg_backup_archiver.c --- b/src/bin/pg_dump/pg_backup_archiver.c *************** *** 21,27 **** */ #include "pg_backup_db.h" - #include "dumpmem.h" #include "dumputils.h" #include <ctype.h> --- 21,26 ---- *** a/src/bin/pg_dump/pg_backup_custom.c --- b/src/bin/pg_dump/pg_backup_custom.c *************** *** 26,32 **** #include "compress_io.h" #include "dumputils.h" - #include "dumpmem.h" /*-------- * Routines in the format interface --- 26,31 ---- *** a/src/bin/pg_dump/pg_backup_db.c --- b/src/bin/pg_dump/pg_backup_db.c *************** *** 11,17 **** */ #include "pg_backup_db.h" - #include "dumpmem.h" #include "dumputils.h" #include <unistd.h> --- 11,16 ---- *** a/src/bin/pg_dump/pg_backup_directory.c --- b/src/bin/pg_dump/pg_backup_directory.c *************** *** 34,40 **** */ #include "compress_io.h" - #include "dumpmem.h" #include "dumputils.h" #include <dirent.h> --- 34,39 ---- *** a/src/bin/pg_dump/pg_backup_null.c --- b/src/bin/pg_dump/pg_backup_null.c *************** *** 23,29 **** */ #include "pg_backup_archiver.h" - #include "dumpmem.h" #include "dumputils.h" #include <unistd.h> /* for dup */ --- 23,28 ---- *** a/src/bin/pg_dump/pg_backup_tar.c --- b/src/bin/pg_dump/pg_backup_tar.c *************** *** 31,37 **** #include "pg_backup.h" #include "pg_backup_archiver.h" #include "pg_backup_tar.h" - #include "dumpmem.h" #include "dumputils.h" #include "pgtar.h" --- 31,36 ---- *** a/src/bin/pg_dump/pg_dump.c --- b/src/bin/pg_dump/pg_dump.c *************** *** 59,65 **** #include "pg_backup_archiver.h" #include "pg_backup_db.h" - #include "dumpmem.h" #include "dumputils.h" extern char *optarg; --- 59,64 ---- *** a/src/bin/pg_dump/pg_dump_sort.c --- b/src/bin/pg_dump/pg_dump_sort.c *************** *** 15,21 **** */ #include "pg_backup_archiver.h" #include "dumputils.h" - #include "dumpmem.h" /* translator: this is a module name */ static const char *modulename = gettext_noop("sorter"); --- 15,20 ---- *** a/src/bin/pg_dump/pg_dumpall.c --- b/src/bin/pg_dump/pg_dumpall.c *************** *** 25,31 **** #include "getopt_long.h" #include "dumputils.h" - #include "dumpmem.h" #include "pg_backup.h" /* version string we expect back from pg_dump */ --- 25,30 ---- *** a/src/bin/pg_dump/pg_restore.c --- b/src/bin/pg_dump/pg_restore.c *************** *** 41,47 **** #include "pg_backup_archiver.h" - #include "dumpmem.h" #include "dumputils.h" #include <ctype.h> --- 41,46 ---- *** a/src/bin/pg_resetxlog/pg_resetxlog.c --- b/src/bin/pg_resetxlog/pg_resetxlog.c *************** *** 54,59 **** --- 54,60 ---- #include "access/xlog_internal.h" #include "catalog/catversion.h" #include "catalog/pg_control.h" + #include "common/fe_memutils.h" extern int optind; extern char *optarg; *************** *** 420,426 **** ReadControlFile(void) } /* Use malloc to ensure we have a maxaligned buffer */ ! buffer = (char *) malloc(PG_CONTROL_SIZE); len = read(fd, buffer, PG_CONTROL_SIZE); if (len < 0) --- 421,427 ---- } /* Use malloc to ensure we have a maxaligned buffer */ ! buffer = (char *) pg_malloc(PG_CONTROL_SIZE); len = read(fd, buffer, PG_CONTROL_SIZE); if (len < 0) *************** *** 942,948 **** WriteEmptyXLOG(void) int nbytes; /* Use malloc() to ensure buffer is MAXALIGNED */ ! buffer = (char *) malloc(XLOG_BLCKSZ); page = (XLogPageHeader) buffer; memset(buffer, 0, XLOG_BLCKSZ); --- 943,949 ---- int nbytes; /* Use malloc() to ensure buffer is MAXALIGNED */ ! buffer = (char *) pg_malloc(XLOG_BLCKSZ); page = (XLogPageHeader) buffer; memset(buffer, 0, XLOG_BLCKSZ); *** a/src/bin/psql/common.c --- b/src/bin/psql/common.c *************** *** 33,88 **** static bool command_no_begin(const char *query); static bool is_select_command(const char *query); /* - * "Safe" wrapper around strdup() - */ - char * - pg_strdup(const char *string) - { - char *tmp; - - if (!string) - { - psql_error("%s: pg_strdup: cannot duplicate null pointer (internal error)\n", - pset.progname); - exit(EXIT_FAILURE); - } - tmp = strdup(string); - if (!tmp) - { - psql_error("out of memory\n"); - exit(EXIT_FAILURE); - } - return tmp; - } - - void * - pg_malloc(size_t size) - { - void *tmp; - - /* Avoid unportable behavior of malloc(0) */ - if (size == 0) - size = 1; - tmp = malloc(size); - if (!tmp) - { - psql_error("out of memory\n"); - exit(EXIT_FAILURE); - } - return tmp; - } - - void * - pg_malloc0(size_t size) - { - void *tmp; - - tmp = pg_malloc(size); - MemSet(tmp, 0, size); - return tmp; - } - - /* * setQFout * -- handler for -o command line option and \o command * --- 33,38 ---- *** a/src/bin/psql/common.h --- b/src/bin/psql/common.h *************** *** 14,28 **** #define atooid(x) ((Oid) strtoul((x), NULL, 10)) - /* - * Safer versions of some standard C library functions. If an - * out-of-memory condition occurs, these functions will bail out - * safely; therefore, their return value is guaranteed to be non-NULL. - */ - extern char *pg_strdup(const char *string); - extern void *pg_malloc(size_t size); - extern void *pg_malloc0(size_t size); - extern bool setQFout(const char *fname); extern void --- 14,19 ---- *** a/src/bin/scripts/common.c --- b/src/bin/scripts/common.c *************** *** 278,332 **** executeMaintenanceCommand(PGconn *conn, const char *query, bool echo) } /* - * "Safe" wrapper around strdup(). Pulled from psql/common.c - */ - char * - pg_strdup(const char *string) - { - char *tmp; - - if (!string) - { - fprintf(stderr, _("pg_strdup: cannot duplicate null pointer (internal error)\n")); - exit(EXIT_FAILURE); - } - tmp = strdup(string); - if (!tmp) - { - fprintf(stderr, _("out of memory\n")); - exit(EXIT_FAILURE); - } - return tmp; - } - - void * - pg_malloc(size_t size) - { - void *tmp; - - /* Avoid unportable behavior of malloc(0) */ - if (size == 0) - size = 1; - tmp = malloc(size); - if (!tmp) - { - fprintf(stderr, _("out of memory\n")); - exit(EXIT_FAILURE); - } - return tmp; - } - - void * - pg_malloc0(size_t size) - { - void *tmp; - - tmp = pg_malloc(size); - MemSet(tmp, 0, size); - return tmp; - } - - /* * Check yes/no answer in a localized way. 1=yes, 0=no, -1=neither. */ --- 278,283 ---- *** a/src/bin/scripts/common.h --- b/src/bin/scripts/common.h *************** *** 50,57 **** extern bool yesno_prompt(const char *question); extern void setup_cancel_handler(void); - extern char *pg_strdup(const char *string); - extern void *pg_malloc(size_t size); - extern void *pg_malloc0(size_t size); - #endif /* COMMON_H */ --- 50,53 ---- *** /dev/null --- b/src/common/Makefile *************** *** 0 **** --- 1,64 ---- + #------------------------------------------------------------------------- + # + # Makefile + # Makefile for src/common + # + # This makefile generates two outputs: + # + # libpgcommon.a - contains object files with FRONTEND defined, + # for use by client application and libraries + # + # libpgcommon_srv.a - contains object files without FRONTEND defined, + # for use only by the backend binaries + # + # IDENTIFICATION + # src/common/Makefile + # + #------------------------------------------------------------------------- + + subdir = src/common + top_builddir = ../.. + include $(top_builddir)/src/Makefile.global + + override CPPFLAGS := -DFRONTEND $(CPPFLAGS) + LIBS += $(PTHREAD_LIBS) + + OBJS_COMMON = + + OBJS_FRONTEND = $(OBJS_COMMON) fe_memutils.o + + OBJS_SRV = $(OBJS_COMMON:%.o=%_srv.o) + + all: libpgcommon.a libpgcommon_srv.a + + # libpgcommon is needed by some contrib + install: all installdirs + $(INSTALL_STLIB) libpgcommon.a '$(DESTDIR)$(libdir)/libpgcommon.a' + + installdirs: + $(MKDIR_P) '$(DESTDIR)$(libdir)' + + uninstall: + rm -f '$(DESTDIR)$(libdir)/libpgcommon.a' + + libpgcommon.a: $(OBJS_FRONTEND) + $(AR) $(AROPT) $@ $^ + + # + # Server versions of object files + # + + libpgcommon_srv.a: $(OBJS_SRV) + $(AR) $(AROPT) $@ $^ + + # Because this uses its own compilation rule, it doesn't use the + # dependency tracking logic from Makefile.global. To make sure that + # dependency tracking works anyway for the *_srv.o files, depend on + # their *.o siblings as well, which do have proper dependencies. It's + # a hack that might fail someday if there is a *_srv.o without a + # corresponding *.o, but it works for now. + %_srv.o: %.c %.o + $(CC) $(CFLAGS) $(subst -DFRONTEND,, $(CPPFLAGS)) -c $< -o $@ + + clean distclean maintainer-clean: + rm -f libpgcommon.a libpgcommon_srv.a $(OBJS_FRONTEND) $(OBJS_SRV) *** /dev/null --- b/src/common/fe_memutils.c *************** *** 0 **** --- 1,128 ---- + /*------------------------------------------------------------------------- + * + * fe_memutils.c + * memory management support for frontend code + * + * Portions Copyright (c) 1996-2013, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/common/fe_memutils.c + * + *------------------------------------------------------------------------- + */ + + #ifndef FRONTEND + #error "This file is not expected to be compiled for backend code" + #endif + + #include "postgres_fe.h" + + void * + pg_malloc(size_t size) + { + void *tmp; + + /* Avoid unportable behavior of malloc(0) */ + if (size == 0) + size = 1; + tmp = malloc(size); + if (!tmp) + { + fprintf(stderr, _("out of memory\n")); + exit(EXIT_FAILURE); + } + return tmp; + } + + void * + pg_malloc0(size_t size) + { + void *tmp; + + tmp = pg_malloc(size); + MemSet(tmp, 0, size); + return tmp; + } + + void * + pg_realloc(void *ptr, size_t size) + { + void *tmp; + + /* Avoid unportable behavior of realloc(NULL, 0) */ + if (ptr == NULL && size == 0) + size = 1; + tmp = realloc(ptr, size); + if (!tmp) + { + fprintf(stderr, _("out of memory\n")); + exit(EXIT_FAILURE); + } + return tmp; + } + + /* + * "Safe" wrapper around strdup(). + */ + char * + pg_strdup(const char *string) + { + char *tmp; + + if (!string) + { + fprintf(stderr, + _("cannot duplicate null pointer (internal error)\n")); + exit(EXIT_FAILURE); + } + tmp = strdup(string); + if (!tmp) + { + fprintf(stderr, _("out of memory\n")); + exit(EXIT_FAILURE); + } + return tmp; + } + + void + pg_free(void *ptr) + { + if (ptr != NULL) + free(ptr); + } + + /* + * Frontend emulation of backend memory management functions. Useful for + * programs that compile backend files. + */ + void * + palloc(Size size) + { + return pg_malloc(size); + } + + void * + palloc0(Size size) + { + return pg_malloc0(size); + } + + void + pfree(void *pointer) + { + pg_free(pointer); + } + + char * + pstrdup(const char *string) + { + return pg_strdup(string); + } + + void * + repalloc(void *pointer, Size size) + { + return pg_realloc(pointer, size); + } *** /dev/null --- b/src/include/common/fe_memutils.h *************** *** 0 **** --- 1,20 ---- + /* + * fe_memutils.h + * memory management support for frontend code + * + * Copyright (c) 2003-2013, PostgreSQL Global Development Group + * + * src/include/common/fe_memutils.h + */ + #ifndef FE_MEMUTILS_H + #define FE_MEMUTILS_H + + extern char *pg_strdup(const char *string); + extern void *pg_malloc(size_t size); + extern void *pg_malloc0(size_t size); + extern void *pg_realloc(void *pointer, size_t size); + extern void pg_free(void *pointer); + + #include "utils/palloc.h" + + #endif /* FE_MEMUTILS_H */ *** a/src/include/postgres_fe.h --- b/src/include/postgres_fe.h *************** *** 24,27 **** --- 24,29 ---- #include "c.h" + #include "common/fe_memutils.h" + #endif /* POSTGRES_FE_H */ *** a/src/include/utils/palloc.h --- b/src/include/utils/palloc.h *************** *** 28,33 **** --- 28,35 ---- #ifndef PALLOC_H #define PALLOC_H + #ifndef FRONTEND + /* * Type MemoryContextData is declared in nodes/memnodes.h. Most users * of memory allocation should just treat it as an abstract type, so we *************** *** 49,58 **** extern void *MemoryContextAlloc(MemoryContext context, Size size); extern void *MemoryContextAllocZero(MemoryContext context, Size size); extern void *MemoryContextAllocZeroAligned(MemoryContext context, Size size); - #define palloc(sz) MemoryContextAlloc(CurrentMemoryContext, (sz)) - - #define palloc0(sz) MemoryContextAllocZero(CurrentMemoryContext, (sz)) - /* * The result of palloc() is always word-aligned, so we can skip testing * alignment of the pointer when deciding which MemSet variant to use. --- 51,56 ---- *************** *** 66,85 **** extern void *MemoryContextAllocZeroAligned(MemoryContext context, Size size); MemoryContextAllocZeroAligned(CurrentMemoryContext, sz) : \ MemoryContextAllocZero(CurrentMemoryContext, sz) ) - extern void pfree(void *pointer); - - extern void *repalloc(void *pointer, Size size); - /* * MemoryContextSwitchTo can't be a macro in standard C compilers. * But we can make it an inline function if the compiler supports it. * See STATIC_IF_INLINE in c.h. - * - * This file has to be includable by some non-backend code such as - * pg_resetxlog, so don't expose the CurrentMemoryContext reference - * if FRONTEND is defined. */ - #ifndef FRONTEND #ifndef PG_USE_INLINE extern MemoryContext MemoryContextSwitchTo(MemoryContext context); --- 64,74 ---- *************** *** 94,115 **** MemoryContextSwitchTo(MemoryContext context) return old; } #endif /* PG_USE_INLINE || MCXT_INCLUDE_DEFINITIONS */ - #endif /* !FRONTEND */ /* * These are like standard strdup() except the copied string is * allocated in a context, not with malloc(). */ extern char *MemoryContextStrdup(MemoryContext context, const char *string); ! #define pstrdup(str) MemoryContextStrdup(CurrentMemoryContext, (str)) ! extern char *pnstrdup(const char *in, Size len); ! ! #if defined(WIN32) || defined(__CYGWIN__) ! extern void *pgport_palloc(Size sz); ! extern char *pgport_pstrdup(const char *str); ! extern void pgport_pfree(void *pointer); ! #endif #endif /* PALLOC_H */ --- 83,101 ---- return old; } #endif /* PG_USE_INLINE || MCXT_INCLUDE_DEFINITIONS */ /* * These are like standard strdup() except the copied string is * allocated in a context, not with malloc(). */ extern char *MemoryContextStrdup(MemoryContext context, const char *string); + #endif /* !FRONTEND */ ! extern char *pstrdup(const char *in); extern char *pnstrdup(const char *in, Size len); ! extern void *palloc(Size size); ! extern void *palloc0(Size size); ! extern void pfree(void *pointer); ! extern void *repalloc(void *pointer, Size size); #endif /* PALLOC_H */ *** a/src/port/dirmod.c --- b/src/port/dirmod.c *************** *** 40,119 **** #endif #endif - - #ifndef FRONTEND - - /* - * On Windows, call non-macro versions of palloc; we can't reference - * CurrentMemoryContext in this file because of PGDLLIMPORT conflict. - */ - #if defined(WIN32) || defined(__CYGWIN__) - #undef palloc - #undef pstrdup - #define palloc(sz) pgport_palloc(sz) - #define pstrdup(str) pgport_pstrdup(str) - #endif - #else /* FRONTEND */ - - /* - * In frontend, fake palloc behavior with these - */ - #undef palloc - #undef pstrdup - #define palloc(sz) fe_palloc(sz) - #define pstrdup(str) fe_pstrdup(str) - #define repalloc(pointer,sz) fe_repalloc(pointer,sz) - #define pfree(pointer) free(pointer) - - static void * - fe_palloc(Size size) - { - void *res; - - /* Avoid unportable behavior of malloc(0) */ - if (size == 0) - size = 1; - res = malloc(size); - if (res == NULL) - { - fprintf(stderr, _("out of memory\n")); - exit(1); - } - return res; - } - - static char * - fe_pstrdup(const char *string) - { - char *res; - - if ((res = strdup(string)) == NULL) - { - fprintf(stderr, _("out of memory\n")); - exit(1); - } - return res; - } - - static void * - fe_repalloc(void *pointer, Size size) - { - void *res; - - /* Avoid unportable behavior of realloc(NULL, 0) */ - if (pointer == NULL && size == 0) - size = 1; - res = realloc(pointer, size); - if (res == NULL) - { - fprintf(stderr, _("out of memory\n")); - exit(1); - } - return res; - } - #endif /* FRONTEND */ - - #if defined(WIN32) || defined(__CYGWIN__) /* --- 40,45 ---- *** a/src/tools/msvc/Install.pm --- b/src/tools/msvc/Install.pm *************** *** 86,91 **** sub Install --- 86,92 ---- 'Import libraries', $target . '/lib/', "$conf\\", "postgres\\postgres.lib", "libpq\\libpq.lib", "libecpg\\libecpg.lib", + "libpgcommon\\libpgcommon.lib", "libpgport\\libpgport.lib", "libpgtypes\\libpgtypes.lib", "libecpg_compat\\libecpg_compat.lib"); CopySetOfFiles( *** a/src/tools/msvc/Mkvcbuild.pm --- b/src/tools/msvc/Mkvcbuild.pm *************** *** 24,29 **** our (@ISA, @EXPORT_OK); --- 24,30 ---- my $solution; my $libpgport; + my $libpgcommon; my $postgres; my $libpq; *************** *** 35,40 **** my @contrib_uselibpgport = ( --- 36,46 ---- 'pg_standby', 'pg_archivecleanup', 'pg_test_fsync', 'pg_test_timing', 'pg_upgrade', 'vacuumlo'); + my @contrib_uselibpgcommon = ( + 'oid2name', 'pgbench', + 'pg_standby', 'pg_archivecleanup', + 'pg_test_fsync', 'pg_test_timing', + 'pg_upgrade', 'vacuumlo'); my $contrib_extralibs = { 'pgbench' => ['wsock32.lib'] }; my $contrib_extraincludes = { 'tsearch2' => ['contrib/tsearch2'], 'dblink' => ['src/backend'] }; *************** *** 63,72 **** sub mkvcbuild --- 69,87 ---- sprompt.c tar.c thread.c getopt.c getopt_long.c dirent.c rint.c win32env.c win32error.c win32setlocale.c); + our @pgcommonfiles = qw( + fe_memutils.c); + + our @pgcommonbkndfiles = qw(); + $libpgport = $solution->AddProject('libpgport', 'lib', 'misc'); $libpgport->AddDefine('FRONTEND'); $libpgport->AddFiles('src\port', @pgportfiles); + $libpgcommon = $solution->AddProject('libpgcommon', 'lib', 'misc'); + $libpgcommon->AddDefine('FRONTEND'); + $libpgcommon->AddFiles('src\common', @pgcommonfiles); + $postgres = $solution->AddProject('postgres', 'exe', '', 'src\backend'); $postgres->AddIncludeDir('src\backend'); $postgres->AddDir('src\backend\port\win32'); *************** *** 81,86 **** sub mkvcbuild --- 96,102 ---- $postgres->ReplaceFile('src\backend\port\pg_latch.c', 'src\backend\port\win32_latch.c'); $postgres->AddFiles('src\port', @pgportfiles); + $postgres->AddFiles('src\common', @pgcommonbkndfiles); $postgres->AddDir('src\timezone'); $postgres->AddFiles('src\backend\parser', 'scan.l', 'gram.y'); $postgres->AddFiles('src\backend\bootstrap', 'bootscanner.l', *************** *** 307,313 **** sub mkvcbuild $pgregress_ecpg->AddIncludeDir('src\test\regress'); $pgregress_ecpg->AddDefine('HOST_TUPLE="i686-pc-win32vc"'); $pgregress_ecpg->AddDefine('FRONTEND'); ! $pgregress_ecpg->AddReference($libpgport); my $isolation_tester = $solution->AddProject('isolationtester', 'exe', 'misc'); --- 323,329 ---- $pgregress_ecpg->AddIncludeDir('src\test\regress'); $pgregress_ecpg->AddDefine('HOST_TUPLE="i686-pc-win32vc"'); $pgregress_ecpg->AddDefine('FRONTEND'); ! $pgregress_ecpg->AddReference($libpgport, $libpgcommon); my $isolation_tester = $solution->AddProject('isolationtester', 'exe', 'misc'); *************** *** 332,338 **** sub mkvcbuild $pgregress_isolation->AddIncludeDir('src\test\regress'); $pgregress_isolation->AddDefine('HOST_TUPLE="i686-pc-win32vc"'); $pgregress_isolation->AddDefine('FRONTEND'); ! $pgregress_isolation->AddReference($libpgport); # src/bin my $initdb = AddSimpleFrontend('initdb'); --- 348,354 ---- $pgregress_isolation->AddIncludeDir('src\test\regress'); $pgregress_isolation->AddDefine('HOST_TUPLE="i686-pc-win32vc"'); $pgregress_isolation->AddDefine('FRONTEND'); ! $pgregress_isolation->AddReference($libpgport, $libpgcommon); # src/bin my $initdb = AddSimpleFrontend('initdb'); *************** *** 393,399 **** sub mkvcbuild $pgdumpall->AddIncludeDir('src\backend'); $pgdumpall->AddFile('src\bin\pg_dump\pg_dumpall.c'); $pgdumpall->AddFile('src\bin\pg_dump\dumputils.c'); - $pgdumpall->AddFile('src\bin\pg_dump\dumpmem.c'); $pgdumpall->AddFile('src\bin\pg_dump\keywords.c'); $pgdumpall->AddFile('src\backend\parser\kwlookup.c'); --- 409,414 ---- *************** *** 407,413 **** sub mkvcbuild my $zic = $solution->AddProject('zic', 'exe', 'utils'); $zic->AddFiles('src\timezone', 'zic.c', 'ialloc.c', 'scheck.c', 'localtime.c'); ! $zic->AddReference($libpgport); if ($solution->{options}->{xml}) { --- 422,428 ---- my $zic = $solution->AddProject('zic', 'exe', 'utils'); $zic->AddFiles('src\timezone', 'zic.c', 'ialloc.c', 'scheck.c', 'localtime.c'); ! $zic->AddReference($libpgport, $libpgcommon); if ($solution->{options}->{xml}) { *************** *** 547,553 **** sub mkvcbuild $proj->AddIncludeDir('src\interfaces\libpq'); $proj->AddIncludeDir('src\bin\pg_dump'); $proj->AddIncludeDir('src\bin\psql'); ! $proj->AddReference($libpq, $libpgport); $proj->AddResourceFile('src\bin\scripts', 'PostgreSQL Utility'); } --- 562,568 ---- $proj->AddIncludeDir('src\interfaces\libpq'); $proj->AddIncludeDir('src\bin\pg_dump'); $proj->AddIncludeDir('src\bin\psql'); ! $proj->AddReference($libpq, $libpgport, $libpgcommon); $proj->AddResourceFile('src\bin\scripts', 'PostgreSQL Utility'); } *************** *** 561,567 **** sub mkvcbuild $pgregress->AddFile('src\test\regress\pg_regress_main.c'); $pgregress->AddIncludeDir('src\port'); $pgregress->AddDefine('HOST_TUPLE="i686-pc-win32vc"'); ! $pgregress->AddReference($libpgport); $solution->Save(); return $solution->{vcver}; --- 576,582 ---- $pgregress->AddFile('src\test\regress\pg_regress_main.c'); $pgregress->AddIncludeDir('src\port'); $pgregress->AddDefine('HOST_TUPLE="i686-pc-win32vc"'); ! $pgregress->AddReference($libpgport, $libpgcommon); $solution->Save(); return $solution->{vcver}; *************** *** 579,585 **** sub AddSimpleFrontend my $p = $solution->AddProject($n, 'exe', 'bin'); $p->AddDir('src\bin\\' . $n); ! $p->AddReference($libpgport); if ($uselibpq) { $p->AddIncludeDir('src\interfaces\libpq'); --- 594,600 ---- my $p = $solution->AddProject($n, 'exe', 'bin'); $p->AddDir('src\bin\\' . $n); ! $p->AddReference($libpgport, $libpgcommon); if ($uselibpq) { $p->AddIncludeDir('src\interfaces\libpq'); *************** *** 730,735 **** sub AdjustContribProj --- 745,754 ---- { $proj->AddReference($libpgport); } + if (grep { /^$n$/ } @contrib_uselibpgcommon) + { + $proj->AddReference($libpgcommon); + } if ($contrib_extralibs->{$n}) { foreach my $l (@{ $contrib_extralibs->{$n} }) *** a/src/tools/msvc/Project.pm --- b/src/tools/msvc/Project.pm *************** *** 225,231 **** sub AddDir if ($filter eq "LIBOBJS") { ! if (grep(/$p/, @main::pgportfiles) == 1) { $p =~ s/\.c/\.o/; $matches .= $p . " "; --- 225,231 ---- if ($filter eq "LIBOBJS") { ! if (grep(/$p/, @main::pgportfiles, @main::pgcommonfiles) == 1) { $p =~ s/\.c/\.o/; $matches .= $p . " ";
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers