diff options
-rw-r--r-- | libguile/inline.h | 6 | ||||
-rw-r--r-- | libguile/srcprop.c | 5 | ||||
-rw-r--r-- | libguile/strings.c | 3 | ||||
-rw-r--r-- | libguile/threads.c | 4 |
4 files changed, 11 insertions, 7 deletions
diff --git a/libguile/inline.h b/libguile/inline.h index 5337c90a5..122455cee 100644 --- a/libguile/inline.h +++ b/libguile/inline.h @@ -73,8 +73,12 @@ scm_cell (scm_t_bits car, scm_t_bits cdr) { SCM cell = SCM_PACK ((scm_t_bits) (GC_malloc (sizeof (scm_t_cell)))); - SCM_GC_SET_CELL_WORD (cell, 0, car); + /* Initialize the type slot last so that the cell is ignored by the GC + until it is completely initialized. This is only relevant when the GC + can actually run during this code, which it can't since the GC only runs + when all other threads are stopped. */ SCM_GC_SET_CELL_WORD (cell, 1, cdr); + SCM_GC_SET_CELL_WORD (cell, 0, car); return cell; } diff --git a/libguile/srcprop.c b/libguile/srcprop.c index e1b86738c..34c1ae173 100644 --- a/libguile/srcprop.c +++ b/libguile/srcprop.c @@ -112,11 +112,10 @@ scm_make_srcprops (long line, int col, SCM filename, SCM copy, SCM plist) scm_t_srcprops_chunk *mem; size_t n = sizeof (scm_t_srcprops_chunk) + sizeof (scm_t_srcprops) * (SRCPROPS_CHUNKSIZE - 1); - SCM_SYSCALL (mem = (scm_t_srcprops_chunk *) scm_malloc (n)); + mem = scm_gc_malloc (n, "srcprops"); if (mem == NULL) scm_memory_error ("srcprops"); - scm_gc_register_collectable_memory (mem, n, "srcprops"); - + mem->next = srcprops_chunklist; srcprops_chunklist = mem; ptr = &mem->srcprops[0]; diff --git a/libguile/strings.c b/libguile/strings.c index 947bcb498..1640e17bc 100644 --- a/libguile/strings.c +++ b/libguile/strings.c @@ -115,7 +115,8 @@ make_stringbuf (size_t len) } else { - char *mem = scm_gc_malloc (len+1, "string"); + /* FIXME: Create an `scm_gc' equivalent to `GC_MALLOC_ATOMIC ()'. */ + char *mem = GC_MALLOC_ATOMIC (len + 1);/* scm_gc_malloc (len+1, "string"); */ mem[len] = '\0'; return scm_double_cell (STRINGBUF_TAG, (scm_t_bits) mem, (scm_t_bits) len, (scm_t_bits) 0); diff --git a/libguile/threads.c b/libguile/threads.c index 20b8e38c9..0ba059056 100644 --- a/libguile/threads.c +++ b/libguile/threads.c @@ -382,7 +382,7 @@ static SCM scm_i_default_dynamic_state; static void guilify_self_1 (SCM_STACKITEM *base) { - scm_i_thread *t = malloc (sizeof (scm_i_thread)); + scm_i_thread *t = scm_gc_malloc (sizeof (scm_i_thread), "thread"); t->pthread = scm_i_pthread_self (); t->handle = SCM_BOOL_F; @@ -432,7 +432,7 @@ guilify_self_2 (SCM parent) scm_i_thread *t = SCM_I_CURRENT_THREAD; SCM_NEWSMOB (t->handle, scm_tc16_thread, t); - scm_gc_register_collectable_memory (t, sizeof (scm_i_thread), "thread"); + t->continuation_root = scm_cons (t->handle, SCM_EOL); t->continuation_base = t->base; |