ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] Q: AptPkg.pm и два репозитария
@ 2011-01-21 12:44 Paul Wolneykien
  2011-01-21 12:50 ` Alexey I. Froloff
  2011-01-21 13:55 ` Sergei Epiphanov
  0 siblings, 2 replies; 5+ messages in thread
From: Paul Wolneykien @ 2011-01-21 12:44 UTC (permalink / raw)
  To: ALT Linux Team development discussions


  Здравствуйте, все.

  Есть такой перловый модуль AptPkg.pm, который является обёрткой над
libapt-pkg. И он даже вполне пристойно работает, за исключением одной
маленькой детали: большинство объектов работают с глобальной переменной
$_config которая определяет рабочую конфигурацию APT (apt.conf). И
получается, что я не могу иметь два набора объектов, настроенных на
работу для двух разных репозитариев.
  Единственный вариант, до которого я додумался — это изоляция на уровне
процессов, но для решаемой задачи такой вариант очень неудобен: хочется
делать запросы к разным репозитариями в рамках единого процесса, а не
через именованные каналы.
  Вопрос к специалистам по Perl: можно ли каким-нибудь элегантным
образом всё-таки создать в данном случае два независимых набора
объектов? Например, каким-то образом дважды загрузить один и тот же
модуль, но проинициализировать каждый экземпляр по разному?

  Павел.


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [devel] Q: AptPkg.pm и два репозитария
  2011-01-21 12:44 [devel] Q: AptPkg.pm и два репозитария Paul Wolneykien
@ 2011-01-21 12:50 ` Alexey I. Froloff
  2011-01-21 13:55 ` Sergei Epiphanov
  1 sibling, 0 replies; 5+ messages in thread
From: Alexey I. Froloff @ 2011-01-21 12:50 UTC (permalink / raw)
  To: ALT Devel discussion list

[-- Attachment #1: Type: text/plain, Size: 582 bytes --]

On Fri, Jan 21, 2011 at 03:44:11PM +0300, Paul Wolneykien wrote:
>   Есть такой перловый модуль AptPkg.pm, который является обёрткой над
> libapt-pkg. И он даже вполне пристойно работает, за исключением одной
> маленькой детали: большинство объектов работают с глобальной переменной
> $_config которая определяет рабочую конфигурацию APT (apt.conf). И
> получается, что я не могу иметь два набора объектов, настроенных на
> работу для двух разных репозитариев.
Так работает libapt-pkg.  Страдай.

-- 
Regards,    --
Sir Raorn.   --- http://thousandsofhate.blogspot.com/

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [devel] Q: AptPkg.pm и два репозитария
  2011-01-21 12:44 [devel] Q: AptPkg.pm и два репозитария Paul Wolneykien
  2011-01-21 12:50 ` Alexey I. Froloff
@ 2011-01-21 13:55 ` Sergei Epiphanov
  2011-01-21 14:33   ` Paul Wolneykien
  1 sibling, 1 reply; 5+ messages in thread
From: Sergei Epiphanov @ 2011-01-21 13:55 UTC (permalink / raw)
  To: ALT Linux Team development discussions

[-- Attachment #1: Type: Text/Plain, Size: 720 bytes --]

В сообщении от 21 января 2011 15:44:11 автор Paul Wolneykien написал:
>   Вопрос к специалистам по Perl: можно ли каким-нибудь элегантным
> образом всё-таки создать в данном случае два независимых набора
> объектов? Например, каким-то образом дважды загрузить один и тот же
> модуль, но проинициализировать каждый экземпляр по разному?

Через local попробуйте. Тестовый пример в аттаче.

-- 
С уважением, Епифанов Сергей

[-- Attachment #2: test.tar.bz2 --]
[-- Type: application/x-bzip-compressed-tar, Size: 448 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [devel] Q: AptPkg.pm и два репозитария
  2011-01-21 13:55 ` Sergei Epiphanov
@ 2011-01-21 14:33   ` Paul Wolneykien
  2011-01-21 15:16     ` Sergei Epiphanov
  0 siblings, 1 reply; 5+ messages in thread
From: Paul Wolneykien @ 2011-01-21 14:33 UTC (permalink / raw)
  To: devel

21.01.2011 16:55, Sergei Epiphanov пишет:
> В сообщении от 21 января 2011 15:44:11 автор Paul Wolneykien написал:
>>   Вопрос к специалистам по Perl: можно ли каким-нибудь элегантным
>> образом всё-таки создать в данном случае два независимых набора
>> объектов? Например, каким-то образом дважды загрузить один и тот же
>> модуль, но проинициализировать каждый экземпляр по разному?
> 
> Через local попробуйте. Тестовый пример в аттаче.

  Большое спасибо, Сергей. Я сейчас пытаюсь сделать и так и этак,
посмотрим, что получится. Однако пока я не уверен в том, что
переназначение глобальной переменной это хорошая идея:

  1. я точно не знаю, как правильно создать новый экземпляр конфигурации
и как правильно его проинициализировать; и по идее не должен этого
знать, т.к. это внутренние «потроха» модуля; в документации написано,
что если просто загрузить модуль через use, то $_config будет
проинициализирована автоматически; хотелось бы использовать этот
механизм автонастройки для каждого экземпляра модуля;

  2. что будет в многопоточной программе? я же не знаю, кто ещё
использует этот самый $Module::_config ? паранойя, кончено, т.к. у меня
нет параллельных сегментов программы, но хотелось бы иметь решение,
которое давало бы надёжную изоляцию.

  Павел.


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [devel] Q: AptPkg.pm и два репозитария
  2011-01-21 14:33   ` Paul Wolneykien
@ 2011-01-21 15:16     ` Sergei Epiphanov
  0 siblings, 0 replies; 5+ messages in thread
From: Sergei Epiphanov @ 2011-01-21 15:16 UTC (permalink / raw)
  To: ALT Linux Team development discussions

В сообщении от 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);

С этим уже можно пробовать делать неограниченное количество контекстов.

-- 
С уважением, Епифанов Сергей

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2011-01-21 15:16 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-21 12:44 [devel] Q: AptPkg.pm и два репозитария 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

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