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