Size: a a a

2019 September 27

S

Snusmumriken in pro.lua
Должно быть где-то тут ))
https://www.lua.org/source/5.1/lcode.c.html
источник

АК

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

S

Snusmumriken in pro.lua
Я дурак и смотрел в основном код стандартных библиотек, то есть "что дёргаем", а не "как именно дёргаем".
источник

АК

Александр Караев in pro.lua
Так, начало положено
источник

АК

Александр Караев in pro.lua
источник

АК

Александр Караев in pro.lua
Я пошёл от C-API
источник

АК

Александр Караев in pro.lua
источник

АК

Александр Караев in pro.lua
источник

АК

Александр Караев in pro.lua
А вот и создание нового потока
источник

АК

Александр Караев in pro.lua
Судя по всему, global_State у них у всех общий.
источник

A

Anton in pro.lua
Александр Караев
Привет всем.
Допустим, существует некий глобальный стейт L. В нем есть какие переменные. Мы заспаунили тред, запустили в нем корутину, в ней создали какой-то объект a = { ... };.
Правильно ли я понимаю, что "владелец" a - это не L, а некий дочерний стейт, стейт потока?
Что произойдет с владельцем, если я запишу ссылку на a в глобальные переменные L, после чего поток и корутина умрут? Я получу мертвую ссылку и сегфолт в дальнейшем?
Вся аллокация и сборка мусора подвязаны на некий global_State, который и является экземпляром VM. Он не доступен пользовательскому коду, но создаётся в момент lua_open, который возвращает указатель на «главную корутину». Соответсвенно, каждая корутина обладает ссылкой на экземпляр VM, но с точки зрения GC это не очень важно, потому что «на самом деле» владеет управляемой памятью именно global_State. Впрочем, все lua_State используются сборщиком мусора для принятия решения о достижимости объекта.

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

АК

Александр Караев in pro.lua
Anton
Вся аллокация и сборка мусора подвязаны на некий global_State, который и является экземпляром VM. Он не доступен пользовательскому коду, но создаётся в момент lua_open, который возвращает указатель на «главную корутину». Соответсвенно, каждая корутина обладает ссылкой на экземпляр VM, но с точки зрения GC это не очень важно, потому что «на самом деле» владеет управляемой памятью именно global_State. Впрочем, все lua_State используются сборщиком мусора для принятия решения о достижимости объекта.

В таком дизайне нет, никакого висячего указателя не будет, пока GC может хоть как-то (через стеки корутин, через глобальную таблицу) достучаться до объекта.
Отлично. Частично прояснилось, спасибо. Примерно к такому же выводу я пришёл в своих 3-4 последних сообщениях, где-таки добрался до global_State.
Значит проблема или в моём коде, или в коде библиотечной абстракции.

Но к каждой переменной всё равно привязан какой-то стейт, через который она обращается к глобальному стейту. Может ли протухнуть этот стейт?
источник

АК

Александр Караев in pro.lua
Есть у нас глобальный стейт L, переменная a, созданная в корутине. a->L = L1 - дочерний стейт. G(a->L) == G(L).
Допустим, мы копируем эту переменную в глобальный скоуп, в котором всё имеет L, но пришла переменная с L1, который может помереть в любой момент.
источник

S

Snusmumriken in pro.lua
Типа всё что в корутинах отправляется в глобал-стейт, по хорошему.
источник

АК

Александр Караев in pro.lua
Отправляется кем? Виртуальной машиной или разработчиком, который использует C-api?
источник

A

Anton in pro.lua
Александр Караев
Отлично. Частично прояснилось, спасибо. Примерно к такому же выводу я пришёл в своих 3-4 последних сообщениях, где-таки добрался до global_State.
Значит проблема или в моём коде, или в коде библиотечной абстракции.

Но к каждой переменной всё равно привязан какой-то стейт, через который она обращается к глобальному стейту. Может ли протухнуть этот стейт?
С точки зрения Lua VM никаких переменных нет, слоты на стеке. То есть утверждение не очень корректно. Это GC в VM ползает по стекам и решает, что протухло.

Что может пойти не так? Например, у вас есть userdata, которая не заанкорена нигде в Lua-коде (и в registry ее нет). Вот тогда она будет сколлекчена и попытка обращения будет неудачна. Потому что за память userdata отвевает Lua VM, а за начинку – хост.
источник

АК

Александр Караев in pro.lua
Не, юзердаты никакой нет. Есть
sol::table table; в C++ (обёртка над табличкой), есть
sol::table get_table() { return table; }, которая даёт ссылку в луа, где ей пользуются из корутин примерно так:
get_table()[1] = "asd"
Помимо этого есть ещё и void set_table(sol::table t) { table = t; }, который так же могут вызвать из луа как set_table({})
источник

АК

Александр Караев in pro.lua
При unrefе этой самой table (когда все корутины точно мертвы, но возможно не собраны сборщиком) крашится внутри lua_rawgeti, так как index2addr возвращает NULL
источник

АК

Александр Караев in pro.lua
Луа 5.3, если что
источник

M

Max in pro.lua
Можно предположить, что код на плюсах был написан так, что был возможен следующий сценарий: 1) запомнили поинтер на таблицу 2) GC почистил таблицу внутри VM 3) в глобальную таблицу был помещён поинтер на очищенную таблицу
источник