You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by bp...@apache.org on 2015/09/25 19:50:22 UTC

celix git commit: CELIX-259: added dispatcherThread shutdown

Repository: celix
Updated Branches:
  refs/heads/develop 7e3b33f62 -> 268ab022e


CELIX-259: added dispatcherThread shutdown


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

Branch: refs/heads/develop
Commit: 268ab022e08adaa6011785a9cac6b36c958f670a
Parents: 7e3b33f
Author: Bjoern Petri <bp...@apache.org>
Authored: Fri Sep 25 19:48:27 2015 +0200
Committer: Bjoern Petri <bp...@apache.org>
Committed: Fri Sep 25 19:48:27 2015 +0200

----------------------------------------------------------------------
 framework/private/src/framework.c | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/268ab022/framework/private/src/framework.c
----------------------------------------------------------------------
diff --git a/framework/private/src/framework.c b/framework/private/src/framework.c
index e0391e7..529a712 100644
--- a/framework/private/src/framework.c
+++ b/framework/private/src/framework.c
@@ -2066,10 +2066,23 @@ static void *framework_shutdown(void *framework) {
 		bundle_close(bundle);
 	}
 	hashMapIterator_destroy(iter);
-#ifndef ANDROID
-    pthread_cancel(fw->dispatcherThread.thread);
-#endif
-    celixThread_join(fw->dispatcherThread, NULL);
+
+	if (celixThreadMutex_lock(&fw->dispatcherLock) != CELIX_SUCCESS) {
+		fw_log(fw->logger, OSGI_FRAMEWORK_LOG_ERROR, "Error locking the dispatcherThread.");
+	}
+	else {
+		fw->shutdown = true;
+
+		if (celixThreadCondition_broadcast(&fw->dispatcher)) {
+			fw_log(fw->logger, OSGI_FRAMEWORK_LOG_ERROR, "Error broadcasting .");
+		}
+
+		if (celixThreadMutex_unlock(&fw->dispatcherLock)) {
+			fw_log(fw->logger, OSGI_FRAMEWORK_LOG_ERROR, "Error unlocking the dispatcherThread.");
+		}
+
+		celixThread_join(fw->dispatcherThread, NULL);
+	}
 
 	err = celixThreadMutex_lock(&fw->mutex);
 	if (err != 0) {
@@ -2077,7 +2090,6 @@ static void *framework_shutdown(void *framework) {
 		celixThread_exit(NULL);
 		return NULL;
 	}
-	fw->shutdown = true;
 	err = celixThreadCondition_broadcast(&fw->shutdownGate);
 	if (err != 0) {
 		fw_log(fw->logger, OSGI_FRAMEWORK_LOG_ERROR,  "Error waking the shutdown gate, cannot exit clean.");