Здравствуйте, blp, Вы писали:
V_>>Сервис + per-user userspace GUI/headless процесс.
blp>Да, тут больше текста, но все равно непонятно. Задача, которую решает юнистек — это много сервисов, каждый из которых per-user-logged-on.
blp>Как ваша адова архитектура с одинм сервисом и потенциально несколькими процессами, в это вписывается? Например, как эти процессы корректно шатдаунить, когда юзер делает log off, чтобы они гарантированно успели деинициализироваться?
Сервис содержит в себе контекст пользователя. При закрытии user space app информируется сервис, далее делается необходимый shutdown на уровне сервиса.
Service (псевдокод):
onLogon(userId)
{
userContext = createContext(userId)
onUserLogon(userContext)
}
onLogoff(userId)
{
userContext = getUserContext(userId)
onUserLogoff(userContext)
}
onShutdown()
{
foreach userId in logonUsers
{
userContext = getUserContext(userId)
onUserLogOff(userContext)
}
// Деинициализация прошла, разрешаем shutdown
signalOsShutdownAllowed()
}
Можно и shutdown/startup зависимости добавить с другими, "singleton-kind" сервисами, не вижу в этом проблемы
User-space процессы шатдаунятся стандартным способом (SIGTERM, WM_CLOSE или что-там, без разницы). Что-то критичное, для чего нужно "попридержать" shutdown (buffers flush etc), выполняется в onUserLogOff(userContext), в контексте сервиса.