diff options
| author | 2024-06-20 21:42:41 +0000 | |
|---|---|---|
| committer | 2024-06-20 21:42:41 +0000 | |
| commit | de79f147ba2bc32895008a33f0bc920648a6d42c (patch) | |
| tree | 8d6de126a8e511ea4befe78a708f19891a930c33 | |
| parent | e55abe63b887b29eaddc86234a430219cbf10715 (diff) | |
| parent | baaaf744fb12dfd6ddf4e86d91a380586fdc7157 (diff) | |
Merge "Fix deadlock in tuner callback adapter" into main
| -rw-r--r-- | core/java/android/hardware/radio/TunerCallbackAdapter.java | 67 | 
1 files changed, 37 insertions, 30 deletions
diff --git a/core/java/android/hardware/radio/TunerCallbackAdapter.java b/core/java/android/hardware/radio/TunerCallbackAdapter.java index f9a2dbb1bdb4..b1b4de35a9c4 100644 --- a/core/java/android/hardware/radio/TunerCallbackAdapter.java +++ b/core/java/android/hardware/radio/TunerCallbackAdapter.java @@ -63,48 +63,53 @@ 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) { -                Log.w(TAG, "Previous program list observer wasn't properly closed, closing it..."); -                mProgramList.close(); -            } +            prevProgramList = mProgramList;              mProgramList = programList; -            if (programList == null) { -                return; +        } +        if (prevProgramList != null) { +            Log.w(TAG, "Previous program list observer wasn't properly closed, closing it..."); +            prevProgramList.close(); +        } +        if (programList == null) { +            return; +        } +        programList.setOnCloseListener(() -> { +            synchronized (mLock) { +                if (mProgramList != programList) { +                    return; +                } +                mProgramList = null; +                mLastCompleteList = null;              } -            programList.setOnCloseListener(() -> { -                synchronized (mLock) { -                    if (mProgramList != programList) { -                        return; -                    } -                    mProgramList = null; -                    mLastCompleteList = null; +            closeListener.onClose(); +        }); +        programList.addOnCompleteListener(() -> { +            synchronized (mLock) { +                if (mProgramList != programList) { +                    return;                  } -                closeListener.onClose(); -            }); -            programList.addOnCompleteListener(() -> { -                synchronized (mLock) { -                    if (mProgramList != programList) { -                        return; -                    } -                    mLastCompleteList = programList.toList(); -                    if (mDelayedCompleteCallback) { -                        Log.d(TAG, "Sending delayed onBackgroundScanComplete callback"); -                        sendBackgroundScanCompleteLocked(); -                    } +                mLastCompleteList = programList.toList(); +                if (mDelayedCompleteCallback) { +                    Log.d(TAG, "Sending delayed onBackgroundScanComplete callback"); +                    sendBackgroundScanCompleteLocked();                  } -            }); -        } +            } +        });      }      @Nullable List<RadioManager.ProgramInfo> getLastCompleteList() { @@ -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"));          });      }  |