Merge "Fix Deadlock Issue On AppFuseBridge"

This commit is contained in:
Narayan Kamath 2020-06-18 12:29:25 +00:00 committed by Gerrit Code Review
commit 1e03ef5ac9
2 changed files with 17 additions and 3 deletions

View file

@ -311,6 +311,8 @@ class BridgeEpollController : private EpollController {
}
};
std::recursive_mutex FuseBridgeLoop::mutex_;
FuseBridgeLoop::FuseBridgeLoop() : opened_(true) {
base::unique_fd epoll_fd(epoll_create1(EPOLL_CLOEXEC));
if (epoll_fd.get() == -1) {
@ -328,7 +330,7 @@ bool FuseBridgeLoop::AddBridge(int mount_id, base::unique_fd dev_fd, base::uniqu
std::unique_ptr<FuseBridgeEntry> bridge(
new FuseBridgeEntry(mount_id, std::move(dev_fd), std::move(proxy_fd)));
std::lock_guard<std::mutex> lock(mutex_);
std::lock_guard<std::recursive_mutex> lock(mutex_);
if (!opened_) {
LOG(ERROR) << "Tried to add a mount to a closed bridge";
return false;
@ -372,7 +374,7 @@ void FuseBridgeLoop::Start(FuseBridgeLoopCallback* callback) {
const bool wait_result = epoll_controller_->Wait(bridges_.size(), &entries);
LOG(VERBOSE) << "Receive epoll events";
{
std::lock_guard<std::mutex> lock(mutex_);
std::lock_guard<std::recursive_mutex> lock(mutex_);
if (!(wait_result && ProcessEventLocked(entries, callback))) {
for (auto it = bridges_.begin(); it != bridges_.end();) {
callback->OnClosed(it->second->mount_id());
@ -385,5 +387,13 @@ void FuseBridgeLoop::Start(FuseBridgeLoopCallback* callback) {
}
}
void FuseBridgeLoop::Lock() {
mutex_.lock();
}
void FuseBridgeLoop::Unlock() {
mutex_.unlock();
}
} // namespace fuse
} // namespace android

View file

@ -50,6 +50,10 @@ class FuseBridgeLoop final {
// thread from one which invokes |Start|.
bool AddBridge(int mount_id, base::unique_fd dev_fd, base::unique_fd proxy_fd);
static void Lock();
static void Unlock();
private:
bool ProcessEventLocked(const std::unordered_set<FuseBridgeEntry*>& entries,
FuseBridgeLoopCallback* callback);
@ -60,7 +64,7 @@ class FuseBridgeLoop final {
std::map<int, std::unique_ptr<FuseBridgeEntry>> bridges_;
// Lock for multi-threading.
std::mutex mutex_;
static std::recursive_mutex mutex_;
bool opened_;