static UCS_CLASS_CLEANUP_FUNC(uct_mm_ep_t) { uct_mm_iface_t *iface = ucs_derived_of(self->super.super.iface, uct_mm_iface_t); ucs_status_t status; uct_mm_remote_seg_t *remote_seg; struct sglib_hashed_uct_mm_remote_seg_t_iterator iter; uct_mm_ep_signal_remote(self, UCT_MM_IFACE_SIGNAL_DISCONNECT); uct_worker_progress_unregister(iface->super.worker, uct_mm_iface_progress, iface); for (remote_seg = sglib_hashed_uct_mm_remote_seg_t_it_init(&iter, self->remote_segments_hash); remote_seg != NULL; remote_seg = sglib_hashed_uct_mm_remote_seg_t_it_next(&iter)) { sglib_hashed_uct_mm_remote_seg_t_delete(self->remote_segments_hash, remote_seg); /* detach the remote proceess's descriptors segment */ status = uct_mm_md_mapper_ops(iface->super.md)->detach(remote_seg); if (status != UCS_OK) { ucs_warn("Unable to detach shared memory segment of descriptors: %s", ucs_status_string(status)); } ucs_free(remote_seg); } /* detach the remote proceess's shared memory segment (remote recv FIFO) */ status = uct_mm_md_mapper_ops(iface->super.md)->detach(&self->mapped_desc); if (status != UCS_OK) { ucs_error("error detaching from remote FIFO"); } uct_mm_ep_pending_purge(&self->super.super, NULL, NULL); }
static UCS_CLASS_CLEANUP_FUNC(uct_mm_ep_t) { uct_mm_iface_t *iface = ucs_derived_of(self->super.super.iface, uct_mm_iface_t); ucs_status_t status; uct_mm_remote_seg_t *remote_seg; struct sglib_hashed_uct_mm_remote_seg_t_iterator iter; /* don't send a disconnect message for now since it may prevent the receiver * from progressing and reading incoming messages */ /* make sure the slow path function isn't invoked after the ep's cleanup */ if (self->cbq_elem_on) { ucs_debug("Removing a remaining slow path progress function."); uct_mm_ep_remove_slow_path_callback(iface, self); } uct_worker_progress_unregister(iface->super.worker, uct_mm_iface_progress, iface); for (remote_seg = sglib_hashed_uct_mm_remote_seg_t_it_init(&iter, self->remote_segments_hash); remote_seg != NULL; remote_seg = sglib_hashed_uct_mm_remote_seg_t_it_next(&iter)) { sglib_hashed_uct_mm_remote_seg_t_delete(self->remote_segments_hash, remote_seg); /* detach the remote proceess's descriptors segment */ status = uct_mm_md_mapper_ops(iface->super.md)->detach(remote_seg); if (status != UCS_OK) { ucs_warn("Unable to detach shared memory segment of descriptors: %s", ucs_status_string(status)); } ucs_free(remote_seg); } /* detach the remote proceess's shared memory segment (remote recv FIFO) */ status = uct_mm_md_mapper_ops(iface->super.md)->detach(&self->mapped_desc); if (status != UCS_OK) { ucs_error("error detaching from remote FIFO"); } uct_mm_ep_pending_purge(&self->super.super, NULL, NULL); }