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)14 void 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)39 void 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)52 void 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