Skip to content

Commit 1bf3237

Browse files
committed
pmix/external: correctly use PMIx_server_register_nspace()
PMIx_server_register_nspace() is an asynchronous operation, so the pmix glue wait for it completes before returning. Signed-off-by: Gilles Gouaillardet <[email protected]> (back-ported from commit dccb189)
1 parent fffa80e commit 1bf3237

File tree

3 files changed

+28
-12
lines changed

3 files changed

+28
-12
lines changed

opal/mca/pmix/external/pmix_ext.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
22
/*
33
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
4-
* Copyright (c) 2014-2015 Research Organization for Information Science
4+
* Copyright (c) 2014-2017 Research Organization for Information Science
55
* and Technology (RIST). All rights reserved.
66
* Copyright (c) 2014 Mellanox Technologies, Inc.
77
* All rights reserved.
@@ -490,6 +490,7 @@ static void opcon(pmix_ext_opcaddy_t *p)
490490
p->ninfo = 0;
491491
p->apps = NULL;
492492
p->sz = 0;
493+
p->active = false;
493494
p->opcbfunc = NULL;
494495
p->mdxcbfunc = NULL;
495496
p->valcbfunc = NULL;

opal/mca/pmix/external/pmix_ext.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
33
* Copyright (c) 2014-2015 Mellanox Technologies, Inc.
44
* All rights reserved.
5+
* Copyright (c) 2017 Research Organization for Information Science
6+
* and Technology (RIST). All rights reserved.
57
* $COPYRIGHT$
68
*
79
* Additional copyrights may follow
@@ -61,6 +63,7 @@ typedef struct {
6163
size_t ninfo;
6264
pmix_app_t *apps;
6365
size_t sz;
66+
volatile bool active;
6467
opal_pmix_op_cbfunc_t opcbfunc;
6568
opal_pmix_modex_cbfunc_t mdxcbfunc;
6669
opal_pmix_value_cbfunc_t valcbfunc;

opal/mca/pmix/external/pmix_ext_server_south.c

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
22
/*
33
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
4-
* Copyright (c) 2014-2016 Research Organization for Information Science
4+
* Copyright (c) 2014-2017 Research Organization for Information Science
55
* and Technology (RIST). All rights reserved.
66
* Copyright (c) 2014 Mellanox Technologies, Inc.
77
* All rights reserved.
@@ -54,6 +54,14 @@ static void release_cbfunc(void *cbdata)
5454
pmix_ext_opalcaddy_t *cd = (pmix_ext_opalcaddy_t*)cbdata;
5555
OBJ_RELEASE(cd);
5656
}
57+
58+
#define PMIX_WAIT_FOR_COMPLETION(a) \
59+
do { \
60+
while ((a)) { \
61+
usleep(10); \
62+
} \
63+
} while (0);
64+
5765
static void myerr(pmix_status_t status,
5866
pmix_proc_t procs[], size_t nprocs,
5967
pmix_info_t info[], size_t ninfo)
@@ -178,7 +186,11 @@ static void opcbfunc(pmix_status_t status, void *cbdata)
178186
if (NULL != op->opcbfunc) {
179187
op->opcbfunc(pmix_ext_convert_rc(status), op->cbdata);
180188
}
181-
OBJ_RELEASE(op);
189+
if (op->active) {
190+
op->active = false;
191+
} else {
192+
OBJ_RELEASE(op);
193+
}
182194
}
183195

184196
int pmix_ext_server_register_nspace(opal_jobid_t jobid,
@@ -192,7 +204,7 @@ int pmix_ext_server_register_nspace(opal_jobid_t jobid,
192204
size_t sz, szmap, m, n;
193205
char nspace[PMIX_MAX_NSLEN];
194206
pmix_status_t rc;
195-
pmix_ext_opcaddy_t *op;
207+
pmix_ext_opcaddy_t op;
196208
opal_list_t *pmapinfo;
197209
opal_pmix_ext_jobid_trkr_t *job;
198210

@@ -238,15 +250,15 @@ int pmix_ext_server_register_nspace(opal_jobid_t jobid,
238250
}
239251

240252
/* setup the caddy */
241-
op = OBJ_NEW(pmix_ext_opcaddy_t);
242-
op->info = pinfo;
243-
op->sz = sz;
244-
op->opcbfunc = cbfunc;
245-
op->cbdata = cbdata;
253+
OBJ_CONSTRUCT(&op, pmix_ext_opcaddy_t);
254+
op.info = pinfo;
255+
op.sz = sz;
256+
op.opcbfunc = cbfunc;
257+
op.cbdata = cbdata;
246258
rc = PMIx_server_register_nspace(nspace, nlocalprocs, pinfo, sz,
247-
opcbfunc, op);
248-
if (PMIX_SUCCESS != rc) {
249-
OBJ_RELEASE(op);
259+
opcbfunc, &op);
260+
if (PMIX_SUCCESS == rc) {
261+
PMIX_WAIT_FOR_COMPLETION(op.active);
250262
}
251263
return pmix_ext_convert_rc(rc);
252264
}

0 commit comments

Comments
 (0)