• 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 "osal_msg_queue.h"
10 #include "osal_message.h"
11 #include "osal_time.h"
12 
OsalMessageQueueInit(struct HdfMessageQueue * queue)13 void OsalMessageQueueInit(struct HdfMessageQueue *queue)
14 {
15     if (queue != NULL) {
16         OsalMutexInit(&queue->mutex);
17         OsalSemInit(&queue->semaphore, 0);
18         HdfSListInit(&queue->list);
19     }
20 }
21 
OsalMessageQueueDestroy(struct HdfMessageQueue * queue)22 void OsalMessageQueueDestroy(struct HdfMessageQueue *queue)
23 {
24     if (queue != NULL) {
25         OsalMutexDestroy(&queue->mutex);
26         OsalSemDestroy(&queue->semaphore);
27         HdfSListFlush(&queue->list, HdfMessageDelete);
28     }
29 }
30 
HdfMessageQueueEnqueue(struct HdfMessageQueue * queue,struct HdfMessage * message,long delayed)31 void HdfMessageQueueEnqueue(
32     struct HdfMessageQueue *queue, struct HdfMessage *message, long delayed)
33 {
34     if (queue == NULL || message == NULL) {
35         return;
36     }
37 
38     struct HdfSListIterator it;
39     (void)delayed;
40     message->timeStamp += OsalGetSysTimeMs();
41     OsalMutexLock(&queue->mutex);
42     HdfSListIteratorInit(&it, &queue->list);
43     while (HdfSListIteratorHasNext(&it)) {
44         struct HdfMessage *next = (struct HdfMessage *)HdfSListIteratorNext(&it);
45         if (next->timeStamp > message->timeStamp) {
46             HdfSListIteratorInsert(&it, &message->entry);
47             goto COMPLETE;
48         }
49     }
50 
51     HdfSListAddTail(&queue->list, &message->entry);
52 COMPLETE:
53     OsalMutexUnlock(&queue->mutex);
54     OsalSemPost(&queue->semaphore);
55 }
56 
HdfMessageQueueNext(struct HdfMessageQueue * queue)57 struct HdfMessage* HdfMessageQueueNext(struct HdfMessageQueue *queue)
58 {
59     struct HdfSListIterator it;
60     struct HdfMessage *message = NULL;
61     uint64_t currentTime = OsalGetSysTimeMs();
62 
63     OsalMutexLock(&queue->mutex);
64     HdfSListIteratorInit(&it, &queue->list);
65     while (HdfSListIteratorHasNext(&it)) {
66         message = (struct HdfMessage *)HdfSListIteratorNext(&it);
67         if (message->timeStamp <= currentTime) {
68             HdfSListIteratorRemove(&it);
69             OsalMutexUnlock(&queue->mutex);
70             return message;
71         }
72     }
73 
74     OsalMutexUnlock(&queue->mutex);
75     OsalSemWait(&queue->semaphore, OSAL_WAIT_FOREVER);
76     return NULL;
77 }
78 
HdfMessageQueueFlush(struct HdfMessageQueue * queue)79 void HdfMessageQueueFlush(struct HdfMessageQueue *queue)
80 {
81     struct HdfSListIterator it;
82     OsalMutexLock(&queue->mutex);
83     HdfSListIteratorInit(&it, &queue->list);
84     while (HdfSListIteratorHasNext(&it)) {
85         struct HdfMessage *msgNode = (struct HdfMessage *)HdfSListIteratorNext(&it);
86         HdfSListIteratorRemove(&it);
87         HdfMessageRecycle(msgNode);
88     }
89     OsalMutexUnlock(&queue->mutex);
90 }
91 
92