libpdx: Add service poke logic to ServiceUtility.
Consolidate PDX service poke logic (reload system props) in the
ServiceUtility class. This used by atrace to poke PDX services
during systrace.
Bug: 37432968
Test: build succeeds.
Change-Id: Ia650f81fd5d324529b70f8796c4efbf7b3117327
diff --git a/libs/vr/libpdx_default_transport/private/pdx/default_transport/service_utility.h b/libs/vr/libpdx_default_transport/private/pdx/default_transport/service_utility.h
index 22c6b3f..81bb17b 100644
--- a/libs/vr/libpdx_default_transport/private/pdx/default_transport/service_utility.h
+++ b/libs/vr/libpdx_default_transport/private/pdx/default_transport/service_utility.h
@@ -1,6 +1,8 @@
#ifndef ANDROID_PDX_DEFAULT_TRANSPORT_SERVICE_UTILITY_H_
#define ANDROID_PDX_DEFAULT_TRANSPORT_SERVICE_UTILITY_H_
+#include <ftw.h>
+
#include <pdx/client.h>
#include <pdx/default_transport/client_channel_factory.h>
#include <pdx/service.h>
@@ -25,15 +27,59 @@
return ClientChannelFactory::GetEndpointPath(endpoint_path);
}
+ // Traverses the PDX service path space and sends a message to reload system
+ // properties to each service endpoint it finds along the way.
+ // NOTE: This method is used by atrace to poke PDX services. Please avoid
+ // unnecessary changes to this mechanism to minimize impact on atrace.
+ static bool PokeServices() {
+ const int kMaxDepth = 16;
+ const int result =
+ nftw(GetRootEndpointPath().c_str(), PokeService, kMaxDepth, FTW_PHYS);
+ return result == 0 ? true : false;
+ }
+
private:
friend BASE;
ServiceUtility(const std::string& endpoint_path, int* error = nullptr)
- : BASE(ClientChannelFactory::Create(endpoint_path)) {
+ : BASE(ClientChannelFactory::Create(endpoint_path), 0) {
if (error)
*error = Client::error();
}
+ // Sends the sysprop_change message to the service at fpath, so it re-reads
+ // its system properties. Returns 0 on success or a negated errno code on
+ // failure.
+ // NOTE: This method is used by atrace to poke PDX services. Please avoid
+ // unnecessary changes to this mechanism to minimize impact on atrace.
+ static int PokeService(const char* fpath, const struct stat* /*sb*/,
+ int typeflag, struct FTW* /*ftwbuf*/) {
+ const bool kIgnoreErrors = true;
+
+ if (typeflag == FTW_F) {
+ int error;
+ auto utility = ServiceUtility::Create(fpath, &error);
+ if (!utility) {
+ if (error != -ECONNREFUSED) {
+ ALOGE("ServiceUtility::PokeService: Failed to open %s: %s.", fpath,
+ strerror(-error));
+ }
+ return kIgnoreErrors ? 0 : error;
+ }
+
+ auto status = utility->ReloadSystemProperties();
+ if (!status) {
+ ALOGE(
+ "ServiceUtility::PokeService: Failed to send sysprop change to %s: "
+ "%s",
+ fpath, status.GetErrorMessage().c_str());
+ return kIgnoreErrors ? 0 : -status.error();
+ }
+ }
+
+ return 0;
+ }
+
ServiceUtility(const ServiceUtility&) = delete;
void operator=(const ServiceUtility&) = delete;
};