root/ompi/mca/bml/base/bml_base_btl.c

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

DEFINITIONS

This source file includes following definitions.
  1. mca_bml_base_btl_array_construct
  2. mca_bml_base_btl_array_destruct
  3. mca_bml_base_btl_array_reserve
  4. mca_bml_base_completion
  5. mca_bml_base_send

   1 /*
   2  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
   3  *                         University Research and Technology
   4  *                         Corporation.  All rights reserved.
   5  * Copyright (c) 2004-2007 The University of Tennessee and The University
   6  *                         of Tennessee Research Foundation.  All rights
   7  *                         reserved.
   8  * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
   9  *                         University of Stuttgart.  All rights reserved.
  10  * Copyright (c) 2004-2006 The Regents of the University of California.
  11  *                         All rights reserved.
  12  * $COPYRIGHT$
  13  *
  14  * Additional copyrights may follow
  15  *
  16  * $HEADER$
  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 /* OPAL_ENABLE_DEBUG_RELIABILITY */
  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     /* restore original state */
  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     /* invoke original callback */
  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             /* local completion - network "drops" packet */
 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             /* corrupt data */
 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

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