The open source OpenXR runtime
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}