В общем, виноваты оказались, как всегда, арены.
Во-первых, я выделял вообще всё пространство арены целиком. Поэтому, когда размер объекта не кратен размеру арены, я выделял под последний элемент частично за пределами аллоцированной зоны. Первый проёб.
Во-вторых, arena_acquire(), чтобы получить указатель, где можно схоронить нужный объект, возвращал результат list_pop() из списка доступных поинтеров. Только вот, я не учёл, что list_pop() возвращает указатель на элемент внутри списка, а не сам элемент. То есть, в списке память хранится, как void*, а я в неё совал void*, так что по итогу память в списке имела тип void**. Вот как раз его и возвращал мне list_pop(). А я возвращал пользователю вместо указателя на свободное место в арене. Так ладно это, возвращал поинтеры с промежутком в 8 байт, равное как раз таки исходному
sizeof(void*). Поэтому, у меня таски перекрывали друг дружку. Из-за этого мне поебенило состояние серверной таски. Таску с поебененным состоянием получал ивентлуп. Видит - хуйня какая-то, и логгирует баг. А логгер-то я не имплементировал, у меня там заглушка. Выходит, что я вызывал функцию по рандомному адресу в памяти. Отсюда и sigill. В общем, охуел я знатно, конечно. Зато теперь вынес ещё и закрытие сокета из ивентлупа в обёртку, что позволит ещё лучше всё это дело в io_uring потом батчить