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(®->mutex, NULL);
+ celixThreadMutex_create(®->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;
}