diff --git a/pkgs/racket-test-core/tests/racket/ffi-lock.rkt b/pkgs/racket-test-core/tests/racket/ffi-lock.rkt new file mode 100644 index 0000000000..56acaa950f --- /dev/null +++ b/pkgs/racket-test-core/tests/racket/ffi-lock.rkt @@ -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")))) + diff --git a/racket/src/foreign/foreign.c b/racket/src/foreign/foreign.c index f1960f6b96..4cc23636b5 100644 --- a/racket/src/foreign/foreign.c +++ b/racket/src/foreign/foreign.c @@ -3221,6 +3221,16 @@ static Scheme_Object *make_vector_in_master(int count, Scheme_Object *val) { GC_switch_back_from_master(original_gc); 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 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 = make_vector_in_master(2, lock); 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); if (old_lock_box) { scheme_free_immobile_box(lock_box); diff --git a/racket/src/foreign/foreign.rktc b/racket/src/foreign/foreign.rktc index ae5aa63868..dbd6145ed4 100755 --- a/racket/src/foreign/foreign.rktc +++ b/racket/src/foreign/foreign.rktc @@ -2386,6 +2386,16 @@ static Scheme_Object *make_vector_in_master(int count, Scheme_Object *val) { GC_switch_back_from_master(original_gc); 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 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 = make_vector_in_master(2, lock); 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); if (old_lock_box) { scheme_free_immobile_box(lock_box);