Skip to content

Commit c788225

Browse files
Refactor resources & write filter for peer to peer unicast (#959)
* Refactor transport peers (#36) * refactor: transport peers * fix: set peer common as first member * Refactor resource system (#37) * feat: remove unused peer_id * refactor: mapping is now peer address as id * feat: store remote resource at peer level * fix: missing fix mapping * fix: missing init & memory leak * feat: propagate peer in triggers * Rework write filters (#38) * feat: remove unused peer_id * feat: store remote resource at peer level * fix: missing fix mapping * feat: propagate peer in triggers * feat: switch write filter to decl id list * feat: use peer addr to avoid id collisions * feat: update filter on peer disconnection * fix: add comment * feat: avoid recursive list parsing * feat: invalidate cache on peer disconnection * feat: push declarations on new unicast peer * feat: activate ke declaration on p2p unicast * fix: remove filter state init * feat: add replay declare function * fix: deactivate write filter on multicast * fix: read declare on single thread examples --------- Co-authored-by: Geoff Martin <geoff.martin@zettascale.tech>
1 parent 67ccb86 commit c788225

Some content is hidden

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

78 files changed

+1011
-834
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ jobs:
3535
CMAKE_GENERATOR=Ninja ASAN=ON make BUILD_TYPE=Debug test
3636
3737
run_windows_test:
38-
name: Run unit tests on windows-latest
38+
name: Run peer unicast test on windows-latest
3939
runs-on: windows-latest
4040
steps:
4141
- name: Checkout code
@@ -45,6 +45,7 @@ jobs:
4545
run: |
4646
make all
4747
.\build\tests\Debug\z_test_unicast.exe
48+
timeout-minutes: 10
4849
shell: cmd
4950
env:
5051
Z_FEATURE_UNSTABLE_API: 1

examples/freertos_plus_tcp/z_pub_st.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ void app_main(void) {
5959
printf("Unable to declare publisher for key expression!\n");
6060
return;
6161
}
62+
// Read received declaration
63+
zp_read(z_loan(s), NULL);
6264

6365
char *buf = (char *)pvPortMalloc(256);
6466
z_clock_t now = z_clock_now();

examples/rpi_pico/z_pub_st.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ void app_main(void) {
5050
printf("Unable to declare publisher for key expression!\n");
5151
return;
5252
}
53+
// Read received declaration
54+
zp_read(z_loan(s), NULL);
5355

5456
char *buf = (char *)pvPortMalloc(256);
5557
z_clock_t now = z_clock_now();

examples/unix/c11/z_pub_st.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,14 @@ int main(int argc, char **argv) {
5555
printf("Unable to declare publisher for key expression!\n");
5656
return -1;
5757
}
58+
// Read received declaration
59+
zp_read(z_loan(s), NULL);
5860
// Main loop
5961
printf("Press CTRL-C to quit...\n");
6062
char buf[256];
63+
z_clock_t pulse_time = z_clock_now();
6164
for (int idx = 0; idx < n; idx++) {
62-
sleep(1);
65+
z_sleep_s(1);
6366
sprintf(buf, "[%4d] %s", idx, value);
6467
printf("Putting Data ('%s': '%s')...\n", keyexpr, buf);
6568

@@ -70,8 +73,12 @@ int main(int argc, char **argv) {
7073
z_publisher_put(z_loan(pub), z_move(payload), NULL);
7174

7275
zp_read(z_loan(s), NULL);
73-
zp_send_keep_alive(z_loan(s), NULL);
74-
zp_send_join(z_loan(s), NULL);
76+
unsigned long elapsed_ms = z_clock_elapsed_ms(&pulse_time);
77+
if (elapsed_ms >= (Z_TRANSPORT_LEASE / Z_TRANSPORT_LEASE_EXPIRE_FACTOR)) {
78+
pulse_time = z_clock_now();
79+
zp_send_keep_alive(z_loan(s), NULL);
80+
zp_send_join(z_loan(s), NULL);
81+
}
7582
}
7683
z_drop(z_move(pub));
7784
z_drop(z_move(s));

examples/unix/c11/z_sub_st.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,16 @@ int main(int argc, char **argv) {
7171
}
7272

7373
printf("Press CTRL-C to quit...\n");
74+
z_clock_t pulse_time = z_clock_now();
7475
while (msg_nb < n) {
76+
z_sleep_ms(50);
7577
zp_read(z_loan(s), NULL);
76-
zp_send_keep_alive(z_loan(s), NULL);
77-
zp_send_join(z_loan(s), NULL);
78+
unsigned long elapsed_ms = z_clock_elapsed_ms(&pulse_time);
79+
if (elapsed_ms >= (Z_TRANSPORT_LEASE / Z_TRANSPORT_LEASE_EXPIRE_FACTOR)) {
80+
pulse_time = z_clock_now();
81+
zp_send_keep_alive(z_loan(s), NULL);
82+
zp_send_join(z_loan(s), NULL);
83+
}
7884
}
7985
z_drop(z_move(sub));
8086
z_drop(z_move(s));

examples/unix/c99/z_pub_st.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ int main(int argc, char **argv) {
9090
printf("Unable to declare publisher for key expression!\n");
9191
return -1;
9292
}
93+
// Read received declaration
94+
zp_read(z_session_loan(&s), NULL);
9395

9496
printf("Press CTRL-C to quit...\n");
9597
char *buf = (char *)malloc(256);

examples/windows/z_pub_st.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ int main(int argc, char **argv) {
5454
printf("Unable to declare publisher for key expression!\n");
5555
return -1;
5656
}
57+
// Read received declaration
58+
zp_read(z_loan(s), NULL);
5759

5860
printf("Press CTRL-C to quit...\n");
5961
char *buf = (char *)malloc(256);

include/zenoh-pico/net/filtering.h

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,32 @@
2424
extern "C" {
2525
#endif
2626

27+
typedef struct {
28+
uintptr_t peer;
29+
uint32_t decl_id;
30+
} _z_filter_target_t;
31+
32+
typedef z_element_eq_f _z_filter_target_eq_f;
33+
static inline void *_z_filter_target_elem_clone(const void *src) {
34+
uint32_t *dst = (uint32_t *)z_malloc(sizeof(uint32_t));
35+
if (dst != NULL) {
36+
*dst = *(uint32_t *)src;
37+
}
38+
return dst;
39+
}
40+
void _z_filter_target_elem_free(void **elem);
41+
_Z_LIST_DEFINE(_z_filter_target, _z_filter_target_t)
42+
2743
typedef enum {
28-
WRITE_FILTER_INIT = 0,
29-
WRITE_FILTER_ACTIVE = 1,
30-
WRITE_FILTER_OFF = 2,
44+
WRITE_FILTER_ACTIVE = 0,
45+
WRITE_FILTER_OFF = 1,
3146
} _z_write_filter_state_t;
3247

3348
typedef struct {
34-
uint32_t decl_id;
49+
#if Z_FEATURE_MULTI_THREAD == 1
50+
_z_mutex_t mutex;
51+
#endif
52+
_z_filter_target_list_t *targets;
3553
uint8_t state;
3654
} _z_writer_filter_ctx_t;
3755

include/zenoh-pico/net/session.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ typedef struct _z_session_t {
5656

5757
// Session declarations
5858
_z_resource_list_t *_local_resources;
59-
_z_resource_list_t *_remote_resources;
6059

6160
#if Z_FEATURE_AUTO_RECONNECT == 1
6261
// Information for session restoring

include/zenoh-pico/protocol/core.h

Lines changed: 17 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -97,55 +97,36 @@ void _z_timestamp_clear(_z_timestamp_t *tstamp);
9797
void _z_timestamp_move(_z_timestamp_t *dst, _z_timestamp_t *src);
9898
uint64_t _z_timestamp_ntp64_from_time(uint32_t seconds, uint32_t nanos);
9999

100-
/**
101-
* The product of:
102-
* - top-most bit: whether or not the keyexpr containing this mapping owns its suffix (1=true)
103-
* - the mapping for the keyexpr prefix:
104-
* - 0: local mapping.
105-
* - 0x7fff (MAX): unknown remote mapping.
106-
* - x: the mapping associated with the x-th peer.
107-
*/
108-
typedef struct {
109-
uint16_t _val;
110-
} _z_mapping_t;
111-
#define _Z_KEYEXPR_MAPPING_LOCAL 0
112-
#define _Z_KEYEXPR_MAPPING_UNKNOWN_REMOTE 0x7fff
113-
114100
/**
115101
* A zenoh key-expression.
116102
*
117103
* Members:
118-
* uint16_t _id: The resource ID of the ke.
119-
* _z_mapping_t _mapping: The resource mapping of the ke.
120-
* _z_string_t _suffix: The string value of the ke.
104+
* uint16_t _id: The resource ID of the ke.
105+
* uintptr_t _mapping: Address of the peer as id, if ke is remotely declared.
106+
* _z_string_t _suffix: The string value of the ke.
121107
*/
108+
// Note on the _mapping field: there are collisions on _id value between peers/local, this field is used only to
109+
// distinguish which peer/local id space we are in and should not be dereferenced, just compared. NULL/0 value is used
110+
// for local declared keyexpr and the address of empty_id as a placeholder.
111+
#define _Z_KEYEXPR_MAPPING_LOCAL (uintptr_t)0
112+
#define _Z_KEYEXPR_MAPPING_UNKNOWN_REMOTE (uintptr_t)(&empty_id)
113+
122114
typedef struct {
123115
uint16_t _id;
124-
_z_mapping_t _mapping;
116+
uintptr_t _mapping;
125117
_z_string_t _suffix;
126118
} _z_keyexpr_t;
127119

128-
static inline uint16_t _z_keyexpr_mapping_id(const _z_keyexpr_t *key) { return key->_mapping._val & 0x7fff; }
129-
static inline bool _z_keyexpr_is_local(const _z_keyexpr_t *key) {
130-
return (key->_mapping._val & 0x7fff) == _Z_KEYEXPR_MAPPING_LOCAL;
131-
}
132-
static inline _z_mapping_t _z_keyexpr_mapping(uint16_t id) {
133-
assert(id <= _Z_KEYEXPR_MAPPING_UNKNOWN_REMOTE);
134-
_z_mapping_t mapping = {id};
135-
return mapping;
136-
}
137-
static inline void _z_keyexpr_set_mapping(_z_keyexpr_t *ke, uint16_t id) {
138-
assert(id <= _Z_KEYEXPR_MAPPING_UNKNOWN_REMOTE);
139-
ke->_mapping._val &= 0x8000;
140-
ke->_mapping._val |= id;
141-
}
142-
static inline void _z_keyexpr_fix_mapping(_z_keyexpr_t *ke, uint16_t id) {
143-
if (_z_keyexpr_mapping_id(ke) == _Z_KEYEXPR_MAPPING_UNKNOWN_REMOTE) {
144-
_z_keyexpr_set_mapping(ke, id);
120+
static inline bool _z_keyexpr_is_local(const _z_keyexpr_t *key) { return key->_mapping == _Z_KEYEXPR_MAPPING_LOCAL; }
121+
static inline void _z_keyexpr_fix_mapping(_z_keyexpr_t *ke, uintptr_t mapping) {
122+
if (ke->_mapping == _Z_KEYEXPR_MAPPING_UNKNOWN_REMOTE) {
123+
ke->_mapping = mapping;
145124
}
146125
}
147126
static inline bool _z_keyexpr_has_suffix(const _z_keyexpr_t *ke) { return _z_string_check(&ke->_suffix); }
148-
static inline bool _z_keyexpr_check(const _z_keyexpr_t *ke) { return (ke->_id != 0) || _z_keyexpr_has_suffix(ke); }
127+
static inline bool _z_keyexpr_check(const _z_keyexpr_t *ke) {
128+
return (ke->_id != Z_RESOURCE_ID_NONE) || _z_keyexpr_has_suffix(ke);
129+
}
149130

150131
/**
151132
* Create a resource key from a resource name.

include/zenoh-pico/protocol/definitions/declarations.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ typedef struct {
110110
} _body;
111111
} _z_declaration_t;
112112
void _z_declaration_clear(_z_declaration_t* decl);
113-
void _z_decl_fix_mapping(_z_declaration_t* msg, uint16_t mapping);
113+
void _z_decl_fix_mapping(_z_declaration_t* msg, uintptr_t mapping);
114114

115115
_z_declaration_t _z_make_decl_keyexpr(uint16_t id, _Z_MOVE(_z_keyexpr_t) key);
116116
_z_declaration_t _z_make_undecl_keyexpr(uint16_t id);

include/zenoh-pico/protocol/definitions/network.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ _Z_ELEM_DEFINE(_z_network_message, _z_network_message_t, _z_noop_size, _z_n_msg_
307307
_Z_SVEC_DEFINE(_z_network_message, _z_network_message_t)
308308
_Z_LIST_DEFINE(_z_network_message, _z_network_message_t)
309309

310-
void _z_msg_fix_mapping(_z_zenoh_message_t *msg, uint16_t mapping);
310+
void _z_msg_fix_mapping(_z_zenoh_message_t *msg, uintptr_t mapping);
311311
_z_network_message_t _z_msg_make_query(_Z_MOVE(_z_keyexpr_t) key, _Z_MOVE(_z_slice_t) parameters, _z_zint_t qid,
312312
z_consolidation_mode_t consolidation, _Z_MOVE(_z_value_t) value,
313313
uint64_t timeout_ms, _z_bytes_t attachment, z_congestion_control_t cong_ctrl,

include/zenoh-pico/session/interest.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,16 @@ void _z_unregister_interest(_z_session_t *zn, _z_session_interest_rc_t *intr);
3131

3232
void _z_interest_init(_z_session_t *zn);
3333
void _z_flush_interest(_z_session_t *zn);
34-
z_result_t _z_interest_process_declares(_z_session_t *zn, const _z_declaration_t *decl);
35-
z_result_t _z_interest_process_undeclares(_z_session_t *zn, const _z_declaration_t *decl);
36-
z_result_t _z_interest_process_declare_final(_z_session_t *zn, uint32_t id);
34+
z_result_t _z_interest_process_declares(_z_session_t *zn, const _z_declaration_t *decl,
35+
_z_transport_peer_common_t *peer);
36+
z_result_t _z_interest_process_undeclares(_z_session_t *zn, const _z_declaration_t *decl,
37+
_z_transport_peer_common_t *peer);
38+
z_result_t _z_interest_process_declare_final(_z_session_t *zn, uint32_t id, _z_transport_peer_common_t *peer);
3739
z_result_t _z_interest_process_interest_final(_z_session_t *zn, uint32_t id);
3840
z_result_t _z_interest_process_interest(_z_session_t *zn, _z_keyexpr_t key, uint32_t id, uint8_t flags);
41+
z_result_t _z_interest_push_declarations_to_peer(_z_session_t *zn, _z_transport_peer_common_t *peer);
42+
void _z_interest_peer_disconnected(_z_session_t *zn, _z_transport_peer_common_t *peer);
43+
void _z_interest_replay_declare(_z_session_t *zn, _z_session_interest_t *interest);
3944

4045
#ifdef __cplusplus
4146
}

include/zenoh-pico/session/liveliness.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,19 +46,23 @@ void _z_liveliness_unregister_token(_z_session_t *zn, uint32_t id);
4646

4747
#if Z_FEATURE_SUBSCRIPTION == 1
4848
z_result_t _z_liveliness_subscription_declare(_z_session_t *zn, uint32_t id, const _z_keyexpr_t *keyexpr,
49-
const _z_timestamp_t *timestamp);
50-
z_result_t _z_liveliness_subscription_undeclare(_z_session_t *zn, uint32_t id, const _z_timestamp_t *timestamp);
49+
const _z_timestamp_t *timestamp, _z_transport_peer_common_t *peer);
50+
z_result_t _z_liveliness_subscription_undeclare(_z_session_t *zn, uint32_t id, const _z_timestamp_t *timestamp,
51+
_z_transport_peer_common_t *peer);
5152
z_result_t _z_liveliness_subscription_undeclare_all(_z_session_t *zn);
52-
z_result_t _z_liveliness_subscription_trigger_history(_z_session_t *zn, const _z_keyexpr_t *keyexpr);
53+
z_result_t _z_liveliness_subscription_trigger_history(_z_session_t *zn, const _z_keyexpr_t *keyexpr,
54+
_z_transport_peer_common_t *peer);
5355
#endif
5456

5557
#if Z_FEATURE_QUERY == 1
5658
z_result_t _z_liveliness_register_pending_query(_z_session_t *zn, uint32_t id, _z_liveliness_pending_query_t *pen_qry);
5759
void _z_liveliness_unregister_pending_query(_z_session_t *zn, uint32_t id);
5860
#endif
5961

60-
z_result_t _z_liveliness_process_token_declare(_z_session_t *zn, const _z_n_msg_declare_t *decl);
61-
z_result_t _z_liveliness_process_token_undeclare(_z_session_t *zn, const _z_n_msg_declare_t *decl);
62+
z_result_t _z_liveliness_process_token_declare(_z_session_t *zn, const _z_n_msg_declare_t *decl,
63+
_z_transport_peer_common_t *peer);
64+
z_result_t _z_liveliness_process_token_undeclare(_z_session_t *zn, const _z_n_msg_declare_t *decl,
65+
_z_transport_peer_common_t *peer);
6266
z_result_t _z_liveliness_process_declare_final(_z_session_t *zn, const _z_n_msg_declare_t *decl);
6367

6468
void _z_liveliness_init(_z_session_t *zn);

include/zenoh-pico/session/push.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
extern "C" {
2626
#endif
2727

28-
z_result_t _z_trigger_push(_z_session_t *zn, _z_n_msg_push_t *push, z_reliability_t reliability);
28+
z_result_t _z_trigger_push(_z_session_t *zn, _z_n_msg_push_t *push, z_reliability_t reliability,
29+
_z_transport_peer_common_t *peer);
2930

3031
#ifdef __cplusplus
3132
}

include/zenoh-pico/session/query.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ _z_pending_query_t *_z_get_pending_query_by_id(_z_session_t *zn, const _z_zint_t
3232

3333
z_result_t _z_register_pending_query(_z_session_t *zn, _z_pending_query_t *pq);
3434
z_result_t _z_trigger_query_reply_partial(_z_session_t *zn, _z_zint_t reply_context, _z_keyexpr_t *keyexpr,
35-
_z_msg_put_t *msg, z_sample_kind_t kind);
35+
_z_msg_put_t *msg, z_sample_kind_t kind, _z_transport_peer_common_t *peer);
3636
z_result_t _z_trigger_query_reply_err(_z_session_t *zn, _z_zint_t id, _z_msg_err_t *msg);
3737
z_result_t _z_trigger_query_reply_final(_z_session_t *zn, _z_zint_t id);
3838
void _z_unregister_pending_query(_z_session_t *zn, _z_pending_query_t *pq);

include/zenoh-pico/session/queryable.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ _Z_LRU_CACHE_DEFINE(_z_queryable, _z_queryable_cache_data_t, _z_queryable_cache_
5757
/*------------------ Queryable ------------------*/
5858
_z_session_queryable_rc_t *_z_get_session_queryable_by_id(_z_session_t *zn, const _z_zint_t id);
5959
_z_session_queryable_rc_t *_z_register_session_queryable(_z_session_t *zn, _z_session_queryable_t *q);
60-
z_result_t _z_trigger_queryables(_z_session_rc_t *zn, _z_msg_query_t *query, _z_keyexpr_t *q_key, uint32_t qid);
60+
z_result_t _z_trigger_queryables(_z_session_rc_t *zn, _z_msg_query_t *query, _z_keyexpr_t *q_key, uint32_t qid,
61+
_z_transport_peer_common_t *peer);
6162
void _z_unregister_session_queryable(_z_session_t *zn, _z_session_queryable_rc_t *q);
6263
void _z_flush_session_queryable(_z_session_t *zn);
6364
#endif

include/zenoh-pico/session/reply.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ extern "C" {
2626
#ifndef ZENOH_PICO_SESSION_REPLY_H
2727
#define ZENOH_PICO_SESSION_REPLY_H
2828

29-
z_result_t _z_trigger_reply_partial(_z_session_t *zn, _z_zint_t id, _z_keyexpr_t *key, _z_msg_reply_t *reply);
29+
z_result_t _z_trigger_reply_partial(_z_session_t *zn, _z_zint_t id, _z_keyexpr_t *key, _z_msg_reply_t *reply,
30+
_z_transport_peer_common_t *peer);
3031

3132
z_result_t _z_trigger_reply_err(_z_session_t *zn, _z_zint_t id, _z_msg_err_t *error);
3233

include/zenoh-pico/session/resource.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,16 @@ uint32_t _z_get_entity_id(_z_session_t *zn);
2828

2929
/*------------------ Resource ------------------*/
3030
uint16_t _z_get_resource_id(_z_session_t *zn);
31-
_z_resource_t *_z_get_resource_by_id(_z_session_t *zn, uint16_t mapping, _z_zint_t rid);
32-
_z_resource_t *_z_get_resource_by_key(_z_session_t *zn, const _z_keyexpr_t *keyexpr);
33-
_z_keyexpr_t _z_get_expanded_key_from_key(_z_session_t *zn, const _z_keyexpr_t *keyexpr);
34-
uint16_t _z_register_resource(_z_session_t *zn, const _z_keyexpr_t *key, uint16_t id, uint16_t register_to_mapping);
35-
void _z_unregister_resource(_z_session_t *zn, uint16_t id, uint16_t mapping);
36-
void _z_unregister_resources_for_peer(_z_session_t *zn, uint16_t mapping);
37-
void _z_flush_resources(_z_session_t *zn);
38-
39-
_z_keyexpr_t __unsafe_z_get_expanded_key_from_key(_z_session_t *zn, const _z_keyexpr_t *keyexpr, bool force_alias);
40-
_z_resource_t *__unsafe_z_get_resource_by_id(_z_session_t *zn, uint16_t mapping, _z_zint_t id);
31+
_z_resource_t *_z_get_resource_by_id(_z_session_t *zn, _z_zint_t rid, _z_transport_peer_common_t *peer);
32+
_z_resource_t *_z_get_resource_by_key(_z_session_t *zn, const _z_keyexpr_t *keyexpr, _z_transport_peer_common_t *peer);
33+
_z_keyexpr_t _z_get_expanded_key_from_key(_z_session_t *zn, const _z_keyexpr_t *keyexpr,
34+
_z_transport_peer_common_t *peer);
35+
uint16_t _z_register_resource(_z_session_t *zn, const _z_keyexpr_t *key, uint16_t id, _z_transport_peer_common_t *peer);
36+
void _z_unregister_resource(_z_session_t *zn, uint16_t id, _z_transport_peer_common_t *peer);
37+
void _z_flush_local_resources(_z_session_t *zn);
38+
39+
_z_keyexpr_t __unsafe_z_get_expanded_key_from_key(_z_session_t *zn, const _z_keyexpr_t *keyexpr, bool force_alias,
40+
_z_transport_peer_common_t *peer);
4141
_z_resource_t *__unsafe_z_get_resource_matching_key(_z_session_t *zn, const _z_keyexpr_t *keyexpr);
4242

4343
#ifdef __cplusplus

0 commit comments

Comments
 (0)