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

Commit 0a043f18 authored by Narayan Kamath's avatar Narayan Kamath Committed by Automerger Merge Worker
Browse files

Merge "Fix Deadlock Issue On AppFuseBridge" into rvc-dev am: 17fcd95f

Original change: https://googleplex-android-review.googlesource.com/c/platform/system/core/+/11888503

Change-Id: I7b4d33a152e959774a8ae0292bab2a927586a7de
parents 70bd4b1a 17fcd95f
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_;