• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

STEllAR-GROUP / hpx / #856

28 Dec 2022 02:00AM UTC coverage: 86.602% (+0.05%) from 86.55%
#856

push

StellarBot
Merge #6119

6119: Update CMakeLists.txt r=hkaiser a=khuck

updating the default APEX version


Co-authored-by: Kevin Huck <khuck@cs.uoregon.edu>

174566 of 201573 relevant lines covered (86.6%)

1876093.78 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

88.13
/libs/core/affinity/tests/unit/parse_affinity_options.cpp
1
//  Copyright (c) 2007-2016 Hartmut Kaiser
2
//
3
//  SPDX-License-Identifier: BSL-1.0
4
//  Distributed under the Boost Software License, Version 1.0. (See accompanying
5
//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6

7
#include <hpx/affinity/parse_affinity_options.hpp>
8
#include <hpx/local/thread.hpp>
9
#include <hpx/modules/testing.hpp>
10

11
#include <algorithm>
12
#include <cstddef>
13
#include <cstdint>
14
#include <iostream>
15
#include <string>
16
#include <vector>
17

18
// The affinity masks this test is verifying the results against are specific
19
// to a particular machine. If you enable this option you might see a lot of
20
// test failures, which is expected.
21
// The bit masks in the tests below are assuming a 12 core system (with
22
// hyper threading), with 2 NUMA nodes (2 sockets), 6 cores each.
23
// #define VERIFY_AFFINITY_MASKS
24

25
///////////////////////////////////////////////////////////////////////////////
26
namespace hpx::threads::detail {
27
    std::ostream& operator<<(std::ostream& os, spec_type const& data)
×
28
    {
29
        os << spec_type::type_name(data.type_);
×
30
        for (std::size_t i : data.index_bounds_)
×
31
        {
32
            os << "," << i;
×
33
        }
34
        return os;
×
35
    }
36
}    // namespace hpx::threads::detail
37

38
namespace test {
39

40
    using hpx::threads::detail::spec_type;
41

42
    struct data_good_thread
299✔
43
    {
44
        spec_type thread;
45
        spec_type socket;
46
        spec_type core;
47
        spec_type pu;
48
    };
49

50
    struct data_good
260✔
51
    {
52
        std::string option_;
53
        std::size_t threads_;
54
        data_good_thread t[4];
55
        std::uint64_t masks[4];
56
    };
57

58
    //  Test cases implemented below:
59
    //
60
    //   thread:0-1=socket:0
61
    //   thread:0-1=socket:0-1
62
    //   thread:0-1=numanode:0
63
    //   thread:0-1=numanode:0-1
64
    //   thread:0-1=core:0
65
    //   thread:0-1=core:0-1
66
    //   thread:0-1=core:0.pu:0
67
    //   thread:0-1=core:0.pu:0-1
68
    //   thread:0-1=pu:0
69
    //   thread:0-1=pu:0-1
70
    //   thread:0-1=socket:0.core:0
71
    //   thread:0-1=socket:1.core:0-1
72
    //   thread:0-1=numanode:0.core:0
73
    //   thread:0-1=numanode:1.core:0-1
74
    //   thread:0-1=socket:1.core:1.pu:0
75
    //   thread:0-1=socket:1.core:1.pu:0-1
76
    //   thread:0-1=numanode:1.core:1.pu:0
77
    //   thread:0-1=numanode:1.core:1.pu:0-1
78
    //   thread:0-1=socket:1.core:0-1.pu:1
79
    //   thread:0-1=numanode:1.core:0-1.pu:1
80
    //   thread:0-1=socket:0-1.core:1.pu:1
81
    //   thread:0-1=numanode:0-1.core:1.pu:1
82
    //   thread:0-1=socket:0-1.pu:0
83
    //   thread:0-1=numanode:0-1.pu:0
84
    //   thread:0-1=socket:0.pu:0
85
    //   thread:0-1=socket:0.pu:0-1
86
    //   thread:0-1=numanode:0.pu:0
87
    //   thread:0-1=numanode:0.pu:0-1
88
    //   thread:0-1=socket:0.core:all.pu:0
89

90
#if defined(__GNUC__) && __GNUC__ < 5
91
#pragma GCC diagnostic push
92
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
93
#endif
94

95
    // clang-format off
96
    data_good data[] =
1✔
97
    {
66✔
98
        {   "thread:0=socket:0;thread:1=socket:0", 2,
1✔
99
            {
4✔
100
                {
×
101
                    spec_type(spec_type::type::thread, 0, 0),
1✔
102
                    spec_type(spec_type::type::socket, 0, 0),
1✔
103
                    spec_type(spec_type::type::unknown),
1✔
104
                    spec_type(spec_type::type::unknown)
1✔
105
                }, {
×
106
                    spec_type(spec_type::type::thread, 1, 0),
1✔
107
                    spec_type(spec_type::type::socket, 0, 0),
1✔
108
                    spec_type(spec_type::type::unknown),
1✔
109
                    spec_type(spec_type::type::unknown)
1✔
110
                }
111
            },
2✔
112
            { 0x000fff, 0x000fff }
2✔
113
        },
114
        {   "thread:0-1=socket:0", 2,
1✔
115
            {
4✔
116
                {
×
117
                    spec_type(spec_type::type::thread, 0, -1),
1✔
118
                    spec_type(spec_type::type::socket, 0, 0),
1✔
119
                    spec_type(spec_type::type::unknown),
1✔
120
                    spec_type(spec_type::type::unknown)
1✔
121
                }, data_good_thread()
1✔
122
            },
2✔
123
            { 0x000fff, 0x000fff }
2✔
124
        },
125
        {   "thread:0,1=socket:0", 2,
1✔
126
            {
4✔
127
                {
×
128
                    spec_type(spec_type::type::thread, 0, 1),
1✔
129
                    spec_type(spec_type::type::socket, 0, 0),
1✔
130
                    spec_type(spec_type::type::unknown),
1✔
131
                    spec_type(spec_type::type::unknown)
1✔
132
                }, data_good_thread()
1✔
133
            },
2✔
134
            { 0x000fff, 0x000fff }
2✔
135
        },
136

137
        {   "thread:0=socket:0;thread:1=socket:1", 2,
1✔
138
            {
4✔
139
                {
×
140
                    spec_type(spec_type::type::thread, 0, 0),
1✔
141
                    spec_type(spec_type::type::socket, 0, 0),
1✔
142
                    spec_type(spec_type::type::unknown),
1✔
143
                    spec_type(spec_type::type::unknown)
1✔
144
                }, {
×
145
                    spec_type(spec_type::type::thread, 1, 0),
1✔
146
                    spec_type(spec_type::type::socket, 1, 0),
1✔
147
                    spec_type(spec_type::type::unknown),
1✔
148
                    spec_type(spec_type::type::unknown)
1✔
149
                }
150
            },
2✔
151
            { 0x000fff, 0xfff000 }
2✔
152
        },
153
        {   "thread:0-1=socket:0-1", 2,
1✔
154
            {
4✔
155
                {
×
156
                    spec_type(spec_type::type::thread, 0, -1),
1✔
157
                    spec_type(spec_type::type::socket, 0, -1),
1✔
158
                    spec_type(spec_type::type::unknown),
1✔
159
                    spec_type(spec_type::type::unknown)
1✔
160
                }, data_good_thread()
1✔
161
            },
2✔
162
            { 0x000fff, 0xfff000 }
2✔
163
        },
164
        {   "thread:0,1=socket:0-1", 2,
1✔
165
            {
4✔
166
                {
×
167
                    spec_type(spec_type::type::thread, 0, 1),
1✔
168
                    spec_type(spec_type::type::socket, 0, -1),
1✔
169
                    spec_type(spec_type::type::unknown),
1✔
170
                    spec_type(spec_type::type::unknown)
1✔
171
                }, data_good_thread()
1✔
172
            },
2✔
173
            { 0x000fff, 0xfff000 }
2✔
174
        },
175

176
        {   "thread:0=numanode:0;thread:1=numanode:0", 2,
1✔
177
            {
4✔
178
                {
×
179
                    spec_type(spec_type::type::thread, 0, 0),
1✔
180
                    spec_type(spec_type::type::numanode, 0, 0),
1✔
181
                    spec_type(spec_type::type::unknown),
1✔
182
                    spec_type(spec_type::type::unknown)
1✔
183
                }, {
×
184
                    spec_type(spec_type::type::thread, 1, 0),
1✔
185
                    spec_type(spec_type::type::numanode, 0, 0),
1✔
186
                    spec_type(spec_type::type::unknown),
1✔
187
                    spec_type(spec_type::type::unknown)
1✔
188
                }
189
            },
2✔
190
            { 0x000fff, 0x000fff }
2✔
191
        },
192
        {   "thread:0-1=numanode:0", 2,
1✔
193
            {
4✔
194
                {
×
195
                    spec_type(spec_type::type::thread, 0, -1),
1✔
196
                    spec_type(spec_type::type::numanode, 0, 0),
1✔
197
                    spec_type(spec_type::type::unknown),
1✔
198
                    spec_type(spec_type::type::unknown)
1✔
199
                }, data_good_thread()
1✔
200
            },
2✔
201
            { 0x000fff, 0x000fff }
2✔
202
        },
203
        {   "thread:0,1=numanode:0", 2,
1✔
204
            {
4✔
205
                {
×
206
                    spec_type(spec_type::type::thread, 0, 1),
1✔
207
                    spec_type(spec_type::type::numanode, 0, 0),
1✔
208
                    spec_type(spec_type::type::unknown),
1✔
209
                    spec_type(spec_type::type::unknown)
1✔
210
                }, data_good_thread()
1✔
211
            },
2✔
212
            { 0x000fff, 0x000fff }
2✔
213
        },
214

215
        {   "thread:0=numanode:0;thread:1=numanode:1", 2,
1✔
216
            {
4✔
217
                {
×
218
                    spec_type(spec_type::type::thread, 0, 0),
1✔
219
                    spec_type(spec_type::type::numanode, 0, 0),
1✔
220
                    spec_type(spec_type::type::unknown),
1✔
221
                    spec_type(spec_type::type::unknown)
1✔
222
                }, {
×
223
                    spec_type(spec_type::type::thread, 1, 0),
1✔
224
                    spec_type(spec_type::type::numanode, 1, 0),
1✔
225
                    spec_type(spec_type::type::unknown),
1✔
226
                    spec_type(spec_type::type::unknown)
1✔
227
                }
228
            },
2✔
229
            { 0x000fff, 0xfff000 }
2✔
230
        },
231
        {   "thread:0-1=numanode:0-1", 2,
1✔
232
            {
4✔
233
                {
×
234
                    spec_type(spec_type::type::thread, 0, -1),
1✔
235
                    spec_type(spec_type::type::numanode, 0, -1),
1✔
236
                    spec_type(spec_type::type::unknown),
1✔
237
                    spec_type(spec_type::type::unknown)
1✔
238
                }, data_good_thread()
1✔
239
            },
2✔
240
            { 0x000fff, 0xfff000 }
2✔
241
        },
242
        {   "thread:0,1=numanode:0,1", 2,
1✔
243
            {
4✔
244
                {
×
245
                    spec_type(spec_type::type::thread, 0, 1),
1✔
246
                    spec_type(spec_type::type::numanode, 0, 1),
1✔
247
                    spec_type(spec_type::type::unknown),
1✔
248
                    spec_type(spec_type::type::unknown)
1✔
249
                }, data_good_thread()
1✔
250
            },
2✔
251
            { 0x000fff, 0xfff000 }
2✔
252
        },
253

254
        {   "thread:0=core:0;thread:1=core:0", 2,
1✔
255
            {
4✔
256
                {
×
257
                    spec_type(spec_type::type::thread, 0, 0),
1✔
258
                    spec_type(spec_type::type::unknown),
1✔
259
                    spec_type(spec_type::type::core, 0, 0),
1✔
260
                    spec_type(spec_type::type::unknown)
1✔
261
                }, {
×
262
                    spec_type(spec_type::type::thread, 1, 0),
1✔
263
                    spec_type(spec_type::type::unknown),
1✔
264
                    spec_type(spec_type::type::core, 0, 0),
1✔
265
                    spec_type(spec_type::type::unknown)
1✔
266
                }
267
            },
2✔
268
            { 0x000003, 0x000003 }
2✔
269
        },
270
        {   "thread:0-1=core:0", 2,
1✔
271
            {
4✔
272
                {
×
273
                    spec_type(spec_type::type::thread, 0, -1),
1✔
274
                    spec_type(spec_type::type::unknown),
1✔
275
                    spec_type(spec_type::type::core, 0, 0),
1✔
276
                    spec_type(spec_type::type::unknown)
1✔
277
                }, data_good_thread()
1✔
278
            },
2✔
279
            { 0x000003, 0x000003 }
2✔
280
        },
281
        {   "thread:0,1=core:0", 2,
1✔
282
            {
4✔
283
                {
×
284
                    spec_type(spec_type::type::thread, 0, 1),
1✔
285
                    spec_type(spec_type::type::unknown),
1✔
286
                    spec_type(spec_type::type::core, 0, 0),
1✔
287
                    spec_type(spec_type::type::unknown)
1✔
288
                }, data_good_thread()
1✔
289
            },
2✔
290
            { 0x000003, 0x000003 }
2✔
291
        },
292

293
        {   "thread:0=core:0;thread:1=core:1", 2,
1✔
294
            {
4✔
295
                {
×
296
                    spec_type(spec_type::type::thread, 0, 0),
1✔
297
                    spec_type(spec_type::type::unknown),
1✔
298
                    spec_type(spec_type::type::core, 0, 0),
1✔
299
                    spec_type(spec_type::type::unknown)
1✔
300
                }, {
×
301
                    spec_type(spec_type::type::thread, 1, 0),
1✔
302
                    spec_type(spec_type::type::unknown),
1✔
303
                    spec_type(spec_type::type::core, 1, 0),
1✔
304
                    spec_type(spec_type::type::unknown)
1✔
305
                }
306
            },
2✔
307
            { 0x000003, 0x00000c }
2✔
308
        },
309
        {   "thread:0-1=core:0-1", 2,
1✔
310
            {
4✔
311
                {
×
312
                    spec_type(spec_type::type::thread, 0, -1),
1✔
313
                    spec_type(spec_type::type::unknown),
1✔
314
                    spec_type(spec_type::type::core, 0, -1),
1✔
315
                    spec_type(spec_type::type::unknown)
1✔
316
                }, data_good_thread()
1✔
317
            },
2✔
318
            { 0x000003, 0x00000c }
2✔
319
        },
320
        {   "thread:0,1=core:0,1", 2,
1✔
321
            {
4✔
322
                {
×
323
                    spec_type(spec_type::type::thread, 0, 1),
1✔
324
                    spec_type(spec_type::type::unknown),
1✔
325
                    spec_type(spec_type::type::core, 0, 1),
1✔
326
                    spec_type(spec_type::type::unknown)
1✔
327
                }, data_good_thread()
1✔
328
            },
2✔
329
            { 0x000003, 0x00000c }
2✔
330
        },
331

332
        {   "thread:0=core:1.pu:0;thread:1=core:1.pu:0", 2,
1✔
333
            {
4✔
334
                {
×
335
                    spec_type(spec_type::type::thread, 0, 0),
1✔
336
                    spec_type(spec_type::type::unknown),
1✔
337
                    spec_type(spec_type::type::core, 1, 0),
1✔
338
                    spec_type(spec_type::type::pu, 0, 0)
1✔
339
                }, {
×
340
                    spec_type(spec_type::type::thread, 1, 0),
1✔
341
                    spec_type(spec_type::type::unknown),
1✔
342
                    spec_type(spec_type::type::core, 1, 0),
1✔
343
                    spec_type(spec_type::type::pu, 0, 0)
1✔
344
                }
345
            },
2✔
346
            { 0x000004, 0x000004 }
2✔
347
        },
348
        {   "thread:0-1=core:1.pu:0", 2,
1✔
349
            {
4✔
350
                {
×
351
                    spec_type(spec_type::type::thread, 0, -1),
1✔
352
                    spec_type(spec_type::type::unknown),
1✔
353
                    spec_type(spec_type::type::core, 1, 0),
1✔
354
                    spec_type(spec_type::type::pu, 0, 0)
1✔
355
                }, data_good_thread()
1✔
356
            },
2✔
357
            { 0x000004, 0x000004 }
2✔
358
        },
359

360
        {   "thread:0=core:1.pu:0;thread:1=core:1.pu:1", 2,
1✔
361
            {
4✔
362
                {
×
363
                    spec_type(spec_type::type::thread, 0, 0),
1✔
364
                    spec_type(spec_type::type::unknown),
1✔
365
                    spec_type(spec_type::type::core, 1, 0),
1✔
366
                    spec_type(spec_type::type::pu, 0, 0)
1✔
367
                }, {
×
368
                    spec_type(spec_type::type::thread, 1, 0),
1✔
369
                    spec_type(spec_type::type::unknown),
1✔
370
                    spec_type(spec_type::type::core, 1, 0),
1✔
371
                    spec_type(spec_type::type::pu, 1, 0)
1✔
372
                }
373
            },
2✔
374
            { 0x000004, 0x000008 }
2✔
375
        },
376
        {   "thread:0-1=core:1.pu:0-1", 2,
1✔
377
            {
4✔
378
                {
×
379
                    spec_type(spec_type::type::thread, 0, -1),
1✔
380
                    spec_type(spec_type::type::unknown),
1✔
381
                    spec_type(spec_type::type::core, 1, 0),
1✔
382
                    spec_type(spec_type::type::pu, 0, -1)
1✔
383
                }, data_good_thread()
1✔
384
            },
2✔
385
            { 0x000004, 0x000008 }
2✔
386
        },
387

388
        {   "thread:0=pu:0;thread:1=pu:0", 2,
1✔
389
            {
4✔
390
                {
×
391
                    spec_type(spec_type::type::thread, 0, 0),
1✔
392
                    spec_type(spec_type::type::unknown),
1✔
393
                    spec_type(spec_type::type::unknown),
1✔
394
                    spec_type(spec_type::type::pu, 0, 0)
1✔
395
                }, {
×
396
                    spec_type(spec_type::type::thread, 1, 0),
1✔
397
                    spec_type(spec_type::type::unknown),
1✔
398
                    spec_type(spec_type::type::unknown),
1✔
399
                    spec_type(spec_type::type::pu, 0, 0)
1✔
400
                }
401
            },
2✔
402
            { 0x000001, 0x000001 }
2✔
403
        },
404
        {   "thread:0-1=pu:0", 2,
1✔
405
            {
4✔
406
                {
×
407
                    spec_type(spec_type::type::thread, 0, -1),
1✔
408
                    spec_type(spec_type::type::unknown),
1✔
409
                    spec_type(spec_type::type::unknown),
1✔
410
                    spec_type(spec_type::type::pu, 0, 0)
1✔
411
                }, data_good_thread()
1✔
412
            },
2✔
413
            { 0x000001, 0x000001 }
2✔
414
        },
415

416
        {   "thread:0=pu:0;thread:1=pu:1", 2,
1✔
417
            {
4✔
418
                {
×
419
                    spec_type(spec_type::type::thread, 0, 0),
1✔
420
                    spec_type(spec_type::type::unknown),
1✔
421
                    spec_type(spec_type::type::unknown),
1✔
422
                    spec_type(spec_type::type::pu, 0, 0)
1✔
423
                }, {
×
424
                    spec_type(spec_type::type::thread, 1, 0),
1✔
425
                    spec_type(spec_type::type::unknown),
1✔
426
                    spec_type(spec_type::type::unknown),
1✔
427
                    spec_type(spec_type::type::pu, 1, 0)
1✔
428
                }
429
            },
2✔
430
            { 0x000001, 0x000002 }
2✔
431
        },
432
        {   "thread:0-1=pu:0-1", 2,
1✔
433
            {
4✔
434
                {
×
435
                    spec_type(spec_type::type::thread, 0, -1),
1✔
436
                    spec_type(spec_type::type::unknown),
1✔
437
                    spec_type(spec_type::type::unknown),
1✔
438
                    spec_type(spec_type::type::pu, 0, -1)
1✔
439
                }, data_good_thread()
1✔
440
            },
2✔
441
            { 0x000001, 0x000002 }
2✔
442
        },
443

444
        {   "thread:0=socket:0.core:0;thread:1=socket:0.core:0", 2,
1✔
445
            {
4✔
446
                {
×
447
                    spec_type(spec_type::type::thread, 0, 0),
1✔
448
                    spec_type(spec_type::type::socket, 0, 0),
1✔
449
                    spec_type(spec_type::type::core, 0, 0),
1✔
450
                    spec_type(spec_type::type::unknown)
1✔
451
                }, {
×
452
                    spec_type(spec_type::type::thread, 1, 0),
1✔
453
                    spec_type(spec_type::type::socket, 0, 0),
1✔
454
                    spec_type(spec_type::type::core, 0, 0),
1✔
455
                    spec_type(spec_type::type::unknown)
1✔
456
                }
457
            },
2✔
458
            { 0x000003, 0x000003 }
2✔
459
        },
460
        {   "thread:0-1=socket:0.core:0", 2,
1✔
461
            {
4✔
462
                {
×
463
                    spec_type(spec_type::type::thread, 0, -1),
1✔
464
                    spec_type(spec_type::type::socket, 0, 0),
1✔
465
                    spec_type(spec_type::type::core, 0, 0),
1✔
466
                    spec_type(spec_type::type::unknown)
1✔
467
                }, data_good_thread()
1✔
468
            },
2✔
469
            { 0x000003, 0x000003 }
2✔
470
        },
471

472
        {   "thread:0=socket:1.core:0;thread:1=socket:1.core:1", 2,
1✔
473
            {
4✔
474
                {
×
475
                    spec_type(spec_type::type::thread, 0, 0),
1✔
476
                    spec_type(spec_type::type::socket, 1, 0),
1✔
477
                    spec_type(spec_type::type::core, 0, 0),
1✔
478
                    spec_type(spec_type::type::unknown)
1✔
479
                }, {
×
480
                    spec_type(spec_type::type::thread, 1, 0),
1✔
481
                    spec_type(spec_type::type::socket, 1, 0),
1✔
482
                    spec_type(spec_type::type::core, 1, 0),
1✔
483
                    spec_type(spec_type::type::unknown)
1✔
484
                }
485
            },
2✔
486
            { 0x003000, 0x00c000 }
2✔
487
        },
488
        {   "thread:0-1=socket:1.core:0-1", 2,
1✔
489
            {
4✔
490
                {
×
491
                    spec_type(spec_type::type::thread, 0, -1),
1✔
492
                    spec_type(spec_type::type::socket, 1, 0),
1✔
493
                    spec_type(spec_type::type::core, 0, -1),
1✔
494
                    spec_type(spec_type::type::unknown)
1✔
495
                }, data_good_thread()
1✔
496
            },
2✔
497
            { 0x003000, 0x00c000 }
2✔
498
        },
499

500
        {   "thread:0=numanode:0.core:0;thread:1=numanode:0.core:0", 2,
1✔
501
            {
4✔
502
                {
×
503
                    spec_type(spec_type::type::thread, 0, 0),
1✔
504
                    spec_type(spec_type::type::numanode, 0, 0),
1✔
505
                    spec_type(spec_type::type::core, 0, 0),
1✔
506
                    spec_type(spec_type::type::unknown)
1✔
507
                }, {
×
508
                    spec_type(spec_type::type::thread, 1, 0),
1✔
509
                    spec_type(spec_type::type::numanode, 0, 0),
1✔
510
                    spec_type(spec_type::type::core, 0, 0),
1✔
511
                    spec_type(spec_type::type::unknown)
1✔
512
                }
513
            },
2✔
514
            { 0x000003, 0x000003 }
2✔
515
        },
516
        {   "thread:0-1=numanode:0.core:0", 2,
1✔
517
            {
4✔
518
                {
×
519
                    spec_type(spec_type::type::thread, 0, -1),
1✔
520
                    spec_type(spec_type::type::numanode, 0, 0),
1✔
521
                    spec_type(spec_type::type::core, 0, 0),
1✔
522
                    spec_type(spec_type::type::unknown)
1✔
523
                }, data_good_thread()
1✔
524
            },
2✔
525
            { 0x000003, 0x000003 }
2✔
526
        },
527

528
        {   "thread:0=numanode:1.core:0;thread:1=numanode:1.core:1", 2,
1✔
529
            {
4✔
530
                {
×
531
                    spec_type(spec_type::type::thread, 0, 0),
1✔
532
                    spec_type(spec_type::type::numanode, 1, 0),
1✔
533
                    spec_type(spec_type::type::core, 0, 0),
1✔
534
                    spec_type(spec_type::type::unknown)
1✔
535
                }, {
×
536
                    spec_type(spec_type::type::thread, 1, 0),
1✔
537
                    spec_type(spec_type::type::numanode, 1, 0),
1✔
538
                    spec_type(spec_type::type::core, 1, 0),
1✔
539
                    spec_type(spec_type::type::unknown)
1✔
540
                }
541
            },
2✔
542
            { 0x003000, 0x00c000 }
2✔
543
        },
544
        {   "thread:0-1=numanode:1.core:0-1", 2,
1✔
545
            {
4✔
546
                {
×
547
                    spec_type(spec_type::type::thread, 0, -1),
1✔
548
                    spec_type(spec_type::type::numanode, 1, 0),
1✔
549
                    spec_type(spec_type::type::core, 0, -1),
1✔
550
                    spec_type(spec_type::type::unknown)
1✔
551
                }, data_good_thread()
1✔
552
            },
2✔
553
            { 0x003000, 0x00c000 }
2✔
554
        },
555

556
        {   "thread:0=socket:1.core:0.pu:1;thread:1=socket:1.core:1.pu:1", 2,
1✔
557
            {
4✔
558
                {
×
559
                    spec_type(spec_type::type::thread, 0, 0),
1✔
560
                    spec_type(spec_type::type::socket, 1, 0),
1✔
561
                    spec_type(spec_type::type::core, 0, 0),
1✔
562
                    spec_type(spec_type::type::pu, 1, 0)
1✔
563
                }, {
×
564
                    spec_type(spec_type::type::thread, 1, 0),
1✔
565
                    spec_type(spec_type::type::socket, 1, 0),
1✔
566
                    spec_type(spec_type::type::core, 1, 0),
1✔
567
                    spec_type(spec_type::type::pu, 1, 0)
1✔
568
                }
569
            },
2✔
570
            { 0x002000, 0x008000 }
2✔
571
        },
572
        {   "thread:0-1=socket:1.core:0-1.pu:1", 2,
1✔
573
            {
4✔
574
                {
×
575
                    spec_type(spec_type::type::thread, 0, -1),
1✔
576
                    spec_type(spec_type::type::socket, 1, 0),
1✔
577
                    spec_type(spec_type::type::core, 0, -1),
1✔
578
                    spec_type(spec_type::type::pu, 1, 0)
1✔
579
                }, data_good_thread()
1✔
580
            },
2✔
581
            { 0x002000, 0x008000 }
2✔
582
        },
583

584
        {   "thread:0=socket:1.core:1.pu:0;thread:1=socket:1.core:1.pu:0", 2,
1✔
585
            {
4✔
586
                {
×
587
                    spec_type(spec_type::type::thread, 0, 0),
1✔
588
                    spec_type(spec_type::type::socket, 1, 0),
1✔
589
                    spec_type(spec_type::type::core, 1, 0),
1✔
590
                    spec_type(spec_type::type::pu, 0, 0)
1✔
591
                }, {
×
592
                    spec_type(spec_type::type::thread, 1, 0),
1✔
593
                    spec_type(spec_type::type::socket, 1, 0),
1✔
594
                    spec_type(spec_type::type::core, 1, 0),
1✔
595
                    spec_type(spec_type::type::pu, 0, 0)
1✔
596
                }
597
            },
2✔
598
            { 0x004000, 0x004000 }
2✔
599
        },
600
        {   "thread:0-1=socket:1.core:1.pu:0", 2,
1✔
601
            {
4✔
602
                {
×
603
                    spec_type(spec_type::type::thread, 0, -1),
1✔
604
                    spec_type(spec_type::type::socket, 1, 0),
1✔
605
                    spec_type(spec_type::type::core, 1, 0),
1✔
606
                    spec_type(spec_type::type::pu, 0, 0)
1✔
607
                }, data_good_thread()
1✔
608
            },
2✔
609
            { 0x004000, 0x004000 }
2✔
610
        },
611

612
        {   "thread:0=socket:1.core:1.pu:0;thread:1=socket:1.core:1.pu:1", 2,
1✔
613
            {
4✔
614
                {
×
615
                    spec_type(spec_type::type::thread, 0, 0),
1✔
616
                    spec_type(spec_type::type::socket, 1, 0),
1✔
617
                    spec_type(spec_type::type::core, 1, 0),
1✔
618
                    spec_type(spec_type::type::pu, 0, 0)
1✔
619
                }, {
×
620
                    spec_type(spec_type::type::thread, 1, 0),
1✔
621
                    spec_type(spec_type::type::socket, 1, 0),
1✔
622
                    spec_type(spec_type::type::core, 1, 0),
1✔
623
                    spec_type(spec_type::type::pu, 1, 0)
1✔
624
                }
625
            },
2✔
626
            { 0x004000, 0x008000 }
2✔
627
        },
628
        {   "thread:0-1=socket:1.core:1.pu:0-1", 2,
1✔
629
            {
4✔
630
                {
×
631
                    spec_type(spec_type::type::thread, 0, -1),
1✔
632
                    spec_type(spec_type::type::socket, 1, 0),
1✔
633
                    spec_type(spec_type::type::core, 1, 0),
1✔
634
                    spec_type(spec_type::type::pu, 0, -1)
1✔
635
                }, data_good_thread()
1✔
636
            },
2✔
637
            { 0x004000, 0x008000 }
2✔
638
        },
639

640
        {   "thread:0=numanode:1.core:1.pu:0;thread:1=numanode:1.core:1.pu:0", 2,
1✔
641
            {
4✔
642
                {
×
643
                    spec_type(spec_type::type::thread, 0, 0),
1✔
644
                    spec_type(spec_type::type::numanode, 1, 0),
1✔
645
                    spec_type(spec_type::type::core, 1, 0),
1✔
646
                    spec_type(spec_type::type::pu, 0, 0)
1✔
647
                }, {
×
648
                    spec_type(spec_type::type::thread, 1, 0),
1✔
649
                    spec_type(spec_type::type::numanode, 1, 0),
1✔
650
                    spec_type(spec_type::type::core, 1, 0),
1✔
651
                    spec_type(spec_type::type::pu, 0, 0)
1✔
652
                }
653
            },
2✔
654
            { 0x004000, 0x004000 }
2✔
655
        },
656
        {   "thread:0-1=numanode:1.core:1.pu:0", 2,
1✔
657
            {
4✔
658
                {
×
659
                    spec_type(spec_type::type::thread, 0, -1),
1✔
660
                    spec_type(spec_type::type::numanode, 1, 0),
1✔
661
                    spec_type(spec_type::type::core, 1, 0),
1✔
662
                    spec_type(spec_type::type::pu, 0, 0)
1✔
663
                }, data_good_thread()
1✔
664
            },
2✔
665
            { 0x004000, 0x004000 }
2✔
666
        },
667

668
        {   "thread:0=numanode:1.core:0.pu:1;thread:1=numanode:1.core:1.pu:1", 2,
1✔
669
            {
4✔
670
                {
×
671
                    spec_type(spec_type::type::thread, 0, 0),
1✔
672
                    spec_type(spec_type::type::numanode, 1, 0),
1✔
673
                    spec_type(spec_type::type::core, 0, 0),
1✔
674
                    spec_type(spec_type::type::pu, 1, 0)
1✔
675
                }, {
×
676
                    spec_type(spec_type::type::thread, 1, 0),
1✔
677
                    spec_type(spec_type::type::numanode, 1, 0),
1✔
678
                    spec_type(spec_type::type::core, 1, 0),
1✔
679
                    spec_type(spec_type::type::pu, 1, 0)
1✔
680
                }
681
            },
2✔
682
            { 0x002000, 0x008000 }
2✔
683
        },
684
        {   "thread:0-1=numanode:1.core:0-1.pu:1", 2,
1✔
685
            {
4✔
686
                {
×
687
                    spec_type(spec_type::type::thread, 0, -1),
1✔
688
                    spec_type(spec_type::type::numanode, 1, 0),
1✔
689
                    spec_type(spec_type::type::core, 0, -1),
1✔
690
                    spec_type(spec_type::type::pu, 1, 0)
1✔
691
                }, data_good_thread()
1✔
692
            },
2✔
693
            { 0x002000, 0x008000 }
2✔
694
        },
695

696
        {   "thread:0-1=socket:0.core:all.pu:0", 2,
1✔
697
            {
4✔
698
                {
×
699
                    spec_type(spec_type::type::thread, 0, -1),
1✔
700
                    spec_type(spec_type::type::socket, 0, 0),
1✔
701
                    spec_type(spec_type::type::core, spec_type::all_entities(), 0),
1✔
702
                    spec_type(spec_type::type::pu, 0, 0)
1✔
703
                }, data_good_thread()
1✔
704
            },
2✔
705
            { 0x000001, 0x000004 }
2✔
706
        },
707

708
        {   "thread:0=socket:0.core:1.pu:1;thread:1=socket:1.core:1.pu:1", 2,
1✔
709
            {
4✔
710
                {
×
711
                    spec_type(spec_type::type::thread, 0, 0),
1✔
712
                    spec_type(spec_type::type::socket, 0, 0),
1✔
713
                    spec_type(spec_type::type::core, 1, 0),
1✔
714
                    spec_type(spec_type::type::pu, 1, 0)
1✔
715
                },
716
                {
×
717
                    spec_type(spec_type::type::thread, 1, 0),
1✔
718
                    spec_type(spec_type::type::socket, 1, 0),
1✔
719
                    spec_type(spec_type::type::core, 1, 0),
1✔
720
                    spec_type(spec_type::type::pu, 1, 0)
1✔
721
                }
722
            },
2✔
723
            { 0x000008, 0x008000 }
2✔
724
        },
725
        {   "thread:0-1=socket:0-1.core:1.pu:1", 2,
1✔
726
            {
4✔
727
                {
×
728
                    spec_type(spec_type::type::thread, 0, -1),
1✔
729
                    spec_type(spec_type::type::socket, 0, -1),
1✔
730
                    spec_type(spec_type::type::core, 1, 0),
1✔
731
                    spec_type(spec_type::type::pu, 1, 0)
1✔
732
                }, data_good_thread()
1✔
733
            },
2✔
734
            { 0x000008, 0x008000 }
2✔
735
        },
736

737
        {   "thread:0=numanode:0.core:1.pu:1;thread:1=numanode:1.core:1.pu:1", 2,
1✔
738
            {
4✔
739
                {
×
740
                    spec_type(spec_type::type::thread, 0, 0),
1✔
741
                    spec_type(spec_type::type::numanode, 0, 0),
1✔
742
                    spec_type(spec_type::type::core, 1, 0),
1✔
743
                    spec_type(spec_type::type::pu, 1, 0)
1✔
744
                },
745
                {
×
746
                    spec_type(spec_type::type::thread, 1, 0),
1✔
747
                    spec_type(spec_type::type::numanode, 1, 0),
1✔
748
                    spec_type(spec_type::type::core, 1, 0),
1✔
749
                    spec_type(spec_type::type::pu, 1, 0)
1✔
750
                }
751
            },
2✔
752
            { 0x000008, 0x008000 }
2✔
753
        },
754
        {   "thread:0-1=numanode:0-1.core:1.pu:1", 2,
1✔
755
            {
4✔
756
                {
×
757
                    spec_type(spec_type::type::thread, 0, -1),
1✔
758
                    spec_type(spec_type::type::numanode, 0, -1),
1✔
759
                    spec_type(spec_type::type::core, 1, 0),
1✔
760
                    spec_type(spec_type::type::pu, 1, 0)
1✔
761
                }, data_good_thread()
1✔
762
            },
2✔
763
            { 0x000008, 0x008000 }
2✔
764
        },
765

766
        {   "thread:0=socket:0.pu:0;thread:1=socket:1.pu:0", 2,
1✔
767
            {
4✔
768
                {
×
769
                    spec_type(spec_type::type::thread, 0, 0),
1✔
770
                    spec_type(spec_type::type::socket, 0, 0),
1✔
771
                    spec_type(spec_type::type::unknown),
1✔
772
                    spec_type(spec_type::type::pu, 0, 0)
1✔
773
                },
774
                {
×
775
                    spec_type(spec_type::type::thread, 1, 0),
1✔
776
                    spec_type(spec_type::type::socket, 1, 0),
1✔
777
                    spec_type(spec_type::type::unknown),
1✔
778
                    spec_type(spec_type::type::pu, 0, 0)
1✔
779
                }
780
            },
2✔
781
            { 0x000001, 0x001000 }
2✔
782
        },
783
        {   "thread:0-1=socket:0-1.pu:0", 2,
1✔
784
            {
4✔
785
                {
×
786
                    spec_type(spec_type::type::thread, 0, -1),
1✔
787
                    spec_type(spec_type::type::socket, 0, -1),
1✔
788
                    spec_type(spec_type::type::unknown),
1✔
789
                    spec_type(spec_type::type::pu, 0, 0)
1✔
790
                }, data_good_thread()
1✔
791
            },
2✔
792
            { 0x000001, 0x001000 }
2✔
793
        },
794

795
        {   "thread:0=numanode:0.pu:0;thread:1=numanode:1.pu:0", 2,
1✔
796
            {
4✔
797
                {
×
798
                    spec_type(spec_type::type::thread, 0, 0),
1✔
799
                    spec_type(spec_type::type::numanode, 0, 0),
1✔
800
                    spec_type(spec_type::type::unknown),
1✔
801
                    spec_type(spec_type::type::pu, 0, 0)
1✔
802
                },
803
                {
×
804
                    spec_type(spec_type::type::thread, 1, 0),
1✔
805
                    spec_type(spec_type::type::numanode, 1, 0),
1✔
806
                    spec_type(spec_type::type::unknown),
1✔
807
                    spec_type(spec_type::type::pu, 0, 0)
1✔
808
                }
809
            },
2✔
810
            { 0x000001, 0x001000 }
2✔
811
        },
812
        {   "thread:0-1=numanode:0-1.pu:0", 2,
1✔
813
            {
4✔
814
                {
×
815
                    spec_type(spec_type::type::thread, 0, -1),
1✔
816
                    spec_type(spec_type::type::numanode, 0, -1),
1✔
817
                    spec_type(spec_type::type::unknown),
1✔
818
                    spec_type(spec_type::type::pu, 0, 0)
1✔
819
                }, data_good_thread()
1✔
820
            },
2✔
821
            { 0x000001, 0x001000 }
2✔
822
        },
823

824
        {   "thread:0=socket:0.pu:0;thread:1=socket:0.pu:0", 2,
1✔
825
            {
4✔
826
                {
×
827
                    spec_type(spec_type::type::thread, 0, 0),
1✔
828
                    spec_type(spec_type::type::socket, 0, 0),
1✔
829
                    spec_type(spec_type::type::unknown),
1✔
830
                    spec_type(spec_type::type::pu, 0, 0)
1✔
831
                },
832
                {
×
833
                    spec_type(spec_type::type::thread, 1, 0),
1✔
834
                    spec_type(spec_type::type::socket, 0, 0),
1✔
835
                    spec_type(spec_type::type::unknown),
1✔
836
                    spec_type(spec_type::type::pu, 0, 0)
1✔
837
                }
838
            },
2✔
839
            { 0x000001, 0x000001 }
2✔
840
        },
841
        {   "thread:0-1=socket:0.pu:0", 2,
1✔
842
            {
4✔
843
                {
×
844
                    spec_type(spec_type::type::thread, 0, -1),
1✔
845
                    spec_type(spec_type::type::socket, 0, 0),
1✔
846
                    spec_type(spec_type::type::unknown),
1✔
847
                    spec_type(spec_type::type::pu, 0, 0)
1✔
848
                }, data_good_thread()
1✔
849
            },
2✔
850
            { 0x000001, 0x000001 }
2✔
851
        },
852

853
        {   "thread:0=socket:0.pu:0;thread:1=socket:0.pu:1", 2,
1✔
854
            {
4✔
855
                {
×
856
                    spec_type(spec_type::type::thread, 0, 0),
1✔
857
                    spec_type(spec_type::type::socket, 0, 0),
1✔
858
                    spec_type(spec_type::type::unknown),
1✔
859
                    spec_type(spec_type::type::pu, 0, 0)
1✔
860
                },
861
                {
×
862
                    spec_type(spec_type::type::thread, 1, 0),
1✔
863
                    spec_type(spec_type::type::socket, 0, 0),
1✔
864
                    spec_type(spec_type::type::unknown),
1✔
865
                    spec_type(spec_type::type::pu, 1, 0)
1✔
866
                }
867
            },
2✔
868
            { 0x000001, 0x000002 }
2✔
869
        },
870
        {   "thread:0-1=socket:0.pu:0-1", 2,
1✔
871
            {
4✔
872
                {
×
873
                    spec_type(spec_type::type::thread, 0, -1),
1✔
874
                    spec_type(spec_type::type::socket, 0, 0),
1✔
875
                    spec_type(spec_type::type::unknown),
1✔
876
                    spec_type(spec_type::type::pu, 0, -1)
1✔
877
                }, data_good_thread()
1✔
878
            },
2✔
879
            { 0x000001, 0x000002 }
2✔
880
        },
881

882
        {   "thread:0=numanode:0.pu:0;thread:1=numanode:0.pu:0", 2,
1✔
883
            {
4✔
884
                {
×
885
                    spec_type(spec_type::type::thread, 0, 0),
1✔
886
                    spec_type(spec_type::type::numanode, 0, 0),
1✔
887
                    spec_type(spec_type::type::unknown),
1✔
888
                    spec_type(spec_type::type::pu, 0, 0)
1✔
889
                },
890
                {
×
891
                    spec_type(spec_type::type::thread, 1, 0),
1✔
892
                    spec_type(spec_type::type::numanode, 0, 0),
1✔
893
                    spec_type(spec_type::type::unknown),
1✔
894
                    spec_type(spec_type::type::pu, 0, 0)
1✔
895
                }
896
            },
2✔
897
            { 0x000001, 0x000001 }
2✔
898
        },
899
        {   "thread:0-1=numanode:0.pu:0", 2,
1✔
900
            {
4✔
901
                {
×
902
                    spec_type(spec_type::type::thread, 0, -1),
1✔
903
                    spec_type(spec_type::type::numanode, 0, 0),
1✔
904
                    spec_type(spec_type::type::unknown),
1✔
905
                    spec_type(spec_type::type::pu, 0, 0)
1✔
906
                }, data_good_thread()
1✔
907
            },
2✔
908
            { 0x000001, 0x000001 }
2✔
909
        },
910

911
        {   "thread:0=numanode:0.pu:0;thread:1=numanode:0.pu:1", 2,
1✔
912
            {
4✔
913
                {
×
914
                    spec_type(spec_type::type::thread, 0, 0),
1✔
915
                    spec_type(spec_type::type::numanode, 0, 0),
1✔
916
                    spec_type(spec_type::type::unknown),
1✔
917
                    spec_type(spec_type::type::pu, 0, 0)
1✔
918
                },
919
                {
×
920
                    spec_type(spec_type::type::thread, 1, 0),
1✔
921
                    spec_type(spec_type::type::numanode, 0, 0),
1✔
922
                    spec_type(spec_type::type::unknown),
1✔
923
                    spec_type(spec_type::type::pu, 1, 0)
1✔
924
                }
925
            },
2✔
926
            { 0x000001, 0x000002 }
2✔
927
        },
928
        {   "thread:0-1=numanode:0.pu:0-1", 2,
1✔
929
            {
4✔
930
                {
×
931
                    spec_type(spec_type::type::thread, 0, -1),
1✔
932
                    spec_type(spec_type::type::numanode, 0, 0),
1✔
933
                    spec_type(spec_type::type::unknown),
1✔
934
                    spec_type(spec_type::type::pu, 0, -1)
1✔
935
                }, data_good_thread()
1✔
936
            },
2✔
937
            { 0x000001, 0x000002 }
2✔
938
        },
939

940
        // test cases derived from #2312
941
        {   "thread:0-3=core:0-1.pu:0-1", 4,
1✔
942
            {
4✔
943
                {
×
944
                    spec_type(spec_type::type::thread, 0, -3),
1✔
945
                    spec_type(spec_type::type::unknown),
1✔
946
                    spec_type(spec_type::type::core, 0, -1),
1✔
947
                    spec_type(spec_type::type::pu, 0, -1)
1✔
948
                }, data_good_thread()
1✔
949
            },
2✔
950
            { 0x000001, 0x000002, 0x000004, 0x000008 }
1✔
951
        },
952
        {   "thread:0-3=core:0-3.pu:0", 4,
1✔
953
            {
4✔
954
                {
×
955
                    spec_type(spec_type::type::thread, 0, -3),
1✔
956
                    spec_type(spec_type::type::unknown),
1✔
957
                    spec_type(spec_type::type::core, 0, -3),
1✔
958
                    spec_type(spec_type::type::pu, 0, 0)
1✔
959
                }, data_good_thread()
1✔
960
            },
2✔
961
            { 0x000001, 0x000004, 0x0000010, 0x000040 }
1✔
962
        },
963
        {   "thread:0-3=pu:0", 4,
1✔
964
            {
4✔
965
                {
×
966
                    spec_type(spec_type::type::thread, 0, -3),
1✔
967
                    spec_type(spec_type::type::unknown),
1✔
968
                    spec_type(spec_type::type::unknown),
1✔
969
                    spec_type(spec_type::type::pu, 0, 0)
1✔
970
                }, data_good_thread()
1✔
971
            },
2✔
972
            { 0x000001, 0x000001, 0x000001, 0x000001 }
1✔
973
        },
974

975
        { "", 0,  {data_good_thread(), data_good_thread()}, {0,0} }
68✔
976
    };
977
    // clang-format on
978

979
#if defined(__GNUC__) && __GNUC__ < 5
980
#pragma GCC diagnostic pop
981
#endif
982

983
    void good_testing(data_good const* t, char const* const options)
128✔
984
    {
985
        hpx::threads::detail::mappings_type mappings;
128✔
986
        hpx::error_code ec;
128✔
987
        hpx::threads::detail::parse_mappings(options, mappings, ec);
128✔
988
        HPX_TEST(!ec);
128✔
989

990
        int i = 0;
128✔
991

992
        HPX_TEST_EQ(mappings.which(), 1);
128✔
993
        if (mappings.which() == 1)
128✔
994
        {
995
            hpx::threads::detail::mappings_spec_type mappings_specs(
128✔
996
                boost::get<hpx::threads::detail::mappings_spec_type>(mappings));
128✔
997

998
            for (hpx::threads::detail::full_mapping_type const& m :
310✔
999
                mappings_specs)
128✔
1000
            {
1001
                HPX_TEST_EQ(t->t[i].thread, m.first);
182✔
1002
                HPX_TEST_EQ(m.second.size(), 3u);
182✔
1003
                if (m.second.size() == 3u)
182✔
1004
                {
1005
                    HPX_TEST_EQ(t->t[i].socket, m.second[0]);
182✔
1006
                    HPX_TEST_EQ(t->t[i].core, m.second[1]);
182✔
1007
                    HPX_TEST_EQ(t->t[i].pu, m.second[2]);
182✔
1008
                }
182✔
1009
                ++i;
182✔
1010
            }
1011
        }
128✔
1012

1013
#if defined(VERIFY_AFFINITY_MASKS)
1014
        std::vector<hpx::threads::mask_type> affinities;
1015
        affinities.resize(hpx::get_os_thread_count(), 0);
1016
        hpx::threads::parse_affinity_options(options, affinities, ec);
1017
        HPX_TEST(!ec);
1018
        HPX_TEST_EQ(affinities.size(), t->threads_);
1019
        HPX_TEST_EQ(std::count(affinities.begin(), affinities.end(), 0), 0);
1020

1021
        i = 0;
1022
        for (hpx::threads::mask_type const& m : affinities)
1023
        {
1024
            HPX_TEST_EQ(t->masks[i], m);
1025
            ++i;
1026
        }
1027
#endif
1028
    }
128✔
1029

1030
    std::string replace_all(
320✔
1031
        std::string str, char const* const what, char const* const with)
1032
    {
1033
        std::string::size_type p = str.find(what);
320✔
1034
        if (p != std::string::npos)
320✔
1035
        {
1036
            std::size_t len = strnlen(what, 64);
184✔
1037
            do
184✔
1038
            {
1039
                str.replace(p, len, with);
264✔
1040
                p = str.find(what, p + len);
264✔
1041
            } while (p != std::string::npos);
264✔
1042
        }
184✔
1043
        return str;
320✔
1044
    }
1045

1046
    std::string shorten_options(std::string str)
64✔
1047
    {
1048
        str = replace_all(str, "thread", "t");
64✔
1049
        str = replace_all(str, "socket", "s");
64✔
1050
        str = replace_all(str, "numanode", "n");
64✔
1051
        str = replace_all(str, "core", "c");
64✔
1052
        return replace_all(str, "pu", "p");
64✔
1053
    }
×
1054

1055
    void good()
1✔
1056
    {
1057
        for (data_good* t = data; !t->option_.empty(); ++t)
65✔
1058
        {
1059
            // test full length options
1060
            good_testing(t, t->option_.c_str());
64✔
1061

1062
            // test shortened options
1063
            std::string shortened_options(shorten_options(t->option_));
64✔
1064
            good_testing(t, shortened_options.c_str());
64✔
1065
        }
64✔
1066
    }
1✔
1067

1068
    // clang-format off
1069
    char const* const data_bad[] =
1070
    {
1071
        // wrong sequence
1072
        "thread:0=pu:0.socket:0",
1073
        "thread:0=pu:0.numanode:0",
1074
        "thread:0=pu:0.core:0",
1075
        "thread:0=core:0.socket:0",
1076
        "thread:0=core:0.numanode:0",
1077
        "thread:0=numanode:0.socket:0",
1078
        // duplicates
1079
        "thread:0=socket:0.socket:0",
1080
        "thread:0=numanode:0.numanode:0",
1081
        "thread:0=core:0.core:0",
1082
        "thread:0=pu:0.pu:0",
1083
        "thread:1=socket:0.numanode:0",
1084
        // empty
1085
        "thread:0=socket",
1086
        "thread:0=numanode",
1087
        "thread:0=core",
1088
        "thread:0=pu",
1089
        "thread=",
1090
        "socket:0",
1091
        "numanode:0",
1092
        "core:0",
1093
        "pu:0",
1094
        nullptr
1095
    };
1096
    // clang-format on
1097

1098
    void bad()
1✔
1099
    {
1100
        int i = 0;
1✔
1101
        hpx::error_code ec;
1✔
1102
        for (char const* t = data_bad[0]; nullptr != t; t = data_bad[++i])
21✔
1103
        {
1104
            std::vector<hpx::threads::mask_type> affinities;
20✔
1105
            hpx::threads::parse_affinity_options(t, affinities, ec);
20✔
1106
            HPX_TEST(ec);
20✔
1107
        }
20✔
1108
    }
1✔
1109
}    // namespace test
1110

1111
///////////////////////////////////////////////////////////////////////////////
1112
int main()
1✔
1113
{
1114
    {
1115
        test::good();
1✔
1116
        test::bad();
1✔
1117
    }
1118

1119
    return hpx::util::report_errors();
1✔
1120
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc