Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1e03ef5a authored by Narayan Kamath's avatar Narayan Kamath Committed by Gerrit Code Review
Browse files

Merge "Fix Deadlock Issue On AppFuseBridge"

parents 4739f752 49545ab8
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -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
+5 −1
Original line number Diff line number Diff line
@@ -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_;