diff --git a/Utils.cpp b/Utils.cpp index 15b3c0b..2b8d0a5 100644 --- a/Utils.cpp +++ b/Utils.cpp @@ -17,6 +17,7 @@ #include "sehandle.h" #include "Utils.h" #include "Process.h" +#include "VolumeManager.h" #include #include @@ -126,22 +127,22 @@ status_t ForceUnmount(const std::string& path) { } // Apps might still be handling eject request, so wait before // we start sending signals - sleep(5); + if (!VolumeManager::shutting_down) sleep(5); Process::killProcessesWithOpenFiles(cpath, SIGINT); - sleep(5); + if (!VolumeManager::shutting_down) sleep(5); if (!umount2(cpath, UMOUNT_NOFOLLOW) || errno == EINVAL || errno == ENOENT) { return OK; } Process::killProcessesWithOpenFiles(cpath, SIGTERM); - sleep(5); + if (!VolumeManager::shutting_down) sleep(5); if (!umount2(cpath, UMOUNT_NOFOLLOW) || errno == EINVAL || errno == ENOENT) { return OK; } Process::killProcessesWithOpenFiles(cpath, SIGKILL); - sleep(5); + if (!VolumeManager::shutting_down) sleep(5); if (!umount2(cpath, UMOUNT_NOFOLLOW) || errno == EINVAL || errno == ENOENT) { return OK; } @@ -154,17 +155,17 @@ status_t KillProcessesUsingPath(const std::string& path) { if (Process::killProcessesWithOpenFiles(cpath, SIGINT) == 0) { return OK; } - sleep(5); + if (!VolumeManager::shutting_down) sleep(5); if (Process::killProcessesWithOpenFiles(cpath, SIGTERM) == 0) { return OK; } - sleep(5); + if (!VolumeManager::shutting_down) sleep(5); if (Process::killProcessesWithOpenFiles(cpath, SIGKILL) == 0) { return OK; } - sleep(5); + if (!VolumeManager::shutting_down) sleep(5); // Send SIGKILL a second time to determine if we've // actually killed everyone with open files diff --git a/VolumeManager.cpp b/VolumeManager.cpp index 4ba0c36..8398498 100644 --- a/VolumeManager.cpp +++ b/VolumeManager.cpp @@ -89,6 +89,8 @@ const char *VolumeManager::ASECDIR = "/mnt/asec"; */ const char *VolumeManager::LOOPDIR = "/mnt/obb"; +bool VolumeManager::shutting_down = false; + static const char* kPathUserMount = "/mnt/user"; static const char* kPathVirtualDisk = "/data/misc/vold/virtual_disk"; @@ -704,12 +706,14 @@ int VolumeManager::shutdown() { if (mInternalEmulated == nullptr) { return 0; // already shutdown } + shutting_down = true; mInternalEmulated->destroy(); mInternalEmulated = nullptr; for (const auto& disk : mDisks) { disk->destroy(); } mDisks.clear(); + shutting_down = false; return 0; } diff --git a/VolumeManager.h b/VolumeManager.h index 796a91d..537aebe 100644 --- a/VolumeManager.h +++ b/VolumeManager.h @@ -70,6 +70,9 @@ public: static const char *ASECDIR; static const char *LOOPDIR; + //TODO remove this with better solution, b/64143519 + static bool shutting_down; + private: static VolumeManager *sInstance;