CELIX-237: Fixed an issue in the dyn_type, added some extra tests and improved 
some logging handling in the framework


Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/f3ae660e
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/f3ae660e
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/f3ae660e

Branch: refs/heads/develop
Commit: f3ae660e980859ffa29bbcfa829c4db591791f9f
Parents: 3f71ac4
Author: Pepijn Noltes <pepijnnol...@gmail.com>
Authored: Wed Oct 7 14:30:51 2015 +0200
Committer: Pepijn Noltes <pepijnnol...@gmail.com>
Committed: Wed Oct 7 14:30:51 2015 +0200

----------------------------------------------------------------------
 framework/private/src/celix_log.c                |  5 ++++-
 framework/private/src/framework.c                | 12 ++++++------
 .../dynamic_function_interface/dyn_type.c        |  3 ++-
 .../dynamic_function_interface/json_rpc.c        |  2 +-
 .../descriptors/example3.descriptor              | 11 +++++++++++
 .../dyn_interface_tests.cpp                      | 16 ++++++++++++++++
 .../dyn_type_tests.cpp                           | 19 ++++++++++++++++++-
 .../json_rpc_tests.cpp                           | 11 ++++++++++-
 .../rsa/private/src/export_registration_dfi.c    |  2 ++
 .../rsa/private/src/import_registration_dfi.c    |  2 +-
 10 files changed, 71 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/f3ae660e/framework/private/src/celix_log.c
----------------------------------------------------------------------
diff --git a/framework/private/src/celix_log.c 
b/framework/private/src/celix_log.c
index 404c02f..d2e222e 100644
--- a/framework/private/src/celix_log.c
+++ b/framework/private/src/celix_log.c
@@ -34,7 +34,10 @@ void framework_log(framework_logger_pt logger, 
framework_log_level_t level, cons
     va_start(listPointer, fmsg);
     vsprintf(msg, fmsg, listPointer);
 
-    logger->logFunction(level, func, file, line, msg);
+    //FIXME logger and/or logger->logFucntion can be null. But this solution 
is not thread safe!
+    if (logger != NULL && logger->logFunction != NULL) {
+        logger->logFunction(level, func, file, line, msg);
+    }
 }
 
 void framework_logCode(framework_logger_pt logger, framework_log_level_t 
level, const char *func, const char *file, int line, celix_status_t code, char 
*fmsg, ...) {

http://git-wip-us.apache.org/repos/asf/celix/blob/f3ae660e/framework/private/src/framework.c
----------------------------------------------------------------------
diff --git a/framework/private/src/framework.c 
b/framework/private/src/framework.c
index 17cfdba..22abc43 100644
--- a/framework/private/src/framework.c
+++ b/framework/private/src/framework.c
@@ -322,11 +322,6 @@ celix_status_t framework_destroy(framework_pt framework) {
 
        unsetenv(OSGI_FRAMEWORK_FRAMEWORK_UUID);
 
-       logger = hashMap_get(framework->configurationMap, "logger");
-       if (logger == NULL) {
-               free(framework->logger);
-       }
-
        celixThreadCondition_destroy(&framework->dispatcher);
        celixThreadMutex_destroy(&framework->bundleListenerLock);
        celixThreadMutex_destroy(&framework->dispatcherLock);
@@ -335,9 +330,14 @@ celix_status_t framework_destroy(framework_pt framework) {
        celixThreadMutex_destroy(&framework->mutex);
        celixThreadCondition_destroy(&framework->condition);
 
+    logger = hashMap_get(framework->configurationMap, "logger");
+    if (logger == NULL) {
+        free(framework->logger);
+    }
+
     properties_destroy(framework->configurationMap);
 
-       free(framework);
+    free(framework);
 
        return status;
 }

http://git-wip-us.apache.org/repos/asf/celix/blob/f3ae660e/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_type.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_type.c
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_type.c
index 88f8766..972278d 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_type.c
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/dyn_type.c
@@ -301,7 +301,7 @@ static int dynType_parseComplex(FILE *stream, dyn_type 
*type) {
         if (type->complex.structType.elements != NULL) {
             int index = 0;
             TAILQ_FOREACH(entry, &type->complex.entriesHead, entries) {
-                type->complex.structType.elements[index++] = 
entry->type->ffiType;
+                type->complex.structType.elements[index++] = 
dynType_ffiType(entry->type);
             }
         } else {
             status = MEM_ERROR;
@@ -576,6 +576,7 @@ static void dynType_clearTypedPointer(dyn_type *type) {
 
 int dynType_alloc(dyn_type *type, void **bufLoc) {
     assert(type->type != DYN_TYPE_REF);
+    assert(type->ffiType->size != 0);
     int status = OK;
 
     void *inst = calloc(1, type->ffiType->size);

http://git-wip-us.apache.org/repos/asf/celix/blob/f3ae660e/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_rpc.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_rpc.c
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_rpc.c
index 01dc6b5..756b24e 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_rpc.c
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface/json_rpc.c
@@ -128,7 +128,7 @@ int jsonRpc_call(dyn_interface_type *intf, void *service, 
const char *request, c
         dyn_type *argType = dynFunction_argumentTypeForIndex(func, i);
         enum dyn_function_argument_meta  meta = 
dynFunction_argumentMetaForIndex(func, i);
         if (meta == DYN_FUNCTION_ARGUMENT_META__STD) {
-            //TODO SOMETIMES segfault dynType_free(argType, args[i]);
+            dynType_free(argType, args[i]);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/celix/blob/f3ae660e/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/descriptors/example3.descriptor
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/descriptors/example3.descriptor
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/descriptors/example3.descriptor
new file mode 100644
index 0000000..c89d969
--- /dev/null
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/descriptors/example3.descriptor
@@ -0,0 +1,11 @@
+:header
+type=interface
+name=detection_provider
+version=1.0.0
+:annotations
+:types
+location={DD lat lon}
+target={Jllocation;DDJ id location speed heading lastUpdated}
+detection={Jllocation;Dltarget; id center range simulated}
+:methods
+getDetections()Ljava/util/List;=getDetections(#am=handle;P#am=out;**[Ldetection;)N

http://git-wip-us.apache.org/repos/asf/celix/blob/f3ae660e/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/dyn_interface_tests.cpp
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/dyn_interface_tests.cpp
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/dyn_interface_tests.cpp
index 679260f..f7cc370 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/dyn_interface_tests.cpp
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/dyn_interface_tests.cpp
@@ -69,6 +69,18 @@ extern "C" {
         dynInterface_destroy(dynIntf);
     }
 
+    static void test2(void) {
+        int status = 0;
+        dyn_interface_type *dynIntf = NULL;
+        FILE *desc = fopen("descriptors/example3.descriptor", "r");
+        assert(desc != NULL);
+        status = dynInterface_parse(desc, &dynIntf);
+        CHECK_EQUAL(0, status);
+        fclose(desc);
+
+        dynInterface_destroy(dynIntf);
+    }
+
 }
 
 
@@ -85,3 +97,7 @@ TEST_GROUP(DynInterfaceTests) {
 TEST(DynInterfaceTests, test1) {
     test1();
 }
+
+TEST(DynInterfaceTests, test2) {
+    test2();
+}

http://git-wip-us.apache.org/repos/asf/celix/blob/f3ae660e/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/dyn_type_tests.cpp
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/dyn_type_tests.cpp
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/dyn_type_tests.cpp
index ae14c0f..57db391 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/dyn_type_tests.cpp
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/dyn_type_tests.cpp
@@ -22,12 +22,27 @@ extern "C" {
 
     static void runTest(const char *descriptorStr, const char *exName) {
         dyn_type *type;
-        int i;
         type = NULL;
         //printf("\n-- example %s with descriptor string '%s' --\n", exName, 
descriptorStr);
         int status = dynType_parseWithStr(descriptorStr, exName, NULL, &type);
         CHECK_EQUAL(0, status);
 
+        //MEM check, to try to ensure no mem leaks/corruptions occur.
+        int i;
+        int j;
+        int nrOfBurst = 10;
+        int burst = 50;
+        void *pointers[burst];
+        for (j = 0; j < nrOfBurst; j += 1) {
+            for (i = 0; i < burst ; i +=1 ) {
+                pointers[i] = NULL;
+                dynType_alloc(type, &pointers[i]);
+            }
+            for (i = 0; i < burst ; i +=1 ) {
+                dynType_free(type, pointers[i]);
+            }
+        }
+
         FILE *stream = fopen("/dev/null", "w");
         dynType_print(type, stream);
         fclose(stream);
@@ -56,6 +71,7 @@ TEST_GROUP(DynTypeTests) {
 #define EX12 "Tnode={Lnode;Lnode; left right};{Lnode; head}" //note recursive 
example
 #define EX13 "Ttype={DDDDD a b c d e};{ltype;Ltype;ltype;Ltype; byVal1 byRef1 
byVal2 ByRef2}" 
 #define EX14 "{DD{FF{JJ}{II*{ss}}}}"  //unnamed fields
+#define EX15 "Tsample={jDD time val1 val2};Tresult={jDlsample; time result 
sample};Lresult;"
 
 #define CREATE_EXAMPLES_TEST(DESC) \
     TEST(DynTypeTests, ParseTestExample ## DESC) { \
@@ -76,6 +92,7 @@ CREATE_EXAMPLES_TEST(EX11)
 CREATE_EXAMPLES_TEST(EX12)
 CREATE_EXAMPLES_TEST(EX13)
 CREATE_EXAMPLES_TEST(EX14)
+CREATE_EXAMPLES_TEST(EX15)
 
 TEST(DynTypeTests, ParseRandomGarbageTest) {
     /*

http://git-wip-us.apache.org/repos/asf/celix/blob/f3ae660e/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/json_rpc_tests.cpp
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/json_rpc_tests.cpp
 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/json_rpc_tests.cpp
index 6140bec..c7a3350 100644
--- 
a/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/json_rpc_tests.cpp
+++ 
b/remote_services/remote_service_admin_dfi/dynamic_function_interface_tst/json_rpc_tests.cpp
@@ -156,6 +156,7 @@ static void stdLog(void *handle, int level, const char 
*file, int line, const ch
         CHECK(desc != NULL);
         int rc = dynInterface_parse(desc, &intf);
         CHECK_EQUAL(0, rc);
+        fclose(desc);
 
         char *result = NULL;
 
@@ -178,6 +179,7 @@ static void stdLog(void *handle, int level, const char 
*file, int line, const ch
         CHECK(desc != NULL);
         int rc = dynInterface_parse(desc, &intf);
         CHECK_EQUAL(0, rc);
+        fclose(desc);
 
         char *result = NULL;
 
@@ -199,6 +201,7 @@ static void stdLog(void *handle, int level, const char 
*file, int line, const ch
         CHECK(desc != NULL);
         int rc = dynInterface_parse(desc, &intf);
         CHECK_EQUAL(0, rc);
+        fclose(desc);
 
         struct methods_head *head;
         dynInterface_methods(intf, &head);
@@ -238,6 +241,7 @@ static void stdLog(void *handle, int level, const char 
*file, int line, const ch
         CHECK(desc != NULL);
         int rc = dynInterface_parse(desc, &intf);
         CHECK_EQUAL(0, rc);
+        fclose(desc);
 
         struct methods_head *head;
         dynInterface_methods(intf, &head);
@@ -273,9 +277,14 @@ static void stdLog(void *handle, int level, const char 
*file, int line, const ch
         CHECK_EQUAL(2.5, result->buf[1]->b);
 
 
+        int i;
+        for (i = 0; i < result->len; i +=1 ) {
+            free(result->buf[i]);
+        }
         free(result->buf);
         free(result);
-        dynInterface_destroy(intf);    }
+        dynInterface_destroy(intf);
+    }
 
 }
 

http://git-wip-us.apache.org/repos/asf/celix/blob/f3ae660e/remote_services/remote_service_admin_dfi/rsa/private/src/export_registration_dfi.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/rsa/private/src/export_registration_dfi.c
 
b/remote_services/remote_service_admin_dfi/rsa/private/src/export_registration_dfi.c
index edc085e..474749f 100644
--- 
a/remote_services/remote_service_admin_dfi/rsa/private/src/export_registration_dfi.c
+++ 
b/remote_services/remote_service_admin_dfi/rsa/private/src/export_registration_dfi.c
@@ -119,6 +119,8 @@ celix_status_t exportRegistration_create(log_helper_pt 
helper, service_reference
 celix_status_t exportRegistration_call(export_registration_pt export, char 
*data, int datalength, char **responseOut, int *responseLength) {
     int status = CELIX_SUCCESS;
 
+    //printf("calling for '%s'\n");
+
     *responseLength = -1;
     celixThreadMutex_lock(&export->mutex);
     status = jsonRpc_call(export->intf, export->service, data, responseOut);

http://git-wip-us.apache.org/repos/asf/celix/blob/f3ae660e/remote_services/remote_service_admin_dfi/rsa/private/src/import_registration_dfi.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_dfi/rsa/private/src/import_registration_dfi.c
 
b/remote_services/remote_service_admin_dfi/rsa/private/src/import_registration_dfi.c
index 680a75a..fdc95df 100644
--- 
a/remote_services/remote_service_admin_dfi/rsa/private/src/import_registration_dfi.c
+++ 
b/remote_services/remote_service_admin_dfi/rsa/private/src/import_registration_dfi.c
@@ -249,7 +249,7 @@ static void importRegistration_proxyFunc(void *userData, 
void *args[], void *ret
         //printf("request sended. got reply '%s' with status %i\n", reply, rc);
 
         if (rc == 0) {
-            //printf("Handling reply '%s'\n", reply);
+            //fjprintf("Handling reply '%s'\n", reply);
             status = jsonRpc_handleReply(entry->dynFunc, reply, args);
         }
 

Reply via email to