diff options
author | Loic Dachary <loic@dachary.org> | 2014-06-08 18:54:00 +0200 |
---|---|---|
committer | Loic Dachary <loic@dachary.org> | 2014-06-08 18:59:00 +0200 |
commit | 1b30a37c9f75df371cf4deaedfde6b843933b4f0 (patch) | |
tree | efff819aea5370f019b1b4150e798540368d7ade | |
parent | b8221e7d75d2bc74782cd1490a41ada2decef1ba (diff) | |
download | jerasure-1b30a37c9f75df371cf4deaedfde6b843933b4f0.tar.gz |
add galois_init_default_field error code
galois_init_default_field returns an errno(3) code in case of error
instead of exiting. This is handy when the caller needs to perform
cleanup or error reporting when an error occurs instead of exit(2).
The exit(2) based error handling is preserved in the static
galois_init() function which is used in galois.c instead and is based on
galois_init_default_field to avoid code duplication.
Signed-off-by: Loic Dachary <loic@dachary.org>
-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 9d815ab..b1e4652 100644 --- a/include/galois.h +++ b/include/galois.h @@ -46,7 +46,7 @@ extern "C" { #endif -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); } |