diff --git a/collects/ffi/unsafe/nsalloc.rkt b/collects/ffi/unsafe/nsalloc.rkt index 326f94420c..4cb5e551ed 100644 --- a/collects/ffi/unsafe/nsalloc.rkt +++ b/collects/ffi/unsafe/nsalloc.rkt @@ -18,11 +18,13 @@ (define (call-with-autorelease thunk) (unless NSAutoreleasePool (error 'NSAutoreleasePool "not available")) - (call-as-atomic + (dynamic-wind + start-atomic (lambda () (let ([pool (tell (tell NSAutoreleasePool alloc) init)]) (dynamic-wind void thunk (lambda () - (tellv pool release))))))) + (tellv pool release))))) + end-atomic)) diff --git a/src/racket/src/thread.c b/src/racket/src/thread.c index 29526e9378..0c7d1de18e 100644 --- a/src/racket/src/thread.c +++ b/src/racket/src/thread.c @@ -4984,7 +4984,11 @@ void scheme_start_atomic_no_break(void) void scheme_end_atomic_no_swap(void) { - --do_atomic; + int v = --do_atomic; + if (v < 0) { + scheme_log_abort("unbalanced end-atomic"); + abort(); + } } void scheme_start_in_scheduler(void) @@ -4995,8 +4999,12 @@ void scheme_start_in_scheduler(void) void scheme_end_in_scheduler(void) { - --do_atomic; + int v = --do_atomic; --scheme_no_stack_overflow; + if (v < 0) { + scheme_log_abort("unbalanced end-atomic"); + abort(); + } } void scheme_end_atomic(void)