@@ -226,13 +226,47 @@ mca_spml_ucx_component_init(int* priority,
226
226
227
227
static int mca_spml_ucx_component_fini (void )
228
228
{
229
+ mca_spml_ucx_ctx_list_item_t * ctx_item , * next ;
230
+ size_t i , j , nprocs = oshmem_num_procs ();
231
+
229
232
opal_progress_unregister (spml_ucx_progress );
230
-
233
+
234
+ if (!mca_spml_ucx .enabled )
235
+ return OSHMEM_SUCCESS ; /* never selected.. return success.. */
236
+
237
+ /* delete context objects from list */
238
+ OPAL_LIST_FOREACH_SAFE (ctx_item , next , & (mca_spml_ucx .ctx_list ),
239
+ mca_spml_ucx_ctx_list_item_t ) {
240
+ opal_list_remove_item (& (mca_spml_ucx .ctx_list ), & ctx_item -> super );
241
+
242
+ opal_common_ucx_del_proc_t * del_procs ;
243
+ del_procs = malloc (sizeof (* del_procs ) * nprocs );
244
+
245
+ for (i = 0 ; i < nprocs ; ++ i ) {
246
+ for (j = 0 ; j < MCA_MEMHEAP_SEG_COUNT ; j ++ ) {
247
+ if (ctx_item -> ctx .ucp_peers [i ].mkeys [j ].key .rkey != NULL ) {
248
+ ucp_rkey_destroy (ctx_item -> ctx .ucp_peers [i ].mkeys [j ].key .rkey );
249
+ }
250
+ }
251
+
252
+ del_procs [i ].ep = ctx_item -> ctx .ucp_peers [i ].ucp_conn ;
253
+ del_procs [i ].vpid = i ;
254
+ ctx_item -> ctx .ucp_peers [i ].ucp_conn = NULL ;
255
+ }
256
+
257
+ opal_common_ucx_del_procs (del_procs , nprocs , oshmem_my_proc_id (),
258
+ mca_spml_ucx .num_disconnect ,
259
+ ctx_item -> ctx .ucp_worker );
260
+ free (del_procs );
261
+ free (ctx_item -> ctx .ucp_peers );
262
+
263
+ ucp_worker_destroy (ctx_item -> ctx .ucp_worker );
264
+ OBJ_RELEASE (ctx_item );
265
+ }
266
+
231
267
if (mca_spml_ucx_ctx_default .ucp_worker ) {
232
268
ucp_worker_destroy (mca_spml_ucx_ctx_default .ucp_worker );
233
269
}
234
- if (!mca_spml_ucx .enabled )
235
- return OSHMEM_SUCCESS ; /* never selected.. return success.. */
236
270
237
271
mca_spml_ucx .enabled = false; /* not anymore */
238
272
0 commit comments