Skip to content

Commit f6d2ef6

Browse files
authored
Update memory inits and fixes (#61)
* Update memory inits and fixes * Updated timeout management * rmw_wait logic
1 parent 34ed379 commit f6d2ef6

3 files changed

Lines changed: 33 additions & 12 deletions

File tree

rmw_microxrcedds_c/src/rmw_init.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,10 @@ rmw_init_options_copy(const rmw_init_options_t * src, rmw_init_options_t * dst)
100100
RMW_SET_ERROR_MSG("expected zero-initialized dst");
101101
return RMW_RET_INVALID_ARGUMENT;
102102
}
103-
*dst = *src;
103+
memcpy(dst, src, sizeof(rmw_init_options_t));
104+
dst->impl = rmw_allocate(sizeof(rmw_init_options_impl_t));
105+
memcpy(dst->impl, src->impl, sizeof(rmw_init_options_impl_t));
106+
104107
return RMW_RET_OK;
105108
}
106109

rmw_microxrcedds_c/src/rmw_wait.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@ rmw_wait(
9999
session = &custom_subscription->owner_node->context->session;
100100
}
101101

102-
uxr_run_session_until_timeout(session, timeout);
102+
bool run_session_status = uxr_run_session_until_timeout(session, timeout);
103+
bool buffered_status = false;
103104

104105
// Check services
105106
if (services) {
@@ -108,6 +109,8 @@ rmw_wait(
108109

109110
if (!custom_service->micro_buffer_in_use){
110111
services->services[i] = NULL;
112+
}else{
113+
buffered_status = true;
111114
}
112115
}
113116
}
@@ -119,6 +122,8 @@ rmw_wait(
119122

120123
if (!custom_client->micro_buffer_in_use){
121124
clients->clients[i] = NULL;
125+
}else{
126+
buffered_status = true;
122127
}
123128
}
124129
}
@@ -130,13 +135,14 @@ rmw_wait(
130135

131136
if (!custom_subscription->micro_buffer_in_use){
132137
subscriptions->subscribers[i] = NULL;
138+
}else{
139+
buffered_status = true;
133140
}
134141
}
135142
}
136143

137144
EPROS_PRINT_TRACE()
138-
139-
// TODO (Pablo): When it need to return a timeout?
140-
ret = RMW_RET_OK;
141-
return ret;
145+
146+
return (buffered_status) ? RMW_RET_OK :
147+
((run_session_status) ? RMW_RET_ERROR : RMW_RET_TIMEOUT);
142148
}

rmw_microxrcedds_c/src/types.c

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,27 +32,34 @@
3232

3333
struct rmw_uxrce_mempool_t session_memory;
3434
rmw_context_impl_t custom_sessions[RMW_UXRCE_MAX_SESSIONS];
35+
static bool session_memory_init = false;
3536

3637
struct rmw_uxrce_mempool_t node_memory;
3738
rmw_uxrce_node_t custom_nodes[RMW_UXRCE_MAX_NODES];
39+
static bool node_memory_init = false;
3840

3941
struct rmw_uxrce_mempool_t publisher_memory;
4042
rmw_uxrce_publisher_t custom_publishers[RMW_UXRCE_MAX_PUBLISHERS + RMW_UXRCE_MAX_NODES];
43+
static bool publisher_memory_init = false;
4144

4245
struct rmw_uxrce_mempool_t subscription_memory;
4346
rmw_uxrce_subscription_t custom_subscriptions[RMW_UXRCE_MAX_SUBSCRIPTIONS];
47+
static bool subscription_memory_init = false;
4448

4549
struct rmw_uxrce_mempool_t service_memory;
4650
rmw_uxrce_service_t custom_services[RMW_UXRCE_MAX_SERVICES];
51+
static bool service_memory_init = false;
4752

4853
struct rmw_uxrce_mempool_t client_memory;
4954
rmw_uxrce_client_t custom_clients[RMW_UXRCE_MAX_CLIENTS];
55+
static bool client_memory_init = false;
5056

5157
// Memory init functions
5258

5359
void rmw_uxrce_init_service_memory(struct rmw_uxrce_mempool_t * memory, rmw_uxrce_service_t * services, size_t size)
5460
{
55-
if (size > 0) {
61+
if (size > 0 && !service_memory_init) {
62+
service_memory_init = true;
5663
link_prev(NULL, &services[0].mem, NULL);
5764
size > 1 ? link_next(&services[0].mem, &services[1].mem, &services[0]) : link_next(
5865
&services[0].mem, NULL, &services[0]);
@@ -66,7 +73,8 @@ void rmw_uxrce_init_service_memory(struct rmw_uxrce_mempool_t * memory, rmw_uxrc
6673

6774
void rmw_uxrce_init_client_memory(struct rmw_uxrce_mempool_t * memory, rmw_uxrce_client_t * clients, size_t size)
6875
{
69-
if (size > 0) {
76+
if (size > 0 && !client_memory_init) {
77+
client_memory_init = true;
7078
link_prev(NULL, &clients[0].mem, NULL);
7179
size > 1 ? link_next(&clients[0].mem, &clients[1].mem, &clients[0]) : link_next(
7280
&clients[0].mem, NULL, &clients[0]);
@@ -80,7 +88,8 @@ void rmw_uxrce_init_client_memory(struct rmw_uxrce_mempool_t * memory, rmw_uxrce
8088

8189
void rmw_uxrce_init_publisher_memory(struct rmw_uxrce_mempool_t * memory, rmw_uxrce_publisher_t * publishers, size_t size)
8290
{
83-
if (size > 0) {
91+
if (size > 0 && !publisher_memory_init) {
92+
publisher_memory_init = true;
8493
link_prev(NULL, &publishers[0].mem, NULL);
8594
size > 1 ? link_next(&publishers[0].mem, &publishers[1].mem, &publishers[0]) : link_next(
8695
&publishers[0].mem, NULL, &publishers[0]);
@@ -94,7 +103,8 @@ void rmw_uxrce_init_publisher_memory(struct rmw_uxrce_mempool_t * memory, rmw_ux
94103

95104
void rmw_uxrce_init_subscriber_memory(struct rmw_uxrce_mempool_t * memory, rmw_uxrce_subscription_t * subscribers, size_t size)
96105
{
97-
if (size > 0) {
106+
if (size > 0 && !subscription_memory_init) {
107+
subscription_memory_init = true;
98108
link_prev(NULL, &subscribers[0].mem, NULL);
99109
size > 1 ? link_next(&subscribers[0].mem, &subscribers[1].mem, &subscribers[0]) : link_next(
100110
&subscribers[0].mem, NULL, &subscribers[0]);
@@ -108,7 +118,8 @@ void rmw_uxrce_init_subscriber_memory(struct rmw_uxrce_mempool_t * memory, rmw_u
108118

109119
void rmw_uxrce_init_nodes_memory(struct rmw_uxrce_mempool_t * memory, rmw_uxrce_node_t * nodes, size_t size)
110120
{
111-
if (size > 0) {
121+
if (size > 0 && !node_memory_init) {
122+
node_memory_init = true;
112123
link_prev(NULL, &nodes[0].mem, NULL);
113124
size > 1 ? link_next(&nodes[0].mem, &nodes[1].mem, &nodes[0]) : link_next(&nodes[0].mem, NULL,
114125
&nodes[0]);
@@ -122,7 +133,8 @@ void rmw_uxrce_init_nodes_memory(struct rmw_uxrce_mempool_t * memory, rmw_uxrce_
122133

123134
void rmw_uxrce_init_sessions_memory(struct rmw_uxrce_mempool_t * memory, rmw_context_impl_t * sessions, size_t size)
124135
{
125-
if (size > 0) {
136+
if (size > 0 && !session_memory_init) {
137+
session_memory_init = true;
126138
link_prev(NULL, &sessions[0].mem, NULL);
127139
size > 1 ? link_next(&sessions[0].mem, &sessions[1].mem, &sessions[0]) : link_next(&sessions[0].mem, NULL,
128140
&sessions[0]);

0 commit comments

Comments
 (0)