@dlangru

Страница 598 из 719
Ievgenii
13.06.2018
08:03:09
Меняем местами:

auto myIo = cast(MyIo*)clientIo.data; auto clientSock = myIo.fd; char[8192] buffer; long received; writeln(".data: ", clientIo.data, " myIo: ", myIo, " received: ", &received);

И уже выдает:

.data: 7FF33549FB70 myIo: 7FF33549FB70 received: 7FF33549FB70

Google
Ievgenii
13.06.2018
08:03:55
О.о

Тоесть переменаня received и взодной параметр myIo ссылаются на одну область памяти! О.о

Что за на?

Dark
13.06.2018
08:11:08
А работает то правильно?

Ievgenii
13.06.2018
08:21:38
Нет!)

Valeriy
13.06.2018
08:21:52
Что за на?
Если это классы, то нормально. В D вроде адрес можно только у структур брать. Адресс объектов класса ни чего не гарантирует. Т в т.ч. может быть и один адрес

Valeriy
13.06.2018
08:22:17
Тогда странно.

Ievgenii
13.06.2018
08:22:20
ыгы

Dark
13.06.2018
08:23:45
Можешь код куда-нить залить?

Поиграться хочу

Ievgenii
13.06.2018
08:25:06
сек

Google
Ievgenii
13.06.2018
08:32:51
Нашел в чем ошибка

Я объявлял структуру в одном методе

MyIo myIo;

А потом передавал указатель на нее

А у нее при таком подходе всегда одинаковый локальный адресс

Нужно было так:

MyIo* myIo = new MyIo;

О.о

Тогда, наверное, будет работать

Ну при синтетических тестах - работает

Valeriy
13.06.2018
08:35:53
MyIo* myIo = new MyIo;
Структуру через new. Что то не так.

Ievgenii
13.06.2018
08:36:04
Ну смотри

Самому не нравится

Но мне нужно передать структуру в ev_loop

Valeriy
13.06.2018
08:36:33
Понятно. У тебя переменная при выходе из скопа почистилась. Просто похоже ты как то не так передаёшь объет

Ievgenii
13.06.2018
08:36:39
Если я ее создам на стеке - при выходе из метода она удалится

Она создавалась на стеке и удалялась

А адрес у нее какой-то локальный, относительно метода...

Valeriy
13.06.2018
08:37:45
Она создавалась на стеке и удалялась
Эо понятно. Странно, что именно структуру приходется в куче размещать.

Ievgenii
13.06.2018
08:37:51
И при попадании в другой метод, адрес был локальный относительно второго метода О.о

Google
Ievgenii
13.06.2018
08:37:53
Или как-то так

Эо понятно. Странно, что именно структуру приходется в куче размещать.
ф-ция: void ev_io_init(ev_io* w, void function(ev_loop_t*, ev_io*, int) cb, int fd, int events)

struct ev_io { mixin EV_WATCHER_LIST!(ev_io); int fd; /* ro */ int events; /* ro */ }

Это же обвертка над Сишной либой

Там вообще нет альтернатив...

Так что как бы я не хотел - приходится делать new struct....

Я уже искал как создать объект без GC

Что-то не получилось алоцировать память с @nogc

Видать я тупой в эту сторону

Dark
13.06.2018
08:40:23
Ievgenii
13.06.2018
08:40:33
Пофиг

Говорит что нельзя такой метод пометить nogc

Ievgenii
13.06.2018
08:41:00
Хотя я там сам могу управлять этими объектами

Valeriy
13.06.2018
08:43:32
ф-ция: void ev_io_init(ev_io* w, void function(ev_loop_t*, ev_io*, int) cb, int fd, int events)
Обёртку над этим методом сделать методом структуры, а передаваемый в неё объект сделать полем структуры. Тогда при вызове метода объект будет размещён на стеке и гарантированно существовавать. И не придётся в куче выделять.

Ievgenii
13.06.2018
08:44:55
Сейчас попробую

Но мне кажется не прокатит

Maxim
13.06.2018
08:47:33
объект-то все равно в куче будет

Ievgenii
13.06.2018
08:48:38
Смотри

ev_io clientIo; MyIo* myIo = new MyIo; myIo.fd = clientSock; clientIo.data = cast(void*)myIo; ev_io_init(&clientIo, &clientCb, clientSock, EV_READ | EV_WRITE); ev_io_start(loop, &clientIo);

Вот такой код

Google
Ievgenii
13.06.2018
08:48:54
Segmentation fault (core dumped)

И это логично

Так как при выходе из метода, объект clientIo удаляется

Такой же код работает:

ev_io* clientIo = new ev_io; MyIo* myIo = new MyIo; myIo.fd = clientSock; clientIo.data = cast(void*)myIo; ev_io_init(clientIo, &clientCb, clientSock, EV_READ | EV_WRITE); ev_io_start(loop, clientIo);

Вариант делать глобальный массив этих структур - но это тоже самое, даже хуже...

Адрес смещения от метода, если я верно понимаю...

И при передаче его через указатель в другой метод, он как-то берет первый элемент стека принемаемой ф-ции

Admin
ERROR: S client not available

Ievgenii
13.06.2018
08:53:43
И просто ссылается на одну память

В этом и был баг

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

Maxim
13.06.2018
08:55:56
Mylo — это структура, которую как user data передавать надо что ли?

Ievgenii
13.06.2018
08:57:12
struct MyIo { uint fd; ubyte[] bufferIn; ubyte[] bufferOut; }

Да, это пользовательская структура

С входным буферов и исходящим

Maxim
13.06.2018
08:57:51
а чего бы ее тогда вообще не делать через malloc и не париться с GC?

Ievgenii
13.06.2018
08:58:18
Как?

Maxim
13.06.2018
08:58:30
у меня есть подозрение, что GC не может отслеживать указатели на GC-allocated memoty или может?

Google
Ievgenii
13.06.2018
08:58:47
Ну nogc такой метод пометить не вышло

Думаю может

Gets/sets the allocator for the current thread. This is the default allocator that should be used for allocating thread-local memory. For allocating memory to be shared across threads, use processAllocator (below). By default, theAllocator ultimately fetches memory from processAllocator, which in turn uses the garbage collected heap.

Maxim
13.06.2018
08:59:16
clientIo.data = cast(void*)malloc(Mylo.sizeof); не?

Ievgenii
13.06.2018
08:59:28
Что оно мне даст?

Я именно так и хотел сделать

Maxim
13.06.2018
08:59:42
ну и потом где-то там не забыть сделать free

Ievgenii
13.06.2018
08:59:51
Ну попробую

Maxim
13.06.2018
09:00:02
оно тебе даст место в куче размером со структуру Mylo

Ievgenii
13.06.2018
09:00:05
Но он все равно как-то GC задействует, я подумал что тогда профита нет

А new не так же?

Maxim
13.06.2018
09:00:35
new — это выделение памяти через GC

Ievgenii
13.06.2018
09:00:54
Тогда чего с nogc не пашет?

Maxim
13.06.2018
09:01:09
чего не пашет-то?)

очевидно, что в nogc коде нельзя выделять память через GC

и еще я не уверен, что указатель на структуру, скастованный к void* будет восприниматься как ссылка на структуру

ну и как себя будут чувствовать динамические массивы в структуре, сделанной через malloc, тоже непонятно

Ievgenii
13.06.2018
09:03:14
Ыгы

Попробую

Maxim
13.06.2018
09:04:05
есть упоротый вариант: сделать глобальный ассоциативный массив, в который пушить структуры, и дальше играться с указателями на них, а когда надо, удалять структуру из массива)

но это прям совсем упоротая упоротость, наверное, с огромным проседанием производительности)

Страница 598 из 719