|
ServiceContext::ClientDeleter::operator()(Client* client) accesses the serviceContext outside the serviceContext's mutex to call the registered observers on onDestroy(), while the serviceContext may have already been destroyed by service_context_test_fixture, since the client vector is empty, checked by waitForClientsToFinish.
void ServiceContext::ClientDeleter::operator()(Client* client) const {
|
ServiceContext* const service = client->getServiceContext();
|
{
|
stdx::lock_guard<stdx::mutex> lk(service->_mutex);
|
invariant(service->_clients.erase(client));
|
if (service->_clients.empty()) {
|
service->_clientsEmptyCondVar.notify_all();
|
}
|
}
|
// The serviceContext may have already been destroyed.
|
onDestroy(client, service->_clientObservers);
|
delete client;
|
}
|
|