You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2015/10/13 12:17:32 UTC

[2/3] celix git commit: CELIX-237: Added locking and some clearup

CELIX-237: Added locking and some clearup


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

Branch: refs/heads/feature/CELIX-237_rsa-ffi
Commit: c66eb88753e001fefe007e57325777f8dd8fc4db
Parents: 6494ec2
Author: Pepijn Noltes <pe...@gmail.com>
Authored: Tue Oct 13 11:38:00 2015 +0200
Committer: Pepijn Noltes <pe...@gmail.com>
Committed: Tue Oct 13 12:16:38 2015 +0200

----------------------------------------------------------------------
 .../rsa/private/src/import_registration_dfi.c   | 42 +++++++++++++++-----
 1 file changed, 33 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/c66eb887/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 3ba20e7..f0530b0 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
@@ -1,6 +1,7 @@
 #include <stdlib.h>
 #include <jansson.h>
 #include <json_rpc.h>
+#include <assert.h>
 #include "json_serializer.h"
 #include "dyn_interface.h"
 #include "import_registration.h"
@@ -20,6 +21,7 @@ struct import_registration {
     service_registration_pt factoryReg;
 
     hash_map_pt proxies; //key -> bundle, value -> service_proxy
+    celix_thread_mutex_t proxiesMutex; //protects proxies
 };
 
 struct service_proxy {
@@ -32,6 +34,7 @@ static celix_status_t importRegistration_createProxy(import_registration_pt impo
                                               struct service_proxy **proxy);
 static void importRegistration_proxyFunc(void *userData, void *args[], void *returnVal);
 static void importRegistration_destroyProxy(struct service_proxy *proxy);
+static void importRegistration_clearProxies(import_registration_pt import);
 
 celix_status_t importRegistration_create(bundle_context_pt context, endpoint_description_pt endpoint, const char *classObject,
                                          import_registration_pt *out) {
@@ -47,7 +50,9 @@ celix_status_t importRegistration_create(bundle_context_pt context, endpoint_des
         reg->endpoint = endpoint;
         reg->classObject = classObject;
         reg->proxies = hashMap_create(NULL, NULL, NULL, NULL);
+
         celixThreadMutex_create(&reg->mutex, NULL);
+        celixThreadMutex_create(&reg->proxiesMutex, NULL);
 
         reg->factory->factory = reg;
         reg->factory->getService = (void *)importRegistration_getService;
@@ -76,18 +81,32 @@ celix_status_t importRegistration_setSendFn(import_registration_pt reg,
     return CELIX_SUCCESS;
 }
 
-void importRegistration_destroy(import_registration_pt import) {
+static void importRegistration_clearProxies(import_registration_pt import) {
     if (import != NULL) {
+        pthread_mutex_lock(&import->proxiesMutex);
         if (import->proxies != NULL) {
-            hash_map_iterator_pt  iter = hashMapIterator_create(import->proxies);
+            hash_map_iterator_pt iter = hashMapIterator_create(import->proxies);
             while (hashMapIterator_hasNext(iter)) {
                 struct service_proxy *proxy = hashMapIterator_nextEntry(iter);
                 importRegistration_destroyProxy(proxy);
             }
             hashMapIterator_destroy(iter);
+        }
+        pthread_mutex_unlock(&import->proxiesMutex);
+    }
+}
+
+void importRegistration_destroy(import_registration_pt import) {
+    if (import != NULL) {
+        if (import->proxies != NULL) {
+            importRegistration_clearProxies(import);
             hashMap_destroy(import->proxies, false, false);
             import->proxies = NULL;
         }
+
+        pthread_mutex_destroy(&import->mutex);
+        pthread_mutex_destroy(&import->proxiesMutex);
+
         if (import->factory != NULL) {
             free(import->factory);
         }
@@ -110,7 +129,9 @@ celix_status_t importRegistration_stop(import_registration_pt import) {
     if (import->factoryReg != NULL) {
         serviceRegistration_unregister(import->factoryReg);
     }
-    //TODO unregister every serv instance? Needed for factory?
+
+    importRegistration_clearProxies(import);
+
     return status;
 }
 
@@ -127,11 +148,12 @@ celix_status_t importRegistration_getService(import_registration_pt import, bund
      */
 
 
-    struct service_proxy *proxy = hashMap_get(import->proxies, bundle); //TODO lock
+    pthread_mutex_lock(&import->proxiesMutex);
+    struct service_proxy *proxy = hashMap_get(import->proxies, bundle);
     if (proxy == NULL) {
         status = importRegistration_createProxy(import, bundle, &proxy);
         if (status == CELIX_SUCCESS) {
-            hashMap_put(import->proxies, bundle, proxy); //TODO lock
+            hashMap_put(import->proxies, bundle, proxy);
         }
     }
 
@@ -139,6 +161,7 @@ celix_status_t importRegistration_getService(import_registration_pt import, bund
         proxy->count += 1;
         *out = proxy->service;
     }
+    pthread_mutex_unlock(&import->proxiesMutex);
 
     return status;
 }
@@ -263,13 +286,13 @@ static void importRegistration_proxyFunc(void *userData, void *args[], void *ret
 
 celix_status_t importRegistration_ungetService(import_registration_pt import, bundle_pt bundle, service_registration_pt registration, void **out) {
     celix_status_t  status = CELIX_SUCCESS;
-    return status;
 
-    /* TODO fix. gives segfault in framework shutdown (import->proxies == NULL)
     assert(import != NULL);
     assert(import->proxies != NULL);
 
-    struct service_proxy *proxy = hashMap_get(import->proxies, bundle); //TODO lock
+    pthread_mutex_lock(&import->proxiesMutex);
+
+    struct service_proxy *proxy = hashMap_get(import->proxies, bundle);
     if (proxy != NULL) {
         if (*out == proxy->service) {
             proxy->count -= 1;
@@ -281,7 +304,8 @@ celix_status_t importRegistration_ungetService(import_registration_pt import, bu
             importRegistration_destroyProxy(proxy);
         }
     }
-     */
+
+    pthread_mutex_lock(&import->proxiesMutex);
 
     return status;
 }