Age Owner Branch data TLA 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 *
3809 fujii@postgresql.org 23 :CBC 3866460 : pg_malloc_internal(size_t size, int flags)
24 : : {
25 : : void *tmp;
26 : :
27 : : /* Avoid unportable behavior of malloc(0) */
4589 alvherre@alvh.no-ip. 28 [ + + ]: 3866460 : if (size == 0)
29 : 3398 : size = 1;
30 : 3866460 : tmp = malloc(size);
3809 fujii@postgresql.org 31 [ - + ]: 3866460 : if (tmp == NULL)
32 : : {
3809 fujii@postgresql.org 33 [ # # ]:UBC 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 : :
3809 fujii@postgresql.org 41 [ + + ]:CBC 3866460 : if ((flags & MCXT_ALLOC_ZERO) != 0)
42 [ + - + + : 5280332 : MemSet(tmp, 0, size);
+ - + + +
+ ]
4589 alvherre@alvh.no-ip. 43 : 3866460 : return tmp;
44 : : }
45 : :
46 : : void *
3809 fujii@postgresql.org 47 : 1773197 : pg_malloc(size_t size)
48 : : {
49 : 1773197 : return pg_malloc_internal(size, 0);
50 : : }
51 : :
52 : : void *
4589 alvherre@alvh.no-ip. 53 : 1229129 : pg_malloc0(size_t size)
54 : : {
3809 fujii@postgresql.org 55 : 1229129 : return pg_malloc_internal(size, MCXT_ALLOC_ZERO);
56 : : }
57 : :
58 : : void *
59 : 59746 : pg_malloc_extended(size_t size, int flags)
60 : : {
61 : 59746 : return pg_malloc_internal(size, flags);
62 : : }
63 : :
64 : : void *
4589 alvherre@alvh.no-ip. 65 : 93177 : pg_realloc(void *ptr, size_t size)
66 : : {
67 : : void *tmp;
68 : :
69 : : /* Avoid unportable behavior of realloc(NULL, 0) */
4483 bruce@momjian.us 70 [ + + - + ]: 93177 : if (ptr == NULL && size == 0)
4483 bruce@momjian.us 71 :UBC 0 : size = 1;
4483 bruce@momjian.us 72 :CBC 93177 : tmp = realloc(ptr, size);
73 [ - + ]: 93177 : if (!tmp)
74 : : {
4589 alvherre@alvh.no-ip. 75 :UBC 0 : fprintf(stderr, _("out of memory\n"));
76 : 0 : exit(EXIT_FAILURE);
77 : : }
4483 bruce@momjian.us 78 :CBC 93177 : return tmp;
79 : : }
80 : :
81 : : /*
82 : : * "Safe" wrapper around strdup().
83 : : */
84 : : char *
4589 alvherre@alvh.no-ip. 85 : 6911379 : pg_strdup(const char *in)
86 : : {
87 : : char *tmp;
88 : :
89 [ - + ]: 6911379 : if (!in)
90 : : {
4589 alvherre@alvh.no-ip. 91 :UBC 0 : fprintf(stderr,
92 : 0 : _("cannot duplicate null pointer (internal error)\n"));
93 : 0 : exit(EXIT_FAILURE);
94 : : }
4589 alvherre@alvh.no-ip. 95 :CBC 6911379 : tmp = strdup(in);
96 [ - + ]: 6911379 : if (!tmp)
97 : : {
4589 alvherre@alvh.no-ip. 98 :UBC 0 : fprintf(stderr, _("out of memory\n"));
99 : 0 : exit(EXIT_FAILURE);
100 : : }
4589 alvherre@alvh.no-ip. 101 :CBC 6911379 : return tmp;
102 : : }
103 : :
104 : : void
105 : 4292907 : pg_free(void *ptr)
106 : : {
1178 peter@eisentraut.org 107 : 4292907 : free(ptr);
4589 alvherre@alvh.no-ip. 108 : 4292907 : }
109 : :
110 : : /*
111 : : * Frontend emulation of backend memory management functions. Useful for
112 : : * programs that compile backend files.
113 : : */
114 : : void *
115 : 801107 : palloc(Size size)
116 : : {
3809 fujii@postgresql.org 117 : 801107 : return pg_malloc_internal(size, 0);
118 : : }
119 : :
120 : : void *
4589 alvherre@alvh.no-ip. 121 : 2954 : palloc0(Size size)
122 : : {
3809 fujii@postgresql.org 123 : 2954 : return pg_malloc_internal(size, MCXT_ALLOC_ZERO);
124 : : }
125 : :
126 : : void *
127 : 327 : palloc_extended(Size size, int flags)
128 : : {
129 : 327 : return pg_malloc_internal(size, flags);
130 : : }
131 : :
132 : : void
4589 alvherre@alvh.no-ip. 133 : 2328593 : pfree(void *pointer)
134 : : {
135 : 2328593 : pg_free(pointer);
136 : 2328593 : }
137 : :
138 : : char *
139 : 1210589 : pstrdup(const char *in)
140 : : {
141 : 1210589 : return pg_strdup(in);
142 : : }
143 : :
144 : : char *
2103 145 : 147 : pnstrdup(const char *in, Size size)
146 : : {
147 : : char *tmp;
148 : : int len;
149 : :
150 [ - + ]: 147 : if (!in)
151 : : {
2103 alvherre@alvh.no-ip. 152 :UBC 0 : fprintf(stderr,
153 : 0 : _("cannot duplicate null pointer (internal error)\n"));
154 : 0 : exit(EXIT_FAILURE);
155 : : }
156 : :
2103 alvherre@alvh.no-ip. 157 :CBC 147 : len = strnlen(in, size);
158 : 147 : tmp = malloc(len + 1);
159 [ - + ]: 147 : if (tmp == NULL)
160 : : {
2103 alvherre@alvh.no-ip. 161 :UBC 0 : fprintf(stderr, _("out of memory\n"));
162 : 0 : exit(EXIT_FAILURE);
163 : : }
164 : :
2103 alvherre@alvh.no-ip. 165 :CBC 147 : memcpy(tmp, in, len);
166 : 147 : tmp[len] = '\0';
167 : :
168 : 147 : return tmp;
169 : : }
170 : :
171 : : void *
4589 172 : 58188 : repalloc(void *pointer, Size size)
173 : : {
174 : 58188 : return pg_realloc(pointer, size);
175 : : }
|