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+
5765static 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
184196int 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