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