Size: a a a

2020 November 19

SZ

Sergey Zhmylove in Modern::Perl
Ааааа
источник

SZ

Sergey Zhmylove in Modern::Perl
Так тебе нужно два разных объекта
источник

W

Warstone in Modern::Perl
развей свою мыль
источник

SZ

Sergey Zhmylove in Modern::Perl
Warstone
развей свою мыль
По описанию задачи, проблема в том, что в родителе есть хеш, в ребенке есть хеш, но при чтении/изменении его элементов будет cow.
Мое suggested solution: класть хеш в shm, обращаться к нему через tied hashref, которая с помощью xs будет доставать нужные значения.
При изменении значения мы можем столкнуться с тем, что кладём в хеш либо nested structure, либо ссылку. В обоих случаях придется хандлить в xs что с этим делать
источник

W

Warstone in Modern::Perl
Ну для начала как только ты сказал tied так ты потерял скорость.
источник

SZ

Sergey Zhmylove in Modern::Perl
Warstone
Ну для начала как только ты сказал tied так ты потерял скорость.
Окей, тогда вообще тупо через функции
источник

W

Warstone in Modern::Perl
А смысл?.. У тебя будет что-то типа: my $a = $dict->get_var("cool.data") и это все будет каждый раз в локальном спейсе создавать $a со всеми нислежащими
источник

W

Warstone in Modern::Perl
Типа если у нас словарь:
{
 data => [] # long array
}

И мы пишем my $dict_data = $dict->get_var("data"); $dict_data->[3]
То будет скопирован весь массив и смысл?
источник

W

Warstone in Modern::Perl
Нет... Надо чтобы это были обычные переменные перла.
источник

SZ

Sergey Zhmylove in Modern::Perl
Warstone
А смысл?.. У тебя будет что-то типа: my $a = $dict->get_var("cool.data") и это все будет каждый раз в локальном спейсе создавать $a со всеми нислежащими
Я понимаю о чем ты, но это как раз nested structure, которую нужно хандлить
источник

W

Warstone in Modern::Perl
Давай упростим себе задачу... Данные readonly. У нас есть контракт, что после того как словарь "сформирован" - его нельзя менять. То есть он только readonly. Потому что если в потомке его менять, то в нормальном COW - он скопируется.
источник

SZ

Sergey Zhmylove in Modern::Perl
get_var("data") пусть, к примеру, вернет tied. Всяко быстрее, чем копипастить всю data, верно?)
источник

W

Warstone in Modern::Perl
Так можно не копипастить
источник

SZ

Sergey Zhmylove in Modern::Perl
Warstone
Давай упростим себе задачу... Данные readonly. У нас есть контракт, что после того как словарь "сформирован" - его нельзя менять. То есть он только readonly. Потому что если в потомке его менять, то в нормальном COW - он скопируется.
В случае с readonly всё становится проще, как мне кажется
источник

W

Warstone in Modern::Perl
Да
источник

W

Warstone in Modern::Perl
Потмоу и предлагаю.
источник

W

Warstone in Modern::Perl
Допустим мы создали словарь (вот тот с data)
источник

W

Warstone in Modern::Perl
После чего сделали:
my $dict = make_immutable($dict_prototype);
fork()
источник

W

Warstone in Modern::Perl
Вот этот make_immutable делает копию $dict_prototype в shm
источник

W

Warstone in Modern::Perl
То есть разворачивает там свою арену, копирует туда все содержимое прототипа, весм переменным в счетчике ссылок ставит MAX_REFCNT / 2 и т.д.
источник