Not Running→Inactive

@startuml

autonumber

participant ApplicationManager
participant RialtoServerManager

ApplicationManager             ->  RialtoServerManager:               ChangeApplicationState(application_id, AppState::Inactive)
RialtoServerManager            ->  RialtoServerManager:               Generate unique session_management_socket_name for App to Rialto Session Server communication
RialtoServerManager            ->  RialtoServerManager:               Generate socketpair for Rialto Session Server to Server Manager communication
RialtoServerManager            ->  RialtoApplicationSessionServer **: Spawn(socketpair, session_management_socket_name, AppState::Inactive)
RialtoServerManager            ->  RialtoServerManager:               Start [1] second READY timer
RialtoServerManager            --> ApplicationManager:                OK/ERROR
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Allocate shared memory buffer
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Create listening socket & bind to session_management_socket_name
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Set current_state = Inactive

alt Previous steps succeeded (alloc shm, create socket, Connect)

RialtoApplicationSessionServer -// RialtoServerManager:    StateChanged(AppState::Inactive)
RialtoServerManager            ->  RialtoServerManager:    Cancel READY timer
RialtoServerManager            -// ApplicationManager:     StateChanged(application_id, AppState::Inactive)
ApplicationManager             ->  RialtoServerManager:    GetAppConnectionInfo()
RialtoServerManager            --> ApplicationManager:     session_management_socket_name

else Session Server initialisation failed

RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Close IPC connection with app
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Close listening socket (if created)
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Unmap shared memory (if created)
RialtoApplicationSessionServer -// RialtoServerManager:    StateChanged(AppState::Error)
RialtoServerManager            ->  RialtoServerManager:    Cancel READY timer
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer !!: Exit process
RialtoServerManager            -// ApplicationManager:     StateChanged(application_id, AppState::Error)

else READY timer expired

RialtoServerManager            ->  RialtoServerManager:    Kill spawned Rialto Application Session Server process
RialtoServerManager            -// ApplicationManager:     StateChanged(application_id, AppState::Error)

end

@enduml


3. socketpair is used to create the point-to-point IPC channel used for all Rialto Server Manager to Rialto Application Session Server communications

7/8. Session server creates the share memory region and listening socket that the app will use for sending AV data and control respectively.

10. Application Session Server sends first message so Server Manager knows that it is now up and running

13/14. Session Manager has an API to allow the Application Manager to get the socket name that the App will use for communication with Rialto which it should fetch as soon as it is notified that Rialto has moved the app out of the Not Running state so that it can be passed to the app/container when it is launched.

Inactive→Active

@startuml

autonumber

participant ApplicationManager
participant RialtoServerManager

ApplicationManager  ->  RialtoServerManager:    ChangeApplicationState(application_id, AppState::Active)
RialtoServerManager ->  RialtoApplicationSessionServer:    SetState(AppState::Active)
RialtoApplicationSessionServer --> RialtoServerManager:    OK/ERROR
RialtoServerManager --> ApplicationManager:     OK/ERROR
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Set current_state = Active
RialtoApplicationSessionServer -// RialtoServerManager:    StateChanged(AppState::Active)
RialtoServerManager -// ApplicationManager:     StateChanged(application_id, AppState::Active)

@enduml

2. RialtoServer manager will need to look up which RialtoApplicationSessionServer to which to send the notification

Not Running→Active

Same sequence as Not Running→Inactive but change target state to Active.

Active→Inactive

@startuml

autonumber

participant ApplicationManager
participant RialtoServerManager
participant RialtoApplicationSessionServer

ApplicationManager  ->  RialtoServerManager:    ChangeApplicationState(application_id, AppState::Inactive)
RialtoServerManager ->  RialtoApplicationSessionServer:    SetState(AppState::Inactive)
RialtoApplicationSessionServer --> RialtoServerManager:    OK/ERROR
RialtoServerManager --> ApplicationManager:    OK/ERROR
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Free any remaining CDM resources
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Free any remaining Player resources
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Set current_state = Inactive
RialtoApplicationSessionServer -// RialtoServerManager:    StateChanged(AppState::Inactive)
RialtoServerManager -// ApplicationManager:     StateChanged(application_id, AppState::Inactive)

@enduml


6. Free any Player resources means close any open GStreamer pipelines, for example those used for AV playback and/or UI audio.

Inactive→Not Running

@startuml

autonumber

participant ApplicationManager
participant RialtoServerManager
participant RialtoApplicationSessionServer

ApplicationManager  ->  RialtoServerManager:    ChangeApplicationState(application_id, AppState::NotRunning)
RialtoServerManager ->  RialtoApplicationSessionServer:    SetState(AppState::NotRunning)
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Close IPC connection with app
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Unmap shared memory
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Set current_state = NotRunning
RialtoApplicationSessionServer -// RialtoServerManager:    StateChanged(AppState::NotRunning)
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer !!: Exit process
RialtoServerManager -// ApplicationManager:     StateChanged(application_id, AppState::NotRunning)

@enduml


7. The Session Server process should self terminate once it has sent the NotRunning notification to the Server Manager.

Active→Not Running

Not shown for brevity, but should perform all of the cleanup operations in Rialto Sessions server shown in Active→Inactive & Inactive->Not Running.