Вопросы по использованию FFI

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
John Doe
Бюрократ
Posts: 12991
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 40 times
Been thanked: 309 times

Вопросы по использованию FFI

Post by John Doe »

FFI — одна из стандартных библиотек luajit.
Позволяет из Lua кода вызывать внешние C-функции и использовать структуры данных C.
В данной теме задаём вопросы по использованию FFI

Заготовка для документации: viewtopic.php?f=57&t=8418&p=147610#p147610

Примеры готовых скриптов:

Предупреждение: viewtopic.php?p=147610#p147610
Shmuel
Posts: 6189
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 337 times

Вопросы по использованию FFI

Post by Shmuel »

Latest post of the previous page:

По поводу предыдущего поста - есть продвижение в понимании проблемы.
Выполнение любого одного из следующих двух пунктов прекращает падения:

1. Запрет сборки мусора (lua:collectgarbage"stop").
2. Вставка в начало ф-ции Compare строки local foo = rsm.

Таким образом ясно, что падение вызывается освобождением величины rsm сборщиком мусора. Но возникает вопрос: какое право сборщик мусора имеет это делать, при том, что rsm является upvalue функции Compare, пусть даже она и не производит к нему доступа через Lua ???
Shmuel
Posts: 6189
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 337 times

Вопросы по использованию FFI

Post by Shmuel »

Всё, вопрос закрыт. Почему-то я был уверен, что величине достаточно быть upvalue у какой-то живой функции, чтобы спастись от сборщика мусора. Оказывается нет, если к величине нет обращений. Ниже следует пример (запускать из-под lua.exe (Lua 5.1) или luajit.exe).

Code: Select all

-- File 1: sum.lua
local pr = newproxy(true)
getmetatable(pr).__gc = function(o) io.write("__gc:",tostring(o),'\n') end
local function sum(a,b) return a+b end
return sum

Code: Select all

-- File 2: test.lua
local sum = dofile "sum.lua"
print(sum(3,4))
collectgarbage"collect"
print(sum(-3,-4))
Запускаем test.lua и видим, что величина pr подбирается сборщиком мусора, несмотря на то, что является upvalue функции sum.
User avatar
Aidar
Posts: 541
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 7 times
Contact:

Вопросы по использованию FFI

Post by Aidar »

Спасибо за информацию.
Вот полезная ссылка по теме: upvalue memory leak в LuaJIT.
Shmuel
Posts: 6189
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 337 times

Вопросы по использованию FFI

Post by Shmuel »

Aidar, спасибо за ссылку.
Меня сейчас (справедливо) поправили, что объявление переменной во внешнем окружении функции ещё не делает эту переменную upvalue.
User avatar
John Doe
Бюрократ
Posts: 12991
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 40 times
Been thanked: 309 times

Вопросы по использованию FFI

Post by John Doe »

Shmuel wrote: величине достаточно быть upvalue у какой-то живой функции, чтобы спастись от сборщика мусора.
Действительно неочевидный случай.
Будь RS lua-таблицей, обсуждаемая величина не была бы собрана сборщиком.

Впрочем, в документации предупреждали http://luajit.org/ext_ffi_semantics.html#gc
Shmuel
Posts: 6189
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 337 times

Вопросы по использованию FFI

Post by Shmuel »

John Doe wrote: Впрочем, в документации предупреждали http://luajit.org/ext_ffi_semantics.html#gc
Это совсем не тот материал из-за недопонимания которого я потратил много времени.
User avatar
John Doe
Бюрократ
Posts: 12991
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 40 times
Been thanked: 309 times

Вопросы по использованию FFI

Post by John Doe »

Это я отвечал сам себе
User avatar
John Doe
Бюрократ
Posts: 12991
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 40 times
Been thanked: 309 times

Получение привилегий backup/restore

Post by John Doe »

2useven10 wrote: Tue 17 Jun, 2014 14:33

Code: Select all

 if FALSE ~= A.LookupPrivilegeValueA(nil,"Se"..name.."Privilege",v.Privileges[0].Luid) then
Однако сказано, что второй аргумент функции представляет собой "A pointer to a null-terminated string". Наверно правильнее так:

Code: Select all

 if FALSE ~= A.LookupPrivilegeValueA(nil,"Se"..name.."Privilege\0",v.Privileges[0].Luid) then
Shmuel
Posts: 6189
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 337 times

Получение привилегий backup/restore

Post by Shmuel »

Любой стринг в Lua имеет дополнительный \0 в конце (в мануале отмечено).
2useven10
Posts: 4184
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 5 times
Been thanked: 204 times

Получение привилегий backup/restore

Post by 2useven10 »

Наверное правильнее. Поправил, хотя вроде бы и без этого работало...
Last edited by 2useven10 on Fri 08 Sep, 2017 20:21, edited 1 time in total.
2useven10
Posts: 4184
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 5 times
Been thanked: 204 times

Получение привилегий backup/restore

Post by 2useven10 »

Shmuel wrote: Fri 08 Sep, 2017 20:09Любой стринг в Lua имеет дополнительный \0 в конце (в мануале отмечено).
Отлично. Правку откатил.
User avatar
John Doe
Бюрократ
Posts: 12991
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 40 times
Been thanked: 309 times

Получение привилегий backup/restore

Post by John Doe »

Shmuel wrote: Fri 08 Sep, 2017 20:09Любой стринг в Lua имеет дополнительный \0 в конце (в мануале отмечено).
Действительно: https://www.lua.org/manual/5.1/manual.h ... _tolstring
Shmuel
Posts: 6189
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 337 times

Получение привилегий backup/restore

Post by Shmuel »

К сожалению, этого одного нуля недостаточно для стрингов в UTF-16. В своё время я предложил в форуме Lua, чтобы резервировалось место для двух нулей (\0\0), но предложение принято не было.
User avatar
Smitis
Posts: 1640
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 20 times
Been thanked: 41 times

Получение привилегий backup/restore

Post by Smitis »

Shmuel wrote: Fri 08 Sep, 2017 20:42К сожалению, этого одного нуля недостаточно для стрингов в UTF-16. В своё время я предложил в форуме Lua, чтобы резервировалось место для двух нулей (\0\0), но предложение принято не было.
Кстати, по поводу нуля. Обратил внимание, что в скриптах при вызове Utf8ToUtf16 добавляю "\0" к строке, на автомате, так сказать. Задумался - а разве Utf8ToUtf16 не должно конвертировать уже существующий "\0" в "\0\0"?
Разум когда-нибудь победит.
Shmuel
Posts: 6189
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 337 times

Получение привилегий backup/restore

Post by Shmuel »

Smitis wrote: Fri 08 Sep, 2017 20:51разве Utf8ToUtf16 не должно конвертировать уже существующий "\0" в "\0\0"?
Этот уже существующий \0 не является частью стринга - он лежит в его внутреннем представлении. Поэтому, если добавить в Utf8ToUtf16 к результату \0, мы нарушим корректность преобразования.
User avatar
John Doe
Бюрократ
Posts: 12991
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 40 times
Been thanked: 309 times

Получение привилегий backup/restore

Post by John Doe »

Shmuel wrote: Fri 08 Sep, 2017 20:42К сожалению, этого одного нуля недостаточно для стрингов в UTF-16. В своё время я предложил в форуме Lua, чтобы резервировалось место для двух нулей (\0\0), но предложение принято не было.
Совсем памяти нет, уже ведь обсуждали http://forum.farmanager.com/viewtopic.p ... 56#p111556, http://forum.farmanager.com/viewtopic.p ... 01#p115201
Post Reply

Return to “Нужна помощь”