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

Commit de79f147 authored by Weilin Xu's avatar Weilin Xu Committed by Android (Google) Code Review
Browse files

Merge "Fix deadlock in tuner callback adapter" into main

parents e55abe63 baaaf744
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"));
        });
    }