From: Sergei Epiphanov <serpiph@nikiet.ru> To: ALT Linux Team development discussions <devel@lists.altlinux.org> Subject: Re: [devel] Q: AptPkg.pm и два репозитария Date: Fri, 21 Jan 2011 18:16:57 +0300 Message-ID: <201101211816.57566.serpiph@nikiet.ru> (raw) In-Reply-To: <4D39991F.4050401@altlinux.org> В сообщении от 21 января 2011 17:33:03 автор Paul Wolneykien написал: > Большое спасибо, Сергей. Я сейчас пытаюсь сделать и так и этак, > посмотрим, что получится. Однако пока я не уверен в том, что > переназначение глобальной переменной это хорошая идея: При помощи local переменная лишь временно подменяется (на момент выполнения функции). > 1. я точно не знаю, как правильно создать новый экземпляр конфигурации > и как правильно его проинициализировать; и по идее не должен этого > знать, т.к. это внутренние «потроха» модуля; в документации написано, > что если просто загрузить модуль через use, то $_config будет > проинициализирована автоматически; хотелось бы использовать этот > механизм автонастройки для каждого экземпляра модуля; А что мешает при инициализации своего модуля скопировать (deep copy) текущее значение $_config (которое к этому времени уже будет проинициализировано)? > 2. что будет в многопоточной программе? я же не знаю, кто ещё > использует этот самый $Module::_config ? паранойя, кончено, т.к. у меня > нет параллельных сегментов программы, но хотелось бы иметь решение, > которое давало бы надёжную изоляцию. Вот здесь уже сложнее, надо изучать. Но другие подмены мне неизвестны, так как все описания хранятся в общем хеше (равно как и описание модуля). И для временных подмен значений разработчики перла советуют именно local. Тем более, что local - это лексическая подмена, то есть на момент выполнения этого куска программы. Можно в допмодуле организовать семафоры или мьютексы, тем самым не допуская параллельных вызовов основного модуля. Оптимальное решение, но трудоёмкое: самому переписать модуль так, чтобы он не имел ссылок на глобальные переменные (создав контекст вызова). В своё время я на своей работе при написании интерфейсного модуля на перл уходил от глобальных переменных, но там пришлось переписать ещё библиотеки, которые тупо лезли в глобальные переменные, благо были исходники. А проверить ссылки на $Module::_config достаточно внутри самого модуля: маловероятно, что кто-то ещё будет ковырять внутренности. Можно как-то так: package Module; $_config="0"; sub printc(){ print "config=$_config"; return; } 1; package Module1; use Module; sub AUTOLOAD{ { #lock mutex here local $Module::_config = $_[0]; my $program = $AUTOLOAD; $program =~ s/.*:://; @l = &{"Module::$program"}(@_[1..$#_]); $_[0] = $Module::_config; #release mutex here } return @l; } 1; package MAIN; use Module1; $cnf="2"; Module1::printc($cnf); С этим уже можно пробовать делать неограниченное количество контекстов. -- С уважением, Епифанов Сергей
prev parent reply other threads:[~2011-01-21 15:16 UTC|newest] Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-01-21 12:44 Paul Wolneykien 2011-01-21 12:50 ` Alexey I. Froloff 2011-01-21 13:55 ` Sergei Epiphanov 2011-01-21 14:33 ` Paul Wolneykien 2011-01-21 15:16 ` Sergei Epiphanov [this message]
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=201101211816.57566.serpiph@nikiet.ru \ --to=serpiph@nikiet.ru \ --cc=devel@lists.altlinux.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
ALT Linux Team development discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \ devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru public-inbox-index devel Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git