fix memory-management problem with #:lock-name

Repairs a bug in 290020c597.
This commit is contained in:
Matthew Flatt 2015-06-26 07:38:36 +08:00
parent 290020c597
commit 6f6a792d06
3 changed files with 48 additions and 2 deletions

View File

@ -0,0 +1,26 @@
#lang racket
(require ffi/unsafe)
(define (go)
(place pch (s)))
(define (s)
(define sleep (get-ffi-obj 'sleep #f (_fun #:lock-name "sleep-lock" _int -> _void)))
(printf "start\n")
(sleep 1)
(printf "done\n"))
(module+ test
(when (memq (system-type) '(unix macosx))
(place-wait (go))
;; Trigger a GC in space of place-shared objects:
(for ([i 1000])
(place-channel))
(define now (current-seconds))
(define l
(for/list ([i 3])
(go)))
(map place-wait l)
(unless ((- (current-seconds) now) . >= . 3)
(error "didn't serialize"))))

View File

@ -3221,6 +3221,16 @@ static Scheme_Object *make_vector_in_master(int count, Scheme_Object *val) {
GC_switch_back_from_master(original_gc); GC_switch_back_from_master(original_gc);
return vec; return vec;
} }
static void **malloc_immobile_box_in_master(Scheme_Object *v)
{
void **imm;
void *original_gc;
original_gc = GC_switch_to_master_gc();
imm = scheme_malloc_immobile_box(v);
GC_switch_back_from_master(original_gc);
return imm;
}
#endif #endif
static void *name_to_ffi_lock(Scheme_Object *bstr) static void *name_to_ffi_lock(Scheme_Object *bstr)
@ -3247,7 +3257,7 @@ static void *name_to_ffi_lock(Scheme_Object *bstr)
lock = scheme_place_make_async_channel(); lock = scheme_place_make_async_channel();
lock = make_vector_in_master(2, lock); lock = make_vector_in_master(2, lock);
SCHEME_VEC_ELS(lock)[1] = scheme_make_integer(-1); SCHEME_VEC_ELS(lock)[1] = scheme_make_integer(-1);
lock_box = scheme_malloc_immobile_box(lock); lock_box = malloc_immobile_box_in_master(lock);
old_lock_box = scheme_register_process_global(SCHEME_BYTE_STR_VAL(bstr), lock_box); old_lock_box = scheme_register_process_global(SCHEME_BYTE_STR_VAL(bstr), lock_box);
if (old_lock_box) { if (old_lock_box) {
scheme_free_immobile_box(lock_box); scheme_free_immobile_box(lock_box);

View File

@ -2386,6 +2386,16 @@ static Scheme_Object *make_vector_in_master(int count, Scheme_Object *val) {
GC_switch_back_from_master(original_gc); GC_switch_back_from_master(original_gc);
return vec; return vec;
} }
static void **malloc_immobile_box_in_master(Scheme_Object *v)
{
void **imm;
void *original_gc;
original_gc = GC_switch_to_master_gc();
imm = scheme_malloc_immobile_box(v);
GC_switch_back_from_master(original_gc);
return imm;
}
#endif #endif
static void *name_to_ffi_lock(Scheme_Object *bstr) static void *name_to_ffi_lock(Scheme_Object *bstr)
@ -2412,7 +2422,7 @@ static void *name_to_ffi_lock(Scheme_Object *bstr)
lock = scheme_place_make_async_channel(); lock = scheme_place_make_async_channel();
lock = make_vector_in_master(2, lock); lock = make_vector_in_master(2, lock);
SCHEME_VEC_ELS(lock)[1] = scheme_make_integer(-1); SCHEME_VEC_ELS(lock)[1] = scheme_make_integer(-1);
lock_box = scheme_malloc_immobile_box(lock); lock_box = malloc_immobile_box_in_master(lock);
old_lock_box = scheme_register_process_global(SCHEME_BYTE_STR_VAL(bstr), lock_box); old_lock_box = scheme_register_process_global(SCHEME_BYTE_STR_VAL(bstr), lock_box);
if (old_lock_box) { if (old_lock_box) {
scheme_free_immobile_box(lock_box); scheme_free_immobile_box(lock_box);