====== Модулі ядра ======
nokernel.pl – невеликий файл, що запускає модулі ядра.
Кожен модуль повинен мати підпрограму start, яка приймає 2 параметри:
* Прапор запущено модуль в монопольному режимі
* конфіг
Створимо конфіг для модуля kernel:: test. Обов'язковий параметр run вказує, чи буде модуль запускатися автоматично.
Файл kernel/test.cfg
run => 0
Файл kernel/test.pm
package kernel::test;
use strict;
use Debug;
our @ISA = qw{kernel};
sub start
{
my(undef, $single, $config) = @_;
tolog 'Тестовий модуль запущено. Він нічого не робить;
}
1;
Тут $single буде встановлено у випадку, коли модуль запущено в монопольному режимі: perl nokernel.pl -m=test. У монопольному режимі ядро запускає лише один модуль. Це може знадобитися у разі:
* У модулі присутні блокуючі операції, великі таймаути і т.д. Поки модуль виконуватиме тривалу операцію, решта буде в очікуванні.
* модуль використовують потоки, в яких задіяні малопотокові пакети, зокрема Db.
sub start
{
my(undef, $single, $config) = @_;
nod::tasks->new(
task => sub{ main($config) },
period => 5,
first_period => $single? 0 : 3,
);
}
sub main
{
my($config) = @_;
tolog '.';
}
Модуль кожні 5 секунд записує в балку (при запуску nokernel -d -m=test) або виводить на екран крапку. nod::tasks->new створює завдання, яке запускатиме кожні 5 секунд підпрограму main. При монопольному запуску перше виконання main буде зроблено відразу ж, інакше через 3 секунди (first_period = 3).