PengZheng opened a new issue, #595:
URL: https://github.com/apache/celix/issues/595
When eliminating GOTOs in `discovery_zeroconf`, we found replace the
following `celix_bundleContext_stopTrackerAsync` plus
`celix_bundleContext_stopTrackerAsync` by `celix_bundleContext_stop` will
caused ASAN error in `TEST_F(DiscoveryZeroconfWatcherTestSuite,
CreateWatcherFailed4)`.
The difference between the two procedures is that the latter may cancel a
tracker while the former will never try to cancel a in-flight tracker. A closer
look at service tracker creation reveals that a cancelled tracker will be
created and destroyed:
```C
static void celix_bundleContext_createTrackerOnEventLoop(void *data) {
celix_bundle_context_service_tracker_entry_t* entry = data;
assert(celix_framework_isCurrentThreadTheEventLoop(entry->ctx->framework));
celixThreadMutex_lock(&entry->ctx->mutex);
bool cancelled = entry->cancelled;
celixThreadMutex_unlock(&entry->ctx->mutex);
if (cancelled) {
fw_log(entry->ctx->framework->logger, CELIX_LOG_LEVEL_DEBUG,
"Creating of service tracker was cancelled. trk id = %li, svc name tracked =
%s", entry->trackerId, entry->opts.filter.serviceName);
} else {
celix_service_tracker_t *tracker =
celix_serviceTracker_createWithOptions(entry->ctx, &entry->opts);
if (tracker != NULL) {
celixThreadMutex_lock(&entry->ctx->mutex);
// double-check is necessary to eliminate first-check-then-do
race condition
if(!entry->cancelled) {
entry->tracker = tracker;
}
celixThreadMutex_unlock(&entry->ctx->mutex);
if(entry->tracker == NULL) {
assert(entry->cancelled);
celix_serviceTracker_destroy(tracker);
}
} else {
fw_log(entry->ctx->framework->logger, CELIX_LOG_LEVEL_ERROR,
"Cannot create tracker for bnd %s (%li)",
celix_bundle_getSymbolicName(entry->ctx->bundle),
celix_bundle_getId(entry->ctx->bundle));
}
}
}
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]