Repository: celix Updated Branches: refs/heads/feature/CELIX-237_rsa-ffi eba9e71a8 -> 8eeec9a84
CELIX-237: Added destroy for dyn_function/dyn_closure and tested with valgrind Project: http://git-wip-us.apache.org/repos/asf/celix/repo Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/8eeec9a8 Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/8eeec9a8 Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/8eeec9a8 Branch: refs/heads/feature/CELIX-237_rsa-ffi Commit: 8eeec9a84bdd4aa6849df86f740a42c96a512188 Parents: eba9e71 Author: Pepijn Noltes <[email protected]> Authored: Wed Jul 8 01:35:17 2015 +0200 Committer: Pepijn Noltes <[email protected]> Committed: Wed Jul 8 01:35:17 2015 +0200 ---------------------------------------------------------------------- .../dynamic_function_interface/dyn_function.c | 25 +++++++++++++++++--- .../tst/dyn_closure_tests.cpp | 13 ++++++---- 2 files changed, 30 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/celix/blob/8eeec9a8/remote_services/dynamic_function_interface/dyn_function.c ---------------------------------------------------------------------- diff --git a/remote_services/dynamic_function_interface/dyn_function.c b/remote_services/dynamic_function_interface/dyn_function.c index 116803f..dbe414d 100644 --- a/remote_services/dynamic_function_interface/dyn_function.c +++ b/remote_services/dynamic_function_interface/dyn_function.c @@ -30,7 +30,7 @@ struct _dyn_closure_type { ffi_closure *ffiClosure; void (*fn)(void); void (*bind)(void *userData, void *args[], void *ret); - void *userData; + void *userData; //for bind }; @@ -122,7 +122,15 @@ static int dynFunction_initCif(ffi_cif *cif, dyn_type *arguments, dyn_type *retu int dynFunction_destroy(dyn_function_type *dynFunc) { int result = 0; - LOG_WARNING("TODO destroy dyn dync\n"); + if (dynFunc != NULL) { + if (dynFunc->arguments != NULL) { + dynType_destroy(dynFunc->arguments); + } + if (dynFunc->funcReturn != NULL) { + dynType_destroy(dynFunc->funcReturn); + } + free(dynFunc); + } return result; } @@ -180,6 +188,17 @@ int dynClosure_getFnPointer(dyn_closure_type *dynClosure, void (**fn)(void)) { int dynClosure_destroy(dyn_closure_type *dynClosure) { int result = 0; - LOG_WARNING("TODO destroy closure\n"); + if (dynClosure != NULL) { + if (dynClosure->arguments != NULL) { + dynType_destroy(dynClosure->arguments); + } + if (dynClosure->funcReturn != NULL) { + dynType_destroy(dynClosure->funcReturn); + } + if (dynClosure->ffiClosure != NULL) { + ffi_closure_free(dynClosure->ffiClosure); + } + free(dynClosure); + } return result; } http://git-wip-us.apache.org/repos/asf/celix/blob/8eeec9a8/remote_services/dynamic_function_interface/tst/dyn_closure_tests.cpp ---------------------------------------------------------------------- diff --git a/remote_services/dynamic_function_interface/tst/dyn_closure_tests.cpp b/remote_services/dynamic_function_interface/tst/dyn_closure_tests.cpp index c3ea1de..9138fb3 100644 --- a/remote_services/dynamic_function_interface/tst/dyn_closure_tests.cpp +++ b/remote_services/dynamic_function_interface/tst/dyn_closure_tests.cpp @@ -47,7 +47,7 @@ void example2_binding(void *userData, void* args[], void *out) { int32_t a = *((int32_t *)args[0]); struct example2_arg2 b = *((struct example2_arg2 *)args[1]); int32_t c = *((int32_t *)args[2]); - int32_t *ret = (int32_t *)out; + double *ret = (double *)out; *ret = a + b.val1 + b.val2 + b.val3 + c; g_count += 1; } @@ -79,7 +79,7 @@ static void example3_binding(void *userData, void* args[], void *out) { static void tests() { dyn_closure_type *dynClosure = NULL; - int rc; + int rc = 0; { rc = dynClosure_create(EXAMPLE1_SCHEMA, example1_binding, NULL, &dynClosure); @@ -88,8 +88,9 @@ static void tests() { int rc = dynClosure_getFnPointer(dynClosure, (void(**)(void))&func); CHECK_EQUAL(0, rc); int32_t ret = func(2,3,4); - printf("Return value for example1 is %i\n", ret); + //printf("Return value for example1 is %i\n", ret); CHECK_EQUAL(1, g_count); + CHECK_EQUAL(9, ret); dynClosure_destroy(dynClosure); } @@ -105,8 +106,9 @@ static void tests() { b.val2 = 1.5; b.val3 = 2.0; double ret = func(2,b,4); - printf("Return value for example2 is %f\n", ret); + //printf("Return value for example2 is %f\n", ret); CHECK_EQUAL(2, g_count); + CHECK_EQUAL(10.5, ret); dynClosure_destroy(dynClosure); } @@ -118,8 +120,9 @@ static void tests() { rc = dynClosure_getFnPointer(dynClosure, (void(**)(void))&func); CHECK_EQUAL(0, rc); struct example3_ret *ret = func(2,8,4); - printf("Return value for example3 is {sum:%i, max:%i, min:%i}\n", ret->sum, ret->max, ret->min); + //printf("Return value for example3 is {sum:%i, max:%i, min:%i}\n", ret->sum, ret->max, ret->min); CHECK_EQUAL(3, g_count); + CHECK_EQUAL(14, ret->sum); dynClosure_destroy(dynClosure); free(ret); }
