@@ -87,24 +87,6 @@ static inline int _my_client(const char *nspace, pmix_rank_t rank);
8787
8888static pmix_status_t initialize_server_base (pmix_server_module_t * module )
8989{
90- char * evar ;
91-
92- /* look for our namespace, if one was given */
93- if (NULL == (evar = getenv ("PMIX_SERVER_NAMESPACE" ))) {
94- /* use a fake namespace */
95- (void )strncpy (pmix_globals .myid .nspace , "pmix-server" , PMIX_MAX_NSLEN );
96- } else {
97- (void )strncpy (pmix_globals .myid .nspace , evar , PMIX_MAX_NSLEN );
98- }
99- /* look for our rank, if one was given */
100- mypid = getpid ();
101- if (NULL == (evar = getenv ("PMIX_SERVER_RANK" ))) {
102- /* use our pid */
103- pmix_globals .myid .rank = mypid ;
104- } else {
105- pmix_globals .myid .rank = strtol (evar , NULL , 10 );
106- }
107-
10890 /* setup the server-specific globals */
10991 PMIX_CONSTRUCT (& pmix_server_globals .clients , pmix_pointer_array_t );
11092 pmix_pointer_array_init (& pmix_server_globals .clients , 1 , INT_MAX , 1 );
@@ -131,7 +113,7 @@ PMIX_EXPORT pmix_status_t PMIx_server_init(pmix_server_module_t *module,
131113 pmix_status_t rc ;
132114 size_t n , m ;
133115 pmix_kval_t kv ;
134- bool protect ;
116+ bool protect , nspace_given = false, rank_given = false ;
135117 char * protected [] = {
136118 PMIX_USERID ,
137119 PMIX_GRPID ,
@@ -140,6 +122,8 @@ PMIX_EXPORT pmix_status_t PMIx_server_init(pmix_server_module_t *module,
140122 PMIX_SERVER_SYSTEM_SUPPORT ,
141123 NULL
142124 };
125+ char * evar ;
126+ pmix_rank_info_t * rinfo ;
143127
144128 PMIX_ACQUIRE_THREAD (& pmix_global_lock );
145129
@@ -159,31 +143,22 @@ PMIX_EXPORT pmix_status_t PMIx_server_init(pmix_server_module_t *module,
159143 return rc ;
160144 }
161145
162- #if defined(PMIX_ENABLE_DSTORE ) && (PMIX_ENABLE_DSTORE == 1 )
163- if (PMIX_SUCCESS != (rc = pmix_dstore_init (info , ninfo ))) {
164- PMIX_RELEASE_THREAD (& pmix_global_lock );
165- return rc ;
166- }
167- #endif /* PMIX_ENABLE_DSTORE */
168-
169- /* setup the wildcard recv for inbound messages from clients */
170- req = PMIX_NEW (pmix_ptl_posted_recv_t );
171- req -> tag = UINT32_MAX ;
172- req -> cbfunc = server_message_handler ;
173- /* add it to the end of the list of recvs */
174- pmix_list_append (& pmix_ptl_globals .posted_recvs , & req -> super );
175-
176- if (PMIX_SUCCESS != pmix_ptl_base_start_listening (info , ninfo )) {
177- pmix_show_help ("help-pmix-server.txt" , "listener-thread-start" , true);
178- PMIX_RELEASE_THREAD (& pmix_global_lock );
179- return PMIX_ERR_INIT ;
180- }
181-
182146 /* check the info keys for info we
183- * need to provide to every client */
147+ * need to provide to every client and
148+ * directives aimed at us */
184149 if (NULL != info ) {
185150 PMIX_CONSTRUCT (& kv , pmix_kval_t );
186151 for (n = 0 ; n < ninfo ; n ++ ) {
152+ if (0 == strncmp (info [n ].key , PMIX_SERVER_NSPACE , PMIX_MAX_KEYLEN )) {
153+ (void )strncpy (pmix_globals .myid .nspace , info [n ].value .data .string , PMIX_MAX_NSLEN );
154+ nspace_given = true;
155+ continue ;
156+ }
157+ if (0 == strncmp (info [n ].key , PMIX_SERVER_RANK , PMIX_MAX_KEYLEN )) {
158+ pmix_globals .myid .rank = info [n ].value .data .rank ;
159+ rank_given = true;
160+ continue ;
161+ }
187162 /* check the list of protected keys */
188163 protect = false;
189164 for (m = 0 ; NULL != protected [m ]; m ++ ) {
@@ -215,6 +190,64 @@ PMIX_EXPORT pmix_status_t PMIx_server_init(pmix_server_module_t *module,
215190 PMIX_DESTRUCT (& kv );
216191 }
217192
193+ if (!nspace_given ) {
194+ /* look for our namespace, if one was given */
195+ if (NULL == (evar = getenv ("PMIX_SERVER_NAMESPACE" ))) {
196+ /* use a fake namespace */
197+ (void )strncpy (pmix_globals .myid .nspace , "pmix-server" , PMIX_MAX_NSLEN );
198+ } else {
199+ (void )strncpy (pmix_globals .myid .nspace , evar , PMIX_MAX_NSLEN );
200+ }
201+ }
202+ if (!rank_given ) {
203+ /* look for our rank, if one was given */
204+ mypid = getpid ();
205+ if (NULL == (evar = getenv ("PMIX_SERVER_RANK" ))) {
206+ /* use our pid */
207+ pmix_globals .myid .rank = mypid ;
208+ } else {
209+ pmix_globals .myid .rank = strtol (evar , NULL , 10 );
210+ }
211+ }
212+
213+ /* copy it into mypeer entries */
214+ if (NULL == pmix_globals .mypeer -> info ) {
215+ rinfo = PMIX_NEW (pmix_rank_info_t );
216+ pmix_globals .mypeer -> info = rinfo ;
217+ } else {
218+ rinfo = pmix_globals .mypeer -> info ;
219+ }
220+ if (NULL == rinfo -> nptr ) {
221+ rinfo -> nptr = PMIX_NEW (pmix_nspace_t );
222+ /* ensure our own nspace is first on the list */
223+ PMIX_RETAIN (rinfo -> nptr );
224+ rinfo -> nptr -> server = PMIX_NEW (pmix_server_nspace_t );
225+ pmix_list_prepend (& pmix_globals .nspaces , & rinfo -> nptr -> super );
226+ }
227+ (void )strncpy (rinfo -> nptr -> nspace , pmix_globals .myid .nspace , PMIX_MAX_NSLEN );
228+ rinfo -> rank = pmix_globals .myid .rank ;
229+
230+
231+ #if defined(PMIX_ENABLE_DSTORE ) && (PMIX_ENABLE_DSTORE == 1 )
232+ if (PMIX_SUCCESS != (rc = pmix_dstore_init (info , ninfo ))) {
233+ PMIX_RELEASE_THREAD (& pmix_global_lock );
234+ return rc ;
235+ }
236+ #endif /* PMIX_ENABLE_DSTORE */
237+
238+ /* setup the wildcard recv for inbound messages from clients */
239+ req = PMIX_NEW (pmix_ptl_posted_recv_t );
240+ req -> tag = UINT32_MAX ;
241+ req -> cbfunc = server_message_handler ;
242+ /* add it to the end of the list of recvs */
243+ pmix_list_append (& pmix_ptl_globals .posted_recvs , & req -> super );
244+
245+ if (PMIX_SUCCESS != pmix_ptl_base_start_listening (info , ninfo )) {
246+ pmix_show_help ("help-pmix-server.txt" , "listener-thread-start" , true);
247+ PMIX_RELEASE_THREAD (& pmix_global_lock );
248+ return PMIX_ERR_INIT ;
249+ }
250+
218251 /* get our available security modules */
219252 security_mode = pmix_psec .get_available_modules ();
220253
0 commit comments