diff options
author | Andreas Huber <andih@google.com> | 2011-05-24 15:15:42 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2011-05-24 15:15:42 -0700 |
commit | 5a65e30064dc8dffa4f3d868f1c46038972c40c5 (patch) | |
tree | ba3fa8c6f095e6ca214d8465525a32738a26a8b5 | |
parent | f2af5a2c607e71ff4cd39da28b077c0a68b206fe (diff) | |
download | frameworks_av-5a65e30064dc8dffa4f3d868f1c46038972c40c5.zip frameworks_av-5a65e30064dc8dffa4f3d868f1c46038972c40c5.tar.gz frameworks_av-5a65e30064dc8dffa4f3d868f1c46038972c40c5.tar.bz2 |
Make sure all references to the decoder plugin are accounted for
before calling dlunload().
Change-Id: I59aa1d19edf566b8a86a6f73b1c2eeb47c96b0de
related-to-bug: 4466387
4 files changed, 10 insertions, 2 deletions
diff --git a/media/libstagefright/include/SimpleSoftOMXComponent.h b/media/libstagefright/include/SimpleSoftOMXComponent.h index 2a29a7d..50cd275 100644 --- a/media/libstagefright/include/SimpleSoftOMXComponent.h +++ b/media/libstagefright/include/SimpleSoftOMXComponent.h @@ -36,7 +36,7 @@ struct SimpleSoftOMXComponent : public SoftOMXComponent { OMX_PTR appData, OMX_COMPONENTTYPE **component); - virtual ~SimpleSoftOMXComponent(); + virtual void prepareForDestruction(); void onMessageReceived(const sp<AMessage> &msg); diff --git a/media/libstagefright/include/SoftOMXComponent.h b/media/libstagefright/include/SoftOMXComponent.h index 053bc22..a808611 100644 --- a/media/libstagefright/include/SoftOMXComponent.h +++ b/media/libstagefright/include/SoftOMXComponent.h @@ -38,6 +38,8 @@ struct SoftOMXComponent : public RefBase { void setLibHandle(void *libHandle); void *libHandle() const; + virtual void prepareForDestruction() {} + protected: virtual ~SoftOMXComponent(); diff --git a/media/libstagefright/omx/SimpleSoftOMXComponent.cpp b/media/libstagefright/omx/SimpleSoftOMXComponent.cpp index 179b2a0..f7330f3 100644 --- a/media/libstagefright/omx/SimpleSoftOMXComponent.cpp +++ b/media/libstagefright/omx/SimpleSoftOMXComponent.cpp @@ -45,7 +45,11 @@ SimpleSoftOMXComponent::SimpleSoftOMXComponent( PRIORITY_AUDIO); } -SimpleSoftOMXComponent::~SimpleSoftOMXComponent() { +void SimpleSoftOMXComponent::prepareForDestruction() { + // The looper's queue may still contain messages referencing this + // object. Make sure those are flushed before returning so that + // a subsequent dlunload() does not pull out the rug from under us. + mLooper->unregisterHandler(mHandler->id()); mLooper->stop(); } diff --git a/media/libstagefright/omx/SoftOMXPlugin.cpp b/media/libstagefright/omx/SoftOMXPlugin.cpp index cfbcb96..04ca39e 100644 --- a/media/libstagefright/omx/SoftOMXPlugin.cpp +++ b/media/libstagefright/omx/SoftOMXPlugin.cpp @@ -127,6 +127,8 @@ OMX_ERRORTYPE SoftOMXPlugin::destroyComponentInstance( (SoftOMXComponent *) ((OMX_COMPONENTTYPE *)component)->pComponentPrivate; + me->prepareForDestruction(); + void *libHandle = me->libHandle(); CHECK_EQ(me->getStrongCount(), 1); |