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 #include "hdf_log.h" 13 HdfMessageLooperStart(struct HdfMessageLooper * looper)14void HdfMessageLooperStart(struct HdfMessageLooper *looper) 15 { 16 struct HdfMessage *message = NULL; 17 if (looper == NULL) { 18 return; 19 } 20 looper->isRunning = true; 21 while (true) { 22 message = HdfMessageQueueNext(&looper->messageQueue); 23 if (message != NULL) { 24 HDF_LOGD("%{public}s received message %{public}d", __func__, message->messageId); 25 if (message->messageId == MESSAGE_STOP_LOOP) { 26 HdfMessageRecycle(message); 27 OsalMessageQueueDestroy(&looper->messageQueue); 28 looper->isRunning = false; 29 break; 30 } else if (message->target != NULL) { 31 struct HdfMessageTask *task = message->target; 32 task->DispatchMessage(task, message); 33 } 34 HdfMessageRecycle(message); 35 } 36 } 37 } 38 HdfMessageLooperStop(struct HdfMessageLooper * looper)39void HdfMessageLooperStop(struct HdfMessageLooper *looper) 40 { 41 if (looper == NULL || !looper->isRunning) { 42 return; 43 } 44 45 struct HdfMessage *message = HdfMessageObtain(0); 46 if (message != NULL) { 47 message->messageId = MESSAGE_STOP_LOOP; 48 HdfMessageQueueEnqueue(&looper->messageQueue, message, 0); 49 } 50 } 51 HdfMessageLooperConstruct(struct HdfMessageLooper * looper)52void HdfMessageLooperConstruct(struct HdfMessageLooper *looper) 53 { 54 if (looper != NULL) { 55 OsalMessageQueueInit(&looper->messageQueue); 56 looper->Start = HdfMessageLooperStart; 57 looper->Stop = HdfMessageLooperStop; 58 } 59 } 60 61