Запросы топологии (7)
xsServerFind возвращает аренду со ссылкой, которую обязан парный xsServerRelease; параметры колбэка перечисления заимствуются только на время колбэка — перед сохранением обязателен xsServerRetain. host дополнительно защищён арендой своего server.xsServerFind запрос
Найти server по глобально уникальному имени; возвращает retained lease.
XS_ServerInfo* pSrv = xsServerFind("demo");
if ( pSrv != NULL ) {
/* используем данные топологии ... */
xsServerRelease(pSrv);
}
xsServerRetain / xsServerRelease запрос
Продлить аренду server / вернуть ссылку. Retain нужен на время жизни соединения и перед сохранением за пределами колбэка перечисления.
xsHostFind запрос
Найти host по имени внутри server; результат дополнительно защищён переданной арендой server (отдельный release не нужен).
xsEnumServers / xsEnumHosts запрос
Перечислить все server / все host одного server. Параметры заимствуются только на время колбэка.
static bool PrintServer(XS_ServerInfo* pServer, void* pUserData)
{
printf("server: %s (%s)\n", pServer->Name, pServer->Class);
return true; /* продолжаем перечисление */
}
xsEnumServers(PrintServer, NULL);
xsConfigRoot запрос
Возвращает верхнеуровневый Custom из xs.json (всё сверх предустановленных полей) — чтобы приложение читало свои ручки.
Горячая перезагрузка (7)
reload — это задача согласования желаемого состояния, а не синхронная команда. Автомат конечных состояний: ACCEPTED → PREPARING → SUCCEEDED / FAILED / SUPERSEDED / CANCELLED; новое намерение на том же server перекрывает неисполненные старые; предел очереди pending — 64.
xsReloadHostSubmit перезагрузка
Подать намерение перезагрузки одного host (единица публикации — его server).
xsReloadServerSubmit перезагрузка
Подать намерение перезагрузки целого server по имени.
xsReloadAllSubmit перезагрузка
Пакетная транзакция: кандидаты всех server прекомпилируются; любая неудача откатывает всё.
xsReloadQuery перезагрузка
Опросить конечное состояние намерения; результат несёт отпечаток содержимого Revision и описание цели.
| Поле XS_ReloadResult | Пояснение |
|---|---|
Id / State | ID намерения и одно из семи состояний |
Revision | отпечаток содержимого неизменяемого входного снимка (при отсутствии конфигурационного входа включает отпечаток скриптов) |
Target[160] / Message[256] | описание цели и сообщение результата (причина неудачи) |
XS_ReloadId iId = xsReloadHostSubmit(pHost);
XS_ReloadResult tRes;
if ( iId != 0 && xsReloadQuery(iId, &tRes) )
printf("reload #%llu: %d\n",
(unsigned long long)tRes.Id, (int)tRes.State);
xsReloadHost / xsReloadServer / xsReloadAll перезагрузка
bool-совместимые обёртки — сообщают лишь, вернул ли Submit ненулевое значение; конечного состояния не ждут.
Таймеры (2)
xsTimerAfter таймер
Одноразовый таймер, привязанный к поколению владельца — смена поколения автоматически гасит таймеры старого; в новый они не выстрелят.
static void OnTick(void* pUserData)
{
printf("tick: %s\n", (const char*)pUserData);
}
/* в ServiceInit: сработать один раз через 5 с */
(void)xsTimerAfter(pHost, 5000, OnTick, "hello");
xsTimerCancel таймер
Отменить таймер. ID, который уже сработал или погашен сменой поколения, вернёт false.
Развёртывание и вложенность (3)
xsAppPath развёртывание
Каталог приложения (исполняемого файла), UTF-8 — совпадает с каталогом конфигурации; якорь разбора относительных путей.
xsExtensionEnabled развёртывание
Рантайм-проверка: вкомпилировано ли расширение в этот вариант, по имени реестра (= аргументу сборки, как в стартовом баннере и --version). Без учёта регистра; зависимости, подтянутые через requires, тоже видны; неизвестное имя, пустая строка и NULL возвращают ложь без установки ошибки. Компиляционный эквивалент — #ifdef XS_USE_<имя>.
if ( xsExtensionEnabled("sqlite") ) {
/* в этом хосте есть sqlite — пользуемся напрямую */
db_open(&db);
} /* не вкомпилировано: идём запасным путём */
xsExtensionCount / xsExtensionName развёртывание
Перечисление расширений, вкомпилированных в этот вариант: count возвращает количество, name — имя по индексу (= аргументу сборки, тот же источник данных, что стартовый баннер и --version). Возвращаемый указатель заимствует статическую константу — действителен всё время жизни процесса, освобождать не нужно; выход за границы возвращает NULL без установки ошибки. В варианте default count равен 0; каждое имя из перечисления, переданное xsExtensionEnabled, даёт истину.
for ( uint32 i = 0; i < xsExtensionCount(); i++ ) {
printf("%u: %s
", i, xsExtensionName(i));
}
xsCreateTCC / xsDestroyTCC вложенность
Создать вложенный компилятор с предустановленными путями include/lib и импортом символов — фундамент системы плагинов на уровне приложения.
Передача состояния (1)
xsSwapTake передача
Действует только в ServiceInit нового поколения: забрать снимок, экспортированный ServiceSwap старого. Нет данных передачи — NULL.
static void ServiceInit(XS_HostInfo* pHost)
{
xvalue* pState = xsSwapTake(pHost);
if ( pState != NULL ) {
G_iCounter = xrtValueInt64(
xrtValueObjectGet(pState, "counter"));
xrtValueRelease(pState); /* забрали — освобождаем сами */
}
}