summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoic Dachary <loic@dachary.org>2014-06-08 18:54:00 +0200
committerLoic Dachary <loic@dachary.org>2014-06-09 11:20:39 +0200
commitc9e12edb584bb58b447c7d90e167b9853d7675b6 (patch)
tree9ce2531c5564ef3e2b2ca4758de7c7c862aab334
parent35bdea7e19ad7831c3f0af609d368faef983548b (diff)
downloadjerasure-c9e12edb584bb58b447c7d90e167b9853d7675b6.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> (cherry picked from commit 1b30a37c9f75df371cf4deaedfde6b843933b4f0)
-rw-r--r--include/galois.h2
-rw-r--r--src/galois.c47
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);
}