32#include "erasurecode.h"
33#include "erasurecode_backend.h"
34#include "erasurecode_helpers.h"
36#define LIBPHAZR_LIB_MAJOR 1
37#define LIBPHAZR_LIB_MINOR 0
38#define LIBPHAZR_LIB_REV 0
39#define LIBPHAZR_LIB_VER_STR "1.0.0"
40#define LIBPHAZR_LIB_NAME "libphazr"
41#if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
42#define LIBPHAZR_SO_NAME "libphazr" LIBERASURECODE_SO_SUFFIX ".dylib"
44#define LIBPHAZR_SO_NAME "libphazr" LIBERASURECODE_SO_SUFFIX ".so.1"
53typedef char* (*pio_create_precoding_matrix_func)(int);
54typedef char* (*pio_create_inverse_precoding_matrix_func)(int);
55typedef char* (*pio_create_kmux_matrix_func)(int, int, int);
88 int word_size = w / 8;
89 return ((blocksize + ((word_size - hd) - 1)) / (word_size - hd)) * word_size;
97 char **encoded = malloc(
sizeof(
char*) * (xdesc->
k + xdesc->
m));
99 if (NULL == encoded) {
104 for (i = 0; i < xdesc->
k; i++) {
105 encoded[i] = data[i];
108 for (i = 0; i < xdesc->
m; i++) {
109 encoded[i + xdesc->
k] = parity[i];
113 xdesc->
k, xdesc->
m, xdesc->
w, xdesc->
hd, blocksize, padding_size);
122 int *missing_idxs,
int blocksize)
127 char **decoded = malloc(
sizeof(
char*) * (xdesc->
k + xdesc->
m));
129 if (NULL == decoded) {
134 for (i = 0; i < xdesc->
k; i++) {
135 decoded[i] = data[i];
138 for (i = 0; i < xdesc->
m; i++) {
139 decoded[i + xdesc->
k] = parity[i];
143 missing_idxs, xdesc->
k, xdesc->
m, xdesc->
w, xdesc->
hd, blocksize, padding_size);
152 int *missing_idxs,
int destination_idx,
int blocksize)
157 char **encoded = malloc(
sizeof(
char*) * (xdesc->
k + xdesc->
m));
159 if (NULL == encoded) {
164 for (i = 0; i < xdesc->
k; i++) {
165 encoded[i] = data[i];
168 for (i = 0; i < xdesc->
m; i++) {
169 encoded[i + xdesc->
k] = parity[i];
173 destination_idx, xdesc->
k, xdesc->
m, xdesc->
w, blocksize, padding_size);
182 int *fragments_to_exclude,
int *fragments_needed)
185 struct ec_bm missing_bm = NEW_BM;
186 convert_list_to_bitmap(fragments_to_exclude, &missing_bm);
187 convert_list_to_bitmap(missing_idxs, &missing_bm);
192 for (i = 0; i < (xdesc->
k + xdesc->
m); i++) {
193 if (!bm_get_value(&missing_bm, i)) {
194 fragments_needed[j] = i;
199 fragments_needed[j] = -1;
218static void *
pio_init(
struct ec_backend_args *args,
void *backend_sohandle)
229 desc->
k = args->uargs.k;
230 desc->
m = args->uargs.m;
231 desc->
w = args->uargs.w;
232 desc->
hd = args->uargs.hd;
236 args->uargs.w = desc->
w;
240 args->uargs.hd = desc->
hd;
255 } func_handle = {.vptr = NULL};
258 func_handle.vptr = NULL;
259 func_handle.vptr = dlsym(backend_sohandle,
"create_precoding_matrix");
265 func_handle.vptr = NULL;
266 func_handle.vptr = dlsym(backend_sohandle,
"create_inverse_precoding_matrix");
272 func_handle.vptr = NULL;
273 func_handle.vptr = dlsym(backend_sohandle,
"create_kmux_matrix");
279 func_handle.vptr = NULL;
280 func_handle.vptr = dlsym(backend_sohandle,
"matrix_encode");
286 func_handle.vptr = NULL;
287 func_handle.vptr = dlsym(backend_sohandle,
"matrix_decode");
293 func_handle.vptr = NULL;
294 func_handle.vptr = dlsym(backend_sohandle,
"matrix_reconstruct");
314 if (NULL == desc->
matrix) {
321 return (
void *) desc;
359 return padded_blocksize - blocksize;
364 return metadata_size;
384 .id = EC_BACKEND_LIBPHAZR,
static void * pio_init(struct ec_backend_args *args, void *backend_sohandle)
static int pio_matrix_decode(void *desc, char **data, char **parity, int *missing_idxs, int blocksize)
#define LIBPHAZR_LIB_VER_STR
static int pio_matrix_reconstruct(void *desc, char **data, char **parity, int *missing_idxs, int destination_idx, int blocksize)
static int pio_element_size(void *desc)
Return the element-size, which is the number of bits stored on a given device, per codeword.
char *(* pio_create_inverse_precoding_matrix_func)(int)
static int pio_matrix_encode(void *desc, char **data, char **parity, int blocksize)
static int pio_min_fragments(void *desc, int *missing_idxs, int *fragments_to_exclude, int *fragments_needed)
static bool pio_is_compatible_with(uint32_t version)
int(* pio_matrix_decode_func)(char *, char *, char **, int *, int, int, int, int, int, int)
static size_t pio_get_backend_metadata_size(void *desc, int blocksize)
int(* pio_matrix_encode_func)(char *, char *, char **, int, int, int, int, int, int)
char *(* pio_create_kmux_matrix_func)(int, int, int)
#define LIBPHAZR_LIB_NAME
static int get_padded_blocksize(int w, int hd, int blocksize)
struct ec_backend_common backend_libphazr
static size_t pio_get_encode_offset(void *desc, int metadata_size)
#define LIBPHAZR_LIB_MINOR
char *(* pio_create_precoding_matrix_func)(int)
int(* pio_matrix_reconstruct_func)(char *, char **, int *, int, int, int, int, int, int)
__attribute__((visibility("internal")))
static int pio_exit(void *desc)
#define LIBPHAZR_LIB_MAJOR
static struct ec_backend_op_stubs libphazr_op_stubs
pio_matrix_decode_func matrix_decode
pio_create_kmux_matrix_func create_kmux_matrix
pio_create_inverse_precoding_matrix_func create_inverse_precoding_matrix
char * inverse_precoding_matrix
pio_matrix_reconstruct_func matrix_reconstruct
pio_create_precoding_matrix_func create_precoding_matrix
pio_matrix_encode_func matrix_encode