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

Commit baaaf744 authored by Weilin Xu's avatar Weilin Xu
Browse files

Fix deadlock in tuner callback adapter

Fixed the deadlock in tuner callback adapter by moving prgroam list
methods called outside lock.

Bug: 348091230
Flag: EXEMPT bugfix
Test: atest ProgramListTest
Change-Id: Idfeffe6c90d5cb45984eedf6ce5139512d695751
parent 213782d7
Loading
Loading
Loading
Loading
+37 −30
Original line number Diff line number Diff line
@@ -63,22 +63,28 @@ final class TunerCallbackAdapter extends ITunerCallback.Stub {
    }

    void close() {
        ProgramList programList;
        synchronized (mLock) {
            if (mProgramList != null) {
                mProgramList.close();
            if (mProgramList == null) {
                return;
            }
            programList = mProgramList;
        }
        programList.close();
    }

    void setProgramListObserver(@Nullable ProgramList programList,
            ProgramList.OnCloseListener closeListener) {
        Objects.requireNonNull(closeListener, "CloseListener cannot be null");
        ProgramList prevProgramList;
        synchronized (mLock) {
            if (mProgramList != null) {
            prevProgramList = mProgramList;
            mProgramList = programList;
        }
        if (prevProgramList != null) {
            Log.w(TAG, "Previous program list observer wasn't properly closed, closing it...");
                mProgramList.close();
            prevProgramList.close();
        }
            mProgramList = programList;
        if (programList == null) {
            return;
        }
@@ -105,7 +111,6 @@ final class TunerCallbackAdapter extends ITunerCallback.Stub {
            }
        });
    }
    }

    @Nullable List<RadioManager.ProgramInfo> getLastCompleteList() {
        synchronized (mLock) {
@@ -245,12 +250,14 @@ final class TunerCallbackAdapter extends ITunerCallback.Stub {
    @Override
    public void onProgramListUpdated(ProgramList.Chunk chunk) {
        mHandler.post(() -> {
            ProgramList programList;
            synchronized (mLock) {
                if (mProgramList == null) {
                    return;
                }
                mProgramList.apply(Objects.requireNonNull(chunk, "Chunk cannot be null"));
                programList = mProgramList;
            }
            programList.apply(Objects.requireNonNull(chunk, "Chunk cannot be null"));
        });
    }