Changed license terms to the plain LGPL thru-out.
[bpt/guile.git] / libguile / gc-malloc.c
CommitLineData
c7743d02
HWN
1/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001, 2002 Free Software Foundation, Inc.
2 *
73be1d9e
MV
3 * This library is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU Lesser General Public
5 * License as published by the Free Software Foundation; either
6 * version 2.1 of the License, or (at your option) any later version.
c7743d02 7 *
73be1d9e 8 * This library is distributed in the hope that it will be useful,
c7743d02 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
73be1d9e
MV
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
c7743d02 12 *
73be1d9e
MV
13 * You should have received a copy of the GNU Lesser General Public
14 * License along with this library; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 */
c7743d02
HWN
17
18
19\f
132fa21f
RB
20#if HAVE_CONFIG_H
21# include <config.h>
22#endif
23
c7743d02
HWN
24#include <stdio.h>
25#include <errno.h>
26#include <string.h>
27
28#ifdef __ia64__
29#include <ucontext.h>
30extern unsigned long * __libc_ia64_register_backing_store_base;
31#endif
32
33#include "libguile/_scm.h"
34#include "libguile/eval.h"
35#include "libguile/stime.h"
36#include "libguile/stackchk.h"
37#include "libguile/struct.h"
38#include "libguile/smob.h"
39#include "libguile/unif.h"
40#include "libguile/async.h"
41#include "libguile/ports.h"
42#include "libguile/root.h"
43#include "libguile/strings.h"
44#include "libguile/vectors.h"
45#include "libguile/weaks.h"
46#include "libguile/hashtab.h"
47#include "libguile/tags.h"
48
49#include "libguile/validate.h"
50#include "libguile/deprecation.h"
51#include "libguile/gc.h"
52
53#include "libguile/private-gc.h"
54
55#ifdef GUILE_DEBUG_MALLOC
56#include "libguile/debug-malloc.h"
57#endif
58
59#ifdef HAVE_MALLOC_H
60#include <malloc.h>
61#endif
62
63#ifdef HAVE_UNISTD_H
64#include <unistd.h>
65#endif
66
67/*
68 INIT_MALLOC_LIMIT is the initial amount of malloc usage which will
69 trigger a GC.
70
71 After startup (at the guile> prompt), we have approximately 100k of
72 alloced memory, which won't go away on GC. Let's set the init such
73 that we get a nice yield on the next allocation:
74*/
c2cbcc57 75#define SCM_DEFAULT_INIT_MALLOC_LIMIT 200*1024
c7743d02
HWN
76#define SCM_DEFAULT_MALLOC_MINYIELD 40
77
61ef9c1f 78/* #define DEBUGINFO */
c7743d02
HWN
79
80static int scm_i_minyield_malloc;
81
82void
83scm_gc_init_malloc (void)
84{
85 scm_mtrigger = scm_getenv_int ("GUILE_INIT_MALLOC_LIMIT",
86 SCM_DEFAULT_INIT_MALLOC_LIMIT);
87 scm_i_minyield_malloc = scm_getenv_int ("GUILE_MIN_YIELD_MALLOC",
88 SCM_DEFAULT_MALLOC_MINYIELD);
dac04e9f
HWN
89
90 if (scm_i_minyield_malloc >= 100)
91 scm_i_minyield_malloc = 99;
92 if (scm_i_minyield_malloc < 1)
93 scm_i_minyield_malloc = 1;
94
95 if (scm_mtrigger < 0)
96 scm_mtrigger = SCM_DEFAULT_INIT_MALLOC_LIMIT;
c7743d02
HWN
97}
98
99
100\f
101/* Function for non-cell memory management.
102 */
103
c7743d02
HWN
104void *
105scm_realloc (void *mem, size_t size)
106{
107 void *ptr;
108
109 SCM_SYSCALL (ptr = realloc (mem, size));
110 if (ptr)
111 return ptr;
112
fb50ef08 113 scm_rec_mutex_lock (&scm_i_sweep_mutex);
9bc4701c 114
c7743d02
HWN
115 scm_i_sweep_all_segments ("realloc");
116
117 SCM_SYSCALL (ptr = realloc (mem, size));
118 if (ptr)
9bc4701c 119 {
fb50ef08 120 scm_rec_mutex_unlock (&scm_i_sweep_mutex);
9bc4701c
MD
121 return ptr;
122 }
c7743d02
HWN
123
124 scm_igc ("realloc");
125 scm_i_sweep_all_segments ("realloc");
126
fb50ef08 127 scm_rec_mutex_unlock (&scm_i_sweep_mutex);
9bc4701c 128
c7743d02
HWN
129 SCM_SYSCALL (ptr = realloc (mem, size));
130 if (ptr)
131 return ptr;
132
133 scm_memory_error ("realloc");
134}
135
39e8f371
HWN
136void *
137scm_malloc (size_t sz)
138{
139 return scm_realloc (NULL, sz);
140}
ba1b2226
HWN
141
142/*
143 Hmm. Should we use the C convention for arguments (i.e. N_ELTS,
144 SIZEOF_ELT)? --hwn
145 */
146void *
147scm_calloc (size_t sz)
148{
1383773b
HWN
149 void * ptr;
150
151 /*
152 By default, try to use calloc, as it is likely more efficient than
153 calling memset by hand.
154 */
fb50ef08 155 SCM_SYSCALL (ptr = calloc (sz, 1));
1383773b
HWN
156 if (ptr)
157 return ptr;
158
159 ptr = scm_realloc (NULL, sz);
ba1b2226
HWN
160 memset (ptr, 0x0, sz);
161 return ptr;
162}
163
39e8f371 164
c7743d02
HWN
165char *
166scm_strndup (const char *str, size_t n)
167{
fb50ef08 168 char *dst = scm_malloc (n + 1);
c7743d02
HWN
169 memcpy (dst, str, n);
170 dst[n] = 0;
171 return dst;
172}
173
174char *
175scm_strdup (const char *str)
176{
177 return scm_strndup (str, strlen (str));
178}
179
180void
181scm_gc_register_collectable_memory (void *mem, size_t size, const char *what)
182{
183 scm_mallocated += size;
184
185 /*
186 we could finish the full sweep (without mark) here, but in
187 practice this turns out to be ineffective.
188 */
189
190 /*
191 A program that uses a lot of malloced collectable memory (vectors,
192 strings), will use a lot of memory off the cell-heap; it needs to
193 do GC more often (before cells are exhausted), otherwise swapping
194 and malloc management will tie it down.
195 */
196 if (scm_mallocated > scm_mtrigger)
197 {
9bc4701c 198 unsigned long prev_alloced;
c7743d02
HWN
199 float yield;
200
fb50ef08 201 scm_rec_mutex_lock (&scm_i_sweep_mutex);
9bc4701c
MD
202
203 prev_alloced = scm_mallocated;
c7743d02 204 scm_igc (what);
9bc4701c 205 scm_i_sweep_all_segments ("mtrigger");
c7743d02 206
fb50ef08
MD
207 yield = (((float) prev_alloced - (float) scm_mallocated)
208 / (float) prev_alloced);
ffd72400 209
c2cbcc57 210 scm_gc_malloc_yield_percentage = (int) (100 * yield);
61ef9c1f
HWN
211
212#ifdef DEBUGINFO
c7743d02 213 fprintf (stderr, "prev %lud , now %lud, yield %4.2lf, want %d",
fb50ef08
MD
214 prev_alloced,
215 scm_mallocated,
216 100.0 * yield,
217 scm_i_minyield_malloc);
61ef9c1f
HWN
218#endif
219
c7743d02
HWN
220 if (yield < scm_i_minyield_malloc / 100.0)
221 {
222 /*
223 We make the trigger a little larger, even; If you have a
224 program that builds up a lot of data in strings, then the
225 desired yield will never be satisfied.
226
227 Instead of getting bogged down, we let the mtrigger grow
228 strongly with it.
229 */
e88e4f2e 230 float no_overflow_trigger = scm_mallocated * 110.0;
dac04e9f 231
e88e4f2e 232 no_overflow_trigger /= (float) (100.0 - scm_i_minyield_malloc);
dac04e9f 233 scm_mtrigger = (unsigned long) no_overflow_trigger;
c7743d02 234
61ef9c1f 235#ifdef DEBUGINFO
fb50ef08
MD
236 fprintf (stderr, "Mtrigger sweep: ineffective. New trigger %d\n",
237 scm_mtrigger);
61ef9c1f 238#endif
c7743d02 239 }
9bc4701c 240
fb50ef08 241 scm_rec_mutex_unlock (&scm_i_sweep_mutex);
c7743d02
HWN
242 }
243
244#ifdef GUILE_DEBUG_MALLOC
245 if (mem)
246 scm_malloc_register (mem, what);
247#endif
248}
249
250void
251scm_gc_unregister_collectable_memory (void *mem, size_t size, const char *what)
252{
253 scm_mallocated -= size;
254 scm_gc_malloc_collected += size;
255
256#ifdef GUILE_DEBUG_MALLOC
257 if (mem)
258 scm_malloc_unregister (mem);
259#endif
260}
261
262void *
263scm_gc_malloc (size_t size, const char *what)
264{
265 /*
266 The straightforward implementation below has the problem
267 that it might call the GC twice, once in scm_malloc and then
268 again in scm_gc_register_collectable_memory. We don't really
269 want the second GC since it will not find new garbage.
270
271
272 Note: this is a theoretical peeve. In reality, malloc() never
273 returns NULL. Usually, memory is overcommitted, and when you try
274 to write it the program is killed with signal 11. --hwn
275 */
276
277 void *ptr = scm_malloc (size);
278 scm_gc_register_collectable_memory (ptr, size, what);
279 return ptr;
280}
281
39e8f371
HWN
282void *
283scm_gc_calloc (size_t size, const char *what)
284{
285 void *ptr = scm_gc_malloc (size, what);
286 memset (ptr, 0x0, size);
287 return ptr;
288}
289
290
c7743d02
HWN
291void *
292scm_gc_realloc (void *mem, size_t old_size, size_t new_size, const char *what)
293{
294 /* XXX - see scm_gc_malloc. */
295
296 void *ptr = scm_realloc (mem, new_size);
297 scm_gc_unregister_collectable_memory (mem, old_size, what);
298 scm_gc_register_collectable_memory (ptr, new_size, what);
299 return ptr;
300}
301
302void
303scm_gc_free (void *mem, size_t size, const char *what)
304{
305 scm_gc_unregister_collectable_memory (mem, size, what);
306 free (mem);
307}
308
309char *
310scm_gc_strndup (const char *str, size_t n, const char *what)
311{
312 char *dst = scm_gc_malloc (n+1, what);
313 memcpy (dst, str, n);
314 dst[n] = 0;
315 return dst;
316}
317
318char *
319scm_gc_strdup (const char *str, const char *what)
320{
321 return scm_gc_strndup (str, strlen (str), what);
322}
323
324#if SCM_ENABLE_DEPRECATED == 1
325
326/* {Deprecated front end to malloc}
327 *
328 * scm_must_malloc, scm_must_realloc, scm_must_free, scm_done_malloc,
329 * scm_done_free
330 *
331 * These functions provide services comparable to malloc, realloc, and
332 * free. They should be used when allocating memory that will be under
333 * control of the garbage collector, i.e., if the memory may be freed
334 * during garbage collection.
335 *
336 * They are deprecated because they weren't really used the way
337 * outlined above, and making sure to return the right amount from
338 * smob free routines was sometimes difficult when dealing with nested
339 * data structures. We basically want everybody to review their code
340 * and use the more symmetrical scm_gc_malloc/scm_gc_free functions
341 * instead. In some cases, where scm_must_malloc has been used
342 * incorrectly (i.e. for non-GC-able memory), use scm_malloc/free.
343 */
344
345void *
346scm_must_malloc (size_t size, const char *what)
347{
348 scm_c_issue_deprecation_warning
349 ("scm_must_malloc is deprecated. "
350 "Use scm_gc_malloc and scm_gc_free instead.");
351
352 return scm_gc_malloc (size, what);
353}
354
355void *
356scm_must_realloc (void *where,
357 size_t old_size,
358 size_t size,
359 const char *what)
360{
361 scm_c_issue_deprecation_warning
362 ("scm_must_realloc is deprecated. "
363 "Use scm_gc_realloc and scm_gc_free instead.");
364
365 return scm_gc_realloc (where, old_size, size, what);
366}
367
368char *
369scm_must_strndup (const char *str, size_t length)
370{
371 scm_c_issue_deprecation_warning
372 ("scm_must_strndup is deprecated. "
373 "Use scm_gc_strndup and scm_gc_free instead.");
374
375 return scm_gc_strndup (str, length, "string");
376}
377
378char *
379scm_must_strdup (const char *str)
380{
381 scm_c_issue_deprecation_warning
382 ("scm_must_strdup is deprecated. "
383 "Use scm_gc_strdup and scm_gc_free instead.");
384
385 return scm_gc_strdup (str, "string");
386}
387
388void
389scm_must_free (void *obj)
390#define FUNC_NAME "scm_must_free"
391{
392 scm_c_issue_deprecation_warning
393 ("scm_must_free is deprecated. "
394 "Use scm_gc_malloc and scm_gc_free instead.");
395
396#ifdef GUILE_DEBUG_MALLOC
397 scm_malloc_unregister (obj);
398#endif
399 if (obj)
400 free (obj);
401 else
be3ff021
HWN
402 {
403 fprintf (stderr,"freeing NULL pointer");
404 abort ();
405 }
c7743d02
HWN
406}
407#undef FUNC_NAME
408
409
410void
411scm_done_malloc (long size)
412{
413 scm_c_issue_deprecation_warning
414 ("scm_done_malloc is deprecated. "
415 "Use scm_gc_register_collectable_memory instead.");
416
417 scm_gc_register_collectable_memory (NULL, size, "foreign mallocs");
418}
419
420void
421scm_done_free (long size)
422{
423 scm_c_issue_deprecation_warning
424 ("scm_done_free is deprecated. "
425 "Use scm_gc_unregister_collectable_memory instead.");
426
427 scm_gc_unregister_collectable_memory (NULL, size, "foreign mallocs");
428}
429
430#endif /* SCM_ENABLE_DEPRECATED == 1 */