This source file includes following definitions.
- mca_bml_base_btl_array_construct
- mca_bml_base_btl_array_destruct
- mca_bml_base_btl_array_reserve
- mca_bml_base_completion
- mca_bml_base_send
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 #include "ompi_config.h"
  20 
  21 #include <string.h>
  22 
  23 #include "ompi/mca/bml/bml.h"
  24 #include "bml_base_btl.h"
  25 #include "opal/util/crc.h"
  26 #if OPAL_ENABLE_DEBUG_RELIABILITY
  27 #include "opal/util/alfg.h"
  28 #endif 
  29 static void mca_bml_base_btl_array_construct(mca_bml_base_btl_array_t* array)
  30 {
  31     array->bml_btls = NULL;
  32     array->arr_size = 0;
  33     array->arr_index = 0;
  34     array->arr_reserve = 0;
  35 }
  36 
  37 
  38 static void mca_bml_base_btl_array_destruct(mca_bml_base_btl_array_t* array)
  39 {
  40     if(NULL != array->bml_btls) {
  41         free(array->bml_btls);
  42         array->bml_btls = NULL;
  43     }
  44     array->arr_size = 0;
  45     array->arr_index = 0;
  46     array->arr_reserve = 0;
  47 }
  48 
  49 OBJ_CLASS_INSTANCE(
  50     mca_bml_base_btl_array_t,
  51     opal_object_t,
  52     mca_bml_base_btl_array_construct,
  53     mca_bml_base_btl_array_destruct
  54 );
  55 
  56 int mca_bml_base_btl_array_reserve(mca_bml_base_btl_array_t* array, size_t size)
  57 {
  58     size_t old_len = sizeof(mca_bml_base_btl_t)*array->arr_reserve;
  59     size_t new_len = sizeof(mca_bml_base_btl_t)*size;
  60     if(old_len >= new_len)
  61         return OMPI_SUCCESS;
  62 
  63     array->bml_btls = (mca_bml_base_btl_t*)realloc(array->bml_btls, new_len);
  64     if(NULL == array->bml_btls)
  65         return OMPI_ERR_OUT_OF_RESOURCE;
  66     memset((unsigned char*)array->bml_btls + old_len, 0, new_len-old_len);
  67     array->arr_reserve = size;
  68     return OMPI_SUCCESS;
  69 }
  70 
  71 
  72 #if OPAL_ENABLE_DEBUG_RELIABILITY
  73 
  74 extern int mca_bml_base_error_rate_floor;
  75 extern int mca_bml_base_error_rate_ceiling;
  76 extern int  mca_bml_base_error_count;
  77 extern opal_rng_buff_t mca_bml_base_rand_buff;
  78 
  79 struct mca_bml_base_context_t {
  80     size_t index;
  81     mca_btl_base_completion_fn_t cbfunc;
  82     void* cbdata;
  83 };
  84 typedef struct mca_bml_base_context_t mca_bml_base_context_t;
  85 
  86 static void mca_bml_base_completion(
  87                                     struct mca_btl_base_module_t* btl,
  88                                     struct mca_btl_base_endpoint_t* ep,
  89                                     struct mca_btl_base_descriptor_t* des,
  90                                     int status)
  91 {
  92     mca_bml_base_context_t* ctx = (mca_bml_base_context_t*) des->des_cbdata;
  93     
  94     ((unsigned char*)des->des_segments[0].seg_addr.pval)[ctx->index] ^= ~0;
  95     des->des_cbdata = ctx->cbdata;
  96     des->des_cbfunc = ctx->cbfunc;
  97     free(ctx);
  98     
  99     des->des_cbfunc(btl,ep,des,status);
 100 }
 101 
 102 int mca_bml_base_send( mca_bml_base_btl_t* bml_btl,
 103                        mca_btl_base_descriptor_t* des,
 104                        mca_btl_base_tag_t tag )
 105 {
 106     des->des_context = (void*)bml_btl;
 107     if(mca_bml_base_error_count <= 0 && mca_bml_base_error_rate_ceiling > 0) {
 108       mca_bml_base_error_count = (int) (((double) mca_bml_base_error_rate_ceiling *
 109                   opal_rand(&mca_bml_base_rand_buff))/(UINT32_MAX+1.0));
 110         if(mca_bml_base_error_count < (double) mca_bml_base_error_rate_floor) {
 111           mca_bml_base_error_count = (double) mca_bml_base_error_rate_floor;
 112         }
 113         if(mca_bml_base_error_count % 2) {
 114             
 115             opal_output(0, "%s:%d: dropping data, with local completion\n", __FILE__, __LINE__);
 116             des->des_cbfunc(bml_btl->btl, bml_btl->btl_endpoint, des, OMPI_SUCCESS);
 117             return OMPI_SUCCESS;
 118         } else {
 119             
 120             mca_bml_base_context_t* ctx = (mca_bml_base_context_t*)
 121                 malloc(sizeof(mca_bml_base_context_t));
 122             if(NULL != ctx) {
 123                 opal_output(0, "%s:%d: corrupting data\n", __FILE__, __LINE__);
 124                 ctx->index = (size_t) ((des->des_segments[0].seg_len *
 125                             opal_rand(&mca_bml_base_rand_buff) * 1.0) / (UINT32_MAX + 1.0));
 126                 ctx->cbfunc = des->des_cbfunc;
 127                 ctx->cbdata = des->des_cbdata;
 128                 ((unsigned char*)des->des_segments[0].seg_addr.pval)[ctx->index] ^= ~0;
 129                 des->des_cbdata = ctx;
 130                 des->des_cbfunc = mca_bml_base_completion;
 131             }
 132         }
 133     }
 134     mca_bml_base_error_count--;
 135     return bml_btl->btl_send( bml_btl->btl,
 136                               bml_btl->btl_endpoint,
 137                               des, tag );
 138 }
 139 
 140 #endif