mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-02-22 06:36:24 +00:00
ipc: Add session_destroy to handle session destruction
This commit is contained in:
parent
8a715ec41c
commit
8a191daa29
src/xrt/ipc
|
@ -662,6 +662,10 @@ ipc_compositor_destroy(struct xrt_compositor *xc)
|
||||||
|
|
||||||
assert(icc->compositor_created);
|
assert(icc->compositor_created);
|
||||||
|
|
||||||
|
IPC_ERROR(icc->ipc_c, "Called");
|
||||||
|
|
||||||
|
IPC_CALL_CHK(ipc_call_session_destroy(icc->ipc_c));
|
||||||
|
|
||||||
icc->compositor_created = false;
|
icc->compositor_created = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -374,6 +374,13 @@ ipc_server_update_state(struct ipc_server *s);
|
||||||
void *
|
void *
|
||||||
ipc_server_client_thread(void *_cs);
|
ipc_server_client_thread(void *_cs);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* This destroyes the native compositor for this client and any extra objects
|
||||||
|
* created from it, like all of the swapchains.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ipc_server_client_destroy_compositor(volatile struct ipc_client_state *ics);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @defgroup ipc_server_internals Server Internals
|
* @defgroup ipc_server_internals Server Internals
|
||||||
* @brief These are only called by the platform-specific mainloop polling code.
|
* @brief These are only called by the platform-specific mainloop polling code.
|
||||||
|
|
|
@ -103,6 +103,10 @@ ipc_handle_session_create(volatile struct ipc_client_state *ics, const struct xr
|
||||||
|
|
||||||
struct xrt_compositor_native *xcn = NULL;
|
struct xrt_compositor_native *xcn = NULL;
|
||||||
|
|
||||||
|
if (ics->xc != NULL) {
|
||||||
|
return XRT_ERROR_IPC_SESSION_ALREADY_CREATED;
|
||||||
|
}
|
||||||
|
|
||||||
xrt_result_t xret = xrt_syscomp_create_native_compositor(ics->server->xsysc, xsi, &xcn);
|
xrt_result_t xret = xrt_syscomp_create_native_compositor(ics->server->xsysc, xsi, &xcn);
|
||||||
if (xret != XRT_SUCCESS) {
|
if (xret != XRT_SUCCESS) {
|
||||||
return xret;
|
return xret;
|
||||||
|
@ -144,6 +148,20 @@ ipc_handle_session_end(volatile struct ipc_client_state *ics)
|
||||||
return xrt_comp_end_session(ics->xc);
|
return xrt_comp_end_session(ics->xc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xrt_result_t
|
||||||
|
ipc_handle_session_destroy(volatile struct ipc_client_state *ics)
|
||||||
|
{
|
||||||
|
IPC_TRACE_MARKER();
|
||||||
|
|
||||||
|
if (ics->xc == NULL) {
|
||||||
|
return XRT_ERROR_IPC_SESSION_NOT_CREATED;
|
||||||
|
}
|
||||||
|
|
||||||
|
ipc_server_client_destroy_compositor(ics);
|
||||||
|
|
||||||
|
return XRT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
xrt_result_t
|
xrt_result_t
|
||||||
ipc_handle_compositor_get_info(volatile struct ipc_client_state *ics, struct xrt_compositor_info *out_info)
|
ipc_handle_compositor_get_info(volatile struct ipc_client_state *ics, struct xrt_compositor_info *out_info)
|
||||||
{
|
{
|
||||||
|
|
|
@ -124,12 +124,37 @@ client_loop(volatile struct ipc_client_state *ics)
|
||||||
|
|
||||||
ipc_message_channel_close((struct ipc_message_channel *)&ics->imc);
|
ipc_message_channel_close((struct ipc_message_channel *)&ics->imc);
|
||||||
|
|
||||||
ics->num_swapchains = 0;
|
|
||||||
|
|
||||||
ics->server->threads[ics->server_thread_index].state = IPC_THREAD_STOPPING;
|
ics->server->threads[ics->server_thread_index].state = IPC_THREAD_STOPPING;
|
||||||
ics->server_thread_index = -1;
|
ics->server_thread_index = -1;
|
||||||
memset((void *)&ics->client_state, 0, sizeof(struct ipc_app_state));
|
memset((void *)&ics->client_state, 0, sizeof(struct ipc_app_state));
|
||||||
|
|
||||||
|
os_mutex_unlock(&ics->server->global_state.lock);
|
||||||
|
|
||||||
|
ipc_server_client_destroy_compositor(ics);
|
||||||
|
|
||||||
|
// Should we stop the server when a client disconnects?
|
||||||
|
if (ics->server->exit_on_disconnect) {
|
||||||
|
ics->server->running = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ipc_server_deactivate_session(ics);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* 'Exported' functions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
ipc_server_client_destroy_compositor(volatile struct ipc_client_state *ics)
|
||||||
|
{
|
||||||
|
// Multiple threads might be looking at these fields.
|
||||||
|
os_mutex_lock(&ics->server->global_state.lock);
|
||||||
|
|
||||||
|
ics->num_swapchains = 0;
|
||||||
|
|
||||||
// Destroy all swapchains now.
|
// Destroy all swapchains now.
|
||||||
for (uint32_t j = 0; j < IPC_MAX_CLIENT_SWAPCHAINS; j++) {
|
for (uint32_t j = 0; j < IPC_MAX_CLIENT_SWAPCHAINS; j++) {
|
||||||
// Drop our reference, does NULL checking. Cast away volatile.
|
// Drop our reference, does NULL checking. Cast away volatile.
|
||||||
|
@ -142,22 +167,8 @@ client_loop(volatile struct ipc_client_state *ics)
|
||||||
|
|
||||||
// Cast away volatile.
|
// Cast away volatile.
|
||||||
xrt_comp_destroy((struct xrt_compositor **)&ics->xc);
|
xrt_comp_destroy((struct xrt_compositor **)&ics->xc);
|
||||||
|
|
||||||
// Should we stop the server when a client disconnects?
|
|
||||||
if (ics->server->exit_on_disconnect) {
|
|
||||||
ics->server->running = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ipc_server_deactivate_session(ics);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* Entry point.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
void *
|
void *
|
||||||
ipc_server_client_thread(void *_ics)
|
ipc_server_client_thread(void *_ics)
|
||||||
{
|
{
|
||||||
|
|
|
@ -66,6 +66,8 @@
|
||||||
|
|
||||||
"session_end": {},
|
"session_end": {},
|
||||||
|
|
||||||
|
"session_destroy": {},
|
||||||
|
|
||||||
"compositor_get_info": {
|
"compositor_get_info": {
|
||||||
"out": [
|
"out": [
|
||||||
{"name": "info", "type": "struct xrt_compositor_info"}
|
{"name": "info", "type": "struct xrt_compositor_info"}
|
||||||
|
|
Loading…
Reference in a new issue