common: compile libcommon as C++
[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
5a2f5f00 8#include <common/dynamic-array.h>
c0a66c84
JG
9#include <common/buffer-view.h>
10#include "payload-view.h"
11#include "payload.h"
12#include <stddef.h>
13
3e6e0df2
JG
14bool lttng_payload_view_is_valid(const struct lttng_payload_view *view)
15{
16 return view && lttng_buffer_view_is_valid(&view->buffer);
17}
18
c0a66c84
JG
19struct lttng_payload_view lttng_payload_view_from_payload(
20 const struct lttng_payload *payload, size_t offset,
21 ptrdiff_t len)
22{
3e6e0df2 23 return payload ? (struct lttng_payload_view) {
c0a66c84
JG
24 .buffer = lttng_buffer_view_from_dynamic_buffer(
25 &payload->buffer, offset, len),
fe489250 26 ._fd_handles = payload->_fd_handles,
3e6e0df2 27 } : (struct lttng_payload_view) {};
c0a66c84
JG
28}
29
c0a66c84
JG
30struct lttng_payload_view lttng_payload_view_from_view(
31 struct lttng_payload_view *view, size_t offset,
32 ptrdiff_t len)
33{
3e6e0df2 34 return view ? (struct lttng_payload_view) {
c0a66c84 35 .buffer = lttng_buffer_view_from_view(
ddab38d1 36 &view->buffer, offset, len),
fe489250 37 ._fd_handles = view->_fd_handles,
a6bc4ca9
SM
38 ._iterator = {
39 .p_fd_handles_position = view->_iterator.p_fd_handles_position ?:
fe489250 40 &view->_iterator.fd_handles_position,
a6bc4ca9
SM
41 }
42 } : (struct lttng_payload_view) {};
c0a66c84
JG
43}
44
c0a66c84
JG
45struct lttng_payload_view lttng_payload_view_from_dynamic_buffer(
46 const struct lttng_dynamic_buffer *buffer, size_t offset,
47 ptrdiff_t len)
48{
3e6e0df2 49 return buffer ? (struct lttng_payload_view) {
c0a66c84
JG
50 .buffer = lttng_buffer_view_from_dynamic_buffer(
51 buffer, offset, len)
3e6e0df2 52 } : (struct lttng_payload_view) {};
c0a66c84
JG
53}
54
5a2f5f00
JG
55struct lttng_payload_view lttng_payload_view_from_buffer_view(
56 const struct lttng_buffer_view *view, size_t offset,
57 ptrdiff_t len)
58{
3e6e0df2 59 return view ? (struct lttng_payload_view) {
5a2f5f00
JG
60 .buffer = lttng_buffer_view_from_view(
61 view, offset, len)
3e6e0df2 62 } : (struct lttng_payload_view) {};
5a2f5f00
JG
63}
64
e368fb43
JG
65struct lttng_payload_view lttng_payload_view_init_from_buffer(
66 const char *src, size_t offset, ptrdiff_t len)
67{
68 return (struct lttng_payload_view) {
69 .buffer = lttng_buffer_view_init(
70 src, offset, len)
71 };
72}
73
18eec1c9
JG
74int lttng_payload_view_get_fd_handle_count(
75 const struct lttng_payload_view *payload_view)
5a2f5f00
JG
76{
77 int ret;
78 size_t position;
79
80 if (!payload_view) {
81 ret = -1;
82 goto end;
83 }
84
fe489250 85 ret = lttng_dynamic_pointer_array_get_count(&payload_view->_fd_handles);
5a2f5f00
JG
86 if (ret < 0) {
87 goto end;
88 }
89
fe489250
JG
90 position = payload_view->_iterator.p_fd_handles_position ?
91 *payload_view->_iterator.p_fd_handles_position :
92 payload_view->_iterator.fd_handles_position;
5a2f5f00
JG
93 ret = ret - (int) position;
94end:
95 return ret;
96}
97
fe489250
JG
98struct fd_handle *lttng_payload_view_pop_fd_handle(
99 struct lttng_payload_view *view)
c0a66c84 100{
fe489250
JG
101 struct fd_handle *handle = NULL;
102 size_t fd_handle_count;
c0a66c84
JG
103 size_t *pos;
104
105 if (!view) {
c0a66c84
JG
106 goto end;
107 }
108
fe489250
JG
109 fd_handle_count = lttng_payload_view_get_fd_handle_count(view);
110 if (fd_handle_count == 0) {
c0a66c84
JG
111 goto end;
112 }
113
fe489250
JG
114 pos = view->_iterator.p_fd_handles_position ?
115 view->_iterator.p_fd_handles_position :
116 &view->_iterator.fd_handles_position;
a6bc4ca9 117 handle = (fd_handle *) lttng_dynamic_pointer_array_get_pointer(&view->_fd_handles,
fe489250 118 *pos);
c0a66c84 119 (*pos)++;
fe489250 120 fd_handle_get(handle);
c0a66c84 121end:
fe489250 122 return handle;
c0a66c84 123}
This page took 0.03456 seconds and 4 git commands to generate.