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-08 18:59:00 +0200
commit1b30a37c9f75df371cf4deaedfde6b843933b4f0 (patch)
treeefff819aea5370f019b1b4150e798540368d7ade
parentb8221e7d75d2bc74782cd1490a41ada2decef1ba (diff)
downloadjerasure-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.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 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);
}