diff options
author | Kevin Greenan <kmgreen2@gmail.com> | 2014-06-12 12:14:12 -0700 |
---|---|---|
committer | Kevin Greenan <kmgreen2@gmail.com> | 2014-06-12 12:14:12 -0700 |
commit | 7313600fc1c63234b51413721afaafedd36359c4 (patch) | |
tree | 9ce2531c5564ef3e2b2ca4758de7c7c862aab334 | |
parent | 35bdea7e19ad7831c3f0af609d368faef983548b (diff) | |
parent | c9e12edb584bb58b447c7d90e167b9853d7675b6 (diff) | |
download | jerasure-7313600fc1c63234b51413721afaafedd36359c4.tar.gz |
Merged in dachary/jerasure/wip-galois-init-v2 (pull request #23)
add galois_init_default_field error code
-rw-r--r-- | include/galois.h | 2 | ||||
-rw-r--r-- | src/galois.c | 47 |
2 files changed, 30 insertions, 19 deletions
diff --git a/include/galois.h b/include/galois.h index e55dbed..b57ef3c 100644 --- a/include/galois.h +++ b/include/galois.h @@ -45,7 +45,7 @@ #include <stdlib.h> #include <gf_complete.h> -extern void galois_init_default_field(int w); +extern int galois_init_default_field(int w); extern void galois_change_technique(gf_t *gf, int w); extern int galois_single_multiply(int a, int b, int w); diff --git a/src/galois.c b/src/galois.c index 5d4282e..95d72bc 100644 --- a/src/galois.c +++ b/src/galois.c @@ -47,6 +47,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <errno.h> #include "galois.h" @@ -168,24 +169,34 @@ gf_t* galois_init_composite_field(int w, return gfp; } -void galois_init_default_field(int w) +int galois_init_default_field(int w) +{ + if (gfp_array[w] == NULL) { + gfp_array[w] = (gf_t*)malloc(sizeof(gf_t)); + if(gfp_array[w] == NULL) + return ENOMEM; + if (!gf_init_easy(gfp_array[w], w)) + return EINVAL; + } + return 0; +} + +static void galois_init(int w) { if (w <= 0 || w > 32) { fprintf(stderr, "ERROR -- cannot init default Galois field for w=%d\n", w); exit(1); } - if (gfp_array[w] == NULL) { - gfp_array[w] = (gf_t*)malloc(sizeof(gf_t)); - if (gfp_array[w] == NULL) { - fprintf(stderr, "ERROR -- cannot allocate memory for Galois field w=%d\n", w); - exit(1); - } - } - - if (!gf_init_easy(gfp_array[w], w)) { + switch (galois_init_default_field(w)) { + case ENOMEM: + fprintf(stderr, "ERROR -- cannot allocate memory for Galois field w=%d\n", w); + exit(1); + break; + case EINVAL: fprintf(stderr, "ERROR -- cannot init default Galois field for w=%d\n", w); exit(1); + break; } } @@ -243,7 +254,7 @@ int galois_single_multiply(int x, int y, int w) if (x == 0 || y == 0) return 0; if (gfp_array[w] == NULL) { - galois_init_default_field(w); + galois_init(w); } if (w <= 32) { @@ -260,7 +271,7 @@ int galois_single_divide(int x, int y, int w) if (y == 0) return -1; if (gfp_array[w] == NULL) { - galois_init_default_field(w); + galois_init(w); } if (w <= 32) { @@ -278,7 +289,7 @@ void galois_w08_region_multiply(char *region, /* Region to multiply */ int add) { if (gfp_array[8] == NULL) { - galois_init_default_field(8); + galois_init(8); } gfp_array[8]->multiply_region.w32(gfp_array[8], region, r2, multby, nbytes, add); } @@ -290,7 +301,7 @@ void galois_w16_region_multiply(char *region, /* Region to multiply */ int add) { if (gfp_array[16] == NULL) { - galois_init_default_field(16); + galois_init(16); } gfp_array[16]->multiply_region.w32(gfp_array[16], region, r2, multby, nbytes, add); } @@ -303,7 +314,7 @@ void galois_w32_region_multiply(char *region, /* Region to multiply */ int add) { if (gfp_array[32] == NULL) { - galois_init_default_field(32); + galois_init(32); } gfp_array[32]->multiply_region.w32(gfp_array[32], region, r2, multby, nbytes, add); } @@ -311,7 +322,7 @@ void galois_w32_region_multiply(char *region, /* Region to multiply */ void galois_w8_region_xor(void *src, void *dest, int nbytes) { if (gfp_array[8] == NULL) { - galois_init_default_field(8); + galois_init(8); } gfp_array[8]->multiply_region.w32(gfp_array[32], src, dest, 1, nbytes, 1); } @@ -319,7 +330,7 @@ void galois_w8_region_xor(void *src, void *dest, int nbytes) void galois_w16_region_xor(void *src, void *dest, int nbytes) { if (gfp_array[16] == NULL) { - galois_init_default_field(16); + galois_init(16); } gfp_array[16]->multiply_region.w32(gfp_array[16], src, dest, 1, nbytes, 1); } @@ -327,7 +338,7 @@ void galois_w16_region_xor(void *src, void *dest, int nbytes) void galois_w32_region_xor(void *src, void *dest, int nbytes) { if (gfp_array[32] == NULL) { - galois_init_default_field(32); + galois_init(32); } gfp_array[32]->multiply_region.w32(gfp_array[32], src, dest, 1, nbytes, 1); } |