1 /* 2 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. 3 * 4 * HDF is dual licensed: you can use it either under the terms of 5 * the GPL, or the BSD license, at your option. 6 * See the LICENSE file in the root of this repository for complete details. 7 */ 8 9 #include "hdf_message_looper.h" 10 #include "hdf_message_task.h" 11 #include "osal_message.h" 12 HdfMessageLooperStart(struct HdfMessageLooper * looper)13void HdfMessageLooperStart(struct HdfMessageLooper *looper) 14 { 15 struct HdfMessage *message = NULL; 16 if (looper == NULL) { 17 return; 18 } 19 looper->isRunning = true; 20 while (true) { 21 message = HdfMessageQueueNext(&looper->messageQueue); 22 if (message != NULL) { 23 if (message->messageId == MESSAGE_STOP_LOOP) { 24 HdfMessageRecycle(message); 25 OsalMessageQueueDestroy(&looper->messageQueue); 26 looper->isRunning = false; 27 break; 28 } else if (message->target != NULL) { 29 struct HdfMessageTask *task = message->target; 30 task->DispatchMessage(task, message); 31 } 32 HdfMessageRecycle(message); 33 } 34 } 35 } 36 HdfMessageLooperStop(struct HdfMessageLooper * looper)37void HdfMessageLooperStop(struct HdfMessageLooper *looper) 38 { 39 if (looper == NULL || !looper->isRunning) { 40 return; 41 } 42 43 struct HdfMessage *message = HdfMessageObtain(0); 44 if (message != NULL) { 45 message->messageId = MESSAGE_STOP_LOOP; 46 HdfMessageQueueEnqueue(&looper->messageQueue, message, 0); 47 } 48 } 49 HdfMessageLooperConstruct(struct HdfMessageLooper * looper)50void HdfMessageLooperConstruct(struct HdfMessageLooper *looper) 51 { 52 if (looper != NULL) { 53 OsalMessageQueueInit(&looper->messageQueue); 54 looper->Start = HdfMessageLooperStart; 55 looper->Stop = HdfMessageLooperStop; 56 } 57 } 58 59