PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
fe_memutils.c
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * fe_memutils.c
4  * memory management support for frontend code
5  *
6  * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  *
10  * IDENTIFICATION
11  * src/common/fe_memutils.c
12  *
13  *-------------------------------------------------------------------------
14  */
15 
16 #ifndef FRONTEND
17 #error "This file is not expected to be compiled for backend code"
18 #endif
19 
20 #include "postgres_fe.h"
21 
22 static inline void *
23 pg_malloc_internal(size_t size, int flags)
24 {
25  void *tmp;
26 
27  /* Avoid unportable behavior of malloc(0) */
28  if (size == 0)
29  size = 1;
30  tmp = malloc(size);
31  if (tmp == NULL)
32  {
33  if ((flags & MCXT_ALLOC_NO_OOM) == 0)
34  {
35  fprintf(stderr, _("out of memory\n"));
36  exit(EXIT_FAILURE);
37  }
38  return NULL;
39  }
40 
41  if ((flags & MCXT_ALLOC_ZERO) != 0)
42  MemSet(tmp, 0, size);
43  return tmp;
44 }
45 
46 void *
47 pg_malloc(size_t size)
48 {
49  return pg_malloc_internal(size, 0);
50 }
51 
52 void *
53 pg_malloc0(size_t size)
54 {
55  return pg_malloc_internal(size, MCXT_ALLOC_ZERO);
56 }
57 
58 void *
59 pg_malloc_extended(size_t size, int flags)
60 {
61  return pg_malloc_internal(size, flags);
62 }
63 
64 void *
65 pg_realloc(void *ptr, size_t size)
66 {
67  void *tmp;
68 
69  /* Avoid unportable behavior of realloc(NULL, 0) */
70  if (ptr == NULL && size == 0)
71  size = 1;
72  tmp = realloc(ptr, size);
73  if (!tmp)
74  {
75  fprintf(stderr, _("out of memory\n"));
76  exit(EXIT_FAILURE);
77  }
78  return tmp;
79 }
80 
81 /*
82  * "Safe" wrapper around strdup().
83  */
84 char *
85 pg_strdup(const char *in)
86 {
87  char *tmp;
88 
89  if (!in)
90  {
91  fprintf(stderr,
92  _("cannot duplicate null pointer (internal error)\n"));
93  exit(EXIT_FAILURE);
94  }
95  tmp = strdup(in);
96  if (!tmp)
97  {
98  fprintf(stderr, _("out of memory\n"));
99  exit(EXIT_FAILURE);
100  }
101  return tmp;
102 }
103 
104 void
105 pg_free(void *ptr)
106 {
107  if (ptr != NULL)
108  free(ptr);
109 }
110 
111 /*
112  * Frontend emulation of backend memory management functions. Useful for
113  * programs that compile backend files.
114  */
115 void *
117 {
118  return pg_malloc_internal(size, 0);
119 }
120 
121 void *
123 {
124  return pg_malloc_internal(size, MCXT_ALLOC_ZERO);
125 }
126 
127 void *
128 palloc_extended(Size size, int flags)
129 {
130  return pg_malloc_internal(size, flags);
131 }
132 
133 void
134 pfree(void *pointer)
135 {
136  pg_free(pointer);
137 }
138 
139 char *
140 pstrdup(const char *in)
141 {
142  return pg_strdup(in);
143 }
144 
145 void *
146 repalloc(void *pointer, Size size)
147 {
148  return pg_realloc(pointer, size);
149 }
void * pg_malloc(size_t size)
Definition: fe_memutils.c:47
#define MCXT_ALLOC_NO_OOM
Definition: fe_memutils.h:18
#define MemSet(start, val, len)
Definition: c.h:857
static void * pg_malloc_internal(size_t size, int flags)
Definition: fe_memutils.c:23
char * pstrdup(const char *in)
Definition: fe_memutils.c:140
#define malloc(a)
Definition: header.h:50
void * pg_malloc0(size_t size)
Definition: fe_memutils.c:53
char * pg_strdup(const char *in)
Definition: fe_memutils.c:85
void * pg_malloc_extended(size_t size, int flags)
Definition: fe_memutils.c:59
void * pg_realloc(void *ptr, size_t size)
Definition: fe_memutils.c:65
#define free(a)
Definition: header.h:65
void * palloc(Size size)
Definition: fe_memutils.c:116
#define NULL
Definition: c.h:229
void * palloc0(Size size)
Definition: fe_memutils.c:122
#define MCXT_ALLOC_ZERO
Definition: fe_memutils.h:19
void pfree(void *pointer)
Definition: fe_memutils.c:134
size_t Size
Definition: c.h:356
void pg_free(void *ptr)
Definition: fe_memutils.c:105
#define realloc(a, b)
Definition: header.h:60
void * palloc_extended(Size size, int flags)
Definition: fe_memutils.c:128
#define EXIT_FAILURE
Definition: settings.h:151
void * repalloc(void *pointer, Size size)
Definition: fe_memutils.c:146
#define _(x)
Definition: elog.c:84