NAME
Salvation::DaemonDecl::Backend - Бэкэнд для Salvation::DaemonDecl
METHODS
get_meta( Str class )
Возвращает HashRef, представляющий описание демона.
Если описания для конкретного демона ещё нет - оно будет создано.
add_worker( HashRef meta, HashRef( Str :name!, CodeRef :main!, Int :max_instances!, CodeRef :log, Salvation::DaemonDecl::Transports :transport, CodeRef :reap, CodeRef :wrapper ) descr )
Добавляет новый воркер к описанию демона.
Воркер характеризуется следующими параметрами:
- name
-
Строка, представляющая имя воркера.
Обязательный параметр.
- main
-
Функция, представляющая основной код воркера, соверщающий одну итерацию и передающий управление вызвавшему его коду.
В эту функцию первым параметром будет передан экземпляр класса Salvation::DaemonDecl::Worker, соответствующий текущему воркеру, а далее - параметры, переданные воркеру при запуске.
В этой функции ни в коем случае не должно быть вечных циклов или вечного ожидания.
Обязательный параметр.
- max_instances
-
Целое число, представляющее максимальное количество экземпляров конкретного воркера, которое может существовать единовременно.
Обязательный параметр.
- log
-
Функция для логирования сообщений от воркера.
- transport
-
Битовая маска, представляющая собой способность воркера к общению с внешним миром.
Составляющие биты (далее перечислены константы):
- TRANSPORT_R
-
Воркер может принимать сообщения из внешнего мира.
- TRANSPORT_W
-
Воркер может отправлять сообщения во внешний мир.
- reap
-
Функция, представляющая код, выполняющийся в родительском процессе в момент, когда воркер завершается.
Первым аргументом функция получает идентификатор процесса завершившегося воркера.
- wrapper
-
Функция, представляющая обёртку вокруг кода, переданного в
main
.Если необходимо, чтобы основной код воркера выполнялся в вечном цикле или содержал вечное ожидание - это должно быть сделано в данной функции.
Первым параметром в функцию будет передан экземпляр класса Salvation::DaemonDecl::Worker, соответствующий текущему воркеру, вторым - CodeRef, представляющий основной код воркера, не принимающий никаких параметров.
can_spawn_worker( HashRef meta, Str worker )
Возвращает true
, если может быть порождён ещё один конкретный воркер, или false
, если воркер не может быть порождён.
has_alive_workers( HashRef meta, Str worker? )
Возвращает true
, если может быть порождён ещё один конкретный воркер, или false
, если воркер не может быть порождён.
Если имя воркера не передано - ворзвращает true
, если есть хотя бы один живой воркер, иначе - возвращает false
.
count_alive_workers( HashRef meta, Str worker )
Возвращает целое число, представляющее количество активных экземпляров конкретного воркера.
wait_all_workers( HashRef meta, Str worker? )
Блокирует до тех пор, пока все воркеры не завершатся.
wait_worker_slot( HashRef meta, Str worker )
Блокирует до тех пор, пока хотя бы один конкретный воркер не завершится.
spawn_worker( HashRef meta, Str worker, ArrayRef args? )
Порождает новый экземпляр конкретного воркера.
Возвращает идентификатор порождённого процесса.
daemon_main( HashRef meta, Str worker, ArrayRef args? )
Точка входа в демон.
Аргументы worker
и args
используются для вызова spawn_worker
. Предполагается, что так этот вызов породит главный воркер.
reinstall_signals( HashRef meta )
Переинициализирует обработчики сигналов.
Внутренний метод.
reap_worker( HashRef meta, HashRef worker, Int status )
Функция, обрабатывающая событие завершения работы конкретного воркера.
Внутренний метод.
serve_tunnel( HashRef meta, ArrayRef( Maybe[Ref] read, Maybe[Ref] write ) tun )
Функция, обрабатывающая запрос из одного конкретного тоннеля.
Внутренний метод.
serve_tunnel_by_prefix( HashRef meta, ArrayRef( Maybe[Ref] read, Maybe[Ref] write ) tun, Str{1} prefix )
Функция, обрабатывающая запрос известного типа из одного конкретного тоннеля.
Внутренний метод.
register_tmp_tunnel_handler( HashRef meta, Str prefix, Str|CodeRef method )
Регистрирует временный обработчик неизвестного ранее префикса сообщения, пришедшего в тоннель.
Такой обработчик выполняется, и тут же убирается из списка обработчиков.
Внутренни�� метод.
serve_discovery_request( HashRef meta, ArrayRef( Maybe[Ref] read, Maybe[Ref] write ) tun )
Функция, обрабатывающая запрос поиска тоннеля до конкретного воркера.
Внутренний метод.
serve_data_request( HashRef meta, ArrayRef( Maybe[Ref] read, Maybe[Ref] write ) tun )
Функция, обрабатывающая запрос отправки данных по тунелю до конкретного воркера.
Внутренний метод.
find_tunnel( HashRef meta, Int from, Int to, CodeRef cb, ArrayRef[Int] skip? )
Функция поиска тоннеля от одного воркера до другого.
Находит (или нет) и выполняет коллбэк.
Внутренний метод.
find_tunnel_deep( HashRef meta, Int from, Int to, HashRef skip, CodeRef cb )
Опрашивает соседних воркеров с целью поиска тоннеля, и выполняет коллбэк.
Внутренний метод.
ask_pid_about_tunnel( HashRef meta, Int from, Int to, Int pid, ArrayRef[Int] skip, CodeRef cb )
Спрашивает конкретный воркер, есть ли у него тоннель до конкретного воркера, и выполняет коллбэк.
Внутренний метод.
write_to( HashRef meta, Int pid, Str data )
Отправляет данные в конкретный воркер.
read_from( HashRef meta, Int pid, Int len, CodeRef cb )
Читает данные из конкретного воркера и выполняет коллбэк.
read_len( Int len, Ref pipe, CodeRef cb )
Читает сообщение определённой длины из пайпа и вызывает коллбэк.
Внутренний метод.
create_pipe()
Создаёт пайп.
Внутренний метод.
ae_handle_error_cb( AnyEvent::Handle h, Bool fatal, Str msg, AnyEvent::CondVar cv? )
Обработчик события ошибки для экземпляров класса AnyEvent::Handle.
Внутренний метод.
create_tunnel_manager( HashRef meta, ArrayRef( Ref read, Ref write ) tun )
Создаёт менеджер тоннеля.
Внутренний метод.
wait_cond( AnyEvent::CondVar cv )
Выполняет прерываемый $cv -
recv()>.
Внутренний метод.
worker_class()
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 5:
Non-ASCII character seen before =encoding in 'Бэкэнд'. Assuming UTF-8