Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * fe_memutils.c
4 : * memory management support for frontend code
5 : *
6 : * Portions Copyright (c) 1996-2025, 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 7564734 : pg_malloc_internal(size_t size, int flags)
24 : {
25 : void *tmp;
26 :
27 : /* Avoid unportable behavior of malloc(0) */
28 7564734 : if (size == 0)
29 6520 : size = 1;
30 7564734 : tmp = malloc(size);
31 7564734 : if (tmp == NULL)
32 : {
33 0 : if ((flags & MCXT_ALLOC_NO_OOM) == 0)
34 : {
35 0 : fprintf(stderr, _("out of memory\n"));
36 0 : exit(EXIT_FAILURE);
37 : }
38 0 : return NULL;
39 : }
40 :
41 7564734 : if ((flags & MCXT_ALLOC_ZERO) != 0)
42 10000964 : MemSet(tmp, 0, size);
43 7564734 : return tmp;
44 : }
45 :
46 : void *
47 3525760 : pg_malloc(size_t size)
48 : {
49 3525760 : return pg_malloc_internal(size, 0);
50 : }
51 :
52 : void *
53 2423672 : pg_malloc0(size_t size)
54 : {
55 2423672 : return pg_malloc_internal(size, MCXT_ALLOC_ZERO);
56 : }
57 :
58 : void *
59 249964 : pg_malloc_extended(size_t size, int flags)
60 : {
61 249964 : return pg_malloc_internal(size, flags);
62 : }
63 :
64 : void *
65 186902 : pg_realloc(void *ptr, size_t size)
66 : {
67 : void *tmp;
68 :
69 : /* Avoid unportable behavior of realloc(NULL, 0) */
70 186902 : if (ptr == NULL && size == 0)
71 0 : size = 1;
72 186902 : tmp = realloc(ptr, size);
73 186902 : if (!tmp)
74 : {
75 0 : fprintf(stderr, _("out of memory\n"));
76 0 : exit(EXIT_FAILURE);
77 : }
78 186902 : return tmp;
79 : }
80 :
81 : /*
82 : * "Safe" wrapper around strdup().
83 : */
84 : char *
85 13144626 : pg_strdup(const char *in)
86 : {
87 : char *tmp;
88 :
89 13144626 : if (!in)
90 : {
91 0 : fprintf(stderr,
92 0 : _("cannot duplicate null pointer (internal error)\n"));
93 0 : exit(EXIT_FAILURE);
94 : }
95 13144626 : tmp = strdup(in);
96 13144626 : if (!tmp)
97 : {
98 0 : fprintf(stderr, _("out of memory\n"));
99 0 : exit(EXIT_FAILURE);
100 : }
101 13144626 : return tmp;
102 : }
103 :
104 : void
105 8172056 : pg_free(void *ptr)
106 : {
107 8172056 : free(ptr);
108 8172056 : }
109 :
110 : /*
111 : * Frontend emulation of backend memory management functions. Useful for
112 : * programs that compile backend files.
113 : */
114 : void *
115 1358918 : palloc(Size size)
116 : {
117 1358918 : return pg_malloc_internal(size, 0);
118 : }
119 :
120 : void *
121 5778 : palloc0(Size size)
122 : {
123 5778 : return pg_malloc_internal(size, MCXT_ALLOC_ZERO);
124 : }
125 :
126 : void *
127 642 : palloc_extended(Size size, int flags)
128 : {
129 642 : return pg_malloc_internal(size, flags);
130 : }
131 :
132 : void
133 4296326 : pfree(void *pointer)
134 : {
135 4296326 : pg_free(pointer);
136 4296326 : }
137 :
138 : char *
139 2268192 : pstrdup(const char *in)
140 : {
141 2268192 : return pg_strdup(in);
142 : }
143 :
144 : char *
145 288 : pnstrdup(const char *in, Size size)
146 : {
147 : char *tmp;
148 : int len;
149 :
150 288 : if (!in)
151 : {
152 0 : fprintf(stderr,
153 0 : _("cannot duplicate null pointer (internal error)\n"));
154 0 : exit(EXIT_FAILURE);
155 : }
156 :
157 288 : len = strnlen(in, size);
158 288 : tmp = malloc(len + 1);
159 288 : if (tmp == NULL)
160 : {
161 0 : fprintf(stderr, _("out of memory\n"));
162 0 : exit(EXIT_FAILURE);
163 : }
164 :
165 288 : memcpy(tmp, in, len);
166 288 : tmp[len] = '\0';
167 :
168 288 : return tmp;
169 : }
170 :
171 : void *
172 116332 : repalloc(void *pointer, Size size)
173 : {
174 116332 : return pg_realloc(pointer, size);
175 : }
|