• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)13 void 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)37 void 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)50 void 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