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

Commit 7b8a8034 authored by James Dong's avatar James Dong Committed by Android Git Automerger
Browse files

am 13d1cb56: Merge "Avoid deadlock in OMX::freeNode by making sure...

am 13d1cb56: Merge "Avoid deadlock in OMX::freeNode by making sure OMXCodecObserver does not hold the last reference of OMXCodec object - do not merge" into gingerbread

* commit '13d1cb56dfdfc89888de6a0389b0fe6cf7e36c27':
  Avoid deadlock in OMX::freeNode by making sure OMXCodecObserver does not hold the last reference of OMXCodec object - do not merge
parents 9cfc9eff 32c8335c
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -60,8 +60,6 @@ struct OMXCodec : public MediaSource,

    virtual status_t pause();

    void on_message(const omx_message &msg);

    // from MediaBufferObserver
    virtual void signalBufferReturned(MediaBuffer *buffer);

@@ -69,6 +67,13 @@ protected:
    virtual ~OMXCodec();

private:

    // Make sure mLock is accessible to OMXCodecObserver
    friend class OMXCodecObserver;

    // Call this with mLock hold
    void on_message(const omx_message &msg);

    enum State {
        DEAD,
        LOADED,
+2 −2
Original line number Diff line number Diff line
@@ -234,7 +234,9 @@ struct OMXCodecObserver : public BnOMXObserver {
        sp<OMXCodec> codec = mTarget.promote();

        if (codec.get() != NULL) {
            Mutex::Autolock autoLock(codec->mLock);
            codec->on_message(msg);
            codec.clear();
        }
    }

@@ -1672,8 +1674,6 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
}

void OMXCodec::on_message(const omx_message &msg) {
    Mutex::Autolock autoLock(mLock);

    switch (msg.type) {
        case omx_message::EVENT:
        {
+9 −3
Original line number Diff line number Diff line
@@ -89,6 +89,9 @@ OMX::CallbackDispatcher::~CallbackDispatcher() {
        mQueueChanged.signal();
    }

    // Don't call join on myself
    CHECK(mThread != pthread_self());

    void *dummy;
    pthread_join(mThread, &dummy);
}
@@ -249,9 +252,12 @@ status_t OMX::freeNode(node_id node) {

    status_t err = instance->freeNode(mMaster);

    {
        Mutex::Autolock autoLock(mLock);
        index = mDispatchers.indexOfKey(node);
        CHECK(index >= 0);
        mDispatchers.removeItemsAt(index);
    }

    return err;
}