#include "tasklet.hpp"
#include "common/code_utils.hpp"
#include "common/debug.hpp"
#include "common/instance.hpp"
#include "common/locator-getters.hpp"
#include "net/ip6.hpp"
namespace ot {
Tasklet::Tasklet(Instance &aInstance, Handler aHandler, void *aOwner)
: InstanceLocator(aInstance)
, OwnerLocator(aOwner)
, mHandler(aHandler)
, mNext(NULL)
{
}
void Tasklet::Post(void)
{
if (!IsPosted())
{
Get<TaskletScheduler>().PostTasklet(*this);
}
}
TaskletScheduler::TaskletScheduler(void)
: mTail(NULL)
{
}
void TaskletScheduler::PostTasklet(Tasklet &aTasklet)
{
if (mTail == NULL)
{
mTail = &aTasklet;
mTail->mNext = mTail;
otTaskletsSignalPending(&aTasklet.GetInstance());
}
else
{
aTasklet.mNext = mTail->mNext;
mTail->mNext = &aTasklet;
mTail = &aTasklet;
}
}
void TaskletScheduler::ProcessQueuedTasklets(void)
{
Tasklet *tail = mTail;
mTail = NULL;
while (tail != NULL)
{
Tasklet *tasklet = tail->mNext;
if (tasklet == tail)
{
tail = NULL;
}
else
{
tail->mNext = tasklet->mNext;
}
tasklet->mNext = NULL;
tasklet->RunTask();
}
}
}