Skip to content

Commit 78ee281

Browse files
committed
Modified to receive multiple core affinity parameters according to the update of REP-2017 below.
ros-infrastructure/rep#385 Signed-off-by: Shoji Morita <s-morita@esol.co.jp>
1 parent 043b11b commit 78ee281

7 files changed

Lines changed: 102 additions & 46 deletions

File tree

rcl/test/rcl/test_arguments.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ TEST_F(CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), check_known_vs_unkno
210210
EXPECT_TRUE(
211211
are_known_ros_args(
212212
{"--ros-args", "--thread-attrs-value",
213-
"[{priority: 10, scheduling_policy: FIFO, name: thread-1, core_affinity: 1}]"}));
213+
"[{priority: 10, scheduling_policy: FIFO, name: thread-1, core_affinity: [1,2,3]}]"}));
214214
}
215215

216216
bool
@@ -238,7 +238,7 @@ TEST_F(CLASSNAME(TestArgumentsFixture, RMW_IMPLEMENTATION), check_valid_vs_inval
238238
"--params-file", parameters_filepath.c_str(), "--log-level", "INFO",
239239
"--log-config-file", "file.config",
240240
"--thread-attrs-value",
241-
"[{priority: 10, scheduling_policy: IDLE, name: thread-1, core_affinity: 1}]"
241+
"[{priority: 10, scheduling_policy: IDLE, name: thread-1, core_affinity: [1]}]"
242242
}));
243243

244244
// ROS args unknown to rcl are not (necessarily) invalid

rcl/test/rcl/test_context.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,11 +171,15 @@ TEST_F(CLASSNAME(TestContextFixture, RMW_IMPLEMENTATION), nominal) {
171171
rcutils_thread_attrs_t * arg_attrs = &context.global_arguments.impl->thread_attrs;
172172
rcutils_thread_attrs_t * ctx_attrs = &context.impl->thread_attrs;
173173
rcutils_ret_t ret;
174+
rcutils_thread_core_affinity_t tmp_affinity =
175+
rcutils_get_zero_initialized_thread_core_affinity();
174176

175177
ret = rcutils_thread_attrs_init(ctx_attrs, rcl_get_default_allocator());
176178
EXPECT_EQ(RCUTILS_RET_OK, ret);
179+
ret = rcutils_thread_core_affinity_init(&tmp_affinity, rcl_get_default_allocator());
180+
EXPECT_EQ(RCUTILS_RET_OK, ret);
177181
ret = rcutils_thread_attrs_add_attr(
178-
ctx_attrs, RCUTILS_THREAD_SCHEDULING_POLICY_FIFO, 1, 10, "arg");
182+
ctx_attrs, RCUTILS_THREAD_SCHEDULING_POLICY_FIFO, &tmp_affinity, 10, "arg");
179183
EXPECT_EQ(RCUTILS_RET_OK, ret);
180184

181185
EXPECT_EQ(ctx_attrs, rcl_context_get_thread_attrs(&context));
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
- name: thread-1
22
priority: 10
33
scheduling_policy: FIFO
4-
core_affinity: 1
4+
core_affinity: [1]
55
- name: thread-2
66
priority: 20
77
scheduling_policy: RR
8-
core_affinity: 2
8+
core_affinity: [2]

rcl_yaml_param_parser/src/parse_thread_attr.c

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,12 @@ rcutils_ret_t parse_thread_attr(
119119
yaml_event_t event;
120120
thread_attr_key_bits_t key_bits = THREAD_ATTR_KEY_BITS_NONE;
121121
rcutils_thread_scheduling_policy_t sched_policy;
122-
int core_affinity;
122+
rcutils_thread_core_affinity_t core_affinity =
123+
rcutils_get_zero_initialized_thread_core_affinity();
123124
int priority;
124125
char const * name = NULL;
125126
rcutils_allocator_t allocator = attrs->allocator;
127+
void * ret_val = NULL;
126128

127129
while (1) {
128130
PARSE_WITH_CHECK_ERROR();
@@ -148,26 +150,51 @@ rcutils_ret_t parse_thread_attr(
148150
goto error;
149151
}
150152

151-
PARSE_WITH_CHECK_EVENT(YAML_SCALAR_EVENT);
153+
PARSE_WITH_CHECK_ERROR();
152154

153155
const char * value = (char *)event.data.scalar.value;
154156
yaml_scalar_style_t style = event.data.scalar.style;
155157
const yaml_char_t * tag = event.data.scalar.tag;
156158
data_types_t val_type;
157-
void * ret_val = NULL;
158159

159160
switch (key_type) {
160161
case THREAD_ATTR_KEY_CORE_AFFINITY:
161-
ret_val = get_value(value, style, tag, &val_type, allocator);
162-
if (DATA_TYPE_INT64 != val_type) {
163-
RCUTILS_SET_ERROR_MSG_WITH_FORMAT_STRING(
164-
"Unrecognized value for thread core affinity: %s", value);
162+
if (event.type != YAML_SEQUENCE_START_EVENT) {
165163
ret = RCUTILS_RET_ERROR;
166164
goto error;
167165
}
168-
core_affinity = ((int)*(int64_t *)(ret_val));
166+
ret = rcutils_thread_core_affinity_init(&core_affinity, 0, allocator);
167+
if (RCUTILS_RET_OK != ret) {
168+
goto error;
169+
}
170+
while (1) {
171+
PARSE_WITH_CHECK_ERROR();
172+
if (YAML_SEQUENCE_END_EVENT == event.type) {
173+
break;
174+
}
175+
value = (char *)event.data.scalar.value;
176+
style = event.data.scalar.style;
177+
tag = event.data.scalar.tag;
178+
ret_val = get_value(value, style, tag, &val_type, allocator);
179+
if (DATA_TYPE_INT64 != val_type) {
180+
RCUTILS_SET_ERROR_MSG_WITH_FORMAT_STRING(
181+
"Unrecognized value for thread core affinity: %s", value);
182+
ret = RCUTILS_RET_ERROR;
183+
goto error;
184+
}
185+
size_t core_no = ((size_t)*(int64_t *)(ret_val));
186+
allocator.deallocate(ret_val, allocator.state);
187+
ret_val = NULL;
188+
ret = rcutils_thread_core_affinity_set(&core_affinity, core_no);
189+
if (RCUTILS_RET_OK != ret) {
190+
goto error;
191+
}
192+
}
169193
break;
170194
case THREAD_ATTR_KEY_PRIORITY:
195+
if (event.type != YAML_SCALAR_EVENT) {
196+
goto error;
197+
}
171198
ret_val = get_value(value, style, tag, &val_type, allocator);
172199
if (DATA_TYPE_INT64 != val_type) {
173200
RCUTILS_SET_ERROR_MSG_WITH_FORMAT_STRING(
@@ -178,9 +205,15 @@ rcutils_ret_t parse_thread_attr(
178205
priority = ((int)*(int64_t *)(ret_val));
179206
break;
180207
case THREAD_ATTR_KEY_SCHEDULING_POLICY:
208+
if (event.type != YAML_SCALAR_EVENT) {
209+
goto error;
210+
}
181211
sched_policy = parse_thread_attr_scheduling_policy(value);
182212
break;
183213
case THREAD_ATTR_KEY_NAME:
214+
if (event.type != YAML_SCALAR_EVENT) {
215+
goto error;
216+
}
184217
if (*value == '\0') {
185218
RCUTILS_SET_ERROR_MSG("Empty thread name");
186219
ret = RCUTILS_RET_ERROR;
@@ -196,6 +229,7 @@ rcutils_ret_t parse_thread_attr(
196229

197230
if (NULL != ret_val) {
198231
allocator.deallocate(ret_val, allocator.state);
232+
ret_val = NULL;
199233
}
200234

201235
key_bits |= (thread_attr_key_bits_t)key_type;
@@ -207,7 +241,7 @@ rcutils_ret_t parse_thread_attr(
207241
goto error;
208242
}
209243

210-
ret = rcutils_thread_attrs_add_attr(attrs, sched_policy, core_affinity, priority, name);
244+
ret = rcutils_thread_attrs_add_attr(attrs, sched_policy, &core_affinity, priority, name);
211245
if (RCUTILS_RET_OK != ret) {
212246
goto error;
213247
}
@@ -220,6 +254,14 @@ rcutils_ret_t parse_thread_attr(
220254
if (NULL != name) {
221255
allocator.deallocate((char *)name, allocator.state);
222256
}
257+
if (NULL != ret_val) {
258+
allocator.deallocate(ret_val, allocator.state);
259+
}
260+
if (0 < core_affinity.core_count) {
261+
rcutils_ret_t tmp_ret =
262+
rcutils_thread_core_affinity_fini(&core_affinity);
263+
(void)tmp_ret;
264+
}
223265
return ret;
224266
}
225267

rcl_yaml_param_parser/test/test_parse_thread_attr.cpp

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ struct TestParseThreadAttrs : testing::Test
3535
attrs = rcutils_get_zero_initialized_thread_attrs();
3636
allocator = rcutils_get_default_allocator();
3737
ret = rcutils_thread_attrs_init(&attrs, allocator);
38-
ASSERT_EQ(ret, RCUTILS_RET_OK);
38+
ASSERT_EQ(RCUTILS_RET_OK, ret);
3939

4040
int parser_ret = yaml_parser_initialize(&parser);
4141
ASSERT_NE(0, parser_ret);
@@ -78,15 +78,15 @@ TEST_F(TestParseThreadAttr, success) {
7878
yaml_event_t event;
7979

8080
prepare_yaml_parser(
81-
"{ priority: 10, name: thread-1, core_affinity: 1, scheduling_policy: FIFO }");
81+
"{ priority: 10, name: thread-1, core_affinity: [1], scheduling_policy: FIFO }");
8282

8383
ret = parse_thread_attr(&parser, &attrs);
8484
EXPECT_EQ(RCUTILS_RET_OK, ret);
8585

8686
EXPECT_EQ(1, attrs.num_attributes);
8787
EXPECT_EQ(10, attrs.attributes[0].priority);
8888
EXPECT_STREQ("thread-1", attrs.attributes[0].name);
89-
EXPECT_EQ(1, attrs.attributes[0].core_affinity);
89+
EXPECT_TRUE(rcutils_thread_core_affinity_is_set(&attrs.attributes[0].core_affinity, 1));
9090
EXPECT_EQ(RCUTILS_THREAD_SCHEDULING_POLICY_FIFO, attrs.attributes[0].scheduling_policy);
9191

9292
int parser_ret;
@@ -102,7 +102,7 @@ TEST_F(TestParseThreadAttr, unknown_key) {
102102
rcutils_ret_t ret;
103103

104104
prepare_yaml_parser(
105-
"{ priority: 10, name: thread-1, core_affinity: 1, unknown_key: FIFO }");
105+
"{ priority: 10, name: thread-1, core_affinity: [1], unknown_key: FIFO }");
106106

107107
ret = parse_thread_attr(&parser, &attrs);
108108
EXPECT_EQ(RCUTILS_RET_ERROR, ret);
@@ -112,7 +112,8 @@ TEST_F(TestParseThreadAttr, all_valid_keys_with_unknown_key) {
112112
rcutils_ret_t ret;
113113

114114
prepare_yaml_parser(
115-
"{ priority: 10, name: thread-1, core_affinity: 1, scheduling_policy: FIFO, unknown_key: RR }");
115+
"{ priority: 10, name: thread-1, core_affinity: [1], "
116+
"scheduling_policy: FIFO, unknown_key: RR }");
116117

117118
ret = parse_thread_attr(&parser, &attrs);
118119
EXPECT_EQ(RCUTILS_RET_ERROR, ret);
@@ -127,15 +128,6 @@ TEST_F(TestParseThreadAttr, missing_key_value) {
127128
EXPECT_EQ(RCUTILS_RET_ERROR, ret);
128129
}
129130

130-
TEST_F(TestParseThreadAttr, not_acceptable_mapping) {
131-
rcutils_ret_t ret;
132-
prepare_yaml_parser(
133-
"{ priority: 10, name: thread-1, core_affinity: [1,2,3], scheduling_policy: FIFO }");
134-
135-
ret = parse_thread_attr(&parser, &attrs);
136-
EXPECT_EQ(RCUTILS_RET_ERROR, ret);
137-
}
138-
139131
TEST_F(TestParseThreadAttrs, success) {
140132
rcutils_ret_t ret;
141133

@@ -144,7 +136,7 @@ TEST_F(TestParseThreadAttrs, success) {
144136
for (std::size_t i = 0; i < 100; ++i) {
145137
ss << "{ priority: " << i * 10;
146138
ss << ", name: thread-" << i;
147-
ss << ", core_affinity: " << i;
139+
ss << ", core_affinity: [" << i << "]";
148140
ss << ", scheduling_policy: FIFO },";
149141
}
150142
ss << "]";
@@ -162,7 +154,21 @@ TEST_F(TestParseThreadAttrs, success) {
162154
ss << "thread-" << i;
163155
buf = ss.str();
164156
EXPECT_STREQ(buf.c_str(), attrs.attributes[i].name);
165-
EXPECT_EQ(i, attrs.attributes[i].core_affinity);
157+
EXPECT_TRUE(rcutils_thread_core_affinity_is_set(&attrs.attributes[i].core_affinity, i));
166158
EXPECT_EQ(RCUTILS_THREAD_SCHEDULING_POLICY_FIFO, attrs.attributes[i].scheduling_policy);
167159
}
168160
}
161+
162+
TEST_F(TestParseThreadAttr, affinity_multiple_core) {
163+
rcutils_ret_t ret;
164+
prepare_yaml_parser(
165+
"{ priority: 10, name: thread-1, core_affinity: [1,2,3], scheduling_policy: FIFO }");
166+
167+
ret = parse_thread_attr(&parser, &attrs);
168+
EXPECT_EQ(RCUTILS_RET_OK, ret);
169+
EXPECT_FALSE(rcutils_thread_core_affinity_is_set(&attrs.attributes[0].core_affinity, 0));
170+
EXPECT_TRUE(rcutils_thread_core_affinity_is_set(&attrs.attributes[0].core_affinity, 1));
171+
EXPECT_TRUE(rcutils_thread_core_affinity_is_set(&attrs.attributes[0].core_affinity, 2));
172+
EXPECT_TRUE(rcutils_thread_core_affinity_is_set(&attrs.attributes[0].core_affinity, 3));
173+
EXPECT_FALSE(rcutils_thread_core_affinity_is_set(&attrs.attributes[0].core_affinity, 4));
174+
}

rcl_yaml_param_parser/test/test_parser_thread_attr.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,14 @@ TEST_F(TestParserThreadAttr, success_file) {
8686
ASSERT_EQ(RCUTILS_RET_OK, ret);
8787
EXPECT_EQ(10, attrs.num_attributes);
8888

89-
for (int i = 0; i < 10; ++i) {
89+
for (size_t i = 0; i < 10; ++i) {
9090
EXPECT_EQ(attrs.attributes[i].priority, i * 10);
9191
char buf[32];
92-
snprintf(buf, sizeof(buf), "thread-%d", i);
92+
snprintf(buf, sizeof(buf), "thread-%lu", i);
9393
EXPECT_STREQ(buf, attrs.attributes[i].name);
94-
EXPECT_EQ(i, attrs.attributes[i].core_affinity);
94+
EXPECT_TRUE(rcutils_thread_core_affinity_is_set(&attrs.attributes[i].core_affinity, i));
95+
EXPECT_TRUE(rcutils_thread_core_affinity_is_set(&attrs.attributes[i].core_affinity, i + 10));
96+
EXPECT_TRUE(rcutils_thread_core_affinity_is_set(&attrs.attributes[i].core_affinity, i * i));
9597
EXPECT_EQ(expected_policies[i], attrs.attributes[i].scheduling_policy);
9698
}
9799
}
@@ -109,12 +111,14 @@ TEST_F(TestParserThreadAttr, success_value) {
109111
ASSERT_EQ(RCUTILS_RET_OK, ret);
110112
EXPECT_EQ(10, attrs.num_attributes);
111113

112-
for (int i = 0; i < 10; ++i) {
114+
for (size_t i = 0; i < 10; ++i) {
113115
EXPECT_EQ(attrs.attributes[i].priority, i * 10);
114116
char buf[32];
115-
snprintf(buf, sizeof(buf), "thread-%d", i);
117+
snprintf(buf, sizeof(buf), "thread-%lu", i);
116118
EXPECT_STREQ(buf, attrs.attributes[i].name);
117-
EXPECT_EQ(i, attrs.attributes[i].core_affinity);
119+
EXPECT_TRUE(rcutils_thread_core_affinity_is_set(&attrs.attributes[i].core_affinity, i));
120+
EXPECT_TRUE(rcutils_thread_core_affinity_is_set(&attrs.attributes[i].core_affinity, i + 10));
121+
EXPECT_TRUE(rcutils_thread_core_affinity_is_set(&attrs.attributes[i].core_affinity, i * i));
118122
EXPECT_EQ(expected_policies[i], attrs.attributes[i].scheduling_policy);
119123
}
120124
}
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,40 @@
11
- priority: 0
22
name: thread-0
3-
core_affinity: 0
3+
core_affinity: [0,10,0]
44
scheduling_policy: BADSCHEDPOLICY1
55
- priority: 10
66
name: thread-1
7-
core_affinity: 1
7+
core_affinity: [1,11,1]
88
scheduling_policy: FIFO
99
- priority: 20
1010
name: thread-2
11-
core_affinity: 2
11+
core_affinity: [2,12,4]
1212
scheduling_policy: RR
1313
- priority: 30
1414
name: thread-3
15-
core_affinity: 3
15+
core_affinity: [3,13,9]
1616
scheduling_policy: SPORADIC
1717
- priority: 40
1818
name: thread-4
19-
core_affinity: 4
19+
core_affinity: [4,14,16]
2020
scheduling_policy: OTHER
2121
- priority: 50
2222
name: thread-5
23-
core_affinity: 5
23+
core_affinity: [5,15,25]
2424
scheduling_policy: IDLE
2525
- priority: 60
2626
name: thread-6
27-
core_affinity: 6
27+
core_affinity: [6,16,36]
2828
scheduling_policy: BATCH
2929
- priority: 70
3030
name: thread-7
31-
core_affinity: 7
31+
core_affinity: [7,17,49]
3232
scheduling_policy: DEADLINE
3333
- priority: 80
3434
name: thread-8
35-
core_affinity: 8
35+
core_affinity: [8,18,64]
3636
scheduling_policy: BADSCHEDPOLICY2
3737
- priority: 90
3838
name: thread-9
39-
core_affinity: 9
39+
core_affinity: [9,19,81]
4040
scheduling_policy: FIFO

0 commit comments

Comments
 (0)