Monado OpenXR Runtime
Loading...
Searching...
No Matches

Server side IPC code. More...

Collaboration diagram for Server IPC:

Modules

 Server Internals
 These are only called by the platform-specific mainloop polling code.
 

Files

file  ipc_server.h
 Common server side code.
 
file  ipc_server_handle_helpers.h
 Helpers shared between the IPC server handle functions.
 
file  ipc_server_handler.c
 Handling functions called from generated dispatch function.
 
file  ipc_server_handler_app_policy.c
 IPC server handlers for app policy objects.
 
file  ipc_server_handler_body_tracker.c
 IPC server handlers for xrt_body_tracker.
 
file  ipc_server_handler_hand_tracker.c
 IPC server handlers for xrt_hand_tracker.
 
file  ipc_server_handler_io_cache.c
 IPC server handlers for xrt_io_cache.
 
file  ipc_server_handler_swapchain.c
 Swapchain handling functions called from generated dispatch function.
 
file  ipc_server_interface.h
 Interface for IPC server code.
 
file  ipc_server_mainloop_android.c
 Server mainloop details on Android.
 
file  ipc_server_mainloop_android.h
 Additional server entry points needed for Android.
 
file  ipc_server_mainloop_linux.c
 Server mainloop details on Linux.
 
file  ipc_server_mainloop_windows.cpp
 Server mainloop details on Windows.
 
file  ipc_server_objects.c
 Tracking objects to IDs.
 
file  ipc_server_objects.h
 Tracking objects to IDs.
 
file  ipc_server_per_client_thread.c
 Per client thread listening on the socket.
 
file  ipc_server_process.c
 Server process functions.
 
file  ipc_server_thread_shutdown.c
 IPC client thread shutdown and blocking I/O cancellation.
 
file  ipc_server_thread_shutdown.h
 IPC client thread shutdown and blocking I/O cancellation.
 

Data Structures

struct  ipc_swapchain_data
 Information about a single swapchain. More...
 
struct  ipc_client_state
 Holds the state for a single client. More...
 
struct  ipc_server_mainloop
 Platform-specific mainloop object for the IPC server. More...
 
struct  ipc_server
 Main IPC object for the server. More...
 
struct  ipc_server_main_info
 Information passed into the IPC server main function, used for customization of the IPC server. More...
 
struct  ipc_server_callbacks
 

Functions

xrt_result_t ipc_server_init_system_if_available_locked (struct ipc_server *s, volatile struct ipc_client_state *ics, bool *out_available)
 Finish setting up the server by creating the system, compositor and devices.
 
xrt_result_t ipc_server_get_client_app_state (struct ipc_server *s, uint32_t client_id, struct ipc_app_state *out_ias)
 Get the current state of a client.
 
xrt_result_t ipc_server_set_active_client (struct ipc_server *s, uint32_t client_id)
 Set the new active client.
 
xrt_result_t ipc_server_toggle_io_client (struct ipc_server *s, uint32_t client_id)
 Toggle the io for this client.
 
xrt_result_t ipc_server_set_client_io_blocks (struct ipc_server *s, uint32_t client_id, const struct ipc_client_io_blocks *blocks)
 Block certain types of IO for this client.
 
xrt_result_t ipc_server_get_client_session_running_state (struct ipc_server *s, uint32_t client_id, struct xrt_compositor_session_running_state *out_running_state)
 Get the session running state for this client.
 
xrt_result_t ipc_server_get_client_view_config (struct ipc_server *s, uint32_t client_id, enum xrt_view_type view_type, struct xrt_view_config *out_default_view_config, struct xrt_recommended_view_config *out_recommended_view_config)
 Get the view configuration for this client.
 
xrt_result_t ipc_server_set_client_recommended_view_config (struct ipc_server *s, uint32_t client_id, enum xrt_view_type view_type, const struct xrt_recommended_view_config *recommended_view_config)
 Set the recommended view configuration for this client.
 
void ipc_server_activate_session (volatile struct ipc_client_state *ics)
 Called by client threads to set a session to active.
 
void ipc_server_deactivate_session (volatile struct ipc_client_state *ics)
 Called by client threads to set a session to deactivate.
 
void ipc_server_update_state (struct ipc_server *s)
 Called by client threads to recalculate active client.
 
void * ipc_server_client_thread (void *_ics)
 Thread function for the client side dispatching.
 
static bool ipc_server_client_is_input_blocked (volatile struct ipc_client_state *ics, enum xrt_input_name name)
 Is the given input blocked for this client by its ipc_client_io_blocks.
 
static void ipc_server_client_filter_blocked_inputs (volatile struct ipc_client_state *ics, struct xrt_input *inputs, uint32_t input_count)
 Zero out the inputs that are blocked for this client, in place.
 
static void ipc_server_client_filter_blocked_outputs (volatile struct ipc_client_state *ics, struct xrt_output *outputs, uint32_t output_count)
 Zero out the outputs if outputs are blocked for this client, in place.
 
static xrt_result_t ipc_server_validate_output_value (volatile struct ipc_client_state *ics, const struct xrt_output_value *value)
 Plain output calls copy the value as is, so reject PCM values: they hold client pointers and must go through a varlen haptic output call.
 
static xrt_result_t ipc_server_validate_pcm_haptic_buffer (volatile struct ipc_client_state *ics, const struct ipc_pcm_haptic_buffer *buffer)
 Reject haptic output calls with no samples, since the message channel can't send zero bytes, or with more samples than the service will allocate, see IPC_MAX_PCM_HAPTIC_SAMPLES.
 
int ipc_server_main_common (const struct ipc_server_main_info *ismi, const struct ipc_server_callbacks *iscb, void *data)
 Common main function for starting the IPC service.
 
int ipc_server_main (int argc, char **argv, const struct ipc_server_main_info *ismi)
 Main entrypoint to the compositor process.
 
xrt_result_t ipc_server_objects_get_xdev_and_validate (volatile struct ipc_client_state *ics, uint32_t id, struct xrt_device **out_xdev)
 Get a device by its per-client-connection slot index.
 
xrt_result_t ipc_server_objects_get_xdev_id_or_add (volatile struct ipc_client_state *ics, struct xrt_device *xdev, uint32_t *out_id)
 Get or allocate a per-client-connection slot index for a device object.
 
xrt_result_t ipc_server_objects_get_xtrack_and_validate (volatile struct ipc_client_state *ics, uint32_t id, struct xrt_tracking_origin **out_xtrack)
 Get a tracking origin by ID, must only be called from the per client thread as this function accesses the client state's memory.
 
xrt_result_t ipc_server_objects_get_xtrack_id_or_add (volatile struct ipc_client_state *ics, struct xrt_tracking_origin *xtrack, uint32_t *out_id)
 Get a tracking origin ID for a given tracking origin object, must only be called from the per client thread as this function accesses the client state's memory.
 
xrt_result_t ipc_server_objects_get_xspc_and_validate (volatile struct ipc_client_state *ics, uint32_t id, struct xrt_space **out_xspc)
 Get a space by ID, must only be called from the per client thread.
 
xrt_result_t ipc_server_objects_get_xspc_id_or_add (volatile struct ipc_client_state *ics, struct xrt_space *xspc, uint32_t *out_id)
 Track a space and return its ID.
 
xrt_result_t ipc_server_objects_destroy_xspc (volatile struct ipc_client_state *ics, uint32_t id)
 Destroy a tracked space.
 
xrt_result_t ipc_server_objects_get_xbt_and_validate (volatile struct ipc_client_state *ics, uint32_t id, struct xrt_body_tracker **out_xbt)
 Get a body tracker by ID, must only be called from the per client thread.
 
xrt_result_t ipc_server_objects_get_xbt_id_or_add (volatile struct ipc_client_state *ics, struct xrt_body_tracker *xbt, uint32_t *out_id)
 Track a newly created body tracker and return its ID.
 
xrt_result_t ipc_server_objects_destroy_xbt (volatile struct ipc_client_state *ics, uint32_t id)
 Destroy a tracked body tracker.
 
xrt_result_t ipc_server_objects_get_xht_and_validate (volatile struct ipc_client_state *ics, uint32_t id, struct xrt_hand_tracker **out_xht)
 Get a hand tracker by ID, must only be called from the per client thread.
 
xrt_result_t ipc_server_objects_get_xht_id_or_add (volatile struct ipc_client_state *ics, struct xrt_hand_tracker *xht, uint32_t *out_id)
 Track a newly created hand tracker and return its ID.
 
xrt_result_t ipc_server_objects_destroy_xht (volatile struct ipc_client_state *ics, uint32_t id)
 Destroy a tracked hand tracker.
 
xrt_result_t ipc_server_objects_get_xic_and_validate (volatile struct ipc_client_state *ics, uint32_t id, struct xrt_io_cache **out_xic)
 Get an input/output cache by ID, must only be called from the per client thread.
 
xrt_result_t ipc_server_objects_get_xic_id_or_add (volatile struct ipc_client_state *ics, struct xrt_io_cache *xic, uint32_t *out_id)
 Track a newly created input/output cache and return its ID.
 
xrt_result_t ipc_server_objects_destroy_xic (volatile struct ipc_client_state *ics, uint32_t id)
 Destroy a tracked input/output cache.
 

Detailed Description

Server side IPC code.

Function Documentation

◆ ipc_server_activate_session()

void ipc_server_activate_session ( volatile struct ipc_client_state *  ics)

#include <ipc/server/ipc_server.h>

Called by client threads to set a session to active.

References lock, and ipc_client_state::server.

◆ ipc_server_client_filter_blocked_inputs()

static void ipc_server_client_filter_blocked_inputs ( volatile struct ipc_client_state *  ics,
struct xrt_input *  inputs,
uint32_t  input_count 
)
inlinestatic

#include <ipc/server/ipc_server_handle_helpers.h>

Zero out the inputs that are blocked for this client, in place.

References ipc_server_client_is_input_blocked(), and U_ZERO.

◆ ipc_server_client_filter_blocked_outputs()

static void ipc_server_client_filter_blocked_outputs ( volatile struct ipc_client_state *  ics,
struct xrt_output *  outputs,
uint32_t  output_count 
)
inlinestatic

#include <ipc/server/ipc_server_handle_helpers.h>

Zero out the outputs if outputs are blocked for this client, in place.

References U_ZERO.

◆ ipc_server_client_is_input_blocked()

◆ ipc_server_client_thread()

void * ipc_server_client_thread ( void *  _ics)

#include <ipc/server/ipc_server.h>

Thread function for the client side dispatching.

Referenced by ipc_server_handle_client_connected().

◆ ipc_server_deactivate_session()

void ipc_server_deactivate_session ( volatile struct ipc_client_state *  ics)

#include <ipc/server/ipc_server.h>

Called by client threads to set a session to deactivate.

References lock, and ipc_client_state::server.

◆ ipc_server_get_client_app_state()

xrt_result_t ipc_server_get_client_app_state ( struct ipc_server *  s,
uint32_t  client_id,
struct ipc_app_state *  out_ias 
)

#include <ipc/server/ipc_server.h>

Get the current state of a client.

References lock.

◆ ipc_server_get_client_session_running_state()

xrt_result_t ipc_server_get_client_session_running_state ( struct ipc_server *  s,
uint32_t  client_id,
struct xrt_compositor_session_running_state *  out_running_state 
)

#include <ipc/server/ipc_server.h>

Get the session running state for this client.

References lock.

◆ ipc_server_get_client_view_config()

xrt_result_t ipc_server_get_client_view_config ( struct ipc_server *  s,
uint32_t  client_id,
enum xrt_view_type  view_type,
struct xrt_view_config *  out_default_view_config,
struct xrt_recommended_view_config *  out_recommended_view_config 
)

#include <ipc/server/ipc_server.h>

Get the view configuration for this client.

References lock.

◆ ipc_server_init_system_if_available_locked()

xrt_result_t ipc_server_init_system_if_available_locked ( struct ipc_server *  s,
volatile struct ipc_client_state *  ics,
bool *  out_available 
)

#include <ipc/server/ipc_server.h>

Finish setting up the server by creating the system, compositor and devices.

References ipc_client_state::has_init_shm_system, XRT_SUCCESS, xso, xsys, xsysc, and xsysd.

Referenced by ipc_server_main_common().

◆ ipc_server_main()

int ipc_server_main ( int  argc,
char **  argv,
const struct ipc_server_main_info *  ismi 
)

#include <ipc/server/ipc_server_interface.h>

Main entrypoint to the compositor process.

Both socket_filename and pid_filename in ismi must be set, otherwise this fails and returns -1.

References ipc_server_callbacks::client_connected, ipc_server_callbacks::client_disconnected, ipc_server_callbacks::init_failed, ipc_server_main_common(), ipc_server_callbacks::mainloop_entering, and ipc_server_callbacks::mainloop_leaving.

◆ ipc_server_main_common()

◆ ipc_server_objects_destroy_xbt()

xrt_result_t ipc_server_objects_destroy_xbt ( volatile struct ipc_client_state *  ics,
uint32_t  id 
)

◆ ipc_server_objects_destroy_xht()

xrt_result_t ipc_server_objects_destroy_xht ( volatile struct ipc_client_state *  ics,
uint32_t  id 
)

◆ ipc_server_objects_destroy_xic()

xrt_result_t ipc_server_objects_destroy_xic ( volatile struct ipc_client_state *  ics,
uint32_t  id 
)

◆ ipc_server_objects_destroy_xspc()

xrt_result_t ipc_server_objects_destroy_xspc ( volatile struct ipc_client_state *  ics,
uint32_t  id 
)

◆ ipc_server_objects_get_xbt_and_validate()

xrt_result_t ipc_server_objects_get_xbt_and_validate ( volatile struct ipc_client_state *  ics,
uint32_t  id,
struct xrt_body_tracker **  out_xbt 
)

#include <ipc/server/ipc_server_objects.h>

Get a body tracker by ID, must only be called from the per client thread.

References ipc_client_state::server, ipc_client_state::xbts, XRT_ERROR_IPC_FAILURE, and XRT_SUCCESS.

◆ ipc_server_objects_get_xbt_id_or_add()

xrt_result_t ipc_server_objects_get_xbt_id_or_add ( volatile struct ipc_client_state *  ics,
struct xrt_body_tracker *  xbt,
uint32_t *  out_id 
)

#include <ipc/server/ipc_server_objects.h>

Track a newly created body tracker and return its ID.

Takes ownership of xbt until explicit destroy or client disconnect.

References ipc_client_state::server, ipc_client_state::xbts, XRT_ERROR_IPC_FAILURE, and XRT_SUCCESS.

◆ ipc_server_objects_get_xdev_and_validate()

xrt_result_t ipc_server_objects_get_xdev_and_validate ( volatile struct ipc_client_state *  ics,
uint32_t  id,
struct xrt_device **  out_xdev 
)

#include <ipc/server/ipc_server_objects.h>

Get a device by its per-client-connection slot index.

The id is a uint32_t index into ics->objects.xdevs used for IPC message lookups. It is not xrt_device::id.

Must only be called from the per client thread as this function accesses the client state's memory.

Parameters
icsThe client state instance.
idThe per-client slot index.
out_xdevWill be filled with the device object on success.
Returns
XRT_SUCCESS on success, some other result on failure.

References xrt_device::id, ipc_client_state::server, ipc_client_state::xdevs, XRT_ERROR_IPC_FAILURE, XRT_SUCCESS, and XRT_SYSTEM_MAX_DEVICES.

◆ ipc_server_objects_get_xdev_id_or_add()

xrt_result_t ipc_server_objects_get_xdev_id_or_add ( volatile struct ipc_client_state *  ics,
struct xrt_device *  xdev,
uint32_t *  out_id 
)

#include <ipc/server/ipc_server_objects.h>

Get or allocate a per-client-connection slot index for a device object.

The returned uint32_t is used in IPC messages to look up xdev on the server. It is not xrt_device::id, which is assigned at device creation and synchronized to clients via ipc_device_info.

Must only be called from the per client thread as this function accesses the client state's memory.

Parameters
icsThe client state instance.
xdevThe device object.
out_idWill be filled with the slot index on success.
Returns
XRT_SUCCESS on success, some other result on failure.

References ipc_server_objects_get_xtrack_id_or_add(), ipc_client_state::server, xrt_device::str, xrt_device::tracking_origin, ipc_client_state::xdevs, XRT_ERROR_IPC_FAILURE, XRT_SUCCESS, and XRT_SYSTEM_MAX_DEVICES.

◆ ipc_server_objects_get_xht_and_validate()

xrt_result_t ipc_server_objects_get_xht_and_validate ( volatile struct ipc_client_state *  ics,
uint32_t  id,
struct xrt_hand_tracker **  out_xht 
)

#include <ipc/server/ipc_server_objects.h>

Get a hand tracker by ID, must only be called from the per client thread.

References ipc_client_state::server, ipc_client_state::xhts, XRT_ERROR_IPC_FAILURE, and XRT_SUCCESS.

◆ ipc_server_objects_get_xht_id_or_add()

xrt_result_t ipc_server_objects_get_xht_id_or_add ( volatile struct ipc_client_state *  ics,
struct xrt_hand_tracker *  xht,
uint32_t *  out_id 
)

#include <ipc/server/ipc_server_objects.h>

Track a newly created hand tracker and return its ID.

Takes ownership of xht until explicit destroy or client disconnect.

References ipc_client_state::server, ipc_client_state::xhts, XRT_ERROR_IPC_FAILURE, and XRT_SUCCESS.

◆ ipc_server_objects_get_xic_and_validate()

xrt_result_t ipc_server_objects_get_xic_and_validate ( volatile struct ipc_client_state *  ics,
uint32_t  id,
struct xrt_io_cache **  out_xic 
)

#include <ipc/server/ipc_server_objects.h>

Get an input/output cache by ID, must only be called from the per client thread.

References ipc_client_state::server, ipc_client_state::xics, XRT_ERROR_IPC_FAILURE, and XRT_SUCCESS.

◆ ipc_server_objects_get_xic_id_or_add()

xrt_result_t ipc_server_objects_get_xic_id_or_add ( volatile struct ipc_client_state *  ics,
struct xrt_io_cache *  xic,
uint32_t *  out_id 
)

#include <ipc/server/ipc_server_objects.h>

Track a newly created input/output cache and return its ID.

Takes ownership of xic until explicit destroy or client disconnect.

References ipc_client_state::server, ipc_client_state::xics, XRT_ERROR_IPC_FAILURE, and XRT_SUCCESS.

◆ ipc_server_objects_get_xspc_and_validate()

xrt_result_t ipc_server_objects_get_xspc_and_validate ( volatile struct ipc_client_state *  ics,
uint32_t  id,
struct xrt_space **  out_xspc 
)

#include <ipc/server/ipc_server_objects.h>

Get a space by ID, must only be called from the per client thread.

References ipc_client_state::server, XRT_ERROR_IPC_FAILURE, XRT_SUCCESS, and ipc_client_state::xspcs.

◆ ipc_server_objects_get_xspc_id_or_add()

xrt_result_t ipc_server_objects_get_xspc_id_or_add ( volatile struct ipc_client_state *  ics,
struct xrt_space *  xspc,
uint32_t *  out_id 
)

#include <ipc/server/ipc_server_objects.h>

Track a space and return its ID.

Grabs and stores a reference if newly tracked.

References ipc_client_state::server, XRT_ERROR_IPC_FAILURE, xrt_space::xrt_space_reference(), XRT_SUCCESS, and ipc_client_state::xspcs.

◆ ipc_server_objects_get_xtrack_and_validate()

xrt_result_t ipc_server_objects_get_xtrack_and_validate ( volatile struct ipc_client_state *  ics,
uint32_t  id,
struct xrt_tracking_origin **  out_xtrack 
)

#include <ipc/server/ipc_server_objects.h>

Get a tracking origin by ID, must only be called from the per client thread as this function accesses the client state's memory.

Parameters
icsThe client state instance.
idThe tracking origin ID.
out_xtrackWill be filled with the tracking origin object on success.
Returns
XRT_SUCCESS on success, some other result on failure.

References ipc_client_state::server, XRT_ERROR_IPC_FAILURE, XRT_SUCCESS, XRT_SYSTEM_MAX_DEVICES, and ipc_client_state::xtracks.

◆ ipc_server_objects_get_xtrack_id_or_add()

xrt_result_t ipc_server_objects_get_xtrack_id_or_add ( volatile struct ipc_client_state *  ics,
struct xrt_tracking_origin *  xtrack,
uint32_t *  out_id 
)

#include <ipc/server/ipc_server_objects.h>

Get a tracking origin ID for a given tracking origin object, must only be called from the per client thread as this function accesses the client state's memory.

Parameters
icsThe client state instance.
xtrackThe tracking origin object.
out_idWill be filled with the tracking origin ID on success.
Returns
XRT_SUCCESS on success, some other result on failure.

References xrt_tracking_origin::name, ipc_client_state::server, XRT_ERROR_IPC_FAILURE, XRT_SUCCESS, XRT_SYSTEM_MAX_DEVICES, and ipc_client_state::xtracks.

Referenced by ipc_server_objects_get_xdev_id_or_add().

◆ ipc_server_set_active_client()

xrt_result_t ipc_server_set_active_client ( struct ipc_server *  s,
uint32_t  client_id 
)

#include <ipc/server/ipc_server.h>

Set the new active client.

References lock.

◆ ipc_server_set_client_io_blocks()

xrt_result_t ipc_server_set_client_io_blocks ( struct ipc_server *  s,
uint32_t  client_id,
const struct ipc_client_io_blocks *  blocks 
)

#include <ipc/server/ipc_server.h>

Block certain types of IO for this client.

References lock.

◆ ipc_server_set_client_recommended_view_config()

xrt_result_t ipc_server_set_client_recommended_view_config ( struct ipc_server *  s,
uint32_t  client_id,
enum xrt_view_type  view_type,
const struct xrt_recommended_view_config *  recommended_view_config 
)

#include <ipc/server/ipc_server.h>

Set the recommended view configuration for this client.

References lock.

◆ ipc_server_toggle_io_client()

xrt_result_t ipc_server_toggle_io_client ( struct ipc_server *  s,
uint32_t  client_id 
)

#include <ipc/server/ipc_server.h>

Toggle the io for this client.

References lock.

◆ ipc_server_update_state()

void ipc_server_update_state ( struct ipc_server *  s)

#include <ipc/server/ipc_server.h>

Called by client threads to recalculate active client.

References lock.

◆ ipc_server_validate_output_value()

static xrt_result_t ipc_server_validate_output_value ( volatile struct ipc_client_state *  ics,
const struct xrt_output_value *  value 
)
inlinestatic

#include <ipc/server/ipc_server_handle_helpers.h>

Plain output calls copy the value as is, so reject PCM values: they hold client pointers and must go through a varlen haptic output call.

References ipc_client_state::server, XRT_ERROR_INVALID_ARGUMENT, and XRT_SUCCESS.

◆ ipc_server_validate_pcm_haptic_buffer()

static xrt_result_t ipc_server_validate_pcm_haptic_buffer ( volatile struct ipc_client_state *  ics,
const struct ipc_pcm_haptic_buffer *  buffer 
)
inlinestatic

#include <ipc/server/ipc_server_handle_helpers.h>

Reject haptic output calls with no samples, since the message channel can't send zero bytes, or with more samples than the service will allocate, see IPC_MAX_PCM_HAPTIC_SAMPLES.

References IPC_MAX_PCM_HAPTIC_SAMPLES, ipc_client_state::server, XRT_ERROR_INVALID_ARGUMENT, and XRT_SUCCESS.