[тяжкий вздох]
UPD, 05.11.17: Прогресса доолго ещё не будет.
- разгребаю барахло. Бывает так, что перед гостями срочно прибраться, вещи кучей в коробку, коробку - на антресоль, на потом. У меня двадцать лет таких "потом" накопилось, выматывает так, что отпуск не помогает.
- продолжаю писать фанфик-кроссовер Ранмы и Шантэ, на двух языках одновременно.
- веду подготовительные работы к созданию самодельного портативного компьютера. Алиэкспресс трещит от натуги, жаба забилась в уголок и даже уже плакать не может.
- восстанавливаю радиолюбительскую лабораторию (запиханную на антресоль в 90-х). Текущий результат: удавил бы того гада, что в детстве подсунул мне тот припой, которым всю жизнь пользовался. Он, оказывается, высокотемпературный! ПОС-61 по сравнению с ним - просто смазка к салазкам в рай. Не удивительно, что все мои детские поделиЯ спаяны через ... одно место.
UPD, 09.01.18: Всё ещё вожусь с хтоническим юбер-девайсом, мастеря ящик.
Вчера вышел нежданчик: выяснилось, что жифорсина не лезет. Пришлось взяться за ножовку:

Если кому интересно, мой фанфик пишется хорошо:
Танцуй-танцуй заварушкаUPD, 10.01.18: Переосмысление парадигмы
Общего самодельного менеджера памяти не будет. Будет сугубо специализированный менеджер памяти посредством собственной NewInstance для TManagedObject: инстансы будут храниться не в хипе, а в специальных пулах памяти, выделяемых постранично от ОС. Как и в более раннем варианте, это нужно для особых полей, хранимых компактно:
- флаги: чтоб было.
- индекс для обхода графа: это поле модифицируется у каждого обходимого объекта, и хранение его внутри инстанса - дикое загрязнение кеша. В идеале, должны не только храниться отдельно, но и очистка этих полей после обхода графа должна осуществляться освобождением памяти, где они лежали.
- счётчик ссылок: нужно сохранять возможность модификации когда память пула защищается от записи (нужно для отладки).
Структура такая: при старте менеджер резервит у ОС блок памяти, на гигабайт примерно. Пулы коммитятся внутри него с таким выравниванием, чтобы из любого указателя получался указатель на начало пула путём тупого округления по маске. А в начале пула лежит указатель на собственно его служебную запись, являющуюся обычным объектом в хипе. Все хранилища для специальных полей в нём - обычные массивы в том же хипе.
Таким образом количество велосипедов сводится к минимуму.
Для большей тупизны каждый пул расчитан на инстансы строго одного размера, и принадлежит конкретному потоку (я тут убедился, что GetCurrentThreadId() - эпически быстрая вещь, в линуксе это просто алиас pthread_self() ). Выделяются блоки без всяких блокировок, а освобождаются из не своего потока - посредством передачи сообщений "тут у тебя блок освободился" потоку-владельцу, и уж на этом механизме-то критические секции стоят. А освобождает поток-владелец когда заметит, что очередь сообщений не пуста.
Поскольку такие случаи - нештатные, получаем 99% операций выделения/освобождения - быстрые, без критических секций.
Кроме радикального уменьшения загрязнения кеша, подобный менеджер памяти инстансов позволяет менять защиту памяти для пулов конкретных потоков, без чего нормальная отладка многослойной физики просто невозможна. А с этой защитой - ваылезет AV как только какой-то косоруко запрограммированный объект полезет писать куда не следует. И, соответственно, многослойность можно реализовать гораздо тупее, без изобретения дополнительных велосипедов.