diff options
author | David Anderson <dvander@google.com> | 2019-07-12 14:18:37 -0700 |
---|---|---|
committer | David Anderson <dvander@google.com> | 2019-07-29 11:35:12 -0700 |
commit | 4c75673a121e055a258e8710de2a4ec9c263c68f (patch) | |
tree | 6d9b43b5fdb846ae335846d4312de302d689524d /gsi_tool.cpp | |
parent | 1fdec26f4fc748768ccba2a67a9adc8147432e51 (diff) | |
download | gsid-4c75673a121e055a258e8710de2a4ec9c263c68f.tar.gz |
Only shut down gsid when it has no more consumers.
Consumers of gsiservice must now use IGsid for its top-level interface.
IGsiService can be acquired through IGsid::getClient. When the last
reference to IGsiService is dropped, gsid will cleanly exit. Callers
should no longer stop gsid through init.
Bug: 133528572
Test: gsid cleanly exits after gsi_tool runs
Change-Id: Ie5cb80fa63e61b143f9f27cca96999a5c71dab2c
Merged-In: Ie5cb80fa63e61b143f9f27cca96999a5c71dab2c
Diffstat (limited to 'gsi_tool.cpp')
-rw-r--r-- | gsi_tool.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/gsi_tool.cpp b/gsi_tool.cpp index f5f549f..c33e645 100644 --- a/gsi_tool.cpp +++ b/gsi_tool.cpp @@ -31,6 +31,7 @@ #include <android-base/properties.h> #include <android-base/unique_fd.h> #include <android/gsi/IGsiService.h> +#include <android/gsi/IGsid.h> #include <binder/IServiceManager.h> #include <cutils/android_reboot.h> #include <libgsi/libgsi.h> @@ -61,7 +62,7 @@ static const std::map<std::string, CommandCallback> kCommandMap = { // clang-format on }; -static sp<IGsiService> GetGsiService() { +static sp<IGsid> GetGsiService() { if (android::base::GetProperty("init.svc.gsid", "") != "running") { if (!android::base::SetProperty("ctl.start", "gsid") || !android::base::WaitForProperty("init.svc.gsid", "running", 5s)) { @@ -77,7 +78,7 @@ static sp<IGsiService> GetGsiService() { auto name = android::String16(kGsiServiceName); android::sp<android::IBinder> res = sm->checkService(name); if (res) { - return android::interface_cast<IGsiService>(res); + return android::interface_cast<IGsid>(res); } usleep(kSleepTimeMs * 1000); } @@ -515,6 +516,13 @@ int main(int argc, char** argv) { return EX_NOPERM; } + android::sp<IGsiService> service; + auto status = gsid->getClient(&service); + if (!status.isOk()) { + std::cerr << "Could not get gsi client: " << ErrorMessage(status) << "\n"; + return EX_SOFTWARE; + } + if (1 >= argc) { std::cerr << "Expected command." << std::endl; return EX_USAGE; @@ -528,6 +536,6 @@ int main(int argc, char** argv) { return usage(argc, argv); } - int rc = iter->second(gsid, argc - 1, argv + 1); + int rc = iter->second(service, argc - 1, argv + 1); return rc; } |