C 라이브러리가 내 Odin 코드로 콜백을 부르는데, 콜백은 등록 전에 설정해 둔 context를 보지 못한다. proc "c"에는 암묵적 context가 없어서 직접 만들어야 하고, runtime.default_context()가 주는 것은 기본 할당자다. 등록한 코드가 context.allocator에 넣어 둔 아레나는 오지 않는다. 콜백이 할당한 것은 전부 힙으로 가고 프레임 정리에 들어가지 않는다.
지금은 라이브러리의 user_data 포인터로 아레나를 넘기고 손으로 되돌려 놓는다.
import "base:runtime"
import "core:c"
import "core:mem"
on_event :: proc "c" (user: rawptr, code: c.int) {
context = runtime.default_context()
context.allocator = mem.arena_allocator((^mem.Arena)(user))
handle_event(int(code))
}
동작은 한다. 아레나 포인터는 등록보다 오래 살아야 하는데 아무것도 그걸 확인하지 않는다. 콜백마다 저 두 줄이 반복된다. 더 깔끔한 패턴이 있나, 아니면 C로 넘어가는 대가가 원래 이 정도인가?