static int test_spawn_common(char *my_nspace, int my_rank, int blocking) { int rc; pmix_app_t *apps; size_t napps; char nspace[PMIX_MAX_NSLEN+1]; memset(nspace, 0, PMIX_MAX_NSLEN+1); napps = 1; PMIX_APP_CREATE(apps, napps); if (blocking) { if (PMIX_SUCCESS != (rc = PMIx_Spawn(NULL, 0, apps, napps, nspace))) { PMIX_APP_FREE(apps, napps); return rc; } } else { spawn_cbdata cbdata; cbdata.in_progress = 1; memset(cbdata.nspace, 0, PMIX_MAX_NSLEN); rc = PMIx_Spawn_nb(NULL, 0, apps, napps, spawn_cb, (void*)&cbdata); if (PMIX_SUCCESS != rc) { PMIX_APP_FREE(apps, napps); return rc; } PMIX_WAIT_FOR_COMPLETION(cbdata.in_progress); strncpy(nspace, cbdata.nspace, strlen(cbdata.nspace)+1); } PMIX_APP_FREE(apps, napps); if (strncmp(nspace, "foobar", strlen(nspace)+1)) { return PMIX_ERROR; } return rc; }
PMIX_EXPORT pmix_status_t PMIx_Spawn(const pmix_info_t job_info[], size_t ninfo, const pmix_app_t apps[], size_t napps, char nspace[]) { pmix_status_t rc; pmix_cb_t *cb; pmix_output_verbose(2, pmix_globals.debug_output, "pmix: spawn called"); if (pmix_globals.init_cntr <= 0) { return PMIX_ERR_INIT; } /* if we aren't connected, don't attempt to send */ if (!pmix_globals.connected) { return PMIX_ERR_UNREACH; } /* ensure the nspace (if provided) is initialized */ if (NULL != nspace) { memset(nspace, 0, PMIX_MAX_NSLEN+1); } /* create a callback object */ cb = PMIX_NEW(pmix_cb_t); cb->active = true; if (PMIX_SUCCESS != (rc = PMIx_Spawn_nb(job_info, ninfo, apps, napps, spawn_cbfunc, cb))) { PMIX_RELEASE(cb); return rc; } /* wait for the result */ PMIX_WAIT_FOR_COMPLETION(cb->active); rc = cb->status; if (NULL != nspace) { (void)strncpy(nspace, cb->nspace, PMIX_MAX_NSLEN); } PMIX_RELEASE(cb); return rc; }