1
1

btl/ugni: fix leak in new sendi function.

cmr=v1.7.5:ticket=trac:4151

This commit was SVN r30365.

The following Trac tickets were found above:
  Ticket 4151 --> https://svn.open-mpi.org/trac/ompi/ticket/4151
Этот коммит содержится в:
Nathan Hjelm 2014-01-22 16:32:07 +00:00
родитель 66b69da394
Коммит ff4c9c808a

Просмотреть файл

@ -102,39 +102,39 @@ mca_btl_ugni_sendi (struct mca_btl_base_module_t *btl,
} }
frag = mca_btl_ugni_prepare_src_send (btl, endpoint, convertor, order, header_size, frag = mca_btl_ugni_prepare_src_send (btl, endpoint, convertor, order, header_size,
&packed_size, flags & ~MCA_BTL_DES_FLAGS_BTL_OWNERSHIP); &packed_size, flags);
if (OPAL_UNLIKELY(NULL == frag || packed_size != payload_size)) { assert (packed_size == payload_size);
if (OPAL_UNLIKELY(NULL == frag)) {
break; break;
} }
frag->hdr.send.lag = (tag << 24) | total_size; frag->hdr.send.lag = (tag << 24) | total_size;
memcpy (frag->segments[0].base.seg_addr.pval, header, header_size); memcpy (frag->segments[0].base.seg_addr.pval, header, header_size);
frag->flags = MCA_BTL_UGNI_FRAG_IGNORE;
rc = mca_btl_ugni_send_frag (endpoint, frag); rc = mca_btl_ugni_send_frag (endpoint, frag);
if (OPAL_UNLIKELY(OPAL_SUCCESS != rc)) { if (OPAL_UNLIKELY(OPAL_SUCCESS != rc)) {
mca_btl_ugni_frag_return (frag);
break; break;
} }
if (!(frag->flags & MCA_BTL_UGNI_FRAG_BUFFERED)) { if (!(frag->flags & MCA_BTL_UGNI_FRAG_BUFFERED)) {
/* wait until the frag is received by the remote end */ /* wait until the frag is received by the remote end */
while (!(frag->flags & MCA_BTL_UGNI_FRAG_COMPLETE)) { while (!(frag->flags & MCA_BTL_UGNI_FRAG_SMSG_COMPLETE)) {
mca_btl_ugni_progress_local_smsg ((mca_btl_ugni_module_t *) btl); mca_btl_ugni_progress_local_smsg ((mca_btl_ugni_module_t *) btl);
} }
} }
frag->flags |= MCA_BTL_DES_FLAGS_BTL_OWNERSHIP; frag->flags &= ~MCA_BTL_UGNI_FRAG_IGNORE;
if (frag->flags & MCA_BTL_UGNI_FRAG_COMPLETE) { if (frag->flags & MCA_BTL_UGNI_FRAG_SMSG_COMPLETE) {
mca_btl_ugni_frag_return (frag); mca_btl_ugni_frag_return (frag);
} }
return OMPI_SUCCESS; return OMPI_SUCCESS;
} while (0); } while (0);
if (frag) {
mca_btl_ugni_frag_return (frag);
}
*descriptor = NULL; *descriptor = NULL;
return OMPI_ERR_OUT_OF_RESOURCE; return OMPI_ERR_OUT_OF_RESOURCE;
} }