[mpich2-commits] r7681 - mpich2/trunk/src/pm/hydra/ui/utils
goodell at mcs.anl.gov
goodell at mcs.anl.gov
Tue Jan 11 11:33:03 CST 2011
Author: goodell
Date: 2011-01-11 11:33:03 -0600 (Tue, 11 Jan 2011)
New Revision: 7681
Modified:
mpich2/trunk/src/pm/hydra/ui/utils/uiu.c
Log:
rework hydra pattern expansion to support escaping via "%%"
This is more natural to users because it behaves just like printf escape
specifiers.
Reviewed by balaji at .
Modified: mpich2/trunk/src/pm/hydra/ui/utils/uiu.c
===================================================================
--- mpich2/trunk/src/pm/hydra/ui/utils/uiu.c 2011-01-11 17:22:51 UTC (rev 7680)
+++ mpich2/trunk/src/pm/hydra/ui/utils/uiu.c 2011-01-11 17:33:03 UTC (rev 7681)
@@ -171,85 +171,89 @@
return;
}
-static HYD_status resolve_pattern_string(const char *pattern, char **str, int pgid, int proxy_id,
- int rank)
+static HYD_status resolve_pattern_string(const char *pattern, char **str, int pgid, int proxy_id, int rank)
{
- int offset, i;
- char *tstr, *s_rank, *s_pgid, *s_proxy_id, *s_host, *s;
+ HYD_status status = HYD_SUCCESS;
+ int i, pos, tpos;
+ char *tmp[HYD_NUM_TMP_STRINGS] = {NULL};
struct HYD_pg *pg;
struct HYD_proxy *proxy;
- char *tmp[HYD_NUM_TMP_STRINGS];
- HYD_status status = HYD_SUCCESS;
HYDU_FUNC_ENTER();
- tstr = *str = HYDU_strdup(pattern);
-
- offset = 0;
+ *str = NULL;
+ tpos = 0;
+ pos = 0;
i = 0;
- do {
- s_rank = strstr(*str, "%r");
- s_pgid = strstr(*str, "%g");
- s_proxy_id = strstr(*str, "%p");
- s_host = strstr(*str, "%h");
+ HYDU_MALLOC(tmp[i], char *, HYD_TMP_STRLEN, status);
+ tmp[i][0] = '\0';
- s = s_rank;
- if (s == NULL || (s_pgid && s_pgid < s))
- s = s_pgid;
- if (s == NULL || (s_proxy_id && s_proxy_id < s))
- s = s_proxy_id;
- if (s == NULL || (s_host && s_host < s))
- s = s_host;
+ while (1) {
+ HYDU_ASSERT(tpos < HYD_TMP_STRLEN, status);
+ if (pattern[pos] != '%') {
+ tmp[i][tpos++] = pattern[pos++];
+ if (pattern[pos-1] == '\0')
+ break;
+ }
+ else {
+ ++pos; /* consume '%' */
- if (s)
- *s = 0;
+ if (pattern[pos] == '%') {
+ tmp[i][tpos++] = pattern[pos++];
+ continue;
+ }
- tmp[i++] = HYDU_strdup(*str);
+ /* all remaining valid specifiers need a new temp string */
+ tmp[i][tpos] = '\0';
+ ++i;
+ tpos = 0;
+ HYDU_MALLOC(tmp[i], char *, HYD_TMP_STRLEN, status);
+ tmp[i][0] = '\0';
- if (s) {
- if (s[1] == 'r') {
- HYDU_MALLOC(tmp[i], char *, HYD_TMP_STRLEN, status);
- MPL_snprintf(tmp[i], HYD_TMP_STRLEN, "%d", rank);
+ switch (pattern[pos]) {
+ case 'r':
+ MPL_snprintf(tmp[i], HYD_TMP_STRLEN, "%d", rank);
+ break;
+ case 'g':
+ MPL_snprintf(tmp[i], HYD_TMP_STRLEN, "%d", pgid);
+ break;
+ case 'p':
+ MPL_snprintf(tmp[i], HYD_TMP_STRLEN, "%d", proxy_id);
+ break;
+ case 'h':
+ for (pg = &HYD_server_info.pg_list; pg; pg = pg->next)
+ if (pg->pgid == pgid)
+ break;
+ HYDU_ASSERT(pg, status);
+
+ for (proxy = pg->proxy_list; proxy; proxy = proxy->next)
+ if (proxy->proxy_id == proxy_id)
+ break;
+ HYDU_ASSERT(proxy, status);
+ MPL_snprintf(tmp[i], HYD_TMP_STRLEN, "%s", proxy->node.hostname);
+ break;
+ case '\0':
+ HYDU_ERR_SETANDJUMP(status, HYD_INTERNAL_ERROR, "dangling '%%' at end of pattern\n");
+ default:
+ HYDU_ERR_SETANDJUMP(status, HYD_INTERNAL_ERROR, "unrecognized pattern specifier ('%c')\n", pattern[pos]);
+ break;
}
- else if (s[1] == 'g') {
- HYDU_MALLOC(tmp[i], char *, HYD_TMP_STRLEN, status);
- MPL_snprintf(tmp[i], HYD_TMP_STRLEN, "%d", pgid);
- }
- else if (s[1] == 'p') {
- HYDU_MALLOC(tmp[i], char *, HYD_TMP_STRLEN, status);
- MPL_snprintf(tmp[i], HYD_TMP_STRLEN, "%d", proxy_id);
- }
- else if (s[1] == 'h') {
- for (pg = &HYD_server_info.pg_list; pg; pg = pg->next)
- if (pg->pgid == pgid)
- break;
- HYDU_ASSERT(pg, status);
- for (proxy = pg->proxy_list; proxy; proxy = proxy->next)
- if (proxy->proxy_id == proxy_id)
- break;
- HYDU_ASSERT(proxy, status);
+ ++pos; /* skip past fmt specifier */
- HYDU_MALLOC(tmp[i], char *, HYD_TMP_STRLEN, status);
- MPL_snprintf(tmp[i], HYD_TMP_STRLEN, "%s", proxy->node.hostname);
- }
- else {
- HYDU_ERR_SETANDJUMP(status, HYD_INTERNAL_ERROR, "unrecognized pattern\n");
- }
- i++;
-
- *str = s + 2;
+ ++i;
+ tpos = 0;
+ HYDU_MALLOC(tmp[i], char *, HYD_TMP_STRLEN, status);
+ tmp[i][0] = '\0';
}
- else
- *str = NULL;
- } while (*str);
+ }
- tmp[i++] = NULL;
+ tmp[++i] = NULL;
status = HYDU_str_alloc_and_join(tmp, str);
HYDU_ERR_POP(status, "unable to join strings\n");
- HYDU_free_strlist(tmp);
fn_exit:
+ HYDU_free_strlist(tmp);
HYDU_FUNC_EXIT();
return status;
@@ -274,6 +278,7 @@
if (pattern) {
/* See if the pattern already exists */
status = resolve_pattern_string(pattern, &pattern_resolve, pgid, proxy_id, rank);
+ HYDU_ERR_POP(status, "error resolving pattern\n");
for (run = stdoe_fd_list; run; run = run->next)
if (!strcmp(run->pattern, pattern_resolve))
@@ -314,8 +319,10 @@
mark = 0;
for (i = 0; i < buflen; i++) {
if (buf[i] == '\n' || i == buflen - 1) {
- status = HYDU_sock_write(fd, (const void *) prepend, strlen(prepend), &sent,
- &closed);
+ if (prepend[0] != '\0') { /* sock_write barfs on maxlen==0 */
+ status = HYDU_sock_write(fd, (const void *) prepend,
+ strlen(prepend), &sent, &closed);
+ }
status = HYDU_sock_write(fd, (const void *) &buf[mark], i - mark + 1,
&sent, &closed);
HYDU_ERR_POP(status, "unable to write data to stdout/stderr\n");
More information about the mpich2-commits
mailing list