From ca9718b81d1edb3d094a11502737293dcb7526e7 Mon Sep 17 00:00:00 2001 From: Glenn Kasten Date: Thu, 23 Jun 2011 15:09:08 -0700 Subject: OMX CallbackDispatcher uses C++ Thread not pthread This permits leveraging future improvements to Thread. Change-Id: I45e25a309e7edd1d4f0dacc5ec987329afa497d9 --- media/libstagefright/omx/OMX.cpp | 63 ++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 28 deletions(-) (limited to 'media/libstagefright/omx') diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp index d23aa3a..25f30d6 100644 --- a/media/libstagefright/omx/OMX.cpp +++ b/media/libstagefright/omx/OMX.cpp @@ -20,8 +20,6 @@ #include -#include - #include "../include/OMX.h" #include "../include/OMXNodeInstance.h" @@ -38,11 +36,32 @@ namespace android { //////////////////////////////////////////////////////////////////////////////// +// This provides the underlying Thread used by CallbackDispatcher. +// Note that deriving CallbackDispatcher from Thread does not work. + +struct OMX::CallbackDispatcherThread : public Thread { + CallbackDispatcherThread(CallbackDispatcher *dispatcher) + : mDispatcher(dispatcher) { + } + +private: + CallbackDispatcher *mDispatcher; + + bool threadLoop(); + + CallbackDispatcherThread(const CallbackDispatcherThread &); + CallbackDispatcherThread &operator=(const CallbackDispatcherThread &); +}; + +//////////////////////////////////////////////////////////////////////////////// + struct OMX::CallbackDispatcher : public RefBase { CallbackDispatcher(OMXNodeInstance *owner); void post(const omx_message &msg); + bool loop(); + protected: virtual ~CallbackDispatcher(); @@ -54,13 +73,10 @@ private: Condition mQueueChanged; List mQueue; - pthread_t mThread; + sp mThread; void dispatch(const omx_message &msg); - static void *ThreadWrapper(void *me); - void threadEntry(); - CallbackDispatcher(const CallbackDispatcher &); CallbackDispatcher &operator=(const CallbackDispatcher &); }; @@ -68,13 +84,8 @@ private: OMX::CallbackDispatcher::CallbackDispatcher(OMXNodeInstance *owner) : mOwner(owner), mDone(false) { - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); - - pthread_create(&mThread, &attr, ThreadWrapper, this); - - pthread_attr_destroy(&attr); + mThread = new CallbackDispatcherThread(this); + mThread->run("OMXCallbackDisp", ANDROID_PRIORITY_AUDIO); } OMX::CallbackDispatcher::~CallbackDispatcher() { @@ -86,10 +97,8 @@ OMX::CallbackDispatcher::~CallbackDispatcher() { } // Don't call join on myself - CHECK(mThread != pthread_self()); - - void *dummy; - pthread_join(mThread, &dummy); + status_t status = mThread->join(); + CHECK(status == NO_ERROR); } void OMX::CallbackDispatcher::post(const omx_message &msg) { @@ -107,17 +116,7 @@ void OMX::CallbackDispatcher::dispatch(const omx_message &msg) { mOwner->onMessage(msg); } -// static -void *OMX::CallbackDispatcher::ThreadWrapper(void *me) { - static_cast(me)->threadEntry(); - - return NULL; -} - -void OMX::CallbackDispatcher::threadEntry() { - androidSetThreadPriority(0, ANDROID_PRIORITY_AUDIO); - prctl(PR_SET_NAME, (unsigned long)"OMXCallbackDisp", 0, 0, 0); - +bool OMX::CallbackDispatcher::loop() { for (;;) { omx_message msg; @@ -137,6 +136,14 @@ void OMX::CallbackDispatcher::threadEntry() { dispatch(msg); } + + return false; +} + +//////////////////////////////////////////////////////////////////////////////// + +bool OMX::CallbackDispatcherThread::threadLoop() { + return mDispatcher->loop(); } //////////////////////////////////////////////////////////////////////////////// -- cgit v1.1