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