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

Commit f3523592 authored by Hans Boehm's avatar Hans Boehm Committed by android-build-merger
Browse files

Merge "Initialize mMetaData correctly, fix ref count"

am: 7ef724dc

Change-Id: I0fe395437e4d0b1cab3be5e9a9e4de1c8271c2fa
parents 4fd142e2 7ef724dc
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ MediaBuffer::MediaBuffer(void *data, size_t size)
      mRangeOffset(0),
      mRangeLength(size),
      mOwnsData(false),
      mMetaData(new MetaData),
      mMetaData(new MetaDataBase),
      mOriginal(NULL) {
}

@@ -51,7 +51,7 @@ MediaBuffer::MediaBuffer(size_t size)
      mRangeOffset(0),
      mRangeLength(size),
      mOwnsData(true),
      mMetaData(new MetaData),
      mMetaData(new MetaDataBase),
      mOriginal(NULL) {
    if (size < kSharedMemThreshold
            || std::atomic_load_explicit(&mUseSharedMemory, std::memory_order_seq_cst) == 0) {
@@ -84,7 +84,7 @@ MediaBuffer::MediaBuffer(const sp<ABuffer> &buffer)
      mRangeLength(mSize),
      mBuffer(buffer),
      mOwnsData(false),
      mMetaData(new MetaData),
      mMetaData(new MetaDataBase),
      mOriginal(NULL) {
}

@@ -96,7 +96,7 @@ void MediaBuffer::release() {
        return;
    }

    int prevCount = __sync_fetch_and_sub(&mRefCount, 1);
    int prevCount = mRefCount.fetch_sub(1);
    if (prevCount == 1) {
        if (mObserver == NULL) {
            delete this;
@@ -110,13 +110,13 @@ void MediaBuffer::release() {

void MediaBuffer::claim() {
    CHECK(mObserver != NULL);
    CHECK_EQ(mRefCount, 1);
    CHECK_EQ(mRefCount.load(std::memory_order_relaxed), 1);

    mRefCount = 0;
    mRefCount.store(0, std::memory_order_relaxed);
}

void MediaBuffer::add_ref() {
    (void) __sync_fetch_and_add(&mRefCount, 1);
    (void) mRefCount.fetch_add(1);
}

void *MediaBuffer::data() const {
+4 −2
Original line number Diff line number Diff line
@@ -86,12 +86,14 @@ public:
    virtual MediaBufferBase *clone();

    // sum of localRefcount() and remoteRefcount()
    // Result should be treated as approximate unless the result precludes concurrent accesses.
    virtual int refcount() const {
        return localRefcount() + remoteRefcount();
    }

    // Result should be treated as approximate unless the result precludes concurrent accesses.
    virtual int localRefcount() const {
        return mRefCount;
        return mRefCount.load(std::memory_order_relaxed);
    }

    virtual int remoteRefcount() const {
@@ -146,7 +148,7 @@ private:
    void claim();

    MediaBufferObserver *mObserver;
    int mRefCount;
    std::atomic<int> mRefCount;

    void *mData;
    size_t mSize, mRangeOffset, mRangeLength;