sdk-hwV1.3/external/eyesee-mpp/framework/sun8iw21/utils/CallbackDispatcher.cpp

98 lines
2.4 KiB
C++
Executable File

/******************************************************************************
Copyright (C), 2001-2016, Allwinner Tech. Co., Ltd.
******************************************************************************
File Name : CallbackDispatcher.cpp
Version : Initial Draft
Author : Allwinner BU3-PD2 Team
Created : 2016/06/02
Last Modified :
Description : camera wrap MPP components.
Function List :
History :
******************************************************************************/
//#define LOG_NDEBUG 0
#define LOG_TAG "CallbackDispatcher"
#include <utils/plat_log.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <CallbackDispatcher.h>
namespace EyeseeLinux {
bool CallbackDispatcher::CallbackDispatcherThread::threadLoop()
{
return mpDispatcher->loop();
}
CallbackDispatcher::CallbackDispatcher()
: mbDone(false)
{
mpDispatcherThread = new CallbackDispatcherThread(this);
mpDispatcherThread->run("CallbackDispatcherThread");
}
CallbackDispatcher::~CallbackDispatcher()
{
{
Mutex::Autolock autoLock(mLock);
mbDone = true;
mQueueChanged.signal();
}
// A join on self can happen if the last ref to CallbackDispatcher
// is released within the CallbackDispatcherThread loop
status_t status = mpDispatcherThread->join();
if (status != WOULD_BLOCK) {
// Other than join to self, the only other error return codes are
// whatever readyToRun() returns, and we don't override that
if(status != (status_t)NO_ERROR)
{
aloge("status[0x%x]!=NO_ERROR", status);
}
}
delete mpDispatcherThread;
}
void CallbackDispatcher::post(const CallbackMessage &msg)
{
Mutex::Autolock autoLock(mLock);
mQueue.push_back(msg);
mQueueChanged.signal();
}
void CallbackDispatcher::dispatch(const CallbackMessage &msg)
{
handleMessage(msg);
}
bool CallbackDispatcher::loop()
{
for(;;)
{
CallbackMessage msg;
{
Mutex::Autolock autoLock(mLock);
while (!mbDone && mQueue.empty())
{
mQueueChanged.wait(mLock);
}
if (mbDone)
{
break;
}
msg = mQueue.front();
mQueue.pop_front();
}
dispatch(msg);
}
return false;
}
}; /* namespace EyeseeLinux */