This source file includes following definitions.
- ompi_datatype_pack_external
- ompi_datatype_unpack_external
- ompi_datatype_pack_external_size
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 #include "ompi_config.h"
26 #include <stdio.h>
27
28 #include "ompi/runtime/params.h"
29 #include "ompi/communicator/communicator.h"
30 #include "ompi/datatype/ompi_datatype.h"
31 #include "opal/datatype/opal_convertor.h"
32
33 int ompi_datatype_pack_external(const char datarep[], const void *inbuf, int incount,
34 ompi_datatype_t *datatype, void *outbuf,
35 MPI_Aint outsize, MPI_Aint *position)
36 {
37 int rc = MPI_SUCCESS;
38 opal_convertor_t local_convertor;
39 struct iovec invec;
40 unsigned int iov_count;
41 size_t size;
42
43 OBJ_CONSTRUCT(&local_convertor, opal_convertor_t);
44
45
46
47
48
49 opal_convertor_copy_and_prepare_for_send( ompi_mpi_external32_convertor,
50 &(datatype->super), incount, (void *) inbuf,
51 CONVERTOR_SEND_CONVERSION,
52 &local_convertor );
53
54
55 opal_convertor_get_packed_size( &local_convertor, &size );
56 if( (*position + size) > (size_t)outsize ) {
57 OBJ_DESTRUCT( &local_convertor );
58 return MPI_ERR_TRUNCATE;
59 }
60
61
62 invec.iov_base = (char*) outbuf + (*position);
63 invec.iov_len = size;
64
65
66 iov_count = 1;
67 rc = opal_convertor_pack( &local_convertor, &invec, &iov_count, &size );
68 *position += size;
69 OBJ_DESTRUCT( &local_convertor );
70
71
72
73 return (rc == 1) ? OMPI_SUCCESS : MPI_ERR_UNKNOWN;
74 }
75
76 int ompi_datatype_unpack_external (const char datarep[], const void *inbuf, MPI_Aint insize,
77 MPI_Aint *position, void *outbuf, int outcount,
78 ompi_datatype_t *datatype)
79 {
80 int rc = MPI_SUCCESS;
81 opal_convertor_t local_convertor;
82 struct iovec outvec;
83 unsigned int iov_count;
84 size_t size;
85
86 OBJ_CONSTRUCT(&local_convertor, opal_convertor_t);
87
88
89 opal_convertor_copy_and_prepare_for_recv( ompi_mpi_external32_convertor,
90 &(datatype->super), outcount, outbuf,
91 0,
92 &local_convertor );
93
94
95 opal_convertor_get_packed_size( &local_convertor, &size );
96 if( (*position + size) > (unsigned int)insize ) {
97 OBJ_DESTRUCT( &local_convertor );
98 return MPI_ERR_TRUNCATE;
99 }
100
101
102 outvec.iov_base = (char*) inbuf + (*position);
103 outvec.iov_len = size;
104
105
106 iov_count = 1;
107 rc = opal_convertor_unpack( &local_convertor, &outvec, &iov_count, &size );
108 *position += size;
109 OBJ_DESTRUCT( &local_convertor );
110
111
112
113 return (rc == 1) ? OMPI_SUCCESS : MPI_ERR_UNKNOWN;
114 }
115
116 int ompi_datatype_pack_external_size(const char datarep[], int incount,
117 ompi_datatype_t *datatype, MPI_Aint *size)
118 {
119 opal_convertor_t local_convertor;
120 size_t length;
121
122 OBJ_CONSTRUCT(&local_convertor, opal_convertor_t);
123
124
125 opal_convertor_copy_and_prepare_for_recv( ompi_mpi_external32_convertor,
126 &(datatype->super), incount, NULL,
127 CONVERTOR_SEND_CONVERSION,
128 &local_convertor );
129
130 opal_convertor_get_unpacked_size( &local_convertor, &length );
131 *size = (MPI_Aint)length;
132 OBJ_DESTRUCT( &local_convertor );
133
134 return OMPI_SUCCESS;
135 }