Skip to content

Commit

Permalink
CELIX-351: Moved remove service listener after untracking service in …
Browse files Browse the repository at this point in the history
…service tracker. This ensure service reference are still valid during untracking.
  • Loading branch information
pnoltes committed Feb 12, 2016
1 parent 9434821 commit b990dde
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 2 deletions.
1 change: 1 addition & 0 deletions cmake/CMakeCelix.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,4 @@ include(cmake_celix/PackagingLegacy)
#include(cmake_celix/Test)
include(cmake_celix/ApacheRat)
include(cmake_celix/CodeCoverage)
include(cmake_celix/BuildOptions)
7 changes: 7 additions & 0 deletions cmake/cmake_celix/BuildOptions.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@

option(ENABLE_ADDRESS_SANITIZER "Enabled building with address sanitizer. Note for gcc libasan must be installed" OFF)

if (ENABLE_ADDRESS_SANITIZER)
set(CMAKE_C_FLAGS "-lasan -fsanitize=address ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "-lasan -fsanitize=address ${CMAKE_CXX_FLAGS}")
endif()
4 changes: 3 additions & 1 deletion framework/private/src/service_reference.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,9 @@ celix_status_t serviceReference_getOwner(service_reference_pt ref, bundle_pt *ow

celix_status_t serviceReference_getServiceRegistration(service_reference_pt ref, service_registration_pt *out) {
celixThreadRwlock_readLock(&ref->lock);
*out = ref->registration;
if (ref != NULL) {
*out = ref->registration;
}
celixThreadRwlock_unlock(&ref->lock);
return CELIX_SUCCESS;
}
Expand Down
4 changes: 3 additions & 1 deletion framework/private/src/service_tracker.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,6 @@ celix_status_t serviceTracker_open(service_tracker_pt tracker) {
celix_status_t serviceTracker_close(service_tracker_pt tracker) {
celix_status_t status = CELIX_SUCCESS;

status = bundleContext_removeServiceListener(tracker->context, tracker->listener);
if (status == CELIX_SUCCESS) {
array_list_pt refs = serviceTracker_getServiceReferences(tracker);
if (refs != NULL) {
Expand All @@ -160,6 +159,9 @@ celix_status_t serviceTracker_close(service_tracker_pt tracker) {
}
arrayList_destroy(refs);
}
if (status == CELIX_SUCCESS) {
status = bundleContext_removeServiceListener(tracker->context, tracker->listener);
}

framework_logIfError(logger, status, NULL, "Cannot close tracker");

Expand Down

0 comments on commit b990dde

Please sign in to comment.