Size: a a a

Rust — русскоговорящее сообществo

2020 October 17

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Mag Pie
но для начала было-бы неплохо понять размер *void
8 на обоих
источник

MP

Mag Pie in Rust — русскоговорящее сообществo
мусор в верхних байтах u64 говорит о том что не сходятся ABI, и это странно
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Mag Pie
в такой магии я не силен
в теории, я могу тупо юзать указатели в аргументах функций. А коды возврата вообще не юзать. Главное, что бы в итоге где-то это не крешанулось. Но путём тестов можно проверить, всовывает ли он в 6 аргументов нормальные данные.
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Mag Pie
мусор в верхних байтах u64 говорит о том что не сходятся ABI, и это странно
причём я все аби перебрал. А есть ли возможность в ++ указать, какого аби должна быть функция?
источник

MP

Mag Pie in Rust — русскоговорящее сообществo
Anton TrionProg
причём я все аби перебрал. А есть ли возможность в ++ указать, какого аби должна быть функция?
хз, зависит от наличия исходников анрила и желания понять с какими аргументами вызывается msvc
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Mag Pie
мусор в верхних байтах u64 говорит о том что не сходятся ABI, и это странно
я только i686 не пробовал т.к. видно же, что у меня приложение 64 бит.

Хм. мб можно найти как длл написать для анриала, и как её компилить.
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Mag Pie
хз, зависит от наличия исходников анрила и желания понять с какими аргументами вызывается msvc
хм, ну если заставить компилятор ругнуться, консоль должна отобразить.
Насколько я опытным путём понял, в большьшинстве АБИ аргументы передаются одинаково. Поэтому мб могу временно сделать через аргументы.
источник

DS

David Sorokin in Rust — русскоговорящее сообществo
Anton TrionProg
Привет. Нужна помощь с FFI. Странная хрень творится. В общих словах, DLLшка на расте должна вызвать функцию в екзешнике на C/C++. Поэтому функция на С становится колбеком и я её вызываю на расте.

Трабла в том, что возникают проблемы с возвращением этой функцией значения. Какой-то мусор возвращается(если число большое, маленькое срабатывает, возращение u32 работает), а если Option<ptr>, то вообще сегфолт. Вообще, функция должна возвращать указатель, но он, будучи 8мибайтным, ломается.

Сигнатура
pub type FooCallback = extern "C" fn(*mut c_void, Position2D) -> u64

На крестах:
u64 foo(SomeClass* class, Position2D position) { ..}

Position2D это структура, содержащая x:i32, y:i32

Вызов колбека растом:
let foo:FooCallback = ..//Я пропущу, там специальной функцией присваивается.
let value = foo(some_class, position);

Вот вроде всё работает, а внезапно сегфолт. Есть идеи? Может я забыл где-то приписать какой-то extern?

И что за хрень, что Option<*const c_void> весит 128 байт?!
В первую очередь проверить алокацию памяти. Если объект выделяется в одном модуле (сошка, дээлелька), т.е. создается одним алокатором, то тем же алокатором должен быть и удален, т.е. в том же модуле, где был создан объект. Имейте в виду, что растовский jemalloc встраивается в сам модуль, тогда как плюсовый (или сишный) перекрывает системный malloc, т.е. они работают независимо друг от друга.
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
David Sorokin
В первую очередь проверить алокацию памяти. Если объект выделяется в одном модуле (сошка, дээлелька), т.е. создается одним алокатором, то тем же алокатором должен быть и удален, т.е. в том же модуле, где был создан объект. Имейте в виду, что растовский jemalloc встраивается в сам модуль, тогда как плюсовый (или сишный) перекрывает системный malloc, т.е. они работают независимо друг от друга.
т.е. я должен из крестов вызывать дроп, что бы тот удалил объект из памяти?
источник

DS

David Sorokin in Rust — русскоговорящее сообществo
типа того, но для начала проверьте, отключив везде jemalloc, если его используете
если стало работать, то, возможно, дело именно в этом
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
David Sorokin
В первую очередь проверить алокацию памяти. Если объект выделяется в одном модуле (сошка, дээлелька), т.е. создается одним алокатором, то тем же алокатором должен быть и удален, т.е. в том же модуле, где был создан объект. Имейте в виду, что растовский jemalloc встраивается в сам модуль, тогда как плюсовый (или сишный) перекрывает системный malloc, т.е. они работают независимо друг от друга.
я завтра попробую запустить без аргументов в самом начале приложения, вдруг сработает. и то, пока у меня ещё просто. Я пока всякие векторы крестам не слал.
источник

DS

David Sorokin in Rust — русскоговорящее сообществo
дроп должен в модуль на расте попасть из плюсов
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
David Sorokin
типа того, но для начала проверьте, отключив везде jemalloc, если его используете
если стало работать, то, возможно, дело именно в этом
а как его отключить?
источник

DS

David Sorokin in Rust — русскоговорящее сообществo
если не включали, то может быть, и не используется
можно проверить весь список зависимостей
может быть, вообще, не в этом дело
источник

DS

David Sorokin in Rust — русскоговорящее сообществo
еще момент
источник

DS

David Sorokin in Rust — русскоговорящее сообществo
там нужно указывать, что используется либо сишное соглашение о вызовах, либо растовское
они - разные
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
David Sorokin
дроп должен в модуль на расте попасть из плюсов
хотя, вспоминаю.. всё-таки были у меня некие аллокейты. Надо будет посмотреть и вызвать до них.
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
David Sorokin
там нужно указывать, что используется либо сишное соглашение о вызовах, либо растовское
они - разные
Ну у меня потому колбек имеет такой тип
pub type FooCallback = extern "C" fn(*mut c_void, Position2D) -> u64
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
а вот вызывать такой колбек обычным растовским синтаксисом?
источник

DS

David Sorokin in Rust — русскоговорящее сообществo
раст сам делает вызов в нужном соглашении - он должен только точно знать, какое соглашение
источник