summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Lambert <eric_lambert@xyratex.com>2014-06-03 14:14:04 -0700
committerEric Lambert <eric_lambert@xyratex.com>2014-06-03 14:14:04 -0700
commita30308b48539c60ffe5bbc5fb0a31f95f8290084 (patch)
treeb177cafcd814fda75a38c72f5fcda0edd9e46b60
parent596c2f04fe4d5c3ad3b6ed196441909221727aba (diff)
downloadpyeclib-a30308b48539c60ffe5bbc5fb0a31f95f8290084.tar.gz
issue-46: fixed some memory leaks, as well as some minor fixes.
-rwxr-xr-xc_eclib-0.9/build-c_eclib.sh6
-rw-r--r--c_eclib-0.9/xor_codes/test_xor_hd_code.c56
-rw-r--r--c_eclib-0.9/xor_codes/xor_hd_code.c11
-rw-r--r--src/c/pyeclib_c/pyeclib_c.c3
4 files changed, 66 insertions, 10 deletions
diff --git a/c_eclib-0.9/build-c_eclib.sh b/c_eclib-0.9/build-c_eclib.sh
index 2ac8e59..fa6f7fa 100755
--- a/c_eclib-0.9/build-c_eclib.sh
+++ b/c_eclib-0.9/build-c_eclib.sh
@@ -160,6 +160,12 @@ for lib in ${LIB_ORDER}; do
else
export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}":"${LIBDIR}
fi
+ else
+ if [ -z ${LD_LIBRARY_PATH} ]; then
+ export LD_LIBRARY_PATH=${LIBDIR}
+ else
+ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}":"${LIBDIR}
+ fi
fi
# Generate INCLUDE lines for c_eclib
diff --git a/c_eclib-0.9/xor_codes/test_xor_hd_code.c b/c_eclib-0.9/xor_codes/test_xor_hd_code.c
index 9443378..66e842e 100644
--- a/c_eclib-0.9/xor_codes/test_xor_hd_code.c
+++ b/c_eclib-0.9/xor_codes/test_xor_hd_code.c
@@ -75,6 +75,10 @@ int test_hd_code(xor_code_t *code_desc, int num_failure_combs, int failure_combs
data = (char**)malloc(code_desc->k * sizeof(char*));
parity = (char**)malloc(code_desc->m * sizeof(char*));
fragments_needed = (int*)malloc(code_desc->k*code_desc->m*sizeof(int));
+ if (!fragments_needed) {
+ fprintf(stderr, "Could not allocate memory for fragments %d\n", i);
+ exit(2);
+ }
bzero(fragments_needed, code_desc->k*code_desc->m*sizeof(int));
@@ -82,7 +86,7 @@ int test_hd_code(xor_code_t *code_desc, int num_failure_combs, int failure_combs
data[i] = aligned_malloc(blocksize, 16);
fill_buffer(data[i], blocksize, i);
if (!data[i]) {
- fprintf(stderr, "Could not allocate memnory for data %d\n", i);
+ fprintf(stderr, "Could not allocate memory for data %d\n", i);
exit(2);
}
}
@@ -91,7 +95,7 @@ int test_hd_code(xor_code_t *code_desc, int num_failure_combs, int failure_combs
parity[i] = aligned_malloc(blocksize, 16);
memset(parity[i], 0, blocksize);
if (!parity[i]) {
- fprintf(stderr, "Could not allocate memnory for parity %d\n", i);
+ fprintf(stderr, "Could not allocate memory for parity %d\n", i);
exit(2);
}
}
@@ -210,6 +214,15 @@ int test_hd_code(xor_code_t *code_desc, int num_failure_combs, int failure_combs
end_time = clock();
fprintf(stderr, "Decode: %.2f MB/s\n", ((double)(num_iter * blocksize * code_desc->k) / 1000 / 1000 ) / ((double)(end_time-start_time) / CLOCKS_PER_SEC));
+ free(fragments_needed);
+ for (i = 0; i < code_desc->k; i++) {
+ aligned_free(data[i]);
+ }
+ free(data);
+ for (i = 0; i < code_desc->m; i++) {
+ aligned_free(parity[i]);
+ }
+ free(parity);
return 0;
}
@@ -328,10 +341,49 @@ int run_test(int k, int m, int hd)
return ret;
}
+/**
+ * Runs a series aligned_malloc/aligned_free calls with a set of size and
+ * alignment values. For each alignment value, perform a series of boundry
+ * value anaylsis alloctions for every power-of-two between 2 and 32768.
+ * Then perform an aligned_free for each allocation.
+ *
+ * @return 0 is test behaves as expected, else -1.
+ *
+ */
+int run_aligned_malloc_test() {
+ int align = 8;
+ size_t amount;
+ int modifier;
+
+ for (align = 8; align <= 128; align *= 2) {
+ size_t amount = 2;
+ for (amount = 2; amount <= 32768; amount *= 2) {
+ int modifier;
+ for (modifier = -1; modifier <= 1; modifier++) {
+ size_t actual_amount = amount + modifier;
+ void *tmem = aligned_malloc(actual_amount,align);
+ if (!tmem) {
+ return -1;
+ }
+ if (memset(tmem,'0',actual_amount) != tmem) {
+ return -1;
+ }
+ aligned_free(tmem);
+ }
+ }
+ }
+ return 0;
+}
+
int main()
{
int ret = 0;
int i;
+
+ ret = run_aligned_malloc_test();
+ if (ret != 0) {
+ return ret;
+ }
for (i=6; i < 16; i++) {
ret = run_test(i, 6, 3);
diff --git a/c_eclib-0.9/xor_codes/xor_hd_code.c b/c_eclib-0.9/xor_codes/xor_hd_code.c
index 879fee3..6c1d297 100644
--- a/c_eclib-0.9/xor_codes/xor_hd_code.c
+++ b/c_eclib-0.9/xor_codes/xor_hd_code.c
@@ -385,7 +385,7 @@ static void decode_three_data(xor_code_t *code_desc, char **data, char **parity,
int parity_index = -1;
int data_index = -1;
int parity_bm = -1;
- char *parity_buffer;
+ char *parity_buffer = NULL;
/*
* Try to find a parity that only contains
@@ -507,10 +507,9 @@ void xor_hd_decode(xor_code_t *code_desc, char **data, char **parity, int *missi
int *missing_parity = get_missing_parity(code_desc, missing_idxs);
decode_one_data(code_desc, data, parity, missing_data, missing_parity, blocksize);
if (decode_parity) {
- int *missing_parity = get_missing_parity(code_desc, missing_idxs);
selective_encode(code_desc, data, parity, missing_parity, blocksize);
- free(missing_parity);
}
+ free(missing_parity);
free(missing_data);
break;
}
@@ -520,11 +519,10 @@ void xor_hd_decode(xor_code_t *code_desc, char **data, char **parity, int *missi
int *missing_parity = get_missing_parity(code_desc, missing_idxs);
decode_one_data(code_desc, data, parity, missing_data, missing_parity, blocksize);
if (decode_parity) {
- int *missing_parity = get_missing_parity(code_desc, missing_idxs);
selective_encode(code_desc, data, parity, missing_parity, blocksize);
- free(missing_parity);
}
free(missing_data);
+ free(missing_parity);
break;
}
case FAIL_PATTERN_2D_1P:
@@ -533,10 +531,9 @@ void xor_hd_decode(xor_code_t *code_desc, char **data, char **parity, int *missi
int *missing_parity = get_missing_parity(code_desc, missing_idxs);
decode_two_data(code_desc, data, parity, missing_data, missing_parity, blocksize);
if (decode_parity) {
- int *missing_parity = get_missing_parity(code_desc, missing_idxs);
selective_encode(code_desc, data, parity, missing_parity, blocksize);
- free(missing_parity);
}
+ free(missing_parity);
free(missing_data);
break;
}
diff --git a/src/c/pyeclib_c/pyeclib_c.c b/src/c/pyeclib_c/pyeclib_c.c
index 787d055..a8b7ed3 100644
--- a/src/c/pyeclib_c/pyeclib_c.c
+++ b/src/c/pyeclib_c/pyeclib_c.c
@@ -2053,7 +2053,8 @@ pyeclib_c_check_metadata(PyObject *self, PyObject *args)
for (i = 0; i < m; i++) {
parity_sigs[i] = (char *) alloc_aligned_buffer16(PYCC_MAX_SIG_LEN);
if (NULL == parity_sigs[i]) {
- for (int j = 0; j < i; j++) free(parity_sigs[j]);
+ int j;
+ for (j = 0; j < i; j++) free(parity_sigs[j]);
goto error;
} else {
memset(parity_sigs[i], 0, PYCC_MAX_SIG_LEN);