* Copyright (c) 2020-2021 Huawei Device Co., Ltd.
*
* HDF is dual licensed: you can use it either under the terms of
* the GPL, or the BSD license, at your option.
* See the LICENSE file in the root of this repository for complete details.
*/
#include "hdf_message_looper.h"
#include "hdf_message_task.h"
#include "osal_message.h"
void HdfMessageLooperStart(struct HdfMessageLooper *looper)
{
struct HdfMessage *message = NULL;
if (looper == NULL) {
return;
}
looper->isRunning = true;
while (true) {
message = HdfMessageQueueNext(&looper->messageQueue);
if (message != NULL) {
if (message->messageId == MESSAGE_STOP_LOOP) {
HdfMessageRecycle(message);
OsalMessageQueueDestroy(&looper->messageQueue);
looper->isRunning = false;
break;
} else if (message->target != NULL) {
struct HdfMessageTask *task = message->target;
task->DispatchMessage(task, message);
}
HdfMessageRecycle(message);
}
}
}
void HdfMessageLooperStop(struct HdfMessageLooper *looper)
{
if (looper == NULL || !looper->isRunning) {
return;
}
struct HdfMessage *message = HdfMessageObtain(0);
if (message != NULL) {
message->messageId = MESSAGE_STOP_LOOP;
HdfMessageQueueEnqueue(&looper->messageQueue, message, 0);
}
}
void HdfMessageLooperConstruct(struct HdfMessageLooper *looper)
{
if (looper != NULL) {
OsalMessageQueueInit(&looper->messageQueue);
looper->Start = HdfMessageLooperStart;
looper->Stop = HdfMessageLooperStop;
}
}