@@ -35,19 +35,24 @@ pack_predefined_data( opal_convertor_t* CONVERTOR,
35
35
size_t * SPACE )
36
36
{
37
37
const ddt_elem_desc_t * _elem = & ((ELEM )-> elem );
38
- size_t cando_count = (* SPACE ) / opal_datatype_basicDatatypes [_elem -> common .type ]-> size ;
39
- size_t do_now , do_now_bytes ;
40
38
size_t blocklen_bytes = opal_datatype_basicDatatypes [_elem -> common .type ]-> size ;
39
+ size_t cando_count = * (COUNT ), do_now , do_now_bytes ;
41
40
unsigned char * _memory = (* memory ) + _elem -> disp ;
42
41
unsigned char * _packed = * packed ;
43
42
44
43
assert ( * (COUNT ) <= _elem -> count * _elem -> blocklen );
45
44
46
- if ( cando_count > * (COUNT ) )
47
- cando_count = * ( COUNT ) ;
45
+ if ( ( blocklen_bytes * cando_count ) > * (SPACE ) )
46
+ cando_count = ( * SPACE ) / blocklen_bytes ;
48
47
48
+ do_now = * (COUNT ); /* save the COUNT for later */
49
+ /* premptively update the number of COUNT we will return. */
50
+ * (COUNT ) -= cando_count ;
51
+
52
+ if ( 1 == _elem -> count ) { /* Everything is contiguous, handle it as a prologue */
53
+ goto do_epilog ;
54
+ }
49
55
if ( 1 == _elem -> blocklen ) { /* Do as many full blocklen as possible */
50
- * (COUNT ) -= cando_count ;
51
56
for (; cando_count > 0 ; cando_count -- ) {
52
57
OPAL_DATATYPE_SAFEGUARD_POINTER ( _memory , blocklen_bytes , (CONVERTOR )-> pBaseBuf ,
53
58
(CONVERTOR )-> pDesc , (CONVERTOR )-> count );
@@ -59,17 +64,19 @@ pack_predefined_data( opal_convertor_t* CONVERTOR,
59
64
}
60
65
goto update_and_return ;
61
66
}
62
- blocklen_bytes *= _elem -> blocklen ;
63
67
68
+ blocklen_bytes *= _elem -> blocklen ;
69
+ if ( (_elem -> count * _elem -> blocklen ) == cando_count ) {
70
+ goto skip_prolog ;
71
+ }
64
72
/**
65
73
* First check if we already did something on this element ? The COUNT is the number
66
74
* of remaining predefined types in the current elem, not how many predefined types
67
75
* should be manipulated in the current call (this number is instead reflected on the
68
76
* SPACE).
69
77
*/
70
- do_now = * (COUNT ) % _elem -> blocklen ; /* any partial elements ? */
71
- /* premptively update the number of COUNT we will return. */
72
- * (COUNT ) -= cando_count ;
78
+ do_now = do_now % _elem -> blocklen ; /* any partial elements ? */
79
+
73
80
if ( 0 != do_now ) {
74
81
size_t left_in_block = do_now ; /* left in the current blocklen */
75
82
do_now = (do_now > cando_count ) ? cando_count : do_now ;
@@ -88,6 +95,7 @@ pack_predefined_data( opal_convertor_t* CONVERTOR,
88
95
cando_count -= do_now ;
89
96
}
90
97
98
+ skip_prolog :
91
99
/* Do as many full blocklen as possible */
92
100
for (size_t _i = 0 ; _elem -> blocklen <= cando_count ; _i ++ ) {
93
101
OPAL_DATATYPE_SAFEGUARD_POINTER ( _memory , blocklen_bytes , (CONVERTOR )-> pBaseBuf ,
@@ -104,6 +112,8 @@ pack_predefined_data( opal_convertor_t* CONVERTOR,
104
112
* As an epilog do anything left from the last blocklen.
105
113
*/
106
114
if ( 0 != cando_count ) {
115
+
116
+ do_epilog :
107
117
assert ( cando_count < _elem -> blocklen );
108
118
do_now_bytes = cando_count * opal_datatype_basicDatatypes [_elem -> common .type ]-> size ;
109
119
OPAL_DATATYPE_SAFEGUARD_POINTER ( _memory , do_now_bytes , (CONVERTOR )-> pBaseBuf ,
0 commit comments