Skip to content

Commit 2668357

Browse files
Multi-slice bytes support (#439)
* wip * bytes tests and fixes * merge * warning fixes * use new zz_bytes on user side * rename zz_bytes -> z_bytes * merge * fmt * fixes * fixes * fixed svec implementation; fixed z_client_test checking string length; minor readability fixes; * fixe _z_sample_create signature * fix _z_trigger_local_subscriptions signature * fix attachment examples * fixed uninitialized owned_bytes pointer * added z_bytes_len and z_bytes_is_empty functions; updated docs * exposed z_bytes_reader_t * remove _Z_DO_AND_RETURN_IF_ERR since _Z_CLEAN_RETURN_IF_ERR does the same * serialization fixes * ensure that decoded z_bytes never contanin non-_is_alloc slice * added z_bytes_writer implementation * format * fixed attachments * use _ZP_UNUSED instead of (void)(...) * fixed _z_bytes_reader_read return value; fixed public z_bytes api; added public z_bytes_api tests;
1 parent 27000eb commit 2668357

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+2001
-600
lines changed

CMakeLists.txt

+6
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,8 @@ if(UNIX OR MSVC)
374374
add_executable(z_test_fragment_rx ${PROJECT_SOURCE_DIR}/tests/z_test_fragment_rx.c)
375375
add_executable(z_perf_tx ${PROJECT_SOURCE_DIR}/tests/z_perf_tx.c)
376376
add_executable(z_perf_rx ${PROJECT_SOURCE_DIR}/tests/z_perf_rx.c)
377+
add_executable(z_bytes_test ${PROJECT_SOURCE_DIR}/tests/z_bytes_test.c)
378+
add_executable(z_api_bytes_test ${PROJECT_SOURCE_DIR}/tests/z_api_bytes_test.c)
377379

378380
target_link_libraries(z_data_struct_test ${Libname})
379381
target_link_libraries(z_channels_test ${Libname})
@@ -388,6 +390,8 @@ if(UNIX OR MSVC)
388390
target_link_libraries(z_test_fragment_rx ${Libname})
389391
target_link_libraries(z_perf_tx ${Libname})
390392
target_link_libraries(z_perf_rx ${Libname})
393+
target_link_libraries(z_bytes_test ${Libname})
394+
target_link_libraries(z_api_bytes_test ${Libname})
391395

392396
configure_file(${PROJECT_SOURCE_DIR}/tests/modularity.py ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/modularity.py COPYONLY)
393397
configure_file(${PROJECT_SOURCE_DIR}/tests/raweth.py ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/raweth.py COPYONLY)
@@ -405,6 +409,8 @@ if(UNIX OR MSVC)
405409
add_test(z_keyexpr_test ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/z_keyexpr_test)
406410
add_test(z_api_null_drop_test ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/z_api_null_drop_test)
407411
add_test(z_api_double_drop_test ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/z_api_double_drop_test)
412+
add_test(z_bytes_test ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/z_bytes_test)
413+
add_test(z_api_bytes_test ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/z_api_bytes_test)
408414
endif()
409415

410416
if(BUILD_MULTICAST)

docs/api.rst

+22
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ Data Structures
5454
.. autoctype:: types.h::zp_send_keep_alive_options_t
5555
.. autoctype:: types.h::zp_send_join_options_t
5656
.. autoctype:: types.h::z_qos_t
57+
.. autoctype:: types.h::z_bytes_reader_t
58+
.. autoctype:: types.h::z_bytes_iterator_t
59+
5760

5861
Owned Types
5962
~~~~~~~~~~~
@@ -128,6 +131,10 @@ TODO: owned type description
128131
129132
Represents an array of non null-terminated string.
130133

134+
.. c:type:: z_owned_bytes_writer_t
135+
136+
Represents a writer for serialized data.
137+
131138
Loaned Types
132139
~~~~~~~~~~~
133140

@@ -201,6 +208,10 @@ TODO: loaned type description
201208
202209
Represents an array of non null-terminated string.
203210

211+
.. c:type:: z_loaned_bytes_writer_t
212+
213+
Represents a writer for serialized data.
214+
204215
View Types
205216
~~~~~~~~~~~
206217

@@ -319,6 +330,17 @@ Primitives
319330
.. autocfunction:: primitives.h::z_bytes_serialize_from_slice_copy
320331
.. autocfunction:: primitives.h::z_bytes_serialize_from_string
321332
.. autocfunction:: primitives.h::z_bytes_serialize_from_string_copy
333+
.. autocfunction:: primitives.h::z_bytes_empty
334+
.. autocfunction:: primitives.h::z_bytes_len
335+
.. autocfunction:: primitives.h::z_bytes_is_empty
336+
.. autocfunction:: primitives.h::z_bytes_get_iterator
337+
.. autocfunction:: primitives.h::z_bytes_iterator_next
338+
.. autocfunction:: primitives.h::z_bytes_get_reader
339+
.. autocfunction:: primitives.h::z_bytes_reader_read
340+
.. autocfunction:: primitives.h::z_bytes_reader_seek
341+
.. autocfunction:: primitives.h::z_bytes_reader_tell
342+
.. autocfunction:: primitives.h::z_bytes_get_writer
343+
.. autocfunction:: primitives.h::z_bytes_writer_write
322344
.. autocfunction:: primitives.h::z_timestamp_check
323345
.. autocfunction:: primitives.h::z_query_target_default
324346
.. autocfunction:: primitives.h::z_query_consolidation_auto

examples/unix/c11/z_get_attachment.c

+8-18
Original file line numberDiff line numberDiff line change
@@ -46,36 +46,26 @@ typedef struct kv_pairs_rx_t {
4646
static z_condvar_t cond;
4747
static z_mutex_t mutex;
4848

49-
size_t kv_pairs_size(kv_pairs_tx_t *kvp) {
50-
size_t ret = 0;
51-
for (size_t i = 0; i < kvp->len; i++) {
52-
// Size fields
53-
ret += 2 * sizeof(uint32_t);
54-
// Data size
55-
ret += strlen(kvp->data[i].key) + strlen(kvp->data[i].value);
56-
}
57-
return ret;
58-
}
59-
60-
_Bool create_attachment_iter(z_owned_bytes_t *kv_pair, void *context, size_t *curr_idx) {
49+
_Bool create_attachment_iter(z_owned_bytes_t *kv_pair, void *context) {
6150
kv_pairs_tx_t *kvs = (kv_pairs_tx_t *)(context);
6251
z_owned_bytes_t k, v;
6352
if (kvs->current_idx >= kvs->len) {
6453
return false;
6554
} else {
6655
z_bytes_serialize_from_string(&k, kvs->data[kvs->current_idx].key);
6756
z_bytes_serialize_from_string(&v, kvs->data[kvs->current_idx].value);
68-
zp_bytes_serialize_from_pair(kv_pair, z_move(k), z_move(v), curr_idx);
57+
z_bytes_serialize_from_pair(kv_pair, z_move(k), z_move(v));
6958
kvs->current_idx++;
7059
return true;
7160
}
7261
}
7362

7463
void parse_attachment(kv_pairs_rx_t *kvp, const z_loaned_bytes_t *attachment) {
75-
size_t curr_idx = 0;
76-
z_owned_bytes_t first, second;
77-
while ((kvp->current_idx < kvp->len) &&
78-
(zp_bytes_deserialize_into_pair(attachment, &first, &second, &curr_idx) == 0)) {
64+
z_owned_bytes_t kv, first, second;
65+
z_bytes_iterator_t iter = z_bytes_get_iterator(attachment);
66+
67+
while (kvp->current_idx < kvp->len && z_bytes_iterator_next(&iter, &kv)) {
68+
z_bytes_deserialize_into_pair(z_loan(kv), &first, &second);
7969
z_bytes_deserialize_into_string(z_loan(first), &kvp->data[kvp->current_idx].key);
8070
z_bytes_deserialize_into_string(z_loan(second), &kvp->data[kvp->current_idx].value);
8171
z_bytes_drop(&first);
@@ -220,7 +210,7 @@ int main(int argc, char **argv) {
220210
kvs[0] = (kv_pair_t){.key = "test_key", .value = "test_value"};
221211
kv_pairs_tx_t ctx = (kv_pairs_tx_t){.data = kvs, .current_idx = 0, .len = 1};
222212
z_owned_bytes_t attachment;
223-
zp_bytes_serialize_from_iter(&attachment, create_attachment_iter, (void *)&ctx, kv_pairs_size(&ctx));
213+
z_bytes_serialize_from_iter(&attachment, create_attachment_iter, (void *)&ctx);
224214
opts.attachment = z_move(attachment);
225215

226216
z_owned_closure_reply_t callback;

examples/unix/c11/z_pub_attachment.c

+3-15
Original file line numberDiff line numberDiff line change
@@ -35,27 +35,15 @@ typedef struct kv_pairs_t {
3535

3636
#if Z_FEATURE_PUBLICATION == 1
3737

38-
// Return the total serialized size of the key value pairs
39-
size_t kv_pairs_size(kv_pairs_t *kvp) {
40-
size_t ret = 0;
41-
for (size_t i = 0; i < kvp->len; i++) {
42-
// Size fields
43-
ret += 2 * sizeof(uint32_t);
44-
// Data size
45-
ret += strlen(kvp->data[i].key) + strlen(kvp->data[i].value);
46-
}
47-
return ret;
48-
}
49-
50-
_Bool create_attachment_iter(z_owned_bytes_t *kv_pair, void *context, size_t *curr_idx) {
38+
_Bool create_attachment_iter(z_owned_bytes_t *kv_pair, void *context) {
5139
kv_pairs_t *kvs = (kv_pairs_t *)(context);
5240
z_owned_bytes_t k, v;
5341
if (kvs->current_idx >= kvs->len) {
5442
return false;
5543
} else {
5644
z_bytes_serialize_from_string(&k, kvs->data[kvs->current_idx].key);
5745
z_bytes_serialize_from_string(&v, kvs->data[kvs->current_idx].value);
58-
zp_bytes_serialize_from_pair(kv_pair, z_move(k), z_move(v), curr_idx);
46+
z_bytes_serialize_from_pair(kv_pair, z_move(k), z_move(v));
5947
kvs->current_idx++;
6048
return true;
6149
}
@@ -172,7 +160,7 @@ int main(int argc, char **argv) {
172160
sprintf(buf_ind, "%d", idx);
173161
kvs[1] = (kv_pair_t){.key = "index", .value = buf_ind};
174162
kv_pairs_t ctx = (kv_pairs_t){.data = kvs, .current_idx = 0, .len = 2};
175-
zp_bytes_serialize_from_iter(&attachment, create_attachment_iter, (void *)&ctx, kv_pairs_size(&ctx));
163+
z_bytes_serialize_from_iter(&attachment, create_attachment_iter, (void *)&ctx);
176164
options.attachment = z_move(attachment);
177165

178166
// Add encoding value

examples/unix/c11/z_queryable_attachment.c

+8-7
Original file line numberDiff line numberDiff line change
@@ -58,25 +58,26 @@ size_t kv_pairs_size(kv_pairs_tx_t *kvp) {
5858
return ret;
5959
}
6060

61-
_Bool create_attachment_iter(z_owned_bytes_t *kv_pair, void *context, size_t *curr_idx) {
61+
_Bool create_attachment_iter(z_owned_bytes_t *kv_pair, void *context) {
6262
kv_pairs_tx_t *kvs = (kv_pairs_tx_t *)(context);
6363
z_owned_bytes_t k, v;
6464
if (kvs->current_idx >= kvs->len) {
6565
return false;
6666
} else {
6767
z_bytes_serialize_from_string(&k, kvs->data[kvs->current_idx].key);
6868
z_bytes_serialize_from_string(&v, kvs->data[kvs->current_idx].value);
69-
zp_bytes_serialize_from_pair(kv_pair, z_move(k), z_move(v), curr_idx);
69+
z_bytes_serialize_from_pair(kv_pair, z_move(k), z_move(v));
7070
kvs->current_idx++;
7171
return true;
7272
}
7373
}
7474

7575
void parse_attachment(kv_pairs_rx_t *kvp, const z_loaned_bytes_t *attachment) {
76-
size_t curr_idx = 0;
77-
z_owned_bytes_t first, second;
78-
while ((kvp->current_idx < kvp->len) &&
79-
(zp_bytes_deserialize_into_pair(attachment, &first, &second, &curr_idx) == 0)) {
76+
z_owned_bytes_t kv, first, second;
77+
z_bytes_iterator_t iter = z_bytes_get_iterator(attachment);
78+
79+
while (kvp->current_idx < kvp->len && z_bytes_iterator_next(&iter, &kv)) {
80+
z_bytes_deserialize_into_pair(z_loan(kv), &first, &second);
8081
z_bytes_deserialize_into_string(z_loan(first), &kvp->data[kvp->current_idx].key);
8182
z_bytes_deserialize_into_string(z_loan(second), &kvp->data[kvp->current_idx].value);
8283
z_bytes_drop(&first);
@@ -134,7 +135,7 @@ void query_handler(const z_loaned_query_t *query, void *ctx) {
134135
kvs[0] = (kv_pair_t){.key = "reply_key", .value = "reply_value"};
135136
kv_pairs_tx_t kv_ctx = (kv_pairs_tx_t){.data = kvs, .current_idx = 0, .len = 1};
136137
z_owned_bytes_t attachment;
137-
zp_bytes_serialize_from_iter(&attachment, create_attachment_iter, (void *)&kv_ctx, kv_pairs_size(&kv_ctx));
138+
z_bytes_serialize_from_iter(&attachment, create_attachment_iter, (void *)&kv_ctx);
138139

139140
z_query_reply_options_t options;
140141
z_query_reply_options_default(&options);

examples/unix/c11/z_sub_attachment.c

+5-4
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,11 @@ typedef struct kv_pairs_t {
3838
static int msg_nb = 0;
3939

4040
void parse_attachment(kv_pairs_t *kvp, const z_loaned_bytes_t *attachment) {
41-
size_t curr_idx = 0;
42-
z_owned_bytes_t first, second;
43-
while ((kvp->current_idx < kvp->len) &&
44-
(zp_bytes_deserialize_into_pair(attachment, &first, &second, &curr_idx) == 0)) {
41+
z_owned_bytes_t kv, first, second;
42+
z_bytes_iterator_t iter = z_bytes_get_iterator(attachment);
43+
44+
while (kvp->current_idx < kvp->len && z_bytes_iterator_next(&iter, &kv)) {
45+
z_bytes_deserialize_into_pair(z_loan(kv), &first, &second);
4546
z_bytes_deserialize_into_string(z_loan(first), &kvp->data[kvp->current_idx].key);
4647
z_bytes_deserialize_into_string(z_loan(second), &kvp->data[kvp->current_idx].value);
4748
z_bytes_drop(&first);

include/zenoh-pico/api/olv_macros.h

+26
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,29 @@
7373
} \
7474
}
7575

76+
#define _Z_OWNED_FUNCTIONS_PTR_TRIVIAL_IMPL(type, name) \
77+
_Bool z_##name##_check(const z_owned_##name##_t *obj) { return obj->_val != NULL; } \
78+
const z_loaned_##name##_t *z_##name##_loan(const z_owned_##name##_t *obj) { return obj->_val; } \
79+
z_loaned_##name##_t *z_##name##_loan_mut(z_owned_##name##_t *obj) { return obj->_val; } \
80+
void z_##name##_null(z_owned_##name##_t *obj) { obj->_val = NULL; } \
81+
z_owned_##name##_t *z_##name##_move(z_owned_##name##_t *obj) { return obj; } \
82+
int8_t z_##name##_clone(z_owned_##name##_t *obj, const z_loaned_##name##_t *src) { \
83+
int8_t ret = _Z_RES_OK; \
84+
obj->_val = (type *)z_malloc(sizeof(type)); \
85+
if (obj->_val != NULL) { \
86+
*obj->_val = *src; \
87+
} else { \
88+
ret = _Z_ERR_SYSTEM_OUT_OF_MEMORY; \
89+
} \
90+
return ret; \
91+
} \
92+
void z_##name##_drop(z_owned_##name##_t *obj) { \
93+
if ((obj != NULL) && (obj->_val != NULL)) { \
94+
z_free(obj->_val); \
95+
obj->_val = NULL; \
96+
} \
97+
}
98+
7699
#define _Z_OWNED_FUNCTIONS_RC_IMPL(name) \
77100
_Bool z_##name##_check(const z_owned_##name##_t *val) { return val->_rc.in != NULL; } \
78101
const z_loaned_##name##_t *z_##name##_loan(const z_owned_##name##_t *val) { return &val->_rc; } \
@@ -132,6 +155,9 @@
132155
// Gets internal value from refcounted type (e.g. z_loaned_session_t, z_query_t)
133156
#define _Z_RC_IN_VAL(arg) ((arg)->in->val)
134157

158+
// Checks if refcounted type is initialized
159+
#define _Z_RC_IS_NULL(arg) ((arg)->in == NULL)
160+
135161
// Gets internal value from refcounted owned type (e.g. z_owned_session_t, z_owned_query_t)
136162
#define _Z_OWNED_RC_IN_VAL(arg) ((arg)->_rc.in->val)
137163

0 commit comments

Comments
 (0)