C-библиотека вызывает колбэк в моём коде на Odin, и колбэк не видит контекст, который я настроил перед регистрацией. У proc "c" нет неявного контекста, его приходится строить, а 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?