summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/ChangeLog6
-rw-r--r--libguile/gc-malloc.c10
-rw-r--r--libguile/gc.h1
-rw-r--r--libguile/init.c1
4 files changed, 14 insertions, 4 deletions
diff --git a/libguile/ChangeLog b/libguile/ChangeLog
index b280678d2..9798ee13a 100644
--- a/libguile/ChangeLog
+++ b/libguile/ChangeLog
@@ -1,13 +1,17 @@
2002-12-10 Mikael Djurfeldt <mdj@kvast.blakulla.net>
+ * gc-malloc.c, gc.h (scm_gc_malloc_prehistory): New function.
+
* gc-malloc.c (malloc_mutex): New mutex.
- (scm_gc_init_malloc): Initialize it.
+ (scm_gc_malloc_prehistory): Initialize it.
(scm_realloc): Serialize call to realloc
(scm_calloc): Same for calloc.
Thanks to Wolfgang Jaehrling!
(Now we have to make sure all calls to malloc/realloc are made
through scm_malloc.)
+ * init.c (scm_init_guile_1): Call scm_gc_malloc_prehistory.
+
* threads.c (really_launch): Release heap (to prevent deadlock).
(create_thread): Release heap before locking thread admin mutex.
diff --git a/libguile/gc-malloc.c b/libguile/gc-malloc.c
index f6138f89f..b2c73a104 100644
--- a/libguile/gc-malloc.c
+++ b/libguile/gc-malloc.c
@@ -102,6 +102,12 @@ static int scm_i_minyield_malloc;
static scm_t_mutex malloc_mutex;
void
+scm_gc_malloc_prehistory ()
+{
+ scm_i_plugin_mutex_init (&malloc_mutex, 0);
+}
+
+void
scm_gc_init_malloc (void)
{
scm_mtrigger = scm_getenv_int ("GUILE_INIT_MALLOC_LIMIT",
@@ -116,8 +122,6 @@ scm_gc_init_malloc (void)
if (scm_mtrigger < 0)
scm_mtrigger = SCM_DEFAULT_INIT_MALLOC_LIMIT;
-
- scm_i_plugin_mutex_init (&malloc_mutex, 0);
}
@@ -132,7 +136,7 @@ scm_realloc (void *mem, size_t size)
scm_i_plugin_mutex_lock (&malloc_mutex);
SCM_SYSCALL (ptr = realloc (mem, size));
- scm_i_plugin_mutex_lock (&malloc_mutex);
+ scm_i_plugin_mutex_unlock (&malloc_mutex);
if (ptr)
return ptr;
diff --git a/libguile/gc.h b/libguile/gc.h
index ebb7ff6e9..73c06cd6d 100644
--- a/libguile/gc.h
+++ b/libguile/gc.h
@@ -372,6 +372,7 @@ SCM_API void scm_gc_register_root (SCM *p);
SCM_API void scm_gc_unregister_root (SCM *p);
SCM_API void scm_gc_register_roots (SCM *b, unsigned long n);
SCM_API void scm_gc_unregister_roots (SCM *b, unsigned long n);
+SCM_API void scm_gc_malloc_prehistory (void);
SCM_API int scm_init_storage (void);
SCM_API void *scm_get_stack_base (void);
SCM_API void scm_init_gc (void);
diff --git a/libguile/init.c b/libguile/init.c
index c9dec664b..2051fdb92 100644
--- a/libguile/init.c
+++ b/libguile/init.c
@@ -444,6 +444,7 @@ scm_init_guile_1 (SCM_STACKITEM *base)
scm_block_gc = 1;
+ scm_gc_malloc_prehistory ();
scm_threads_prehistory ();
scm_ports_prehistory ();
scm_smob_prehistory ();