diff options
author | Glenn Kasten <gkasten@google.com> | 2013-09-12 09:21:43 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2013-09-12 09:21:43 -0700 |
commit | f523897787b64cf2217d0ab4946b564420c675fe (patch) | |
tree | bf4361fd297eabb324294ce8e30e95b50176a85e /services | |
parent | d5577f26de1ae3a0dc6fbea9c60a07d585f894bf (diff) | |
parent | 8a220740cd77eb844123d3914190a94513797b40 (diff) | |
download | frameworks_av-f523897787b64cf2217d0ab4946b564420c675fe.zip frameworks_av-f523897787b64cf2217d0ab4946b564420c675fe.tar.gz frameworks_av-f523897787b64cf2217d0ab4946b564420c675fe.tar.bz2 |
am 8a220740: am dc33c542: Merge "Fix AudioTrack shared memory leak" into klp-dev
* commit '8a220740cd77eb844123d3914190a94513797b40':
Fix AudioTrack shared memory leak
Diffstat (limited to 'services')
-rw-r--r-- | services/audioflinger/PlaybackTracks.h | 5 | ||||
-rw-r--r-- | services/audioflinger/Tracks.cpp | 10 |
2 files changed, 14 insertions, 1 deletions
diff --git a/services/audioflinger/PlaybackTracks.h b/services/audioflinger/PlaybackTracks.h index 829b5d6..be4b811 100644 --- a/services/audioflinger/PlaybackTracks.h +++ b/services/audioflinger/PlaybackTracks.h @@ -118,7 +118,10 @@ protected: enum {FS_INVALID, FS_FILLING, FS_FILLED, FS_ACTIVE}; mutable uint8_t mFillingUpStatus; int8_t mRetryCount; - const sp<IMemory> mSharedBuffer; + + // see comment at AudioFlinger::PlaybackThread::Track::~Track for why this can't be const + sp<IMemory> mSharedBuffer; + bool mResetDone; const audio_stream_type_t mStreamType; int mName; // track name on the normal mixer, diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp index 0f0b7b6..047b481 100644 --- a/services/audioflinger/Tracks.cpp +++ b/services/audioflinger/Tracks.cpp @@ -364,6 +364,16 @@ AudioFlinger::PlaybackThread::Track::Track( AudioFlinger::PlaybackThread::Track::~Track() { ALOGV("PlaybackThread::Track destructor"); + + // The destructor would clear mSharedBuffer, + // but it will not push the decremented reference count, + // leaving the client's IMemory dangling indefinitely. + // This prevents that leak. + if (mSharedBuffer != 0) { + mSharedBuffer.clear(); + // flush the binder command buffer + IPCThreadState::self()->flushCommands(); + } } status_t AudioFlinger::PlaybackThread::Track::initCheck() const |