|
1 | 1 | #include "libultraship/libultraship.h"
|
2 | 2 |
|
3 |
| -std::map<OSMesgQueue*, std::pair<std::shared_ptr<std::mutex>, std::shared_ptr<std::condition_variable>>> |
4 |
| - __lusMesgLockMap; |
5 |
| - |
6 | 3 | extern "C" {
|
7 | 4 |
|
8 | 5 | __OSEventState __osEventStateTab[OS_NUM_EVENTS] = { 0 };
|
9 | 6 |
|
10 |
| -#define MQ_GET_COUNT(mq) ((mq)->validCount) |
11 |
| -#define MQ_IS_EMPTY(mq) (MQ_GET_COUNT(mq) == 0) |
12 |
| -#define MQ_IS_FULL(mq) (MQ_GET_COUNT(mq) >= (mq)->msgCount) |
13 |
| - |
14 |
| -#define MQ_MUTEX(mq) (*__lusMesgLockMap[mq].first) |
15 |
| -#define MQ_CVAR(mq) (*__lusMesgLockMap[mq].second) |
16 |
| - |
17 | 7 | void osCreateMesgQueue(OSMesgQueue* mq, OSMesg* msgBuf, int32_t count) {
|
18 |
| - |
19 | 8 | mq->validCount = 0;
|
20 | 9 | mq->first = 0;
|
21 | 10 | mq->msgCount = count;
|
22 | 11 | mq->msg = msgBuf;
|
23 |
| - |
24 |
| - mq->mtqueue = nullptr; |
25 |
| - mq->fullqueue = nullptr; |
26 |
| - |
27 |
| - __lusMesgLockMap[mq] = std::make_pair(std::make_shared<std::mutex>(), std::make_shared<std::condition_variable>()); |
| 12 | + return; |
28 | 13 | }
|
29 | 14 |
|
30 | 15 | int32_t osSendMesg(OSMesgQueue* mq, OSMesg msg, int32_t flag) {
|
31 |
| - |
32 |
| - // mq is not initialised by osCreateMesgQueue |
33 |
| - if (!__lusMesgLockMap.contains(mq)) |
34 |
| - return -1; |
35 |
| - |
36 |
| - std::unique_lock<std::mutex> ul(MQ_MUTEX(mq)); |
37 |
| - |
38 |
| - while (MQ_IS_FULL(mq)) { |
39 |
| - if (flag == OS_MESG_NOBLOCK) |
40 |
| - return -1; |
41 |
| - |
42 |
| - // Wait for space in the queue. |
43 |
| - MQ_CVAR(mq).wait(ul); |
44 |
| - } |
45 |
| - |
| 16 | + int32_t index; |
46 | 17 | if (mq->validCount >= mq->msgCount) {
|
47 | 18 | return -1;
|
48 | 19 | }
|
49 |
| - |
50 |
| - int32_t last = (mq->first + mq->validCount) % mq->msgCount; |
51 |
| - mq->msg[last] = msg; |
| 20 | + index = (mq->first + mq->validCount) % mq->msgCount; |
| 21 | + mq->msg[index] = msg; |
52 | 22 | mq->validCount++;
|
53 | 23 |
|
54 |
| - // Wake threads waiting on this queue. |
55 |
| - MQ_CVAR(mq).notify_all(); |
56 |
| - |
57 | 24 | return 0;
|
58 | 25 | }
|
59 | 26 |
|
60 | 27 | int32_t osJamMesg(OSMesgQueue* mq, OSMesg msg, int32_t flag) {
|
61 |
| - |
62 |
| - // mq is not initialised by osCreateMesgQueue |
63 |
| - if (!__lusMesgLockMap.contains(mq)) |
| 28 | + if (mq->validCount == 0) { |
64 | 29 | return -1;
|
65 |
| - |
66 |
| - std::unique_lock ul(MQ_MUTEX(mq)); |
67 |
| - |
68 |
| - while (MQ_IS_FULL(mq)) { |
69 |
| - if (flag == OS_MESG_NOBLOCK) { |
70 |
| - return -1; |
71 |
| - } |
72 |
| - |
73 |
| - // Wait for space in the queue. |
74 |
| - MQ_CVAR(mq).wait(ul); |
75 | 30 | }
|
76 | 31 |
|
77 | 32 | mq->first = (mq->first + mq->msgCount - 1) % mq->msgCount;
|
78 | 33 | mq->msg[mq->first] = msg;
|
79 | 34 | mq->validCount++;
|
80 | 35 |
|
81 |
| - // Wake threads waiting on this queue. |
82 |
| - MQ_CVAR(mq).notify_all(); |
83 |
| - |
84 | 36 | return 0;
|
85 | 37 | }
|
86 | 38 |
|
87 | 39 | int32_t osRecvMesg(OSMesgQueue* mq, OSMesg* msg, int32_t flag) {
|
88 |
| - |
89 |
| - // mq is not initialised by osCreateMesgQueue |
90 |
| - if (!__lusMesgLockMap.contains(mq)) |
| 40 | + if (mq->validCount == 0) { |
91 | 41 | return -1;
|
92 |
| - |
93 |
| - std::unique_lock ul(MQ_MUTEX(mq)); |
94 |
| - |
95 |
| - while (MQ_IS_EMPTY(mq)) { |
96 |
| - if (flag == OS_MESG_NOBLOCK) |
97 |
| - return -1; |
98 |
| - |
99 |
| - // Wait for mesg |
100 |
| - MQ_CVAR(mq).wait(ul); |
101 | 42 | }
|
102 |
| - |
103 |
| - if (msg != nullptr) { |
104 |
| - *msg = mq->msg[mq->first]; |
| 43 | + if (msg != NULL) { |
| 44 | + *msg = *(mq->first + mq->msg); |
105 | 45 | }
|
106 |
| - |
107 | 46 | mq->first = (mq->first + 1) % mq->msgCount;
|
108 | 47 | mq->validCount--;
|
109 | 48 |
|
110 |
| - // Wake threads waiting on this queue. |
111 |
| - MQ_CVAR(mq).notify_all(); |
112 |
| - |
113 | 49 | return 0;
|
114 | 50 | }
|
115 | 51 |
|
|
0 commit comments