From 3e083b29d6a9d96b976b2b8ad976be453dcc1468 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Thu, 26 Jan 2023 00:46:30 +0000 Subject: servicemanager: log why we notify lazy services This makes it more clear when races which require guaranteeClient get hit. Bug: 264814573 Test: check logs Change-Id: Id4d6984a8120d8df8e13dd748959d71a0c6b8422 --- cmds/servicemanager/ServiceManager.cpp | 26 +++++++++++++++++--------- cmds/servicemanager/ServiceManager.h | 5 +++-- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/cmds/servicemanager/ServiceManager.cpp b/cmds/servicemanager/ServiceManager.cpp index cc038ae0d4..695faf8a78 100644 --- a/cmds/servicemanager/ServiceManager.cpp +++ b/cmds/servicemanager/ServiceManager.cpp @@ -718,7 +718,8 @@ ssize_t ServiceManager::handleServiceClientCallback(const std::string& serviceNa if (service.guaranteeClient) { // we have no record of this client if (!service.hasClients && !hasClients) { - sendClientCallbackNotifications(serviceName, true); + sendClientCallbackNotifications(serviceName, true, + "service is guaranteed to be in use"); } // guarantee is temporary @@ -729,34 +730,41 @@ ssize_t ServiceManager::handleServiceClientCallback(const std::string& serviceNa if (isCalledOnInterval) { if (hasClients && !service.hasClients) { // client was retrieved in some other way - sendClientCallbackNotifications(serviceName, true); + sendClientCallbackNotifications(serviceName, true, "we now have a record of a client"); } // there are no more clients, but the callback has not been called yet if (!hasClients && service.hasClients) { - sendClientCallbackNotifications(serviceName, false); + sendClientCallbackNotifications(serviceName, false, + "we now have no record of a client"); } } return count; } -void ServiceManager::sendClientCallbackNotifications(const std::string& serviceName, bool hasClients) { +void ServiceManager::sendClientCallbackNotifications(const std::string& serviceName, + bool hasClients, const char* context) { auto serviceIt = mNameToService.find(serviceName); if (serviceIt == mNameToService.end()) { - ALOGW("sendClientCallbackNotifications could not find service %s", serviceName.c_str()); + ALOGW("sendClientCallbackNotifications could not find service %s when %s", + serviceName.c_str(), context); return; } Service& service = serviceIt->second; - CHECK(hasClients != service.hasClients) << "Record shows: " << service.hasClients - << " so we can't tell clients again that we have client: " << hasClients; + CHECK(hasClients != service.hasClients) + << "Record shows: " << service.hasClients + << " so we can't tell clients again that we have client: " << hasClients + << " when: " << context; - ALOGI("Notifying %s they have clients: %d", serviceName.c_str(), hasClients); + ALOGI("Notifying %s they %s have clients when %s", serviceName.c_str(), + hasClients ? "do" : "don't", context); auto ccIt = mNameToClientCallback.find(serviceName); CHECK(ccIt != mNameToClientCallback.end()) - << "sendClientCallbackNotifications could not find callbacks for service "; + << "sendClientCallbackNotifications could not find callbacks for service when " + << context; for (const auto& callback : ccIt->second) { callback->onClients(service.binder, hasClients); diff --git a/cmds/servicemanager/ServiceManager.h b/cmds/servicemanager/ServiceManager.h index b24c11c161..f9d4f8fd90 100644 --- a/cmds/servicemanager/ServiceManager.h +++ b/cmds/servicemanager/ServiceManager.h @@ -92,8 +92,9 @@ private: ServiceCallbackMap::iterator* it, bool* found); ssize_t handleServiceClientCallback(const std::string& serviceName, bool isCalledOnInterval); - // Also updates mHasClients (of what the last callback was) - void sendClientCallbackNotifications(const std::string& serviceName, bool hasClients); + // Also updates mHasClients (of what the last callback was) + void sendClientCallbackNotifications(const std::string& serviceName, bool hasClients, + const char* context); // removes a callback from mNameToClientCallback, deleting the entry if the vector is empty // this updates the iterator to the next location void removeClientCallback(const wp& who, ClientCallbackMap::iterator* it); -- cgit v1.2.3-59-g8ed1b