Skip to content

Commit 13d1cb5

Browse files
James DongAndroid (Google) Code Review
authored andcommitted
Merge "Avoid deadlock in OMX::freeNode by making sure OMXCodecObserver does not hold the last reference of OMXCodec object - do not merge" into gingerbread
2 parents 9293937 + 6328185 commit 13d1cb5

File tree

3 files changed

+18
-7
lines changed

3 files changed

+18
-7
lines changed

include/media/stagefright/OMXCodec.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,20 @@ struct OMXCodec : public MediaSource,
6060

6161
virtual status_t pause();
6262

63-
void on_message(const omx_message &msg);
64-
6563
// from MediaBufferObserver
6664
virtual void signalBufferReturned(MediaBuffer *buffer);
6765

6866
protected:
6967
virtual ~OMXCodec();
7068

7169
private:
70+
71+
// Make sure mLock is accessible to OMXCodecObserver
72+
friend class OMXCodecObserver;
73+
74+
// Call this with mLock hold
75+
void on_message(const omx_message &msg);
76+
7277
enum State {
7378
DEAD,
7479
LOADED,

media/libstagefright/OMXCodec.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,9 @@ struct OMXCodecObserver : public BnOMXObserver {
234234
sp<OMXCodec> codec = mTarget.promote();
235235

236236
if (codec.get() != NULL) {
237+
Mutex::Autolock autoLock(codec->mLock);
237238
codec->on_message(msg);
239+
codec.clear();
238240
}
239241
}
240242

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

16741676
void OMXCodec::on_message(const omx_message &msg) {
1675-
Mutex::Autolock autoLock(mLock);
1676-
16771677
switch (msg.type) {
16781678
case omx_message::EVENT:
16791679
{

media/libstagefright/omx/OMX.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ OMX::CallbackDispatcher::~CallbackDispatcher() {
8989
mQueueChanged.signal();
9090
}
9191

92+
// Don't call join on myself
93+
CHECK(mThread != pthread_self());
94+
9295
void *dummy;
9396
pthread_join(mThread, &dummy);
9497
}
@@ -249,9 +252,12 @@ status_t OMX::freeNode(node_id node) {
249252

250253
status_t err = instance->freeNode(mMaster);
251254

252-
index = mDispatchers.indexOfKey(node);
253-
CHECK(index >= 0);
254-
mDispatchers.removeItemsAt(index);
255+
{
256+
Mutex::Autolock autoLock(mLock);
257+
index = mDispatchers.indexOfKey(node);
258+
CHECK(index >= 0);
259+
mDispatchers.removeItemsAt(index);
260+
}
255261

256262
return err;
257263
}

0 commit comments

Comments
 (0)