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

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

Pavel
13.09.2018
19:24:13

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
указатель на структуру которая может быть в стеке?

Oleg
13.09.2018
19:29:48

Pavel
13.09.2018
19:29:52

Oleg
13.09.2018
19:30:10
а решения выдаю из своего понимания

Igor
13.09.2018
19:31:03

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

Pavel
13.09.2018
19:34:35

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

Pavel
13.09.2018
19:34:48

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

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

Pavel
13.09.2018
19:37:53

Oleg
13.09.2018
19:38:03
и соответственно когда итерация цикла заканчивается переменная m перестаёт существовать
да
а в другом потоке ты отправляешь во внешний код это дело
и хочешь быть уверен, что случайно там ничего не поменяют?

Pavel
13.09.2018
19:40:06
через 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…

Oleg
13.09.2018
19:43:21

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

Oleg
13.09.2018
19:44:51

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

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

Ievgenii
13.09.2018
19:47:41

Oleg
13.09.2018
19:47:47

Ievgenii
13.09.2018
19:47:58
Это и есть библиотеки

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

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

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

Igor
13.09.2018
19:48:30

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

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

Pavel
13.09.2018
19:49:06

Igor
13.09.2018
19:49:26
)))

Oleg
13.09.2018
19:49:47

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

Ievgenii
13.09.2018
19:49:51

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

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

Pavel
13.09.2018
19:50:51