Merge "Fix Deadlock Issue On AppFuseBridge"
This commit is contained in:
commit
1e03ef5ac9
2 changed files with 17 additions and 3 deletions
|
@ -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
|
||||
|
|
|
@ -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_;
|
||||
|
||||
|
|
Loading…
Reference in a new issue