PostgreSQL Source Code  git master
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-2022, 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"));
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"));
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"));
94  }
95  tmp = strdup(in);
96  if (!tmp)
97  {
98  fprintf(stderr, _("out of memory\n"));
100  }
101  return tmp;
102 }
103 
104 void
105 pg_free(void *ptr)
106 {
107  free(ptr);
108 }
109 
110 /*
111  * Frontend emulation of backend memory management functions. Useful for
112  * programs that compile backend files.
113  */
114 void *
116 {
117  return pg_malloc_internal(size, 0);
118 }
119 
120 void *
122 {
123  return pg_malloc_internal(size, MCXT_ALLOC_ZERO);
124 }
125 
126 void *
127 palloc_extended(Size size, int flags)
128 {
129  return pg_malloc_internal(size, flags);
130 }
131 
132 void
133 pfree(void *pointer)
134 {
135  pg_free(pointer);
136 }
137 
138 char *
139 pstrdup(const char *in)
140 {
141  return pg_strdup(in);
142 }
143 
144 char *
145 pnstrdup(const char *in, Size size)
146 {
147  char *tmp;
148  int len;
149 
150  if (!in)
151  {
152  fprintf(stderr,
153  _("cannot duplicate null pointer (internal error)\n"));
155  }
156 
157  len = strnlen(in, size);
158  tmp = malloc(len + 1);
159  if (tmp == NULL)
160  {
161  fprintf(stderr, _("out of memory\n"));
163  }
164 
165  memcpy(tmp, in, len);
166  tmp[len] = '\0';
167 
168  return tmp;
169 }
170 
171 void *
172 repalloc(void *pointer, Size size)
173 {
174  return pg_realloc(pointer, size);
175 }
#define MemSet(start, val, len)
Definition: c.h:1019
size_t Size
Definition: c.h:551
#define _(x)
Definition: elog.c:89
void * pg_realloc(void *ptr, size_t size)
Definition: fe_memutils.c:65
static void * pg_malloc_internal(size_t size, int flags)
Definition: fe_memutils.c:23
char * pstrdup(const char *in)
Definition: fe_memutils.c:139
void pfree(void *pointer)
Definition: fe_memutils.c:133
void * palloc0(Size size)
Definition: fe_memutils.c:121
void * repalloc(void *pointer, Size size)
Definition: fe_memutils.c:172
void * pg_malloc0(size_t size)
Definition: fe_memutils.c:53
void * palloc_extended(Size size, int flags)
Definition: fe_memutils.c:127
void * pg_malloc_extended(size_t size, int flags)
Definition: fe_memutils.c:59
char * pg_strdup(const char *in)
Definition: fe_memutils.c:85
char * pnstrdup(const char *in, Size size)
Definition: fe_memutils.c:145
void pg_free(void *ptr)
Definition: fe_memutils.c:105
void * pg_malloc(size_t size)
Definition: fe_memutils.c:47
void * palloc(Size size)
Definition: fe_memutils.c:115
#define MCXT_ALLOC_ZERO
Definition: fe_memutils.h:18
#define MCXT_ALLOC_NO_OOM
Definition: fe_memutils.h:17
#define realloc(a, b)
Definition: header.h:60
#define free(a)
Definition: header.h:65
#define malloc(a)
Definition: header.h:50
exit(1)
const void size_t len
#define fprintf
Definition: port.h:229
size_t strnlen(const char *str, size_t maxlen)
Definition: strnlen.c:26
#define EXIT_FAILURE
Definition: settings.h:163