static void qcon(pmix_query_caddy_t *p) { PMIX_CONSTRUCT_LOCK(&p->lock); p->queries = NULL; p->nqueries = 0; p->targets = NULL; p->ntargets = 0; p->info = NULL; p->ninfo = 0; p->cbfunc = NULL; p->valcbfunc = NULL; p->cbdata = NULL; p->relcbfunc = NULL; }
static void cbcon(pmix_cb_t *p) { PMIX_CONSTRUCT_LOCK(&p->lock); p->checked = false; PMIX_CONSTRUCT(&p->data, pmix_buffer_t); p->cbfunc.ptlfn = NULL; p->cbdata = NULL; p->pname.nspace = NULL; p->pname.rank = PMIX_RANK_UNDEF; p->scope = PMIX_SCOPE_UNDEF; p->key = NULL; p->value = NULL; p->procs = NULL; p->nprocs = 0; p->info = NULL; p->ninfo = 0; p->nvals = 0; PMIX_CONSTRUCT(&p->kvs, pmix_list_t); p->copy = false; p->timer_running = false; }
static void scon(pmix_shift_caddy_t *p) { PMIX_CONSTRUCT_LOCK(&p->lock); p->codes = NULL; p->ncodes = 0; p->pname.nspace = NULL; p->pname.rank = PMIX_RANK_UNDEF; p->data = NULL; p->ndata = 0; p->key = NULL; p->info = NULL; p->ninfo = 0; p->directives = NULL; p->ndirs = 0; p->evhdlr = NULL; p->kv = NULL; p->vptr = NULL; p->cd = NULL; p->tracker = NULL; p->enviro = false; p->cbfunc.relfn = NULL; p->cbdata = NULL; p->ref = 0; }
/**** SUPPORTING FUNCTIONS ****/ static pmix_status_t parse_uri_file(char *filename, char **uri, char **nspace, pmix_rank_t *rank) { FILE *fp; char *srvr, *p, *p2; pmix_lock_t lock; pmix_event_t ev; struct timeval tv; int retries; fp = fopen(filename, "r"); if (NULL == fp) { /* if we cannot open the file, then the server must not * be configured to support tool connections, or this * user isn't authorized to access it - or it may just * not exist yet! Check for existence */ if (0 != access(filename, R_OK)) { if (ENOENT == errno && 0 < mca_ptl_tcp_component.wait_to_connect) { /* the file does not exist, so give it * a little time to see if the server * is still starting up */ retries = 0; do { ++retries; pmix_output_verbose(2, pmix_ptl_base_framework.framework_output, "WAITING FOR CONNECTION FILE"); PMIX_CONSTRUCT_LOCK(&lock); tv.tv_sec = mca_ptl_tcp_component.wait_to_connect; tv.tv_usec = 0; pmix_event_evtimer_set(pmix_globals.evbase, &ev, timeout, &lock); pmix_event_evtimer_add(&ev, &tv); PMIX_WAIT_THREAD(&lock); PMIX_DESTRUCT_LOCK(&lock); fp = fopen(filename, "r"); if (NULL != fp) { /* we found it! */ goto process; } } while (retries < mca_ptl_tcp_component.max_retries); /* otherwise, mark it as unreachable */ } } return PMIX_ERR_UNREACH; } process: /* get the URI */ srvr = pmix_getline(fp); if (NULL == srvr) { PMIX_ERROR_LOG(PMIX_ERR_FILE_READ_FAILURE); fclose(fp); return PMIX_ERR_UNREACH; } /* see if this file contains the server's version */ p2 = pmix_getline(fp); if (NULL == p2) { pmix_client_globals.myserver->proc_type = PMIX_PROC_SERVER | PMIX_PROC_V20; pmix_output_verbose(2, pmix_ptl_base_framework.framework_output, "V20 SERVER DETECTED"); pmix_client_globals.myserver->protocol = PMIX_PROTOCOL_V2; } else if (0 == strncmp(p2, "v2.1", strlen("v2.1")) || 0 == strncmp(p2, "2.1", strlen("2.1"))) { pmix_client_globals.myserver->proc_type = PMIX_PROC_SERVER | PMIX_PROC_V21; pmix_client_globals.myserver->protocol = PMIX_PROTOCOL_V2; pmix_output_verbose(2, pmix_ptl_base_framework.framework_output, "V21 SERVER DETECTED"); } else if (0 == strncmp(p2, "3", strlen("3")) || 0 == strncmp(p2, "v3", strlen("v3"))) { pmix_client_globals.myserver->proc_type = PMIX_PROC_SERVER | PMIX_PROC_V3; pmix_client_globals.myserver->protocol = PMIX_PROTOCOL_V2; pmix_output_verbose(2, pmix_ptl_base_framework.framework_output, "V3 SERVER DETECTED"); } else { pmix_output_verbose(2, pmix_ptl_base_framework.framework_output, "UNKNOWN SERVER VERSION DETECTED: %s", p2); } if (NULL != p2) { free(p2); } fclose(fp); /* up to the first ';' is the server nspace/rank */ if (NULL == (p = strchr(srvr, ';'))) { /* malformed */ free(srvr); return PMIX_ERR_UNREACH; } *p = '\0'; ++p; // move past the semicolon /* the nspace is the section up to the '.' */ if (NULL == (p2 = strchr(srvr, '.'))) { /* malformed */ free(srvr); return PMIX_ERR_UNREACH; } *p2 = '\0'; ++p2; /* set the server nspace/rank */ *nspace = strdup(srvr); *rank = strtoull(p2, NULL, 10); /* now parse the uri itself */ *uri = strdup(p); free(srvr); return PMIX_SUCCESS; }