Age Owner Branch data TLA Line data Source code
1 : : /* src/interfaces/ecpg/ecpglib/memory.c */
2 : :
3 : : #define POSTGRES_ECPG_INTERNAL
4 : : #include "postgres_fe.h"
5 : :
6 : : #include "ecpg-pthread-win32.h"
7 : : #include "ecpgerrno.h"
8 : : #include "ecpglib.h"
9 : : #include "ecpglib_extern.h"
10 : : #include "ecpgtype.h"
11 : :
12 : : void
6038 meskes@postgresql.or 13 :CBC 1631129 : ecpg_free(void *ptr)
14 : : {
7700 15 : 1631129 : free(ptr);
16 : 1631129 : }
17 : :
18 : : char *
6038 19 : 1616637 : ecpg_alloc(long size, int lineno)
20 : : {
7700 21 : 1616637 : char *new = (char *) calloc(1L, size);
22 : :
23 [ - + ]: 1616637 : if (!new)
24 : : {
6038 meskes@postgresql.or 25 :UBC 0 : ecpg_raise(lineno, ECPG_OUT_OF_MEMORY, ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY, NULL);
7700 26 : 0 : return NULL;
27 : : }
28 : :
2432 peter_e@gmx.net 29 :CBC 1616637 : return new;
30 : : }
31 : :
32 : : char *
6038 meskes@postgresql.or 33 : 5325 : ecpg_realloc(void *ptr, long size, int lineno)
34 : : {
7700 35 : 5325 : char *new = (char *) realloc(ptr, size);
36 : :
37 [ - + ]: 5325 : if (!new)
38 : : {
6038 meskes@postgresql.or 39 :UBC 0 : ecpg_raise(lineno, ECPG_OUT_OF_MEMORY, ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY, NULL);
7700 40 : 0 : return NULL;
41 : : }
42 : :
2432 peter_e@gmx.net 43 :CBC 5325 : return new;
44 : : }
45 : :
46 : : char *
6038 meskes@postgresql.or 47 : 5621 : ecpg_strdup(const char *string, int lineno)
48 : : {
49 : : char *new;
50 : :
7045 51 [ - + ]: 5621 : if (string == NULL)
7045 meskes@postgresql.or 52 :UBC 0 : return NULL;
53 : :
7045 meskes@postgresql.or 54 :CBC 5621 : new = strdup(string);
7700 55 [ - + ]: 5621 : if (!new)
56 : : {
6038 meskes@postgresql.or 57 :UBC 0 : ecpg_raise(lineno, ECPG_OUT_OF_MEMORY, ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY, NULL);
7700 58 : 0 : return NULL;
59 : : }
60 : :
2432 peter_e@gmx.net 61 :CBC 5621 : return new;
62 : : }
63 : :
64 : : /* keep a list of memory we allocated for the user */
65 : : struct auto_mem
66 : : {
67 : : void *pointer;
68 : : struct auto_mem *next;
69 : : };
70 : :
71 : : static pthread_key_t auto_mem_key;
72 : : static pthread_once_t auto_mem_once = PTHREAD_ONCE_INIT;
73 : :
74 : : static void
6041 meskes@postgresql.or 75 : 16 : auto_mem_destructor(void *arg)
76 : : {
77 : : (void) arg; /* keep the compiler quiet */
78 : 16 : ECPGfree_auto_mem();
79 : 16 : }
80 : :
81 : : static void
82 : 57 : auto_mem_key_init(void)
83 : : {
84 : 57 : pthread_key_create(&auto_mem_key, auto_mem_destructor);
85 : 57 : }
86 : :
87 : : static struct auto_mem *
88 : 3696 : get_auto_allocs(void)
89 : : {
90 : 3696 : pthread_once(&auto_mem_once, auto_mem_key_init);
91 : 3696 : return (struct auto_mem *) pthread_getspecific(auto_mem_key);
92 : : }
93 : :
94 : : static void
2489 tgl@sss.pgh.pa.us 95 : 1630 : set_auto_allocs(struct auto_mem *am)
96 : : {
6041 meskes@postgresql.or 97 : 1630 : pthread_setspecific(auto_mem_key, am);
98 : 1630 : }
99 : :
100 : : char *
3356 101 : 836 : ecpg_auto_alloc(long size, int lineno)
102 : : {
3249 bruce@momjian.us 103 : 836 : void *ptr = (void *) ecpg_alloc(size, lineno);
104 : :
3356 meskes@postgresql.or 105 [ - + ]: 836 : if (!ptr)
3356 meskes@postgresql.or 106 :UBC 0 : return NULL;
107 : :
3356 meskes@postgresql.or 108 [ - + ]:CBC 836 : if (!ecpg_add_mem(ptr, lineno))
109 : : {
3356 meskes@postgresql.or 110 :UBC 0 : ecpg_free(ptr);
111 : 0 : return NULL;
112 : : }
3356 meskes@postgresql.or 113 :CBC 836 : return ptr;
114 : : }
115 : :
116 : : bool
6038 117 : 836 : ecpg_add_mem(void *ptr, int lineno)
118 : : {
119 : 836 : struct auto_mem *am = (struct auto_mem *) ecpg_alloc(sizeof(struct auto_mem), lineno);
120 : :
3356 121 [ - + ]: 836 : if (!am)
3356 meskes@postgresql.or 122 :UBC 0 : return false;
123 : :
7700 meskes@postgresql.or 124 :CBC 836 : am->pointer = ptr;
6041 125 : 836 : am->next = get_auto_allocs();
126 : 836 : set_auto_allocs(am);
3356 127 : 836 : return true;
128 : : }
129 : :
130 : : void
7700 131 : 78 : ECPGfree_auto_mem(void)
132 : : {
6041 133 : 78 : struct auto_mem *am = get_auto_allocs();
134 : :
135 : : /* free all memory we have allocated for the user */
136 [ + + ]: 78 : if (am)
137 : : {
138 : : do
139 : : {
140 : 20 : struct auto_mem *act = am;
141 : :
142 : 20 : am = am->next;
6038 143 : 20 : ecpg_free(act->pointer);
144 : 20 : ecpg_free(act);
5995 bruce@momjian.us 145 [ + + ]: 20 : } while (am);
6041 meskes@postgresql.or 146 : 2 : set_auto_allocs(NULL);
147 : : }
7700 148 : 78 : }
149 : :
150 : : void
6038 151 : 2782 : ecpg_clear_auto_mem(void)
152 : : {
6041 153 : 2782 : struct auto_mem *am = get_auto_allocs();
154 : :
155 : : /* only free our own structure */
156 [ + + ]: 2782 : if (am)
157 : : {
158 : : do
159 : : {
160 : 797 : struct auto_mem *act = am;
161 : :
162 : 797 : am = am->next;
6038 163 : 797 : ecpg_free(act);
5995 bruce@momjian.us 164 [ + + ]: 797 : } while (am);
6041 meskes@postgresql.or 165 : 792 : set_auto_allocs(NULL);
166 : : }
7700 167 : 2782 : }
|