summaryrefslogtreecommitdiffabout
path: root/libical
Unidiff
Diffstat (limited to 'libical') (more/less context) (ignore whitespace changes)
-rw-r--r--libical/src/libical/icalmemory.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/libical/src/libical/icalmemory.c b/libical/src/libical/icalmemory.c
index 058ef37..18d7ef9 100644
--- a/libical/src/libical/icalmemory.c
+++ b/libical/src/libical/icalmemory.c
@@ -24,98 +24,98 @@
24 2.1, available at: http://www.fsf.org/copyleft/lesser.html 24 2.1, available at: http://www.fsf.org/copyleft/lesser.html
25 25
26 Or: 26 Or:
27 27
28 The Mozilla Public License Version 1.0. You may obtain a copy of 28 The Mozilla Public License Version 1.0. You may obtain a copy of
29 the License at http://www.mozilla.org/MPL/ 29 the License at http://www.mozilla.org/MPL/
30 30
31 The Original Code is icalmemory.h 31 The Original Code is icalmemory.h
32 32
33 ======================================================================*/ 33 ======================================================================*/
34 34
35/** 35/**
36 * @file icalmemory.c 36 * @file icalmemory.c
37 * @brief Common memory management routines. 37 * @brief Common memory management routines.
38 * 38 *
39 * libical often passes strings back to the caller. To make these 39 * libical often passes strings back to the caller. To make these
40 * interfaces simple, I did not want the caller to have to pass in a 40 * interfaces simple, I did not want the caller to have to pass in a
41 * memory buffer, but having libical pass out newly allocated memory 41 * memory buffer, but having libical pass out newly allocated memory
42 * makes it difficult to de-allocate the memory. 42 * makes it difficult to de-allocate the memory.
43 * 43 *
44 * The ring buffer in this scheme makes it possible for libical to pass 44 * The ring buffer in this scheme makes it possible for libical to pass
45 * out references to memory which the caller does not own, and be able 45 * out references to memory which the caller does not own, and be able
46 * to de-allocate the memory later. The ring allows libical to have 46 * to de-allocate the memory later. The ring allows libical to have
47 * several buffers active simultaneously, which is handy when creating 47 * several buffers active simultaneously, which is handy when creating
48 * string representations of components. 48 * string representations of components.
49 */ 49 */
50 50
51#define ICALMEMORY_C 51#define ICALMEMORY_C
52 52
53#ifdef HAVE_CONFIG_H 53#ifdef HAVE_CONFIG_H
54#include "config.h" 54#include "config.h"
55#endif 55#endif
56 56
57#ifdef DMALLOC 57#ifdef DMALLOC
58#include "dmalloc.h" 58#include "dmalloc.h"
59#endif 59#endif
60 60
61#include "icalmemory.h" 61#include "icalmemory.h"
62#include "icalerror.h" 62#include "icalerror.h"
63 63
64#include <stdio.h> /* for printf (debugging) */ 64#include <stdio.h> /* for printf (debugging) */
65#include <stdlib.h> /* for malloc, realloc */ 65#include <stdlib.h> /* for malloc, realloc */
66#include <string.h> /* for memset(), strdup */ 66#include <string.h> /* for memset(), strdup */
67 67
68#ifdef WIN32 68#ifdef WIN32
69#include <windows.h> 69#include <windows.h>
70#endif 70#endif
71 71
72#define BUFFER_RING_SIZE 2500 72#define BUFFER_RING_SIZE 50
73#define MIN_BUFFER_SIZE 200 73#define MIN_BUFFER_SIZE 64
74 74
75 75
76/* HACK. Not threadsafe */ 76/* HACK. Not threadsafe */
77 77
78typedef struct { 78typedef struct {
79 int pos; 79 int pos;
80 void *ring[BUFFER_RING_SIZE]; 80 void *ring[BUFFER_RING_SIZE];
81} buffer_ring; 81} buffer_ring;
82 82
83void icalmemory_free_tmp_buffer (void* buf); 83void icalmemory_free_tmp_buffer (void* buf);
84void icalmemory_free_ring_byval(buffer_ring *br); 84void icalmemory_free_ring_byval(buffer_ring *br);
85 85
86static buffer_ring* global_buffer_ring = 0; 86static buffer_ring* global_buffer_ring = 0;
87 87
88#ifdef HAVE_PTHREAD 88#ifdef HAVE_PTHREAD
89#include <pthread.h> 89#include <pthread.h>
90 90
91static pthread_key_t ring_key; 91static pthread_key_t ring_key;
92static pthread_once_t ring_key_once = PTHREAD_ONCE_INIT; 92static pthread_once_t ring_key_once = PTHREAD_ONCE_INIT;
93 93
94static void ring_destroy(void * buf) { 94static void ring_destroy(void * buf) {
95 if (buf) icalmemory_free_ring_byval((buffer_ring *) buf); 95 if (buf) icalmemory_free_ring_byval((buffer_ring *) buf);
96 pthread_setspecific(ring_key, NULL); 96 pthread_setspecific(ring_key, NULL);
97} 97}
98 98
99static void ring_key_alloc(void) { 99static void ring_key_alloc(void) {
100 pthread_key_create(&ring_key, ring_destroy); 100 pthread_key_create(&ring_key, ring_destroy);
101} 101}
102#endif 102#endif
103 103
104 104
105static buffer_ring * buffer_ring_new(void) { 105static buffer_ring * buffer_ring_new(void) {
106 buffer_ring *br; 106 buffer_ring *br;
107 int i; 107 int i;
108 108
109 br = (buffer_ring *)malloc(sizeof(buffer_ring)); 109 br = (buffer_ring *)malloc(sizeof(buffer_ring));
110 110
111 for(i=0; i<BUFFER_RING_SIZE; i++){ 111 for(i=0; i<BUFFER_RING_SIZE; i++){
112 br->ring[i] = 0; 112 br->ring[i] = 0;
113 } 113 }
114 br->pos = 0; 114 br->pos = 0;
115 return(br); 115 return(br);
116} 116}
117 117
118 118
119#ifdef HAVE_PTHREAD 119#ifdef HAVE_PTHREAD
120static buffer_ring* get_buffer_ring_pthread(void) { 120static buffer_ring* get_buffer_ring_pthread(void) {
121 buffer_ring *br; 121 buffer_ring *br;
@@ -168,98 +168,99 @@ void icalmemory_add_tmp_buffer(void* buf)
168 /* Assign the buffer to a slot */ 168 /* Assign the buffer to a slot */
169 br->ring[br->pos] = buf; 169 br->ring[br->pos] = buf;
170} 170}
171 171
172 172
173/** 173/**
174 * Create a new temporary buffer on the ring. Libical owns these and 174 * Create a new temporary buffer on the ring. Libical owns these and
175 * will deallocate them. 175 * will deallocate them.
176 */ 176 */
177 177
178void* 178void*
179icalmemory_tmp_buffer (size_t size) 179icalmemory_tmp_buffer (size_t size)
180{ 180{
181 char *buf; 181 char *buf;
182 182
183 if (size < MIN_BUFFER_SIZE){ 183 if (size < MIN_BUFFER_SIZE){
184 size = MIN_BUFFER_SIZE; 184 size = MIN_BUFFER_SIZE;
185 } 185 }
186 186
187 buf = (void*)malloc(size); 187 buf = (void*)malloc(size);
188 188
189 if( buf == 0){ 189 if( buf == 0){
190 icalerror_set_errno(ICAL_NEWFAILED_ERROR); 190 icalerror_set_errno(ICAL_NEWFAILED_ERROR);
191 return 0; 191 return 0;
192 } 192 }
193 193
194 memset(buf,0,size); 194 memset(buf,0,size);
195 195
196 icalmemory_add_tmp_buffer(buf); 196 icalmemory_add_tmp_buffer(buf);
197 197
198 return buf; 198 return buf;
199} 199}
200 200
201/** get rid of this buffer ring */ 201/** get rid of this buffer ring */
202void icalmemory_free_ring_byval(buffer_ring *br) { 202void icalmemory_free_ring_byval(buffer_ring *br) {
203 int i; 203 int i;
204 for(i=0; i<BUFFER_RING_SIZE; i++){ 204 for(i=0; i<BUFFER_RING_SIZE; i++){
205 if ( br->ring[i] != 0){ 205 if ( br->ring[i] != 0){
206 free( br->ring[i]); 206 free( br->ring[i]);
207 } 207 }
208 } 208 }
209 free(br); 209 free(br);
210} 210}
211 211
212void icalmemory_free_ring() 212void icalmemory_free_ring()
213{ 213{
214 buffer_ring *br; 214 buffer_ring *br;
215 br = get_buffer_ring(); 215 br = get_buffer_ring();
216
217 icalmemory_free_ring_byval(br); 216 icalmemory_free_ring_byval(br);
217 if ( global_buffer_ring == br )
218 global_buffer_ring = 0;
218} 219}
219 220
220 221
221 222
222/** Like strdup, but the buffer is on the ring. */ 223/** Like strdup, but the buffer is on the ring. */
223char* 224char*
224icalmemory_tmp_copy(const char* str) 225icalmemory_tmp_copy(const char* str)
225{ 226{
226 char* b = icalmemory_tmp_buffer(strlen(str)+1); 227 char* b = icalmemory_tmp_buffer(strlen(str)+1);
227 228
228 strcpy(b,str); 229 strcpy(b,str);
229 230
230 return b; 231 return b;
231} 232}
232 233
233 234
234char* icalmemory_strdup(const char *s) 235char* icalmemory_strdup(const char *s)
235{ 236{
236 return strdup(s); 237 return strdup(s);
237} 238}
238 239
239void 240void
240icalmemory_free_tmp_buffer (void* buf) 241icalmemory_free_tmp_buffer (void* buf)
241{ 242{
242 if(buf == 0) 243 if(buf == 0)
243 { 244 {
244 return; 245 return;
245 } 246 }
246 247
247 free(buf); 248 free(buf);
248} 249}
249 250
250 251
251/* 252/*
252 * These buffer routines create memory the old fashioned way -- so the 253 * These buffer routines create memory the old fashioned way -- so the
253 * caller will have to deallocate the new memory 254 * caller will have to deallocate the new memory
254 */ 255 */
255 256
256void* icalmemory_new_buffer(size_t size) 257void* icalmemory_new_buffer(size_t size)
257{ 258{
258 void *b = malloc(size); 259 void *b = malloc(size);
259 260
260 if( b == 0){ 261 if( b == 0){
261 icalerror_set_errno(ICAL_NEWFAILED_ERROR); 262 icalerror_set_errno(ICAL_NEWFAILED_ERROR);
262 return 0; 263 return 0;
263 } 264 }
264 265
265 memset(b,0,size); 266 memset(b,0,size);