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