Correctly handle the length for unexpected messages (add one more field in the recv frag
struct). This commit was SVN r5944.
Этот коммит содержится в:
родитель
3c4c272714
Коммит
ea1872f1d3
@ -382,10 +382,7 @@ mca_ptl_gm_matched( mca_ptl_base_module_t* ptl,
|
|||||||
unsigned int max_data, out_size;
|
unsigned int max_data, out_size;
|
||||||
int freeAfter;
|
int freeAfter;
|
||||||
|
|
||||||
iov.iov_len = mca_ptl_gm_component.gm_segment_size - sizeof(mca_ptl_base_rendezvous_header_t);
|
iov.iov_len = recv_frag->attached_data_length;
|
||||||
if( frag->frag_base.frag_size < iov.iov_len ) {
|
|
||||||
iov.iov_len = frag->frag_base.frag_size;
|
|
||||||
}
|
|
||||||
/* Here we expect that frag_addr is the begin of the buffer header included */
|
/* Here we expect that frag_addr is the begin of the buffer header included */
|
||||||
iov.iov_base = frag->frag_base.frag_addr;
|
iov.iov_base = frag->frag_base.frag_addr;
|
||||||
|
|
||||||
|
@ -554,7 +554,6 @@ int mca_ptl_gm_peer_send( struct mca_ptl_base_module_t* ptl,
|
|||||||
} else {
|
} else {
|
||||||
iov.iov_len = 0; /* no data will be transmitted */
|
iov.iov_len = 0; /* no data will be transmitted */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* adjust size and request offset to reflect actual number of bytes
|
/* adjust size and request offset to reflect actual number of bytes
|
||||||
* packed by convertor
|
* packed by convertor
|
||||||
*/
|
*/
|
||||||
@ -608,7 +607,6 @@ mca_ptl_gm_recv_frag_match( struct mca_ptl_gm_module_t *ptl,
|
|||||||
{
|
{
|
||||||
mca_ptl_gm_recv_frag_t* recv_frag;
|
mca_ptl_gm_recv_frag_t* recv_frag;
|
||||||
bool matched;
|
bool matched;
|
||||||
uint64_t length;
|
|
||||||
|
|
||||||
/* allocate a receive fragment */
|
/* allocate a receive fragment */
|
||||||
recv_frag = mca_ptl_gm_alloc_recv_frag( (struct mca_ptl_base_module_t*)ptl );
|
recv_frag = mca_ptl_gm_alloc_recv_frag( (struct mca_ptl_base_module_t*)ptl );
|
||||||
@ -625,6 +623,7 @@ mca_ptl_gm_recv_frag_match( struct mca_ptl_gm_module_t *ptl,
|
|||||||
}
|
}
|
||||||
recv_frag->frag_recv.frag_is_buffered = false;
|
recv_frag->frag_recv.frag_is_buffered = false;
|
||||||
recv_frag->have_allocated_buffer = false;
|
recv_frag->have_allocated_buffer = false;
|
||||||
|
recv_frag->attached_data_length = msg_len - sizeof(mca_ptl_base_rendezvous_header_t);
|
||||||
recv_frag->frag_recv.frag_base.frag_peer = NULL;
|
recv_frag->frag_recv.frag_base.frag_peer = NULL;
|
||||||
recv_frag->frag_recv.frag_base.frag_header.hdr_rndv = hdr->hdr_rndv;
|
recv_frag->frag_recv.frag_base.frag_header.hdr_rndv = hdr->hdr_rndv;
|
||||||
matched = ptl->super.ptl_match( &(ptl->super),
|
matched = ptl->super.ptl_match( &(ptl->super),
|
||||||
@ -632,15 +631,11 @@ mca_ptl_gm_recv_frag_match( struct mca_ptl_gm_module_t *ptl,
|
|||||||
&(recv_frag->frag_recv.frag_base.frag_header.hdr_match) );
|
&(recv_frag->frag_recv.frag_base.frag_header.hdr_match) );
|
||||||
if( true == matched ) return NULL; /* done and fragment already removed */
|
if( true == matched ) return NULL; /* done and fragment already removed */
|
||||||
|
|
||||||
length = mca_ptl_gm_component.gm_segment_size - sizeof(mca_ptl_base_rendezvous_header_t);
|
|
||||||
if( recv_frag->frag_recv.frag_base.frag_size < length ) {
|
|
||||||
length = recv_frag->frag_recv.frag_base.frag_size;
|
|
||||||
}
|
|
||||||
/* get some memory and copy the data inside. We can then release the receive buffer */
|
/* get some memory and copy the data inside. We can then release the receive buffer */
|
||||||
if( 0 != length ) {
|
if( 0 != (recv_frag->attached_data_length) ) {
|
||||||
char* ptr = (char*)gm_get_local_buffer();
|
char* ptr = (char*)gm_get_local_buffer();
|
||||||
recv_frag->have_allocated_buffer = true;
|
recv_frag->have_allocated_buffer = true;
|
||||||
memcpy( ptr, recv_frag->frag_recv.frag_base.frag_addr, length );
|
memcpy( ptr, recv_frag->frag_recv.frag_base.frag_addr, recv_frag->attached_data_length );
|
||||||
recv_frag->frag_recv.frag_base.frag_addr = ptr;
|
recv_frag->frag_recv.frag_base.frag_addr = ptr;
|
||||||
} else {
|
} else {
|
||||||
recv_frag->frag_recv.frag_base.frag_addr = NULL;
|
recv_frag->frag_recv.frag_base.frag_addr = NULL;
|
||||||
|
@ -106,6 +106,7 @@ extern "C" {
|
|||||||
uint32_t type;
|
uint32_t type;
|
||||||
bool matched;
|
bool matched;
|
||||||
bool have_allocated_buffer;
|
bool have_allocated_buffer;
|
||||||
|
uint32_t attached_data_length;
|
||||||
};
|
};
|
||||||
typedef struct mca_ptl_gm_recv_frag_t mca_ptl_gm_recv_frag_t;
|
typedef struct mca_ptl_gm_recv_frag_t mca_ptl_gm_recv_frag_t;
|
||||||
|
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user