1 /*-------------------------------------------------------------------------
2 *
3 * fe_memutils.c
4 * memory management support for frontend code
5 *
6 * Portions Copyright (c) 1996-2013, 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 POOL_PRIVATE
17 #error "This file is not expected to be compiled for pgpool utilities only"
18 #endif
19
20 #include <stdlib.h>
21 #include <string.h>
22 #include <stdio.h>
23 #include "utils/fe_ports.h"
24
25 void *
pg_malloc(size_t size)26 pg_malloc(size_t size)
27 {
28 void *tmp;
29
30 /* Avoid unportable behavior of malloc(0) */
31 if (size == 0)
32 size = 1;
33 tmp = malloc(size);
34 if (!tmp)
35 {
36 fprintf(stderr, "out of memory\n");
37 exit(EXIT_FAILURE);
38 }
39 return tmp;
40 }
41
42 void *
pg_malloc0(size_t size)43 pg_malloc0(size_t size)
44 {
45 void *tmp;
46
47 tmp = pg_malloc(size);
48 memset(tmp, 0, size);
49 return tmp;
50 }
51
52 void *
pg_realloc(void * ptr,size_t size)53 pg_realloc(void *ptr, size_t size)
54 {
55 void *tmp;
56
57 /* Avoid unportable behavior of realloc(NULL, 0) */
58 if (ptr == NULL && size == 0)
59 size = 1;
60 tmp = realloc(ptr, size);
61 if (!tmp)
62 {
63 fprintf(stderr, "out of memory\n");
64 exit(EXIT_FAILURE);
65 }
66 return tmp;
67 }
68
69 /*
70 * "Safe" wrapper around strdup().
71 */
72 char *
pg_strdup(const char * in)73 pg_strdup(const char *in)
74 {
75 char *tmp;
76
77 if (!in)
78 {
79 fprintf(stderr,
80 "cannot duplicate null pointer (internal error)\n");
81 exit(EXIT_FAILURE);
82 }
83 tmp = strdup(in);
84 if (!tmp)
85 {
86 fprintf(stderr, "out of memory\n");
87 exit(EXIT_FAILURE);
88 }
89 return tmp;
90 }
91
92 void
pg_free(void * ptr)93 pg_free(void *ptr)
94 {
95 if (ptr != NULL)
96 free(ptr);
97 }
98
99 /*
100 * Frontend emulation of backend memory management functions. Useful for
101 * programs that compile backend files.
102 */
103 void *
palloc(unsigned int size)104 palloc(unsigned int size)
105 {
106 return pg_malloc(size);
107 }
108
109 void *
palloc0(unsigned int size)110 palloc0(unsigned int size)
111 {
112 return pg_malloc0(size);
113 }
114
115 void
pfree(void * pointer)116 pfree(void *pointer)
117 {
118 pg_free(pointer);
119 }
120
121 char *
pstrdup(const char * in)122 pstrdup(const char *in)
123 {
124 return pg_strdup(in);
125 }
126
127 void *
repalloc(void * pointer,unsigned int size)128 repalloc(void *pointer, unsigned int size)
129 {
130 return pg_realloc(pointer, size);
131 }
132