Настроить условие, которое будет срабатывать при наступлении определенного события
#include <ha/ham.h>
ham_condition_t * ham_condition( ham_entity_t *ehdl,
int type,
const char *cname,
unsigned flags );
- ehdl
- Дескриптор объекта HAM. Аргумент ehdl представляет собой дескриптор объекта, полученный либо:
- путём вызова ham_attach*() или ham_entity*() либо:
- путём вызова ham_entity_handle*() с существующим именем объекта. Поскольку условия связаны с объектами, дескриптор объекта (ehdl) должен быть доступен, прежде чем можно будет добавлять условия.
- type
- Тип:
- CONDDEATH
- Объект "умер". Смерть объекта обнаруживается для всех процессов в сеансе 1, для процессов, которые аварийно завершаются (обычно из-за доставки сигнала), и для процессов, которые присоединяются как самостоятельно присоединяемые объекты.
- CONDDETACH
- Объект отсоединился от HAM.
- CONDHBEATMISSEDLOW
- Объект пропустил контрольный сигнал "низкого" уровня важности.
- CONDHBEATMISSEDHIGH
- Объект пропустил контрольный сигнал "высокого" уровня важности.
- CONDRESTART
- Объект был перезапущен.
- cname
- Имя условия.
- flags
- Флаги:
- HCONDINDEPENDENT
- Указывает, что действия, связанные с данным условием, должны выполняться в отдельном потоке. Когда условие срабатывает, действия внутри него выполняются в порядке FIFO. Для нескольких условий, которые запускаются одновременно, условия обслуживаются в произвольном порядке. При установке данного флага, условие помечается как независимое, т.е. все действия, связанные с ним, выполняются в отдельном потоке, независимо от действий в других условиях.
- HCONDNOWAIT
- Указывает, что условие не может содержать никаких задержек действий (waitfor). Задержки действия обычно выполняются медленно и могут иметь значительные издержки. Это задержит выполнение последующих действий в списке. Указание
HCONDNOWAIT
гарантирует отсутствие задержек после срабатывания условия. - HREARMAFTERRESTART
- Указывает, что условие должно быть автоматически повторно установлено после перезапуска объекта, которому оно принадлежит. По умолчанию этот флаг отключен — условия автоматически удаляются при перезапуске объекта. Следует обратить внимание, что если объект, которому принадлежит условие, удаляется, данное условие также будет удалено, независимо от состояния данного флага.
libham
Данная функция вызывается, чтобы настроить условие, которое будет срабатывать при возникновении значимого события.
Каждый объект может быть связан с несколькими различными условиями, и с каждым из этих условий связан набор действий, которые будут выполняться в последовательности FIFO, когда условие истинно. Если объект имеет несколько условий, которые выполняются одновременно, с разными наборами действий, связанных с каждым условием, то все действия, связанные с каждым условием, выполняются последовательно.
Данный механизм позволяет объединять действия в наборы и удалять/управлять ими как единой «группой», а не как отдельными элементами.
Поскольку условия связаны с объектами, дескриптор объекта (ehdl) должен быть доступен прежде чем будут добавлены условия.
Аргумент cname — это имя условия. Оно должен быть уникальным для всех условий в данном объекте.
Когда условие срабатывает, выполняются все действия, определенные во всех условиях данного type. Когда объект "умирает", срабатывает условие типа HCONDDEATH
, и выполняются все действия во всех условиях, соответствующих этому типу.
 | Необходимо вызвать функцию ham_connect() перед первым вызовом ham_condition() в процессе. Если процесс вызывает ham_connect(), а затем вызывает fork(), дочерний процесс должен снова вызвать ham_connect(), прежде чем он сможет успешно вызвать ham_condition() для добавления условий. |
- Адрес
- Дескриптор условия данного объекта.
- NULL
- Возникла ошибка. Код ошибки записан в errno.
- EBADF
- Не удалось подключиться к HAM.
- EEXIST
- Переданное имя для действия уже существует.
- EINVAL
- Дескриптор, type или cnam некорректны (например, содержат символ
/
) или имеют значение NULL
. Не удалось подключиться к HAM. Это происходит, когда процесс, открывший соединение (используя ham_connect()), и процесс, вызывающий ham_condition(), не совпадают. - ENAMETOOLONG
- Указанное имя (в cname) слишком длинное, т.е. оно превышает
_POSIX_PATH_MAX
(определено в <limits.h>
). Обратите внимание, что общая длина имени объекта/условия/действия также ограничена _POSIX_PATH_MAX
. - ENOMEM
- Недостаточно памяти для создания нового дескриптора.
В дополнение к вышеуказанным ошибкам HAM возвращает любую ошибку, с которой он сталкивается при обслуживании данного запроса.
ЗОСРВ «Нейтрино»
- Нет
- Обработчик прерываний
- Нет
- Обработчик сигналов
- Нет
- В потоке
- Да
ham_attach(), ham_attach_self(), ham_condition_remove(), ham_connect(), ham_entity_handle()
Предыдущий раздел: Менеджер высокой готовности (HAM)