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 while (looper != NULL) { 17 message = HdfMessageQueueNext(&looper->messageQueue); 18 if (message != NULL) { 19 if (message->messageId == MESSAGE_STOP_LOOP) { 20 HdfMessageRecycle(message); 21 OsalMessageQueueDestroy(&looper->messageQueue); 22 break; 23 } else if (message->target != NULL) { 24 struct HdfMessageTask *task = message->target; 25 task->DispatchMessage(task, message); 26 } 27 HdfMessageRecycle(message); 28 } 29 } 30 } 31 HdfMessageLooperStop(struct HdfMessageLooper * looper)32void HdfMessageLooperStop(struct HdfMessageLooper *looper) 33 { 34 if (looper == NULL) { 35 return; 36 } 37 38 struct HdfMessage *message = HdfMessageObtain(0); 39 if (message != NULL) { 40 message->messageId = MESSAGE_STOP_LOOP; 41 HdfMessageQueueEnqueue(&looper->messageQueue, message, 0); 42 } 43 } 44 HdfMessageLooperConstruct(struct HdfMessageLooper * looper)45void HdfMessageLooperConstruct(struct HdfMessageLooper *looper) 46 { 47 if (looper != NULL) { 48 OsalMessageQueueInit(&looper->messageQueue); 49 looper->Start = HdfMessageLooperStart; 50 looper->Stop = HdfMessageLooperStop; 51 } 52 } 53 54