Refcount strikes back

топ 100 блогов dz — 01.09.2011 Помощь клуба? Под кат имеет смысл глядеть, если refcount gc - не пустой звук.

Дано: "короткий" GC в Фантоме - на счётчиках ссылок. (Я знаю его ограничения, это нормально.) Недавно в нём была поймана бага вида races, и крайне злая.

- дано - объект и его поле. Поле хранит пойнтер на другой объект.
- при записи в поле происходит декремент рефкаунтера предыдущего значения поля (если оно не нулевое) - что логично. Ссылку потеряли - каунтер декрементим.
- при чтении поля надо бы каунтер инкрементить, но тут и возникает race. По шагам:

1. тред 2 читает значение поля.
-- свитч треда
2. тред 1 стирает поле и декрементит каунтер. объект весело идёт в могилу.
-- тайм пассез, свитч треда
3. тред 2 пытается проинкрементить и взрывает чей-то мозг, потому что объект давно уже склеили с пустым местом и кому-то выделили это место. Ну, короче, нехорошо получается.

Напрашивается спинлок вокруг рефкаунтера, но закрывать спинлок на каждое считывание поля - это просто беда. Оч. дорого.

Есть ещё идея - все декременты и инкременты делать отложенно - класть пойнтер на объект в очередь инкремента и декремента, и потом отрабатывать их в порядке "сначала все инкременты". Это гарантирует, насколько я вижу, непотерю объекта, да и выполнить эти операции можно в idle time, условно бесплатно. Но нагрузка в сумме всё равно получится немалая, да и это приведёт к тому, что пиковое потребление памяти вырастет, или же придётся, всё равно, делать разгрузку очереди не только в idle time.

Может, есть ещё идеи, которые мне не видны навскидку? Простая оптимизация - делать инкремент инлайн, а декремент отложенно - увы, ни фига не гарантирует.

Впрочем, только что осознал, что и схема с очередями не гарантирует - всё равно нужна атомарность по считыванию пойнтера и инкременту, ядри её в корень. (просто схлопывание очередей может оказаться в позиции 2 выше и вызвать ту же проблему.)

Или есть путь без?

PS: Если вам кажется, что atomic inc - это ответ на вопрос, то вы невнимательно прочитали вопрос.

Оставить комментарий

Предыдущие записи блогера :
Архив записей в блогах:
Екатерина Вилкова Светлана Светикова Яна Чурикова Виктория Тарасова Елена Воробей Ольга Дроздова  Тамара Гвердцители ...
оставил в разных местах Лондона восемь новых работ, посвященных животным. Спутниковую тарелку, на которой был изображен воющий волк, украли через несколько часов. ...
От Антивизы. Сегодня, 23 сентября 2011 г., Верховный совет Украины принял закон №8507 «Про документи, що посвідчують особу та підтверджують громадянство України» («О документах, которые удостоверяют личность и подтверждают гражданство Украины»). На ...
Сообщники! Подскажите пожалста, как добраться от Харькова до Борисполя. Хотелось бы на электричке до Борисполя, но непонятно как и за сколько добраться от ж/д вокзала Борисполя до аэропорта Дополнение: БОЛьШОЕ СПАСИБО ЗА ОТВЕТЫ Ехать нужно во ...
Аисты, как драконы, летали над селом, раздолье, речка рядом, луг, живи и радуйся! Работящие птицы, строят, носят в клювиках веточки, солому, заботливо переплетают всё в уютное гнёздышко (а ведь не маленькое!), чтоб удобно потом деткам было...летают в ...