diff options
author | Eric Lambert <eric_lambert@xyratex.com> | 2014-06-03 14:14:04 -0700 |
---|---|---|
committer | Eric Lambert <eric_lambert@xyratex.com> | 2014-06-03 14:14:04 -0700 |
commit | a30308b48539c60ffe5bbc5fb0a31f95f8290084 (patch) | |
tree | b177cafcd814fda75a38c72f5fcda0edd9e46b60 | |
parent | 596c2f04fe4d5c3ad3b6ed196441909221727aba (diff) | |
download | pyeclib-a30308b48539c60ffe5bbc5fb0a31f95f8290084.tar.gz |
issue-46: fixed some memory leaks, as well as some minor fixes.
-rwxr-xr-x | c_eclib-0.9/build-c_eclib.sh | 6 | ||||
-rw-r--r-- | c_eclib-0.9/xor_codes/test_xor_hd_code.c | 56 | ||||
-rw-r--r-- | c_eclib-0.9/xor_codes/xor_hd_code.c | 11 | ||||
-rw-r--r-- | src/c/pyeclib_c/pyeclib_c.c | 3 |
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); |