docs: Add supported versions and fix-backport policy
[lttng-tools.git] / src / common / payload-view.cpp
CommitLineData
c0a66c84
JG
1/*
2 * Copyright (C) 2020 Jérémie Galarneau <jeremie.galarneau@efficios.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.1-only
5 *
6 */
7
c9e313bc
SM
8#include "payload-view.hpp"
9#include "payload.hpp"
28ab034a
JG
10
11#include <common/buffer-view.hpp>
12#include <common/dynamic-array.hpp>
13
c0a66c84
JG
14#include <stddef.h>
15
3e6e0df2
JG
16bool lttng_payload_view_is_valid(const struct lttng_payload_view *view)
17{
18 return view && lttng_buffer_view_is_valid(&view->buffer);
19}
20
28ab034a
JG
21struct lttng_payload_view
22lttng_payload_view_from_payload(const struct lttng_payload *payload, size_t offset, ptrdiff_t len)
c0a66c84 23{
28ab034a
JG
24 return payload ?
25 (struct lttng_payload_view){
26 .buffer = lttng_buffer_view_from_dynamic_buffer(
27 &payload->buffer, offset, len),
28 ._fd_handles = payload->_fd_handles,
29 ._iterator = {},
30 } :
31 (struct lttng_payload_view){
32 .buffer = {},
33 ._fd_handles = {},
34 ._iterator = {},
35 };
c0a66c84
JG
36}
37
28ab034a
JG
38struct lttng_payload_view
39lttng_payload_view_from_view(struct lttng_payload_view *view, size_t offset, ptrdiff_t len)
c0a66c84 40{
3e6e0df2 41 return view ? (struct lttng_payload_view) {
c0a66c84 42 .buffer = lttng_buffer_view_from_view(
ddab38d1 43 &view->buffer, offset, len),
fe489250 44 ._fd_handles = view->_fd_handles,
a6bc4ca9
SM
45 ._iterator = {
46 .p_fd_handles_position = view->_iterator.p_fd_handles_position ?:
fe489250 47 &view->_iterator.fd_handles_position,
1c9a0b0e 48 .fd_handles_position = 0,
a6bc4ca9 49 }
75864046
MJ
50 } : (struct lttng_payload_view) {
51 .buffer = {},
1c9a0b0e
MJ
52 ._fd_handles = {},
53 ._iterator = {},
75864046 54 };
c0a66c84
JG
55}
56
c0a66c84 57struct lttng_payload_view lttng_payload_view_from_dynamic_buffer(
28ab034a 58 const struct lttng_dynamic_buffer *buffer, size_t offset, ptrdiff_t len)
c0a66c84 59{
28ab034a
JG
60 return buffer ?
61 (struct lttng_payload_view){
62 .buffer = lttng_buffer_view_from_dynamic_buffer(buffer, offset, len),
63 ._fd_handles = {},
64 ._iterator = {},
65 } :
66 (struct lttng_payload_view){
67 .buffer = {},
68 ._fd_handles = {},
69 ._iterator = {},
70 };
c0a66c84
JG
71}
72
28ab034a
JG
73struct lttng_payload_view lttng_payload_view_from_buffer_view(const struct lttng_buffer_view *view,
74 size_t offset,
75 ptrdiff_t len)
5a2f5f00 76{
28ab034a
JG
77 return view ?
78 (struct lttng_payload_view){
79 .buffer = lttng_buffer_view_from_view(view, offset, len),
80 ._fd_handles = {},
81 ._iterator = {},
82 } :
83 (struct lttng_payload_view){
84 .buffer = {},
85 ._fd_handles = {},
86 ._iterator = {},
87 };
5a2f5f00
JG
88}
89
28ab034a
JG
90struct lttng_payload_view
91lttng_payload_view_init_from_buffer(const char *src, size_t offset, ptrdiff_t len)
e368fb43 92{
28ab034a
JG
93 return (struct lttng_payload_view){
94 .buffer = lttng_buffer_view_init(src, offset, len),
1c9a0b0e
MJ
95 ._fd_handles = {},
96 ._iterator = {},
e368fb43
JG
97 };
98}
99
28ab034a 100int lttng_payload_view_get_fd_handle_count(const struct lttng_payload_view *payload_view)
5a2f5f00
JG
101{
102 int ret;
103 size_t position;
104
105 if (!payload_view) {
106 ret = -1;
107 goto end;
108 }
109
fe489250 110 ret = lttng_dynamic_pointer_array_get_count(&payload_view->_fd_handles);
5a2f5f00
JG
111 if (ret < 0) {
112 goto end;
113 }
114
fe489250 115 position = payload_view->_iterator.p_fd_handles_position ?
28ab034a
JG
116 *payload_view->_iterator.p_fd_handles_position :
117 payload_view->_iterator.fd_handles_position;
5a2f5f00
JG
118 ret = ret - (int) position;
119end:
120 return ret;
121}
122
28ab034a 123struct fd_handle *lttng_payload_view_pop_fd_handle(struct lttng_payload_view *view)
c0a66c84 124{
cd9adb8b 125 struct fd_handle *handle = nullptr;
fe489250 126 size_t fd_handle_count;
c0a66c84
JG
127 size_t *pos;
128
129 if (!view) {
c0a66c84
JG
130 goto end;
131 }
132
fe489250
JG
133 fd_handle_count = lttng_payload_view_get_fd_handle_count(view);
134 if (fd_handle_count == 0) {
c0a66c84
JG
135 goto end;
136 }
137
28ab034a
JG
138 pos = view->_iterator.p_fd_handles_position ? view->_iterator.p_fd_handles_position :
139 &view->_iterator.fd_handles_position;
140 handle = (fd_handle *) lttng_dynamic_pointer_array_get_pointer(&view->_fd_handles, *pos);
c0a66c84 141 (*pos)++;
fe489250 142 fd_handle_get(handle);
c0a66c84 143end:
fe489250 144 return handle;
c0a66c84 145}
This page took 0.060888 seconds and 4 git commands to generate.