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/11/17 12:57:45 UTC

[28/38] celix git commit: CELIX-272: Fix threading issue remote_shell

CELIX-272: Fix threading issue remote_shell


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

Branch: refs/heads/develop
Commit: 93c6a622126c24ce81d4d07b9c73d5086b75ff2b
Parents: e4259db
Author: Pepijn Noltes <pe...@gmail.com>
Authored: Mon Nov 16 21:14:19 2015 +0100
Committer: Pepijn Noltes <pe...@gmail.com>
Committed: Mon Nov 16 21:14:19 2015 +0100

----------------------------------------------------------------------
 remote_shell/private/include/shell_mediator.h |  1 +
 remote_shell/private/src/activator.c          |  1 +
 remote_shell/private/src/shell_mediator.c     | 39 +++++++++++-----------
 3 files changed, 21 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/93c6a622/remote_shell/private/include/shell_mediator.h
----------------------------------------------------------------------
diff --git a/remote_shell/private/include/shell_mediator.h b/remote_shell/private/include/shell_mediator.h
index faf86e8..24e8250 100644
--- a/remote_shell/private/include/shell_mediator.h
+++ b/remote_shell/private/include/shell_mediator.h
@@ -47,6 +47,7 @@ struct shell_mediator {
 typedef struct shell_mediator *shell_mediator_pt;
 
 celix_status_t shellMediator_create(bundle_context_pt context, shell_mediator_pt *instance);
+celix_status_t shellMediator_stop(shell_mediator_pt instance);
 celix_status_t shellMediator_destroy(shell_mediator_pt instance);
 celix_status_t shellMediator_executeCommand(shell_mediator_pt instance, char *command, FILE *out, FILE *err);
 

http://git-wip-us.apache.org/repos/asf/celix/blob/93c6a622/remote_shell/private/src/activator.c
----------------------------------------------------------------------
diff --git a/remote_shell/private/src/activator.c b/remote_shell/private/src/activator.c
index 062420d..4344258 100644
--- a/remote_shell/private/src/activator.c
+++ b/remote_shell/private/src/activator.c
@@ -102,6 +102,7 @@ celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context)
 	bundle_instance_pt bi = (bundle_instance_pt) userData;
 
 	connectionListener_stop(bi->connectionListener);
+	shellMediator_stop(bi->shellMediator);
 	shellMediator_destroy(bi->shellMediator);
 
 	remoteShell_stopConnections(bi->remoteShell);

http://git-wip-us.apache.org/repos/asf/celix/blob/93c6a622/remote_shell/private/src/shell_mediator.c
----------------------------------------------------------------------
diff --git a/remote_shell/private/src/shell_mediator.c b/remote_shell/private/src/shell_mediator.c
index ab60f3e..9b08035 100644
--- a/remote_shell/private/src/shell_mediator.c
+++ b/remote_shell/private/src/shell_mediator.c
@@ -36,9 +36,7 @@
 #include "log_service.h"
 #include "shell_mediator.h"
 
-static celix_status_t shellMediator_addingService(void *handler, service_reference_pt reference, void **service);
 static celix_status_t shellMediator_addedService(void *handler, service_reference_pt reference, void * service);
-static celix_status_t shellMediator_modifiedService(void *handler, service_reference_pt reference, void * service);
 static celix_status_t shellMediator_removedService(void *handler, service_reference_pt reference, void * service);
 
 celix_status_t shellMediator_create(bundle_context_pt context, shell_mediator_pt *instance) {
@@ -56,8 +54,8 @@ celix_status_t shellMediator_create(bundle_context_pt context, shell_mediator_pt
 
 		status = CELIX_DO_IF(status, celixThreadMutex_create(&(*instance)->mutex, NULL));
 
-		status = CELIX_DO_IF(status, serviceTrackerCustomizer_create((*instance), shellMediator_addingService, shellMediator_addedService,
-				shellMediator_modifiedService, shellMediator_removedService, &customizer));
+		status = CELIX_DO_IF(status, serviceTrackerCustomizer_create((*instance), NULL, shellMediator_addedService,
+				NULL, shellMediator_removedService, &customizer));
 		status = CELIX_DO_IF(status, serviceTracker_create(context, (char * )OSGI_SHELL_SERVICE_NAME, customizer, &(*instance)->tracker));
 
 		if (status == CELIX_SUCCESS) {
@@ -74,18 +72,31 @@ celix_status_t shellMediator_create(bundle_context_pt context, shell_mediator_pt
 	return status;
 }
 
+celix_status_t shellMediator_stop(shell_mediator_pt instance) {
+	service_tracker_pt tracker;
+	celixThreadMutex_lock(&instance->mutex);
+	tracker = instance->tracker;
+	celixThreadMutex_unlock(&instance->mutex);
+
+	if (tracker != NULL) {
+		serviceTracker_close(tracker);
+	}
+}
+
 celix_status_t shellMediator_destroy(shell_mediator_pt instance) {
 	celix_status_t status = CELIX_SUCCESS;
 
 	celixThreadMutex_lock(&instance->mutex);
 
 	instance->shellService = NULL;
-	serviceTracker_close(instance->tracker);
-	celixThreadMutex_unlock(&instance->mutex);
-
+	serviceTracker_destroy(instance->tracker);
 	logHelper_stop(instance->loghelper);
-
 	status = logHelper_destroy(&instance->loghelper);
+	celixThreadMutex_destroy(&instance->mutex);
+
+
+	free(instance);
+
 
 	return status;
 }
@@ -105,13 +116,6 @@ celix_status_t shellMediator_executeCommand(shell_mediator_pt instance, char *co
 	return status;
 }
 
-static celix_status_t shellMediator_addingService(void *handler, service_reference_pt reference, void **service) {
-	celix_status_t status = CELIX_SUCCESS;
-	shell_mediator_pt instance = (shell_mediator_pt) handler;
-	bundleContext_getService(instance->context, reference, service);
-	return status;
-}
-
 static celix_status_t shellMediator_addedService(void *handler, service_reference_pt reference, void * service) {
 	celix_status_t status = CELIX_SUCCESS;
 	shell_mediator_pt instance = (shell_mediator_pt) handler;
@@ -121,11 +125,6 @@ static celix_status_t shellMediator_addedService(void *handler, service_referenc
 	return status;
 }
 
-static celix_status_t shellMediator_modifiedService(void *handler, service_reference_pt reference, void * service) {
-	celix_status_t status = CELIX_SUCCESS;
-	//ignore
-	return status;
-}
 
 static celix_status_t shellMediator_removedService(void *handler, service_reference_pt reference, void * service) {
 	celix_status_t status = CELIX_SUCCESS;