Tom Lane escribió: > Simon Riggs <si...@2ndquadrant.com> writes: > > On 6 February 2013 14:38, Alvaro Herrera <alvhe...@2ndquadrant.com> wrote: > >> Yeah, I am doing this right now and the "shared" name doesn't seem so > >> good. "libpgframework" sounds decent. So since libpgport comes from > >> src/port, are we okay with src/framework and src/include/framework? > > > "common" ? > > > src/backend/common > > src/include/common > > To me the term "framework" carries a lot of baggage that doesn't fit > this usage. "common" seems better.
Okay, here's an attempt at doing it that way. Notably this creates libpgcommon, a static library, to be used by both frontend and backend. There's only a frontend file now (fe_memutils.c); the backend side of it is empty. I verified that the backend makefile rules work, but there's no attempt to link it into the backend. libpgcommon piggybacks on libpgport: for instance there is no separate submake-pgcommon rule on which to depend, or LDFLAGS additions and the like, I just appended it all to existing pgport rules. Duplicating it would be much more verbose and pointless; if we ever need to distinguish these two libs, that can easily be done. Some existing pg_malloc() implementations tried to do something other than exit(EXIT_FAILURE); pg_upgrade did pg_log(FATAL) for instance. But I don't think there is much point in that, so I've just made them all use fprintf(stderr); exit(EXIT_FAILURE); This is the same approach Zoltan ended up with in his patch. MSVC is known broken (I didn't touch Andres' hunk of that. I will look into that later.) -- Álvaro Herrera http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
*** a/contrib/oid2name/oid2name.c --- b/contrib/oid2name/oid2name.c *************** *** 9,14 **** --- 9,16 ---- */ #include "postgres_fe.h" + #include "common/fe_memutils.h" + #include <unistd.h> #ifdef HAVE_GETOPT_H #include <getopt.h> *************** *** 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 *); --- 52,57 ---- *************** *** 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 * --- 200,205 ---- *** a/contrib/pg_upgrade/check.c --- b/contrib/pg_upgrade/check.c *************** *** 10,15 **** --- 10,16 ---- #include "postgres.h" #include "pg_upgrade.h" + #include "common/fe_memutils.h" static void set_locale_and_encoding(ClusterInfo *cluster); *** a/contrib/pg_upgrade/controldata.c --- b/contrib/pg_upgrade/controldata.c *************** *** 10,15 **** --- 10,16 ---- #include "postgres.h" #include "pg_upgrade.h" + #include "common/fe_memutils.h" #include <ctype.h> *** a/contrib/pg_upgrade/file.c --- b/contrib/pg_upgrade/file.c *************** *** 10,15 **** --- 10,16 ---- #include "postgres.h" #include "pg_upgrade.h" + #include "common/fe_memutils.h" #include <fcntl.h> *** a/contrib/pg_upgrade/function.c --- b/contrib/pg_upgrade/function.c *************** *** 10,15 **** --- 10,16 ---- #include "postgres.h" #include "pg_upgrade.h" + #include "common/fe_memutils.h" #include "access/transam.h" *** a/contrib/pg_upgrade/info.c --- b/contrib/pg_upgrade/info.c *************** *** 10,15 **** --- 10,16 ---- #include "postgres.h" #include "pg_upgrade.h" + #include "common/fe_memutils.h" #include "access/transam.h" *** a/contrib/pg_upgrade/option.c --- b/contrib/pg_upgrade/option.c *************** *** 9,14 **** --- 9,15 ---- #include "postgres.h" + #include "common/fe_memutils.h" #include "miscadmin.h" #include "pg_upgrade.h" *** a/contrib/pg_upgrade/pg_upgrade.c --- b/contrib/pg_upgrade/pg_upgrade.c *************** *** 37,42 **** --- 37,43 ---- #include "postgres.h" + #include "common/fe_memutils.h" #include "pg_upgrade.h" #ifdef HAVE_LANGINFO_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 *************** *** 9,14 **** --- 9,15 ---- #include "postgres.h" + #include "common/fe_memutils.h" #include "pg_upgrade.h" #include "catalog/pg_class.h" *** a/contrib/pg_upgrade/tablespace.c --- b/contrib/pg_upgrade/tablespace.c *************** *** 9,14 **** --- 9,15 ---- #include "postgres.h" + #include "common/fe_memutils.h" #include "pg_upgrade.h" static void get_tablespace_paths(void); *** a/contrib/pg_upgrade/util.c --- b/contrib/pg_upgrade/util.c *************** *** 9,14 **** --- 9,15 ---- #include "postgres.h" + #include "common/fe_memutils.h" #include "pg_upgrade.h" #include <signal.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() * --- 214,219 ---- *** a/contrib/pg_upgrade/version_old_8_3.c --- b/contrib/pg_upgrade/version_old_8_3.c *************** *** 9,14 **** --- 9,15 ---- #include "postgres.h" + #include "common/fe_memutils.h" #include "pg_upgrade.h" #include "access/transam.h" *** a/contrib/pgbench/pgbench.c --- b/contrib/pgbench/pgbench.c *************** *** 33,38 **** --- 33,39 ---- #include "postgres_fe.h" + #include "common/fe_memutils.h" #include "getopt_long.h" #include "libpq-fe.h" #include "libpq/pqsignal.h" *************** *** 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) { --- 321,326 ---- *** 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 *************** *** 56,61 **** --- 56,63 ---- #include <signal.h> #include <time.h> + #include "common/fe_memutils.h" + #include "libpq/pqsignal.h" #include "mb/pg_wchar.h" #include "getaddrinfo.h" *************** *** 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); --- 202,207 ---- *************** *** 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) { --- 317,322 ---- *** a/src/bin/pg_basebackup/pg_basebackup.c --- b/src/bin/pg_basebackup/pg_basebackup.c *************** *** 12,17 **** --- 12,19 ---- */ #include "postgres_fe.h" + + #include "common/fe_memutils.h" #include "libpq-fe.h" #include "pqexpbuffer.h" #include "pgtar.h" *************** *** 32,38 **** #include "receivelog.h" #include "streamutil.h" - /* Global options */ char *basedir = NULL; char format = 'p'; /* p(lain)/t(ar) */ --- 34,39 ---- *** a/src/bin/pg_basebackup/pg_receivexlog.c --- b/src/bin/pg_basebackup/pg_receivexlog.c *************** *** 13,18 **** --- 13,19 ---- */ #include "postgres_fe.h" + #include "common/fe_memutils.h" #include "libpq-fe.h" #include "libpq/pqsignal.h" #include "access/xlog_internal.h" *** a/src/bin/pg_basebackup/receivelog.c --- b/src/bin/pg_basebackup/receivelog.c *************** *** 23,28 **** --- 23,29 ---- #include "libpq-fe.h" #include "access/xlog_internal.h" + #include "common/fe_memutils.h" #include "receivelog.h" #include "streamutil.h" *** a/src/bin/pg_basebackup/streamutil.c --- b/src/bin/pg_basebackup/streamutil.c *************** *** 13,18 **** --- 13,19 ---- #include "postgres_fe.h" #include "streamutil.h" + #include "common/fe_memutils.h" #include <stdio.h> #include <string.h> *************** *** 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. --- 27,32 ---- *** 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 *************** *** 33,38 **** --- 33,39 ---- #include <sys/resource.h> #endif + #include "common/fe_memutils.h" #include "libpq/pqsignal.h" #include "getopt_long.h" #include "miscadmin.h" *************** *** 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); --- 119,124 ---- *************** *** 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. */ --- 225,230 ---- *** 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,24 ---- #include <ctype.h> #include "catalog/pg_class.h" ! #include "common/fe_memutils.h" /* *** a/src/bin/pg_dump/compress_io.c --- b/src/bin/pg_dump/compress_io.c *************** *** 53,60 **** */ #include "compress_io.h" - #include "dumpmem.h" #include "dumputils.h" /*---------------------- * Compressor API --- 53,60 ---- */ #include "compress_io.h" #include "dumputils.h" + #include "common/fe_memutils.h" /*---------------------- * Compressor API *** 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 *************** *** 16,23 **** #include <ctype.h> #include "dumputils.h" - #include "dumpmem.h" #include "parser/keywords.h" --- 16,24 ---- #include <ctype.h> + #include "common/fe_memutils.h" + #include "dumputils.h" #include "parser/keywords.h" *** 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,28 **** */ #include "pg_backup_db.h" - #include "dumpmem.h" #include "dumputils.h" #include <ctype.h> #include <unistd.h> --- 21,28 ---- */ #include "pg_backup_db.h" #include "dumputils.h" + #include "common/fe_memutils.h" #include <ctype.h> #include <unistd.h> *** 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,32 ---- #include "compress_io.h" #include "dumputils.h" ! #include "common/fe_memutils.h" /*-------- * Routines in the format interface *** a/src/bin/pg_dump/pg_backup_db.c --- b/src/bin/pg_dump/pg_backup_db.c *************** *** 11,18 **** */ #include "pg_backup_db.h" - #include "dumpmem.h" #include "dumputils.h" #include <unistd.h> #include <ctype.h> --- 11,18 ---- */ #include "pg_backup_db.h" #include "dumputils.h" + #include "common/fe_memutils.h" #include <unistd.h> #include <ctype.h> *** a/src/bin/pg_dump/pg_backup_directory.c --- b/src/bin/pg_dump/pg_backup_directory.c *************** *** 34,41 **** */ #include "compress_io.h" - #include "dumpmem.h" #include "dumputils.h" #include <dirent.h> #include <sys/stat.h> --- 34,41 ---- */ #include "compress_io.h" #include "dumputils.h" + #include "common/fe_memutils.h" #include <dirent.h> #include <sys/stat.h> *** a/src/bin/pg_dump/pg_backup_null.c --- b/src/bin/pg_dump/pg_backup_null.c *************** *** 23,30 **** */ #include "pg_backup_archiver.h" - #include "dumpmem.h" #include "dumputils.h" #include <unistd.h> /* for dup */ --- 23,30 ---- */ #include "pg_backup_archiver.h" #include "dumputils.h" + #include "common/fe_memutils.h" #include <unistd.h> /* for dup */ *** a/src/bin/pg_dump/pg_backup_tar.c --- b/src/bin/pg_dump/pg_backup_tar.c *************** *** 31,38 **** #include "pg_backup.h" #include "pg_backup_archiver.h" #include "pg_backup_tar.h" - #include "dumpmem.h" #include "dumputils.h" #include "pgtar.h" #include <sys/stat.h> --- 31,38 ---- #include "pg_backup.h" #include "pg_backup_archiver.h" #include "pg_backup_tar.h" #include "dumputils.h" + #include "common/fe_memutils.h" #include "pgtar.h" #include <sys/stat.h> *** a/src/bin/pg_dump/pg_dump.c --- b/src/bin/pg_dump/pg_dump.c *************** *** 41,46 **** --- 41,47 ---- #include <termios.h> #endif + #include "common/fe_memutils.h" #include "getopt_long.h" #include "access/attnum.h" *************** *** 59,65 **** #include "pg_backup_archiver.h" #include "pg_backup_db.h" - #include "dumpmem.h" #include "dumputils.h" extern char *optarg; --- 60,65 ---- *** 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,21 ---- */ #include "pg_backup_archiver.h" #include "dumputils.h" ! #include "common/fe_memutils.h" /* translator: this is a module name */ static const char *modulename = gettext_noop("sorter"); *** 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,31 ---- #include "getopt_long.h" #include "dumputils.h" ! #include "common/fe_memutils.h" #include "pg_backup.h" /* version string we expect back from pg_dump */ *** a/src/bin/pg_dump/pg_restore.c --- b/src/bin/pg_dump/pg_restore.c *************** *** 41,48 **** #include "pg_backup_archiver.h" - #include "dumpmem.h" #include "dumputils.h" #include <ctype.h> --- 41,48 ---- #include "pg_backup_archiver.h" #include "dumputils.h" + #include "common/fe_memutils.h" #include <ctype.h> *** 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; *************** *** 417,423 **** 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) --- 418,424 ---- } /* 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) *************** *** 937,943 **** WriteEmptyXLOG(void) int nbytes; /* Use malloc() to ensure buffer is MAXALIGNED */ ! buffer = (char *) malloc(XLOG_BLCKSZ); page = (XLogPageHeader) buffer; memset(buffer, 0, XLOG_BLCKSZ); --- 938,944 ---- 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/command.c --- b/src/bin/psql/command.c *************** *** 33,38 **** --- 33,39 ---- #include <openssl/ssl.h> #endif + #include "common/fe_memutils.h" #include "portability/instr_time.h" #include "libpq-fe.h" *** a/src/bin/psql/common.c --- b/src/bin/psql/common.c *************** *** 17,22 **** --- 17,23 ---- #include <win32.h> #endif + #include "common/fe_memutils.h" #include "portability/instr_time.h" #include "pqsignal.h" *************** *** 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 * --- 34,39 ---- *** 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/psql/copy.c --- b/src/bin/psql/copy.c *************** *** 16,21 **** --- 16,23 ---- #include <io.h> /* I think */ #endif + #include "common/fe_memutils.h" + #include "libpq-fe.h" #include "pqexpbuffer.h" #include "pqsignal.h" *** a/src/bin/psql/describe.c --- b/src/bin/psql/describe.c *************** *** 14,19 **** --- 14,21 ---- #include <ctype.h> + #include "common/fe_memutils.h" + #include "catalog/pg_default_acl.h" #include "common.h" *** a/src/bin/psql/input.c --- b/src/bin/psql/input.c *************** *** 12,17 **** --- 12,19 ---- #endif #include <fcntl.h> + #include "common/fe_memutils.h" + #include "input.h" #include "settings.h" #include "tab-complete.h" *** a/src/bin/psql/mainloop.c --- b/src/bin/psql/mainloop.c *************** *** 8,13 **** --- 8,14 ---- #include "postgres_fe.h" #include "mainloop.h" + #include "common/fe_memutils.h" #include "command.h" #include "common.h" *** a/src/bin/psql/print.c --- b/src/bin/psql/print.c *************** *** 22,27 **** --- 22,29 ---- #include <locale.h> + #include "common/fe_memutils.h" + #include "catalog/pg_type.h" #include "pqsignal.h" *** a/src/bin/psql/prompt.c --- b/src/bin/psql/prompt.c *************** *** 17,22 **** --- 17,24 ---- #include <netdb.h> #endif + #include "common/fe_memutils.h" + #include "common.h" #include "input.h" #include "prompt.h" *** a/src/bin/psql/startup.c --- b/src/bin/psql/startup.c *************** *** 16,21 **** --- 16,22 ---- #include <win32.h> #endif /* WIN32 */ + #include "common/fe_memutils.h" #include "getopt_long.h" #include <locale.h> *** a/src/bin/psql/stringutils.c --- b/src/bin/psql/stringutils.c *************** *** 9,14 **** --- 9,16 ---- #include <ctype.h> + #include "common/fe_memutils.h" + #include "common.h" #include "stringutils.h" *** a/src/bin/psql/tab-complete.c --- b/src/bin/psql/tab-complete.c *************** *** 45,50 **** --- 45,52 ---- #include "tab-complete.h" #include "input.h" + #include "common/fe_memutils.h" + /* If we don't have this, we might as well forget about the whole thing: */ #ifdef USE_READLINE *** a/src/bin/psql/variables.c --- b/src/bin/psql/variables.c *************** *** 7,12 **** --- 7,14 ---- */ #include "postgres_fe.h" + #include "common/fe_memutils.h" + #include "common.h" #include "variables.h" *** 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 *************** *** 12,17 **** --- 12,18 ---- #include "libpq-fe.h" #include "getopt_long.h" /* pgrminclude ignore */ #include "pqexpbuffer.h" /* pgrminclude ignore */ + #include "common/fe_memutils.h" enum trivalue { *************** *** 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 */ --- 51,54 ---- *** /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,131 ---- + /*------------------------------------------------------------------------- + * + * 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" + + #include "common/fe_memutils.h" + #include "utils/palloc.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,28 ---- + /* + * 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); + + #ifdef FRONTEND_PALLOC_EMULATION + #ifndef FRONTEND + #error FRONTEND must be defined for FRONTEND_PALLOC_EMULATION + #endif /* !FRONTEND */ + + #include "utils/palloc.h" + + #endif + + + #endif /* FE_MEMUTILS_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 *************** *** 19,24 **** --- 19,25 ---- #include "postgres.h" #else #include "postgres_fe.h" + #include "utils/palloc.h" #endif /* Don't modify declarations in system headers */ *************** *** 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__) /* --- 41,46 ---- *** a/src/tools/msvc/Mkvcbuild.pm --- b/src/tools/msvc/Mkvcbuild.pm *************** *** 63,71 **** sub mkvcbuild --- 63,74 ---- sprompt.c tar.c thread.c getopt.c getopt_long.c dirent.c rint.c win32env.c win32error.c win32setlocale.c); + our @pgportfrontend = qw(palloc.c); + $libpgport = $solution->AddProject('libpgport', 'lib', 'misc'); $libpgport->AddDefine('FRONTEND'); $libpgport->AddFiles('src\port', @pgportfiles); + $libpgport->AddFiles('src\port', @pgportfrontend); $postgres = $solution->AddProject('postgres', 'exe', '', 'src\backend'); $postgres->AddIncludeDir('src\backend'); *************** *** 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'); --- 396,401 ----
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers