代码来源[1]。
long STaskLoop::postTask(const IRunnable *runnable, bool waitUntilDone, int priority)
{
if (m_thread.isStopped())
{
return -1;
}
IRunnable *pCloneRunnable = runnable->clone();
if (Thread::getCurrentThreadID() == m_thread.getThreadID() && waitUntilDone)
{
pCloneRunnable->run();
delete pCloneRunnable;
return -1;
}
SSemaphore semaphore;
TaskItem item(pCloneRunnable,priority);
if (waitUntilDone)
{
item.semaphore = &semaphore;
}
m_taskListLock.Enter();
item.taskID = m_nextTaskID;
m_nextTaskID = (m_nextTaskID + 1) & ((std::numeric_limits<long>::max)());
std::list<TaskItem>::reverse_iterator it= m_items.rbegin();
while(it != m_items.rend())
{
if(it->nPriority>=priority)
{
m_items.insert(it.base(),item);
break;
}
it ++;
}
if(it==m_items.rend())
m_items.push_front(item);
m_taskListLock.Leave();
m_itemsSem.notify();
if (waitUntilDone)
{
int ret = semaphore.wait();
if (ret == RETURN_ERROR)
{
}
}
return item.taskID;
}
之前有分析过webrtc中invoke函数的实现[2]。
[1] TaskLoop.cpp
[2] 从webrtc的Thread::Invoke谈起
网友评论