root/opal/datatype/opal_datatype_monotonic.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. opal_datatype_is_monotonic

   1 /* -*- Mode: C; c-basic-offset:4 ; -*- */
   2 /*
   3  * Copyright (c) 2018      Research Organization for Information Science
   4  *                         and Technology (RIST). All rights reserved.
   5  * $COPYRIGHT$
   6  *
   7  * Additional copyrights may follow
   8  *
   9  * $HEADER$
  10  */
  11 
  12 #include "opal_config.h"
  13 
  14 #include <stddef.h>
  15 
  16 #include "opal/constants.h"
  17 #include "opal/datatype/opal_datatype.h"
  18 #include "opal/datatype/opal_datatype_internal.h"
  19 #include "opal/datatype/opal_convertor.h"
  20 
  21 int32_t opal_datatype_is_monotonic(opal_datatype_t* type )
  22 {
  23     opal_convertor_t *pConv;
  24     uint32_t iov_count;
  25     struct iovec iov[5];
  26     size_t max_data = 0;
  27     long prev = -1;
  28     int rc;
  29     bool monotonic = true;
  30 
  31     pConv  = opal_convertor_create( opal_local_arch, 0 );
  32     if (OPAL_UNLIKELY(NULL == pConv)) {
  33         return 0;
  34     }
  35     rc = opal_convertor_prepare_for_send( pConv, type, 1, NULL );
  36     if( OPAL_UNLIKELY(OPAL_SUCCESS != rc)) {
  37         OBJ_RELEASE(pConv);
  38         return 0;
  39     }
  40 
  41     do {
  42         iov_count = 5;
  43         rc = opal_convertor_raw( pConv, iov, &iov_count, &max_data);
  44         for (uint32_t i=0; i<iov_count; i++) {
  45             if ((long)iov[i].iov_base < prev) {
  46                 monotonic = false;
  47                 goto cleanup;
  48             }
  49             prev = (long)iov[i].iov_base;
  50         }
  51     } while (rc != 1);
  52 
  53   cleanup:
  54     OBJ_RELEASE( pConv );
  55 
  56     return monotonic;
  57 }

/* [<][>][^][v][top][bottom][index][help] */