@@ -53,7 +53,7 @@ main(int argc, char* argv[])
53
53
int ret = 0 ;
54
54
int blen [4 ];
55
55
ptrdiff_t disp [4 ];
56
- ompi_datatype_t * newType , * types [4 ], * struct_type , * vec_type ;
56
+ ompi_datatype_t * newType , * types [4 ], * struct_type , * vec_type , * dup_type ;
57
57
ptrdiff_t old_lb , old_extent , old_true_lb , old_true_extent ;
58
58
ptrdiff_t lb , extent , true_lb , true_extent ;
59
59
@@ -397,6 +397,53 @@ main(int argc, char* argv[])
397
397
ret = ompi_datatype_destroy (& unpacked_dt );
398
398
if (ret != 0 ) goto cleanup ;
399
399
400
+ /**
401
+ *
402
+ * TEST 7
403
+ *
404
+ */
405
+ printf ("---> Basic test with dup'ed MPI_INT\n" );
406
+
407
+ ret = get_extents (& ompi_mpi_int .dt , & old_lb , & old_extent , & old_true_lb , & old_true_extent );
408
+ if (ret != 0 ) goto cleanup ;
409
+ ret = ompi_datatype_duplicate (& ompi_mpi_int .dt , & dup_type );
410
+ if (ret != 0 ) goto cleanup ;
411
+ ompi_datatype_t * type = & ompi_mpi_int .dt ;
412
+ ret = ompi_datatype_set_args (dup_type , 0 , NULL , 0 , NULL , 1 , & type , MPI_COMBINER_DUP );
413
+ if (ret != 0 ) goto cleanup ;
414
+ packed_ddt_len = ompi_datatype_pack_description_length (dup_type );
415
+ ptr = payload = malloc (packed_ddt_len );
416
+ ret = ompi_datatype_get_pack_description (dup_type , & packed_ddt );
417
+ if (ret != 0 ) goto cleanup ;
418
+
419
+ memcpy (payload , packed_ddt , packed_ddt_len );
420
+ unpacked_dt = ompi_datatype_create_from_packed_description (& payload ,
421
+ ompi_proc_local ());
422
+ free (ptr );
423
+ if (unpacked_dt == NULL ) {
424
+ printf ("\tFAILED: could not unpack datatype\n" );
425
+ ret = 1 ;
426
+ goto cleanup ;
427
+ } else {
428
+ ret = get_extents (unpacked_dt , & lb , & extent , & true_lb , & true_extent );
429
+ if (ret != 0 ) goto cleanup ;
430
+
431
+ if (old_lb != lb || old_extent != extent ||
432
+ old_true_lb != true_lb || old_true_extent != extent ) {
433
+ printf ("\tFAILED: datatypes don't match\n" );
434
+ ret = 1 ;
435
+ goto cleanup ;
436
+ }
437
+ printf ("\tPASSED\n" );
438
+ }
439
+ if (unpacked_dt == & ompi_mpi_int32_t .dt ) {
440
+ printf ("\tPASSED\n" );
441
+ } else {
442
+ printf ("\tFAILED: datatypes don't match\n" );
443
+ ret = 1 ;
444
+ goto cleanup ;
445
+ }
446
+ ompi_datatype_destroy (& dup_type );
400
447
401
448
cleanup :
402
449
ompi_datatype_finalize ();
0 commit comments