fix `ffi/unsafe/nsalloc'
Using `call-as-atomic' isn't right, because that allows an escape via `call-as-nonatomic'. Assuming that `call-as-nonatomic' isn't used, it seems like `call-as-atomic' should be ok, anyway, but somehow its leads to unbalanced `end-atomic' calls.
This commit is contained in:
parent
003613395d
commit
d953bc27ba
|
@ -18,11 +18,13 @@
|
||||||
(define (call-with-autorelease thunk)
|
(define (call-with-autorelease thunk)
|
||||||
(unless NSAutoreleasePool
|
(unless NSAutoreleasePool
|
||||||
(error 'NSAutoreleasePool "not available"))
|
(error 'NSAutoreleasePool "not available"))
|
||||||
(call-as-atomic
|
(dynamic-wind
|
||||||
|
start-atomic
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(let ([pool (tell (tell NSAutoreleasePool alloc) init)])
|
(let ([pool (tell (tell NSAutoreleasePool alloc) init)])
|
||||||
(dynamic-wind
|
(dynamic-wind
|
||||||
void
|
void
|
||||||
thunk
|
thunk
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(tellv pool release)))))))
|
(tellv pool release)))))
|
||||||
|
end-atomic))
|
||||||
|
|
|
@ -4984,7 +4984,11 @@ void scheme_start_atomic_no_break(void)
|
||||||
|
|
||||||
void scheme_end_atomic_no_swap(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)
|
void scheme_start_in_scheduler(void)
|
||||||
|
@ -4995,8 +4999,12 @@ void scheme_start_in_scheduler(void)
|
||||||
|
|
||||||
void scheme_end_in_scheduler(void)
|
void scheme_end_in_scheduler(void)
|
||||||
{
|
{
|
||||||
--do_atomic;
|
int v = --do_atomic;
|
||||||
--scheme_no_stack_overflow;
|
--scheme_no_stack_overflow;
|
||||||
|
if (v < 0) {
|
||||||
|
scheme_log_abort("unbalanced end-atomic");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void scheme_end_atomic(void)
|
void scheme_end_atomic(void)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user