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 ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers