You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by ej...@apache.org on 2016/08/23 14:02:23 UTC

[1/2] celix git commit: [CELIX-256] fixed wrong ordering in case of not processing event

Repository: celix
Updated Branches:
  refs/heads/feature/event_admin 1db2379c1 -> e3fd7f1b2


[CELIX-256] fixed wrong ordering in case of not processing event


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

Branch: refs/heads/feature/event_admin
Commit: 05d719254b966fb6ea91aba984753672735c17df
Parents: 1db2379
Author: Erik Jansman <ej...@apache.org>
Authored: Tue Aug 23 13:03:29 2016 +0200
Committer: Erik Jansman <ej...@apache.org>
Committed: Tue Aug 23 13:03:29 2016 +0200

----------------------------------------------------------------------
 event_admin/event_admin/private/src/event_admin_impl.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/05d71925/event_admin/event_admin/private/src/event_admin_impl.c
----------------------------------------------------------------------
diff --git a/event_admin/event_admin/private/src/event_admin_impl.c b/event_admin/event_admin/private/src/event_admin_impl.c
index 37ca79d..a7204e1 100644
--- a/event_admin/event_admin/private/src/event_admin_impl.c
+++ b/event_admin/event_admin/private/src/event_admin_impl.c
@@ -118,17 +118,22 @@ void *eventProcessor(void *handle) {
         }
         if (event != NULL) {
             status = processEvent((*eventAdminPt), event);
+            const char *topic;
+
+            eventAdmin_getTopic(&event, &topic);
             if (status == CELIX_SUCCESS) {
-                const char *topic;
 
-                eventAdmin_getTopic(&event, &topic);
                 eventAdmin_unlockTopic((*eventAdminPt), topic);
                 event = NULL;
 
 
             } else {
+                do {
+                    status = celixThreadMutex_tryLock((*eventAdminPt)->eventListLock);
+                } while (status != 0);
                 //processing event unsuccesfull since topic is locked. put event back into list for later processing.
-                eventAdmin_postEvent(*eventAdminPt, event);
+                linkedList_addFirst((*eventAdminPt)->eventList, event);
+                celixThreadMutex_unlock((*eventAdminPt)->eventListLock);
             }
         }
 


[2/2] celix git commit: [CELIX-256] made sure events are given to the right event handlers

Posted by ej...@apache.org.
[CELIX-256] made sure events are given to the right event handlers


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

Branch: refs/heads/feature/event_admin
Commit: e3fd7f1b25e7ebbd860e252ef9dba849de924cc4
Parents: 05d7192
Author: Erik Jansman <ej...@apache.org>
Authored: Tue Aug 23 16:01:31 2016 +0200
Committer: Erik Jansman <ej...@apache.org>
Committed: Tue Aug 23 16:01:31 2016 +0200

----------------------------------------------------------------------
 .../event_admin/private/src/event_admin_impl.c  | 32 +++++++++++++++++---
 1 file changed, 28 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/e3fd7f1b/event_admin/event_admin/private/src/event_admin_impl.c
----------------------------------------------------------------------
diff --git a/event_admin/event_admin/private/src/event_admin_impl.c b/event_admin/event_admin/private/src/event_admin_impl.c
index a7204e1..40cbaa1 100644
--- a/event_admin/event_admin/private/src/event_admin_impl.c
+++ b/event_admin/event_admin/private/src/event_admin_impl.c
@@ -82,7 +82,17 @@ celix_status_t eventAdmin_postEvent(event_admin_pt event_admin, event_pt event)
     bool added = false;
     while (event_admin->eventAdminRunning && added == false) {
         if (celixThreadMutex_tryLock(event_admin->eventListLock) == 0) {
-            linkedList_addLast(event_admin->eventList, event);
+            //linkedList_addLast(event_admin->eventList, event);
+            array_list_pt event_handlers;
+            array_list_pt event_and_handlers;
+            const char *topic;
+            eventAdmin_getTopic(&event, &topic);
+            arrayList_create(&event_and_handlers);
+            arrayList_create(&event_handlers);
+            eventAdmin_findHandlersByTopic(event_admin, topic, event_handlers);
+            arrayList_addIndex(event_and_handlers, 0, event);
+            arrayList_addIndex(event_and_handlers, 1, event_handlers);
+            linkedList_addLast(event_admin->eventList, event_and_handlers);
             celixThreadMutex_unlock(event_admin->eventListLock);
             added = true;
         }
@@ -94,6 +104,9 @@ void *eventProcessor(void *handle) {
     celix_status_t status = CELIX_SUCCESS;
     event_admin_pt *eventAdminPt = handle;
     event_pt event = NULL;
+    array_list_pt event_and_handlers;
+
+    arrayList_create(&event_and_handlers);
     int waitcounter = 1;
     while ((*eventAdminPt)->eventAdminRunning) {
         if (celixThreadMutex_tryLock((*eventAdminPt)->eventListLock) == 0) {
@@ -104,7 +117,7 @@ void *eventProcessor(void *handle) {
                     waitcounter = 1;
                 }
             } else {
-                event = linkedList_removeFirst((*eventAdminPt)->eventList);
+                event_and_handlers = linkedList_removeFirst((*eventAdminPt)->eventList);
                 waitcounter = 1;
 
             }
@@ -116,8 +129,19 @@ void *eventProcessor(void *handle) {
                 waitcounter = 1;
             }
         }
-        if (event != NULL) {
-            status = processEvent((*eventAdminPt), event);
+        if (arrayList_isEmpty(event_and_handlers) == false) {
+            event = arrayList_get(event_and_handlers, 0);
+            array_list_pt event_handlers;
+            arrayList_create(&event_handlers);
+            event_handlers = arrayList_get(event_and_handlers, 1);
+            array_list_iterator_pt handlers_iterator = arrayListIterator_create(event_handlers);
+            while (arrayListIterator_hasNext(handlers_iterator)) {
+                event_handler_service_pt event_handler_service = (event_handler_service_pt) arrayListIterator_next(
+                        handlers_iterator);
+                if (event_handler_service != NULL) {
+                    event_handler_service->handle_event(&event_handler_service->event_handler, event);
+                }
+            }
             const char *topic;
 
             eventAdmin_getTopic(&event, &topic);