diff --git a/pkgs/racket-test-core/tests/racket/foreign-test.rktl b/pkgs/racket-test-core/tests/racket/foreign-test.rktl index 632059fb0b..8dcf59a23b 100644 --- a/pkgs/racket-test-core/tests/racket/foreign-test.rktl +++ b/pkgs/racket-test-core/tests/racket/foreign-test.rktl @@ -396,6 +396,7 @@ (let ([ic7i-3 ((ffi 'ic7i_cb (_fun _ic7i (_fun _ic7i -> _ic7i) -> _ic7i)) ic7i (lambda (ic7i-4) + (collect-garbage 'minor) (test 12 ic7i-i1 ic7i-4) (test (cons 255 (map sub1 (cdr v))) ic7i-c7 ic7i-4) (test 13 ic7i-i2 ic7i-4) diff --git a/racket/src/cs/rumble/foreign.ss b/racket/src/cs/rumble/foreign.ss index 7ead16b371..95a07d5994 100644 --- a/racket/src/cs/rumble/foreign.ss +++ b/racket/src/cs/rumble/foreign.ss @@ -1423,6 +1423,14 @@ (with-interrupts-disabled* (foreign-free (cpointer-address p))))) +(define (lock-cpointer p) + (when (authentic-cpointer? p) + (lock-object (cpointer-memory p)))) + +(define (unlock-cpointer p) + (when (authentic-cpointer? p) + (unlock-object (cpointer-memory p)))) + (define-record-type (cpointer/cell make-cpointer/cell cpointer/cell?) (parent cpointer) (fields)) @@ -1758,7 +1766,9 @@ (let ([r (#%apply (gen-proc (cpointer-address proc-p)) (append (if ret-ptr - (list (ret-maker (cpointer-address ret-ptr))) + (begin + (lock-cpointer ret-ptr) + (list (ret-maker (cpointer-address ret-ptr)))) '()) (map (lambda (arg in-type maker) (let ([host-rep (array-rep-to-pointer-rep @@ -1775,7 +1785,7 @@ [(posix) (thread-cell-set! errno-cell (get-errno))] [(windows) (thread-cell-set! errno-cell (get-last-error))]) (cond - [ret-ptr ret-ptr] + [ret-ptr (unlock-cpointer ret-ptr) ret-ptr] [(eq? (ctype-our-rep out-type) 'gcpointer) (addr->gcpointer-memory r)] [else r])))))])