@dlangru

Страница 684 из 719
Oleg
13.09.2018
19:24:00
тогда ничего не мешает этому плагину скопировать данные из твоей неизменяемой структуры и новую передать (с изменёнными полями)

Igor
13.09.2018
19:24:04
я думаю что достаточно immutable is = ms; и отдать плагинам is

Google
Oleg
13.09.2018
19:24:44
Да
тогда ты не защитишься номально от целенаправленной компрометации

Pavel
13.09.2018
19:25:03
тогда ты не защитишься номально от целенаправленной компрометации
От целенаправленной не нужно защищаться, нужно защищаться от глупости

Oleg
13.09.2018
19:25:57
может лучше использовать тогда ref immutable(Foo)?

и запретить конструирование структуры

Pavel
13.09.2018
19:26:22
А мне кажется я все равно не могу передать ссылку между тредами

Oleg
13.09.2018
19:26:31
а я могу

хз

Igor
13.09.2018
19:26:49
ссылку shared наверное можно

Pavel
13.09.2018
19:27:07
и что, написать receiveOnly!(ref immutable(Foo)) так можно?

Oleg
13.09.2018
19:27:29
https://run.dlang.io/is/2RUu9Z

блин, я про указатель

Igor
13.09.2018
19:28:19
не, это неверно в корне

Oleg
13.09.2018
19:28:35
дело в том что ref это не тип данных

Google
Oleg
13.09.2018
19:28:45
а тип параметра метода

Pavel
13.09.2018
19:28:50
Да я знаю, поэтому ref передавать нельзя, а указатель как-то по сишному

Igor
13.09.2018
19:29:15
указатель на структуру которая может быть в стеке?

Pavel
13.09.2018
19:29:52
может лучше использовать тогда ref immutable(Foo)?
Ты пытаешься решить проблему хоть как-то, так и я могу, причем 5 способов придумать. Я сетую на то что самый красивый и простой способ тупо не работает.

Pavel
13.09.2018
19:31:12
Мне просто придется вместо immutable struct S везде писать struct S {...} immutable S s = cast(immutable)receiveOnly!(S);

Расставлять лишние immutable и касты

Igor
13.09.2018
19:31:44
ты можешь и без cast это сделать. разве не?

Pavel
13.09.2018
19:31:52
а как он мог бы работать без ссылки и без копирования?
Я не прошу работать без копирования, я прошу работать с копированием :)

Igor
13.09.2018
19:32:19
а копирование ты запретил обьявив тип иммутабельным

Oleg
13.09.2018
19:32:30
ещё раз

Igor
13.09.2018
19:32:46
туда куда мы копируем уже есть структура кторая иммутабельна

я так понимаю проблему

Oleg
13.09.2018
19:33:21
я не до конца понимаю проблему

где хранятся эти структуры?

они выделяются на стеке или в куче?

Igor
13.09.2018
19:34:34
где хранятся эти структуры?
есть отправляющий тред и принимающий. между ними есть очередь. при отправке структуры помещаются в эту очередь и выгребаются оттуда

Google
Oleg
13.09.2018
19:34:42
почему передать просто копированием не immutable в поток, а потом в плагин передать immutable не годится? сколько живёт плагин? сколько живёт поток?

Pavel
13.09.2018
19:34:48
а копирование ты запретил обьявив тип иммутабельным
Нет, копирование я не запретил, вот доказательство https://run.dlang.io/is/uepZQR

Oleg
13.09.2018
19:35:11
тоесть есть поток, который живёт дольше остальных?

как выделяется новая структура?

Pavel
13.09.2018
19:35:46
тоесть есть поток, который живёт дольше остальных?
Все плагины и все потоки живут все время работы программы и могут обрабатывать тысячи входящих событий

Igor
13.09.2018
19:36:05
https://run.dlang.io/is/XIX3Pj

а так не работает

Oleg
13.09.2018
19:36:19
тогда как ты эти события размещаешь на стеке и расчитываешь, что они будут тоже жить всё время?

Pavel
13.09.2018
19:37:12
тогда как ты эти события размещаешь на стеке и расчитываешь, что они будут тоже жить всё время?
immutable struct EndpointEvent {...} EndpointEvent m = EndpointEvent( eventsTaskTid, update.message.addresser.id, update.message.addressee.id, update.message.text, ); вот так создается

Oleg
13.09.2018
19:37:35
соответственно это в цикле?

Pavel
13.09.2018
19:37:53
тогда как ты эти события размещаешь на стеке и расчитываешь, что они будут тоже жить всё время?
Ну если Есть событие A и создалась его копия A` и она ушла в другой тред, то структура A может спокойно умереть.

Oleg
13.09.2018
19:38:03
и соответственно когда итерация цикла заканчивается переменная m перестаёт существовать

да

а в другом потоке ты отправляешь во внешний код это дело

и хочешь быть уверен, что случайно там ничего не поменяют?

Pavel
13.09.2018
19:40:06
и соответственно когда итерация цикла заканчивается переменная m перестаёт существовать
Да но перед тем как закончится итерация я хочу разослать копии m по всем плагинам

через send

Oleg
13.09.2018
19:40:36
интерфейс метода плагина, принимающего структуру должен принимать immutable(Foo) и всё

Igor
13.09.2018
19:40:47
у тебф что прямо плагины слушают ?

Google
Igor
13.09.2018
19:40:59
или твой код, кторый потом плагинам отдаёт?

Oleg
13.09.2018
19:41:04
ну или ref immutable(Foo) или immutable(Foo)*

в зависимости от жизни переменной внутри потока-приёмника и времени обработки плагином

Pavel
13.09.2018
19:41:53
у тебф что прямо плагины слушают ?
плагин работает в одной Task и слушает void taskHandler() { while(true) { auto event = receiveOnly!EndpointEvent; if (event.text in triggers) { logger.warning("Found in triggers %s", event.text); } CommandHandler cmd = CommandHandler(event); auto commandTask = runTask(&cmd.run); } }

Igor
13.09.2018
19:42:50
ну тебе ничего не мешает наприсать immutable event = receiveOnly…

Pavel
13.09.2018
19:43:25
Не мешает, но представь вместо одного immutable struct S я буду во всех местах приписывать immutable

Igor
13.09.2018
19:43:37
нет

ты попробуй

Pavel
13.09.2018
19:44:10
А структуру придется объявлять не immutable

Admin
ERROR: S client not available

Ievgenii
13.09.2018
19:45:25
И все

Или сделай верно!

Оставь имутейбл

Выдели память, сделай структуру в куче

И передавай ее адрес

И все!

Oleg
13.09.2018
19:46:47
как вариант тоже

Google
Ievgenii
13.09.2018
19:46:51
И копирования не будет

И работать будет быстрее

Pavel
13.09.2018
19:47:02
Выдели память, сделай структуру в куче
Короче в очередной раз D доказал что никакой он не элегантный и лаконичный, а простой как c++ и go

Oleg
13.09.2018
19:47:02
и не изменит никто ничего

Oleg
13.09.2018
19:48:10
ты пытаешься присвоить уже созданному immutable объекту другой такой же

Ievgenii
13.09.2018
19:48:19
Сделай свою мини библиотеку, в которой серой это

Oleg
13.09.2018
19:48:22
получается тем самым ты пытаешься изменить его

Ievgenii
13.09.2018
19:48:30
Это не задача языка, а библиотеки!

Oleg
13.09.2018
19:49:00
и соответственно immutable объект менять запрещено

с языком то всё в порядке

Pavel
13.09.2018
19:49:06
ты пытаешься присвоить уже созданному immutable объекту другой такой же
Нет не пытаюсь, объект еще не создан. А вот receiveOnly его внутри себя создает незаполненным и поэтому ничего не может

Igor
13.09.2018
19:49:26
)))

Pavel
13.09.2018
19:49:50
Выдели память, сделай структуру в куче
Я знаю что если я так сделаю, сразу же пойдут мысли что в куче выделяется медленно, значит надо делать пул событий и переиспользовать их, этот пул будет отдельным классом, объект класса надо инъектировать в плагины и пошло поехало костыли велосипеды.

Igor
13.09.2018
19:49:58
такова селяви, нужно прмежуточное хранение. вот я поэтому и спрашиваю, есть ли реализация которая это обходит

Ievgenii
13.09.2018
19:50:09
Он же данные ещё не вычитал, чтобы создать сразу и наполнить

Pavel
13.09.2018
19:50:51
Он же данные ещё не вычитал, чтобы создать сразу и наполнить
Но по идее внутри receiveOnly он мог бы создавать и копировать стразу структуру целиком, а не строить ее по кусочкам. Вот где все обламывается.

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