Получить Луа государство внутри Луа - PullRequest
0 голосов
/ 23 сентября 2019

Я бы хотел получить состояние lua изнутри lua, чтобы я мог передать его и внешней программе, которую нельзя подключить с помощью ffi или dll.Мне просто нужен указатель на него и возможность делиться им (общая память через границы программы.

) Или я могу создать состояние lua в своей программе и затем передать его, поэтому мне просто нужно установить luaукажите его в lua (и он должен работать с общей памятью).

Я думал об обмене данными с использованием json, но в идеале я хотел бы получить прямой доступ к объектам.

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Lua очень хорошо избегает выделения кучи и глобальных указателей на выделенную память.lua_newstate принимает функцию распределителя в качестве параметра. Предоставленная функция будет использоваться для выделения / освобождения всей памяти, связанной с объектом lua_State.Включая указатель, возвращаемый lua_newstate.

Таким образом, гипотетически, вы можете предоставить функцию распределителя, которая выделяет / освобождает разделяемую память между процессами.И затем, вы можете просто передать lua_State другому процессу и получить к нему доступ.

Во-первых, вы явно не можете сделать это «изнутри lua»;такого рода вещи низкого уровня просто не происходит.Вы не можете получить доступ к lua_State объекту из Lua.Вы должны контролировать процесс создания lua_State, чтобы это было возможно.Итак, мы говорим здесь о C (эквивалентном) коде, а не о коде на Lua.

Теперь вы можете представить функцию C для Lua, которая возвращает легкие пользовательские данные, которые точно являются точными lua_State* обсуждаемый.Но Lua на самом деле ничего не может сделать с легкими пользовательскими данными, кроме передачи их другим API-функциям C.

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

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

Так что простого совместного использования памяти, выделенной состоянием Lua, может быть недостаточно.

Кроме того,даже если это работает, два процесса не могут получить доступ к одному и тому же объекту lua_State одновременно, точно так же, как два потока в одном процессе не могут получить доступ к lua_State одновременно.

0 голосов
/ 23 сентября 2019

Состояние lua не предназначено для того, чтобы покинуть программу / поток, в котором оно выполняется.

Выполнение запроса на работающем lua_state может привести к сбою, поскольку оно только условно согласовано, когда возвращается вызов luaили вызывается функция C api.Во время выполнения некоторые незаблокированные модификации могут вызывать неинициализированный доступ к памяти или бесконечные циклы из-за несовместимости списков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...