32 #include "erasurecode.h" 33 #include "erasurecode_backend.h" 34 #include "erasurecode_helpers.h" 35 #include "erasurecode_helpers_ext.h" 37 #define JERASURE_RS_CAUCHY_LIB_MAJOR 2 38 #define JERASURE_RS_CAUCHY_LIB_MINOR 0 39 #define JERASURE_RS_CAUCHY_LIB_REV 0 40 #define JERASURE_RS_CAUCHY_LIB_VER_STR "2.0" 41 #define JERASURE_RS_CAUCHY_LIB_NAME "jerasure_rs_cauchy" 42 #if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__) 43 #define JERASURE_RS_CAUCHY_SO_NAME "libJerasure.dylib" 45 #define JERASURE_RS_CAUCHY_SO_NAME "libJerasure.so.2" 53 typedef int* (*cauchy_original_coding_matrix_func)(int, int, int);
54 typedef int* (*jerasure_matrix_to_bitmatrix_func)(int, int, int,
int *);
55 typedef int** (*jerasure_smart_bitmatrix_to_schedule_func)
56 (int, int, int,
int *);
58 (int, int, int,
int *,
char **,
char **, int, int);
60 (int, int, int,
int *, int,
int *,
char **,
char **, int, int);
61 typedef int * (*jerasure_erasures_to_erased_func)(int, int,
int *);
63 (int, int, int,
int *,
int *,
int *,
int *);
65 (int, int,
int *,
int *, int,
char **,
char **, int, int);
71 #define PYECC_CAUCHY_PACKETSIZE sizeof(long) * 128 113 data, parity, blocksize,
120 int *missing_idxs,
int blocksize)
138 int *missing_idxs,
int destination_idx,
int blocksize)
142 int *decoding_row = NULL;
145 int *decoding_matrix = NULL;
149 k = jerasure_desc->
k;
150 m = jerasure_desc->
m;
151 w = jerasure_desc->
w;
153 if (destination_idx < k) {
157 if (NULL == decoding_matrix || NULL == dm_ids || NULL == erased) {
163 erased, decoding_matrix, dm_ids);
165 decoding_row = decoding_matrix + (destination_idx * k * w *
w);
168 decoding_row, dm_ids, destination_idx,
197 free(decoding_matrix);
208 int *fragments_to_exclude,
int *fragments_needed)
212 uint64_t exclude_bm = convert_list_to_bitmap(fragments_to_exclude);
213 uint64_t missing_bm = convert_list_to_bitmap(missing_idxs) | exclude_bm;
218 for (i = 0; i < (jerasure_desc->
k + jerasure_desc->
m); i++) {
219 if (!(missing_bm & (1 << i))) {
220 fragments_needed[j] = i;
223 if (j == jerasure_desc->
k) {
225 fragments_needed[j] = -1;
235 void *backend_sohandle)
249 if (args->uargs.w <= 0)
260 long long max_symbols;
261 max_symbols = 1LL <<
w;
262 if ((k + m) > max_symbols) {
282 } func_handle = {.vptr = NULL};
285 func_handle.vptr = NULL;
286 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_bitmatrix_encode");
292 func_handle.vptr = NULL;
293 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_bitmatrix_decode");
299 func_handle.vptr = NULL;
300 func_handle.vptr = dlsym(backend_sohandle,
"cauchy_original_coding_matrix");
306 func_handle.vptr = NULL;
307 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_matrix_to_bitmatrix");
313 func_handle.vptr = NULL;
314 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_smart_bitmatrix_to_schedule");
320 func_handle.vptr = NULL;
321 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_make_decoding_bitmatrix");
327 func_handle.vptr = NULL;
328 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_bitmatrix_dotprod");
334 func_handle.vptr = NULL;
335 func_handle.vptr = dlsym(backend_sohandle,
"jerasure_erasures_to_erased");
343 if (NULL == desc->
matrix) {
382 bool end_of_array =
false;
384 if (jerasure_desc == NULL) {
388 free(jerasure_desc->
matrix);
399 if (schedule != NULL) {
400 while (!end_of_array) {
401 if (schedule[i] == NULL || schedule[i][0] == -1) {
443 .id = EC_BACKEND_JERASURE_RS_CAUCHY,
448 .backend_metadata_size = 0,
#define JERASURE_RS_CAUCHY_LIB_MINOR
void(* jerasure_bitmatrix_dotprod_func)(int, int, int *, int *, int, char **, char **, int, int)
#define JERASURE_RS_CAUCHY_LIB_VER_STR
struct ec_backend jerasure_rs_cauchy
jerasure_bitmatrix_encode_func jerasure_bitmatrix_encode
static bool jerasure_rs_cauchy_is_compatible_with(uint32_t version)
static int jerasure_rs_cauchy_encode(void *desc, char **data, char **parity, int blocksize)
#define JERASURE_RS_CAUCHY_LIB_REV
void * alloc_zeroed_buffer(int size)
Allocate a zero-ed buffer of a specific size.
struct ec_backend_op_stubs jerasure_rs_cauchy_op_stubs
#define JERASURE_RS_CAUCHY_LIB_NAME
jerasure_make_decoding_bitmatrix_func jerasure_make_decoding_bitmatrix
static void * jerasure_rs_cauchy_init(struct ec_backend_args *args, void *backend_sohandle)
static int jerasure_rs_cauchy_reconstruct(void *desc, char **data, char **parity, int *missing_idxs, int destination_idx, int blocksize)
jerasure_bitmatrix_dotprod_func jerasure_bitmatrix_dotprod
int **(* jerasure_smart_bitmatrix_to_schedule_func)(int, int, int, int *)
static int jerasure_rs_cauchy_min_fragments(void *desc, int *missing_idxs, int *fragments_to_exclude, int *fragments_needed)
int(* jerasure_make_decoding_bitmatrix_func)(int, int, int, int *, int *, int *, int *)
int *(* cauchy_original_coding_matrix_func)(int, int, int)
static void free_rs_cauchy_desc(struct jerasure_rs_cauchy_descriptor *jerasure_desc)
#define JERASURE_RS_CAUCHY_LIB_MAJOR
struct ec_backend_common backend_jerasure_rs_cauchy
jerasure_bitmatrix_decode_func jerasure_bitmatrix_decode
int(* jerasure_bitmatrix_decode_func)(int, int, int, int *, int, int *, char **, char **, int, int)
jerasure_erasures_to_erased_func jerasure_erasures_to_erased
static int jerasure_rs_cauchy_exit(void *desc)
cauchy_original_coding_matrix_func cauchy_original_coding_matrix
int *(* jerasure_erasures_to_erased_func)(int, int, int *)
#define JERASURE_RS_CAUCHY_SO_NAME
#define PYECC_CAUCHY_PACKETSIZE
jerasure_matrix_to_bitmatrix_func jerasure_matrix_to_bitmatrix
jerasure_smart_bitmatrix_to_schedule_func jerasure_smart_bitmatrix_to_schedule
int *(* jerasure_matrix_to_bitmatrix_func)(int, int, int, int *)
static int jerasure_rs_cauchy_decode(void *desc, char **data, char **parity, int *missing_idxs, int blocksize)
static int jerasure_rs_cauchy_element_size(void *desc)
Return the element-size, which is the number of bits stored on a given device, per codeword...
void(* jerasure_bitmatrix_encode_func)(int, int, int, int *, char **, char **, int, int)
struct ec_backend_op_stubs jerasure_rs_cauchy_ops