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/19 16:37:36 UTC
[3/3] celix git commit: CELIX-272: Invoke service tracker callbacks
outside the array_list lock.
CELIX-272: Invoke service tracker callbacks outside the array_list lock.
Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/254d7bf1
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/254d7bf1
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/254d7bf1
Branch: refs/heads/develop
Commit: 254d7bf1fb5187f373711478718f9c7ac7938153
Parents: bd5a57c
Author: Pepijn Noltes <pe...@gmail.com>
Authored: Thu Nov 19 16:30:15 2015 +0100
Committer: Pepijn Noltes <pe...@gmail.com>
Committed: Thu Nov 19 16:30:15 2015 +0100
----------------------------------------------------------------------
framework/private/src/service_tracker.c | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/celix/blob/254d7bf1/framework/private/src/service_tracker.c
----------------------------------------------------------------------
diff --git a/framework/private/src/service_tracker.c b/framework/private/src/service_tracker.c
index 4256c52..7714139 100644
--- a/framework/private/src/service_tracker.c
+++ b/framework/private/src/service_tracker.c
@@ -275,8 +275,7 @@ static celix_status_t serviceTracker_track(service_tracker_pt tracker, service_r
bool found = false;
unsigned int i;
- celixThreadRwlock_writeLock(&tracker->lock);
-
+ celixThreadRwlock_readLock(&tracker->lock);
for (i = 0; i < arrayList_size(tracker->trackedServices); i++) {
bool equals = false;
tracked = (tracked_pt) arrayList_get(tracker->trackedServices, i);
@@ -289,6 +288,7 @@ static celix_status_t serviceTracker_track(service_tracker_pt tracker, service_r
break;
}
}
+ celixThreadRwlock_unlock(&tracker->lock);
if (status == CELIX_SUCCESS && !found /*new*/) {
void * service = NULL;
@@ -299,15 +299,19 @@ static celix_status_t serviceTracker_track(service_tracker_pt tracker, service_r
assert(reference != NULL);
tracked->reference = reference;
tracked->service = service;
- arrayList_add(tracker->trackedServices, tracked);
serviceTracker_invokeAddService(tracker, reference, service);
+ celixThreadRwlock_writeLock(&tracker->lock);
+ arrayList_add(tracker->trackedServices, tracked);
+ celixThreadRwlock_unlock(&tracker->lock);
}
}
+
} else {
status = serviceTracker_invokeModifiedService(tracker, reference, tracked->service);
}
- celixThreadRwlock_unlock(&tracker->lock);
+
+
framework_logIfError(logger, status, NULL, "Cannot track reference");
@@ -387,13 +391,16 @@ static celix_status_t serviceTracker_untrack(service_tracker_pt tracker, service
serviceReference_equals(reference, tracked->reference, &equals);
if (equals) {
arrayList_remove(tracker->trackedServices, i);
- serviceTracker_invokeRemovingService(tracker, tracked->reference, tracked->service);
- free(tracked);
break;
}
}
celixThreadRwlock_unlock(&tracker->lock);
+ if (tracked != NULL) {
+ serviceTracker_invokeRemovingService(tracker, tracked->reference, tracked->service);
+ free(tracked);
+ }
+
framework_logIfError(logger, status, NULL, "Cannot untrack reference");
return status;