This source file includes following definitions.
- nidmap_create
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include "orte_config.h"
15 #include "orte/types.h"
16 #include "opal/types.h"
17
18 #ifdef HAVE_UNISTD_H
19 #include <unistd.h>
20 #endif
21 #include <ctype.h>
22
23 #include "opal/util/argv.h"
24 #include "opal/util/basename.h"
25 #include "opal/util/opal_environ.h"
26
27 #include "orte/runtime/orte_globals.h"
28 #include "orte/util/name_fns.h"
29 #include "orte/util/show_help.h"
30 #include "orte/mca/errmgr/errmgr.h"
31 #include "orte/mca/rmaps/base/base.h"
32 #include "orte/mca/routed/routed.h"
33 #include "orte/mca/regx/base/base.h"
34
35 #include "regx_reverse.h"
36
37 static int nidmap_create(opal_pointer_array_t *pool, char **regex);
38
39 orte_regx_base_module_t orte_regx_reverse_module = {
40 .nidmap_create = nidmap_create,
41 .nidmap_parse = orte_regx_base_nidmap_parse,
42 .extract_node_names = orte_regx_base_extract_node_names,
43 .encode_nodemap = orte_regx_base_encode_nodemap,
44 .decode_daemon_nodemap = orte_regx_base_decode_daemon_nodemap,
45 .generate_ppn = orte_regx_base_generate_ppn,
46 .parse_ppn = orte_regx_base_parse_ppn
47 };
48
49 static int nidmap_create(opal_pointer_array_t *pool, char **regex)
50 {
51 char *node;
52 char prefix[ORTE_MAX_NODE_PREFIX];
53 int i, j, n, len, startnum, nodenum, numdigits;
54 bool found;
55 char *suffix, *sfx, *nodenames;
56 orte_regex_node_t *ndreg;
57 orte_regex_range_t *range, *rng;
58 opal_list_t nodenms, dvpids;
59 opal_list_item_t *item, *itm2;
60 char **regexargs = NULL, *tmp, *tmp2;
61 orte_node_t *nptr;
62 orte_vpid_t vpid;
63
64 OBJ_CONSTRUCT(&nodenms, opal_list_t);
65 OBJ_CONSTRUCT(&dvpids, opal_list_t);
66
67 rng = NULL;
68 for (n=0; n < pool->size; n++) {
69 if (NULL == (nptr = (orte_node_t*)opal_pointer_array_get_item(pool, n))) {
70 continue;
71 }
72
73 if (NULL == nptr->daemon) {
74 vpid = -1;
75 } else {
76 vpid = nptr->daemon->name.vpid;
77 }
78
79
80 if (NULL == rng) {
81
82 rng = OBJ_NEW(orte_regex_range_t);
83 rng->vpid = vpid;
84 rng->cnt = 1;
85 opal_list_append(&dvpids, &rng->super);
86 } else if (UINT32_MAX == vpid) {
87 if (-1 == rng->vpid) {
88 rng->cnt++;
89 } else {
90
91 rng = OBJ_NEW(orte_regex_range_t);
92 rng->vpid = vpid;
93 rng->cnt = 1;
94 opal_list_append(&dvpids, &rng->super);
95 }
96 } else if (-1 == rng->vpid) {
97
98 rng = OBJ_NEW(orte_regex_range_t);
99 rng->vpid = vpid;
100 rng->cnt = 1;
101 opal_list_append(&dvpids, &rng->super);
102 } else {
103
104 if (vpid == (orte_vpid_t)(rng->vpid + rng->cnt)) {
105 rng->cnt++;
106 } else {
107
108 rng = OBJ_NEW(orte_regex_range_t);
109 rng->vpid = vpid;
110 rng->cnt = 1;
111 opal_list_append(&dvpids, &rng->super);
112 }
113 }
114 node = nptr->name;
115 opal_output_verbose(5, orte_regx_base_framework.framework_output,
116 "%s PROCESS NODE <%s>",
117 ORTE_NAME_PRINT(ORTE_PROC_MY_NAME),
118 node);
119
120 len = strlen(node);
121 startnum = -1;
122 memset(prefix, 0, ORTE_MAX_NODE_PREFIX);
123 numdigits = 0;
124
125
126
127
128
129
130
131 startnum = -1;
132 memset(prefix, 0, ORTE_MAX_NODE_PREFIX);
133 numdigits = 0;
134 for (i=len-1; i >= 0; i--) {
135
136 if( isdigit(node[i]) ) {
137 numdigits++;
138 continue;
139 }
140 else {
141
142 for( j = 0; j <= i; ++j) {
143 prefix[j] = node[j];
144 }
145 if (numdigits) {
146 startnum = j;
147 }
148 break;
149 }
150 }
151
152 opal_output_verbose(5, orte_regx_base_framework.framework_output,
153 "%s PROCESS NODE <%s> : reverse / prefix \"%s\" / numdigits %d",
154 ORTE_NAME_PRINT(ORTE_PROC_MY_NAME),
155 node, prefix, numdigits);
156
157 if (startnum < 0) {
158
159 ndreg = OBJ_NEW(orte_regex_node_t);
160 ndreg->prefix = strdup(node);
161 opal_list_append(&nodenms, &ndreg->super);
162 continue;
163 }
164
165 nodenum = strtol(&node[startnum], &sfx, 10);
166 if (NULL != sfx) {
167 suffix = strdup(sfx);
168 } else {
169 suffix = NULL;
170 }
171
172 found = false;
173 if (0 != opal_list_get_size(&nodenms)) {
174 ndreg = (orte_regex_node_t*)opal_list_get_last(&nodenms);
175
176 if ((0 < strlen(prefix) && NULL == ndreg->prefix) ||
177 (0 == strlen(prefix) && NULL != ndreg->prefix) ||
178 (0 < strlen(prefix) && NULL != ndreg->prefix &&
179 0 != strcmp(prefix, ndreg->prefix)) ||
180 (NULL == suffix && NULL != ndreg->suffix) ||
181 (NULL != suffix && NULL == ndreg->suffix) ||
182 (NULL != suffix && NULL != ndreg->suffix &&
183 0 != strcmp(suffix, ndreg->suffix)) ||
184 (numdigits != ndreg->num_digits)) {
185 found = false;
186 } else {
187
188 found = true;
189 }
190 }
191 if (found) {
192
193
194
195 range = (orte_regex_range_t*)opal_list_get_last(&ndreg->ranges);
196 if (NULL == range) {
197
198 range = OBJ_NEW(orte_regex_range_t);
199 range->vpid = nodenum;
200 range->cnt = 1;
201 opal_list_append(&ndreg->ranges, &range->super);
202
203 } else if (nodenum != (range->vpid + range->cnt)) {
204
205 range = OBJ_NEW(orte_regex_range_t);
206 range->vpid = nodenum;
207 range->cnt = 1;
208 opal_list_append(&ndreg->ranges, &range->super);
209 } else {
210
211 range->cnt++;
212 }
213 } else {
214
215 ndreg = OBJ_NEW(orte_regex_node_t);
216 if (0 < strlen(prefix)) {
217 ndreg->prefix = strdup(prefix);
218 }
219 if (NULL != suffix) {
220 ndreg->suffix = strdup(suffix);
221 }
222 ndreg->num_digits = numdigits;
223 opal_list_append(&nodenms, &ndreg->super);
224
225
226
227 range = OBJ_NEW(orte_regex_range_t);
228 range->vpid = nodenum;
229 range->cnt = 1;
230 opal_list_append(&ndreg->ranges, &range->super);
231 }
232 if (NULL != suffix) {
233 free(suffix);
234 }
235 }
236
237 while (NULL != (item = opal_list_remove_first(&nodenms))) {
238 ndreg = (orte_regex_node_t*)item;
239
240
241 if (0 == opal_list_get_size(&ndreg->ranges)) {
242 if (NULL != ndreg->prefix) {
243
244 opal_asprintf(&tmp, "%s", ndreg->prefix);
245 opal_argv_append_nosize(®exargs, tmp);
246 free(tmp);
247 }
248 OBJ_RELEASE(ndreg);
249 continue;
250 }
251
252 if (NULL != ndreg->prefix) {
253 opal_asprintf(&tmp, "%s[%d:", ndreg->prefix, ndreg->num_digits);
254 } else {
255 opal_asprintf(&tmp, "[%d:", ndreg->num_digits);
256 }
257
258 while (NULL != (itm2 = opal_list_remove_first(&ndreg->ranges))) {
259 range = (orte_regex_range_t*)itm2;
260 if (1 == range->cnt) {
261 opal_asprintf(&tmp2, "%s%u,", tmp, range->vpid);
262 } else {
263 opal_asprintf(&tmp2, "%s%u-%u,", tmp, range->vpid, range->vpid + range->cnt - 1);
264 }
265 free(tmp);
266 tmp = tmp2;
267 OBJ_RELEASE(range);
268 }
269
270 tmp[strlen(tmp)-1] = ']';
271 if (NULL != ndreg->suffix) {
272
273 opal_asprintf(&tmp2, "%s%s", tmp, ndreg->suffix);
274 free(tmp);
275 tmp = tmp2;
276 }
277 opal_argv_append_nosize(®exargs, tmp);
278 free(tmp);
279 OBJ_RELEASE(ndreg);
280 }
281
282
283 nodenames = opal_argv_join(regexargs, ',');
284
285 opal_argv_free(regexargs);
286 OBJ_DESTRUCT(&nodenms);
287
288
289 tmp = NULL;
290 while (NULL != (item = opal_list_remove_first(&dvpids))) {
291 rng = (orte_regex_range_t*)item;
292 if (1 < rng->cnt) {
293 if (NULL == tmp) {
294 opal_asprintf(&tmp, "%u(%u)", rng->vpid, rng->cnt);
295 } else {
296 opal_asprintf(&tmp2, "%s,%u(%u)", tmp, rng->vpid, rng->cnt);
297 free(tmp);
298 tmp = tmp2;
299 }
300 } else {
301 if (NULL == tmp) {
302 opal_asprintf(&tmp, "%u", rng->vpid);
303 } else {
304 opal_asprintf(&tmp2, "%s,%u", tmp, rng->vpid);
305 free(tmp);
306 tmp = tmp2;
307 }
308 }
309 OBJ_RELEASE(rng);
310 }
311 OPAL_LIST_DESTRUCT(&dvpids);
312
313
314 opal_asprintf(&tmp2, "%s@%s", nodenames, tmp);
315 free(nodenames);
316 free(tmp);
317 *regex = tmp2;
318 return ORTE_SUCCESS;
319 }