diff options
-rw-r--r-- | libguile/ChangeLog | 6 | ||||
-rw-r--r-- | libguile/gc-malloc.c | 10 | ||||
-rw-r--r-- | libguile/gc.h | 1 | ||||
-rw-r--r-- | libguile/init.c | 1 |
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 (); |