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

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

Вопросы по использованию 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
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

Latest post of the previous page:

John Doe wrote: Thu 21 Jan, 2021 08:40
citRiks wrote: Thu 21 Jan, 2021 01:07 а я сейчас тестирую без макросов, вроде есть успехи
С этого надо было начинать.
Очень может быть что (в разных скриптах) у вас присутствуют два отличающихся определения ffi.
Это проглатывается молча, но срабатывает только первое.
John Doe,
ну да, мой косяк, бесполезные время и эксперименты
хоть опыта с ФФИ стало больше, но этот "опыт ради опыта" опять ..
Проблема была в том была в том что я все иницилаизации-декларации ФФИ перенес (не меняя) из _macroinit.lua в LuaFar_init.lua.
т.е., в скрипт макроса все попадаем уже после этих деклараций, все равно, в обоих вариантах как с макроинит так и луафар_инит.
Все еще непонятно почему ои что это меняет, но как-то так.
В свое оправдание:
1.) Из прошлого опыта ФФИ на переопределения ругался сразу, (впрочем сейчас не уверен что помню)
поэтому я не думал что с этим связано
2.) Был сооблазн решить заменой на char[?], это получилось результативно сразу и быстро, но вот далее ..
3.) не было изменений кода используемого кода ФФИ в последние месяцы
Last edited by citRiks on Thu 21 Jan, 2021 12:16, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

citRiks wrote: Thu 21 Jan, 2021 11:32 Из прошлого опыта ФФИ на переопределения ругался сразу,
Так и есть, но не во всех случаях.
viewtopic.php?f=57&t=8418&p=147610#p147610
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

Надеюсь что подскажетe, почему ФФИ ругается на такое:

Code: Select all

ffi.cdef([[
DWORD fDsrHold : 1;
typedef struct {
    union {
        struct {
            ULONG Zone : 28;
            ULONG Level : 4;
        };
        ULONG Value;
    };
} SCOPE_ID, *PSCOPE_ID;
и вот это " : NNN" в Сях означает инициализацию с числом NNN, или что ?
Ашипка:
image.png
image.png (3.88 KiB) Viewed 6588 times
Last edited by citRiks on Tue 27 Apr, 2021 19:58, edited 2 times in total.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

Ругается на DWORD fDsrHold : 1;
Без этой строки ошибки нет, то есть битовые поля в структурах LuaJIT поддерживает, а вот в отдельной переменной видимо нет.
GCC (без дополнительных ключей) тоже выдаёт ошибку.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

citRiks wrote: Tue 27 Apr, 2021 19:48 DWORD fDsrHold : 1;
Откуда вы это взяли? Вне структуры в Си такого нет.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

Shmuel, Спасибо, круто на самом деле.
Узнал про битовые поля в структурах, про это в интернетах много.
А про битовые переменные ничего не нашел, да и в принципе непонятно как переменная может быть со сдвигом в битах?
Но, в скопированном мною коде, оказалось что далее использования fDsrHold и нет.
впрочем далее оказалось что сюрпризы не закончились:

Code: Select all

╔═══════════════════════════════════════════════════════════════════ LuaMacro ═══════════════════════════════════════════════════════════════════╗
║ ...g\Far Manager\Profile\Macros\modules\jit-tcp-srv\aaa.lua:1: declaration specifier expected near 'PTHREAD_START_ROUTINE'                     ║
║ stack traceback:                                                                                                                               ║
║    [C]: in function 'cdef'                                                                                                                     ║
║    ...g\Far Manager\Profile\Macros\modules\jit-tcp-srv\aaa.lua:1: in function 'chunk'                                                          ║

Code: Select all

ffi.cdef([[
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
typedef struct _CREATE_THREAD_DEBUG_INFO {
    HANDLE hThread;
    LPVOID lpThreadLocalBase;
    LPTHREAD_START_ROUTINE lpStartAddress;
} CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO;
]])
Но наверное тут уже можно закончить попытки оживить этот код, слишком много "чудес" в нем происходит
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

HaRT wrote: Wed 28 Apr, 2021 00:31 Откуда вы это взяли? Вне структуры в Си такого нет.
отсюда:
https://github.com/stuta/Luajit-Tcp-Ser ... indows.lua
смотрел что оттуда можно для чего-нибудь приспособить.
кое-что преуспел приспособить впрочем:
https://github.com/dr-dba/lua-jit-tcp-srv/
на остальное думаю что забью пока.

Last edited by citRiks on Wed 28 Apr, 2021 01:07, edited 3 times in total.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

citRiks wrote: Wed 28 Apr, 2021 00:50 Репозиторий не рабочий без разкомментирования --[[ local ffi = require "ffi" --]], т.к. у меня ФФИ сидит в глобале
А зачем это? Экономия аж одной строчки на макрофайл, успешно делающая его нерабочим на обычной нормальной системе.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

Shmuel wrote: Wed 28 Apr, 2021 16:12 А зачем это? Экономия аж одной строчки на макрофайл, успешно делающая его нерабочим на обычной нормальной системе.
было время когда я полагал что повторные require("ffi") делают какие-то проблемы.
сейчас проверил, вроде не делает проблем, вернул все require("ffi") в репозиторий.
Но в любом случае проблема для "обычной нормнальной системе" будет связана с этим:

Code: Select all

╔═══════════════════════════════════════════════════ LuaMacro ═══════════════════════════════════════════════════
║ ...ar Manager\Profile\Macros\modules\jit-tcp-srv\WTypes.lua:397: attempt to redefine '_LARGE_INTEGER' at line 2
║ stack traceback:
║    [C]: in function 'require'
║    [string "LE(require("jit-tcp-srv.lib_util"))"]:1: in main chunk
Что происходит, это то что в моей системе _LARGE_INTEGER уже defined,
и я должен убрать _LARGE_INTEGER там где он еще раз defined.
А на других системх, невозможно будет знать что уже defined а что еще нет.
По-крайней мере, я не знаю как это узнать.
Если у вас есть какие-то идеи или решения для этого, то буду рад услышать конечно
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

citRiks wrote: Wed 28 Apr, 2021 00:42 Но наверное тут уже можно закончить попытки оживить этот код, слишком много "чудес" в нем происходит
Впрочем не откажусь попробоват; разобраться еще раз,
если у кого-то есть идеи как этот PTHREAD_START_ROUTINE можно вылечить
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

citRiks wrote: Wed 28 Apr, 2021 18:57 Если у вас есть какие-то идеи или решения для этого, то буду рад услышать конечно
В теме же есть. В шапке даже (зачем-то).
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

John Doe wrote: Wed 28 Apr, 2021 20:23 В теме же есть. В шапке даже (зачем-то).
Это что-ли? :)
John Doe wrote: Tue 21 May, 2013 20:20 Предупреждение: viewtopic.php?p=147610#p147610
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

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

Post by citRiks »

1. Любое определение, сделанное посредством ffi.cdef, действует до конца сеанса.
Переопределить его невозможно: будет действовать определение, сделанное первым.
Ну нельзя, - так нельзя, я же не настаиваю что можно ..

PS
Ну существует (или .. ?) думаю что возможность попытаться определить в cdef(...),
если падаем, - то ловим exception чтобы не вылететь, и просто едем дальше.
но тогда это будет многовато работы чтобы разбить все определения на такие куски.
А значит без особой на то надобности (которую я пока не вижу) нет смысла так делать
Last edited by citRiks on Wed 28 Apr, 2021 20:53, edited 2 times in total.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

На мой взгляд, правильный подход, это:
- Разместить все вызовы ffi.cdef в одном или более модулях. То есть убрать эти вызовы из макрофайлов. В макрофайлах использовать require().
- Модули проконтролировать на отсутствие дубликатных вызовов.
- Поместить в любой из макрофайлов код package.nounload[<modulename>] = true для каждого модуля.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

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

Post by buniak_a_h »

citRiks wrote: Wed 28 Apr, 2021 18:57 было время когда я полагал что повторные require("ffi") делают какие-то проблемы.
Так действительно было, решение - добавление ffi в какой-то список - то ли в список package.preload, то ли в package.nounload (уже не помню). Потом что-то изменилось…
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

buniak_a_h wrote: Wed 28 Apr, 2021 22:08
citRiks wrote: Wed 28 Apr, 2021 18:57 было время когда я полагал что повторные require("ffi") делают какие-то проблемы.
Так действительно было, решение - добавление ffi в какой-то список - то ли в список package.preload, то ли в package.nounload (уже не помню). Потом что-то изменилось…
Повторные require("ffi") никогда не вызывали проблемы.
Проблемы возникают из-за того, что некоторые модули (например lpeg) не любят перезагрузки, видимо из-за внутренних дефектов.
Изменение в LuaMacro, о котором вы говорите, было в мае 2013, но оно не имело отношения к require "ffi".
Post Reply

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