Size: a a a

2019 September 27

АК

Александр Караев in pro.lua
Там RAII везде и всюду, так на любой объект делается ref при создании/захвате и unref при выходе из скоупа.
источник

АК

Александр Караев in pro.lua
Так что ситуация с забытой навешанной ссылкой крайне маловероятна
источник

АК

Александр Караев in pro.lua
Первый Note отсюда явно предупреждает о том, что что-то может пойти не так с L.
источник

АК

Александр Караев in pro.lua
> These classes, on construction, assignment and other operations, forcibly obtain the lua_State* associated with the main thread, if possible. Using these classes will allow your code to be immune when a wrapped coroutine or a lua thread is set to nil and then garbage-collected.
источник

A

Anton in pro.lua
Окей, хорошо, с L может что-то пойти не так, если указатель на неё теряется каким-то образом. Например, L был запушан на стек другой корутины в рамках исполнения какой-то функции: корутина, соответствующая L, открутилась, функция завершилась, корутина будет удалена GC.
источник

A

Anton in pro.lua
И если какой-то объект достижим только через стек этой L (например), то и он будет удалён.

Да, такой сценарий можно назвать протуханием стейта.
источник

АК

Александр Караев in pro.lua
Так, можно ещё раз, но помедленнее. L - основной стейт, L1 - стейт какой-то корутины.
Правильно ли я понял, что L1 может быть как-то сохранен, что его соберёт сборщик мусора, хотя реально он должен ещё жить? Разве L1 не имеет счетчик ссылок "себя", чтобы знать, пора ему умирать или нет?

И описанная ситуация возможна в луа или это косяк разраба, который юзает C-API?
источник

АК

Александр Караев in pro.lua
Вообще, когда я добуду минимальный воспроизводимый пример, я его обязательно покажу
источник

D

Dadaskis in pro.lua
Отойду чуть-чуть от текущей темы...

Какие либы есть кроме LuaBridge, которые со стороны C++ кода позволяют добавлять кучу всего в Lua?
источник

АК

Александр Караев in pro.lua
Dadaskis
Отойду чуть-чуть от текущей темы...

Какие либы есть кроме LuaBridge, которые со стороны C++ кода позволяют добавлять кучу всего в Lua?
Тут есть и список либ, и бенчмарки
источник

A

Anton in pro.lua
Александр Караев
Так, можно ещё раз, но помедленнее. L - основной стейт, L1 - стейт какой-то корутины.
Правильно ли я понял, что L1 может быть как-то сохранен, что его соберёт сборщик мусора, хотя реально он должен ещё жить? Разве L1 не имеет счетчик ссылок "себя", чтобы знать, пора ему умирать или нет?

И описанная ситуация возможна в луа или это косяк разраба, который юзает C-API?
Корутина L1 — это просто значение, которое живет по тем же принципам, что и все остальные строки/таблицы/корутины. Да, если вы хотите, чтобы объект корутины жил, он должен быть достижим для GC.
источник

D

Dadaskis in pro.lua
Александр Караев
Тут есть и список либ, и бенчмарки
Обогнали чистый C, это, конечно, сильно
источник

M

Max in pro.lua
Dadaskis
Обогнали чистый C, это, конечно, сильно
Plain c видимо нужно читать как plain lua c api
источник

АК

Александр Караев in pro.lua
Anton
Корутина L1 — это просто значение, которое живет по тем же принципам, что и все остальные строки/таблицы/корутины. Да, если вы хотите, чтобы объект корутины жил, он должен быть достижим для GC.
"Объект корутины жил" - пусть помирает себе. Корутина сама никуда себя не записывает в луа коде, она просто выполняется. Во время работы создаёт какие-то объекты, которые, имея владельца L1, вполне могут записаться в табличку из L. И после записи у них кто владелец? L или L1?
Или я несу чушь и никаких владельцев нет?
источник

A

Anton in pro.lua
Александр Караев
"Объект корутины жил" - пусть помирает себе. Корутина сама никуда себя не записывает в луа коде, она просто выполняется. Во время работы создаёт какие-то объекты, которые, имея владельца L1, вполне могут записаться в табличку из L. И после записи у них кто владелец? L или L1?
Или я несу чушь и никаких владельцев нет?
Лучше подходит термин «точка достижимости». Если L1 передала ссылку на объект в L, то этот объект не будет сколлекчен (если L достижима для GC).
источник

АК

Александр Караев in pro.lua
Anton
Лучше подходит термин «точка достижимости». Если L1 передала ссылку на объект в L, то этот объект не будет сколлекчен (если L достижима для GC).
Хорошо. У переменных есть lua_State* владелец/создатель или как-то так? Или после создания переменная - это просто нечто в куче, как-то связанное со всеми другими GCObject* и будет собрана, когда все ссылки очистятся?
источник

A

Anton in pro.lua
Александр Караев
Хорошо. У переменных есть lua_State* владелец/создатель или как-то так? Или после создания переменная - это просто нечто в куче, как-то связанное со всеми другими GCObject* и будет собрана, когда все ссылки очистятся?
Нет. Переменная – это слот на стеке. Как-только этот слот оказывается выше, чем указатель на вершину стека, GC не видит этот слот. Если на всех стеках всех корутин нет такого слота slot < L->top, то значение, лежащее в слоте, будет сколлекчено (немного грубая формулировка, там ещё есть registry и gc roots, но идея такая).
источник

Д

Дмитрий in pro.lua
А бывают луа реверсеры?
источник

АК

Александр Караев in pro.lua
Если у нас таблица, на которую есть несколько ссылок из разных корутин, то в каждом слоте на стеке лежит указатель на неё + счетчик ссылок? @igelhaus
источник

A

Anton in pro.lua
Александр Караев
Если у нас таблица, на которую есть несколько ссылок из разных корутин, то в каждом слоте на стеке лежит указатель на неё + счетчик ссылок? @igelhaus
Счетчика ссылок в Lua нет вообще. Да, если есть таблица и в нескольких корутинах есть

local t = ...

То на стеке каждой корутины будет указатель на эту таблицу.
источник