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