The open source OpenXR runtime
at main 117 lines 3.1 kB view raw
1// Copyright 2025, Collabora, Ltd. 2// SPDX-License-Identifier: BSL-1.0 3/*! 4 * @file 5 * @brief IPC Client futures. 6 * @author Korcan Hussein <korcan@hussein.com> 7 * @ingroup ipc_client 8 */ 9 10#include "xrt/xrt_defines.h" 11 12#include "shared/ipc_message_channel.h" 13 14#include "client/ipc_client.h" 15#include "client/ipc_client_connection.h" 16 17#include "ipc_client_generated.h" 18 19struct ipc_client_future 20{ 21 struct xrt_future base; 22 struct ipc_connection *ipc_c; 23 uint32_t id; 24}; 25 26static inline struct ipc_client_future * 27ipc_client_future(struct xrt_future *xft) 28{ 29 return (struct ipc_client_future *)xft; 30} 31 32static inline const struct ipc_client_future * 33const_ipc_client_future(const struct xrt_future *xft) 34{ 35 return (const struct ipc_client_future *)xft; 36} 37 38static xrt_result_t 39get_state(const struct xrt_future *xft, enum xrt_future_state *out_state) 40{ 41 if (out_state == NULL) { 42 return XRT_ERROR_INVALID_ARGUMENT; 43 } 44 const struct ipc_client_future *ipc_xft = const_ipc_client_future(xft); 45 const xrt_result_t xret = ipc_call_future_get_state(ipc_xft->ipc_c, ipc_xft->id, out_state); 46 IPC_CHK_ALWAYS_RET(ipc_xft->ipc_c, xret, "ipc_call_future_get_state"); 47} 48 49static xrt_result_t 50get_result(const struct xrt_future *xft, struct xrt_future_result *out_ft_result) 51{ 52 if (out_ft_result == NULL) { 53 return XRT_ERROR_INVALID_ARGUMENT; 54 } 55 const struct ipc_client_future *ipc_xft = const_ipc_client_future(xft); 56 const xrt_result_t xret = ipc_call_future_get_result(ipc_xft->ipc_c, ipc_xft->id, out_ft_result); 57 IPC_CHK_ALWAYS_RET(ipc_xft->ipc_c, xret, "ipc_call_future_get_result"); 58} 59 60static xrt_result_t 61cancel(struct xrt_future *xft) 62{ 63 struct ipc_client_future *ipc_xft = ipc_client_future(xft); 64 const xrt_result_t xret = ipc_call_future_cancel(ipc_xft->ipc_c, ipc_xft->id); 65 IPC_CHK_ALWAYS_RET(ipc_xft->ipc_c, xret, "ipc_call_future_cancel"); 66} 67 68static xrt_result_t 69wait(struct xrt_future *xft, int64_t timeout_ns) 70{ 71 return XRT_ERROR_NOT_IMPLEMENTED; 72} 73 74static xrt_result_t 75is_cancel_requested(const struct xrt_future *xft, bool *out_request_cancel) 76{ 77 return XRT_ERROR_NOT_IMPLEMENTED; 78} 79 80static xrt_result_t 81complete(struct xrt_future *xft, const struct xrt_future_result *ft_result) 82{ 83 return XRT_ERROR_NOT_IMPLEMENTED; 84} 85 86static void 87destroy(struct xrt_future *xft) 88{ 89 struct ipc_client_future *ipc_xft = ipc_client_future(xft); 90 if (ipc_xft == NULL) { 91 return; 92 } 93 const xrt_result_t xret = ipc_call_future_destroy(ipc_xft->ipc_c, ipc_xft->id); 94 IPC_CHK_ONLY_PRINT(ipc_xft->ipc_c, xret, "ipc_call_future_destroy"); 95 96 free(ipc_xft); 97} 98 99struct xrt_future * 100ipc_client_future_create(struct ipc_connection *ipc_c, uint32_t future_id) 101{ 102 assert(ipc_c != NULL); 103 struct ipc_client_future *icft = U_TYPED_CALLOC(struct ipc_client_future); 104 struct xrt_future *xft = &icft->base; 105 xft->destroy = destroy; 106 xft->get_state = get_state; 107 xft->get_result = get_result; 108 xft->cancel = cancel; 109 xft->wait = wait; 110 xft->is_cancel_requested = is_cancel_requested; 111 xft->complete = complete; 112 xft->reference.count = 1; 113 icft->id = future_id; 114 icft->ipc_c = ipc_c; 115 116 return xft; 117}