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