summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/MediaBuffer.cpp
diff options
context:
space:
mode:
authorGlenn Kasten <gkasten@google.com>2011-01-12 09:22:07 -0800
committerGlenn Kasten <gkasten@google.com>2011-01-12 09:22:07 -0800
commit4dafe5b814c923538a0f275b62220ec9cc94a9b5 (patch)
tree4a6fa7ec2a746f4fd94b85833beeaa5e4e9c0c05 /media/libstagefright/MediaBuffer.cpp
parentc4c3a2d4123f7dfe8c6ed0c26fb14aeb7b8d8f61 (diff)
downloadframeworks_av-4dafe5b814c923538a0f275b62220ec9cc94a9b5.zip
frameworks_av-4dafe5b814c923538a0f275b62220ec9cc94a9b5.tar.gz
frameworks_av-4dafe5b814c923538a0f275b62220ec9cc94a9b5.tar.bz2
Fix race in buffer ref counting.
Change-Id: Id47c30469c3e3ec293ed2ef574a191275b5044d6
Diffstat (limited to 'media/libstagefright/MediaBuffer.cpp')
-rw-r--r--media/libstagefright/MediaBuffer.cpp13
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 {