This is an automated email from the ASF dual-hosted git repository. pengzheng pushed a commit to branch hotfix/coverity_fix in repository https://gitbox.apache.org/repos/asf/celix.git
commit 1f7ce875586d230ab6c378143f3cc4f2900fb8b9 Author: PengZheng <[email protected]> AuthorDate: Sun May 7 11:03:36 2023 +0800 Fix Coverity 314120 Value not atomically updated. --- libs/framework/src/service_tracker.c | 15 +++++++-------- libs/framework/src/service_tracker_private.h | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/libs/framework/src/service_tracker.c b/libs/framework/src/service_tracker.c index e7ed8caf..13040462 100644 --- a/libs/framework/src/service_tracker.c +++ b/libs/framework/src/service_tracker.c @@ -122,7 +122,7 @@ celix_status_t serviceTracker_createWithFilter(bundle_context_pt context, const celixThreadCondition_init(&tracker->condTracked, NULL); celixThreadCondition_init(&tracker->condUntracking, NULL); tracker->trackedServices = celix_arrayList_create(); - tracker->untrackingServices = celix_arrayList_create(); + tracker->untrackedServiceCount = 0; tracker->currentHighestServiceId = -1; @@ -141,7 +141,6 @@ celix_status_t serviceTracker_destroy(service_tracker_pt tracker) { celixThreadCondition_destroy(&tracker->condTracked); celixThreadCondition_destroy(&tracker->condUntracking); celix_arrayList_destroy(tracker->trackedServices); - celix_arrayList_destroy(tracker->untrackingServices); free(tracker); return CELIX_SUCCESS; } @@ -223,7 +222,7 @@ celix_status_t serviceTracker_close(service_tracker_t* tracker) { if (nrOfTrackedEntries > 0) { tracked = celix_arrayList_get(tracker->trackedServices, 0); celix_arrayList_removeAt(tracker->trackedServices, 0); - celix_arrayList_add(tracker->untrackingServices, tracked); + tracker->untrackedServiceCount++; } celixThreadMutex_unlock(&tracker->mutex); @@ -231,7 +230,7 @@ celix_status_t serviceTracker_close(service_tracker_t* tracker) { int currentSize = nrOfTrackedEntries - 1; serviceTracker_untrackTracked(tracker, tracked, currentSize, currentSize == 0); celixThreadMutex_lock(&tracker->mutex); - celix_arrayList_remove(tracker->untrackingServices, tracked); + tracker->untrackedServiceCount--; celixThreadCondition_broadcast(&tracker->condUntracking); celixThreadMutex_unlock(&tracker->mutex); } @@ -528,7 +527,7 @@ static celix_status_t serviceTracker_untrack(service_tracker_t* tracker, service remove = tracked; //remove from trackedServices to prevent getting this service, but don't destroy yet, can be in use celix_arrayList_removeAt(tracker->trackedServices, i); - celix_arrayList_add(tracker->untrackingServices, remove); + tracker->untrackedServiceCount++; break; } } @@ -539,12 +538,12 @@ static celix_status_t serviceTracker_untrack(service_tracker_t* tracker, service if (remove != NULL) { serviceTracker_untrackTracked(tracker, remove, size, true); celixThreadMutex_lock(&tracker->mutex); - celix_arrayList_remove(tracker->untrackingServices, remove); + tracker->untrackedServiceCount--; celixThreadMutex_unlock(&tracker->mutex); } else { //ensure no untrack is still happening (to ensure it safe to unregister service) celixThreadMutex_lock(&tracker->mutex); - while (celix_arrayList_size(tracker->untrackingServices) > 0) { + while (tracker->untrackedServiceCount > 0) { celixThreadCondition_wait(&tracker->condUntracking, &tracker->mutex); } celixThreadMutex_unlock(&tracker->mutex); @@ -680,7 +679,7 @@ celix_service_tracker_t* celix_serviceTracker_createWithOptions( celixThreadCondition_init(&tracker->condTracked, NULL); celixThreadCondition_init(&tracker->condUntracking, NULL); tracker->trackedServices = celix_arrayList_create(); - tracker->untrackingServices = celix_arrayList_create(); + tracker->untrackedServiceCount = 0; tracker->currentHighestServiceId = -1; tracker->listener.handle = tracker; diff --git a/libs/framework/src/service_tracker_private.h b/libs/framework/src/service_tracker_private.h index 772c6249..196c3c5f 100644 --- a/libs/framework/src/service_tracker_private.h +++ b/libs/framework/src/service_tracker_private.h @@ -67,7 +67,7 @@ struct celix_serviceTracker { celix_thread_cond_t condTracked; celix_thread_cond_t condUntracking; celix_array_list_t *trackedServices; - celix_array_list_t *untrackingServices; + size_t untrackedServiceCount; enum celix_service_tracker_state state; long currentHighestServiceId; };
