summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Greenan <kmgreen2@gmail.com>2014-06-12 12:14:12 -0700
committerKevin Greenan <kmgreen2@gmail.com>2014-06-12 12:14:12 -0700
commit7313600fc1c63234b51413721afaafedd36359c4 (patch)
tree9ce2531c5564ef3e2b2ca4758de7c7c862aab334
parent35bdea7e19ad7831c3f0af609d368faef983548b (diff)
parentc9e12edb584bb58b447c7d90e167b9853d7675b6 (diff)
downloadjerasure-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.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);
}