diff options
author | Glenn Kasten <gkasten@google.com> | 2011-01-12 09:22:07 -0800 |
---|---|---|
committer | Glenn Kasten <gkasten@google.com> | 2011-01-12 09:22:07 -0800 |
commit | 4dafe5b814c923538a0f275b62220ec9cc94a9b5 (patch) | |
tree | 4a6fa7ec2a746f4fd94b85833beeaa5e4e9c0c05 | |
parent | c4c3a2d4123f7dfe8c6ed0c26fb14aeb7b8d8f61 (diff) | |
download | frameworks_av-4dafe5b814c923538a0f275b62220ec9cc94a9b5.zip frameworks_av-4dafe5b814c923538a0f275b62220ec9cc94a9b5.tar.gz frameworks_av-4dafe5b814c923538a0f275b62220ec9cc94a9b5.tar.bz2 |
Fix race in buffer ref counting.
Change-Id: Id47c30469c3e3ec293ed2ef574a191275b5044d6
-rw-r--r-- | media/libstagefright/MediaBuffer.cpp | 13 |
1 files changed, 3 insertions, 10 deletions
diff --git a/media/libstagefright/MediaBuffer.cpp b/media/libstagefright/MediaBuffer.cpp index cbccd31..a8fadf2 100644 --- a/media/libstagefright/MediaBuffer.cpp +++ b/media/libstagefright/MediaBuffer.cpp @@ -26,17 +26,10 @@ #include <media/stagefright/MetaData.h> #include <ui/GraphicBuffer.h> +#include <sys/atomics.h> namespace android { -// XXX make this truly atomic. -static int atomic_add(int *value, int delta) { - int prev_value = *value; - *value += delta; - - return prev_value; -} - MediaBuffer::MediaBuffer(void *data, size_t size) : mObserver(NULL), mNextBuffer(NULL), @@ -84,7 +77,7 @@ void MediaBuffer::release() { return; } - int prevCount = atomic_add(&mRefCount, -1); + int prevCount = __atomic_dec(&mRefCount); if (prevCount == 1) { if (mObserver == NULL) { delete this; @@ -104,7 +97,7 @@ void MediaBuffer::claim() { } void MediaBuffer::add_ref() { - atomic_add(&mRefCount, 1); + (void) __atomic_inc(&mRefCount); } void *MediaBuffer::data() const { |