1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - OS - include
3   File:     message.h
4 
5   Copyright 2003-2008 Nintendo.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Date:: 2008-09-17#$
14   $Rev: 8556 $
15   $Author: okubata_ryoma $
16 
17  *---------------------------------------------------------------------------*/
18 
19 #ifndef NITRO_OS_MESSAGE_H_
20 #define NITRO_OS_MESSAGE_H_
21 
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25 
26 #include <nitro/os/common/thread.h>
27 
28 //--------------------------------------------------------------------------------
29 //---- type definition about message
30 typedef struct OSMessageQueue OSMessageQueue;
31 typedef void *OSMessage;
32 
33 //---- structure of message queue
34 #pragma  warn_padding off
35 struct OSMessageQueue
36 {
37     OSThreadQueue queueSend;
38     OSThreadQueue queueReceive;
39     OSMessage *msgArray;
40     s32     msgCount;
41     s32     firstIndex;
42     s32     usedCount;
43 };
44 #pragma  warn_padding reset
45 
46 //---- Flags to turn blocking on/off when sending/receiving message
47 #define  OS_MESSAGE_NOBLOCK   0
48 #define  OS_MESSAGE_BLOCK     1
49 
50 
51 
52 /*---------------------------------------------------------------------------*
53   Name:         OS_InitMessageQueue
54 
55   Description:  initialize message queue
56 
57   Arguments:    mq          message queue
58                 msgArray    buffer for message queue
59                 msgCount    max massage size for buffer
60 
61   Returns:      None
62  *---------------------------------------------------------------------------*/
63 void    OS_InitMessageQueue(OSMessageQueue *mq, OSMessage *msgArray, s32 msgCount);
64 
65 
66 /*---------------------------------------------------------------------------*
67   Name:         OS_SendMessage
68 
69   Description:  send message to message queue
70 
71   Arguments:    mq          message queue
72                 msg         massage which is sent
73                 flags       whether wait or not when queue is full
74 
75   Returns:      TRUE if send
76 
77  *---------------------------------------------------------------------------*/
78 BOOL    OS_SendMessage(OSMessageQueue *mq, OSMessage msg, s32 flags);
79 
80 
81 /*---------------------------------------------------------------------------*
82   Name:         OS_ReceiveMessage
83 
84   Description:  receive message from message queue
85 
86   Arguments:    mq          message queue
87                 msg         massage which is received
88                 flags       whether wait or not when queue is empty
89 
90   Returns:      TRUE if reveice
91 
92  *---------------------------------------------------------------------------*/
93 BOOL    OS_ReceiveMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags);
94 
95 
96 /*---------------------------------------------------------------------------*
97   Name:         OS_JamMessage
98 
99   Description:  send message to message queue, cutting in the top of the queue
100 
101   Arguments:    mq          message queue
102                 msg         massage which is sent
103                 flags       whether wait or not when queue is empty
104 
105   Returns:      TRUE if send
106 
107  *---------------------------------------------------------------------------*/
108 BOOL    OS_JamMessage(OSMessageQueue *mq, OSMessage msg, s32 flags);
109 
110 
111 /*---------------------------------------------------------------------------*
112   Name:         OS_ReadMessageMessage
113 
114   Description:  read message at message queue. no change to queue
115                 not occur to switch threads.
116 
117   Arguments:    mq          message queue
118                 msg         massage which is received
119                 flags       whether wait or not when queue is empty
120 
121   Returns:      TRUE if read
122 
123  *---------------------------------------------------------------------------*/
124 BOOL    OS_ReadMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags);
125 
126 
127 /*---------------------------------------------------------------------------*
128   Name:         OS_GetMessageCount
129 
130   Description:  get message count of message queue.
131 
132   Arguments:    mq          message queue
133 
134   Returns:      message count
135 
136  *---------------------------------------------------------------------------*/
OS_GetMessageCount(OSMessageQueue * mq)137 static inline s32 OS_GetMessageCount(OSMessageQueue *mq)
138 {
139     SDK_ASSERT(mq);
140     return mq->msgCount;
141 }
142 
143 
144 /*---------------------------------------------------------------------------*
145   Name:         OS_IsMessageQueueFull
146 
147   Description:  get whether message queue is full or not
148 
149   Arguments:    mq          message queue
150 
151   Returns:      TRUE if full
152 
153  *---------------------------------------------------------------------------*/
OS_IsMessageQueueFull(OSMessageQueue * mq)154 static inline BOOL OS_IsMessageQueueFull(OSMessageQueue *mq)
155 {
156     SDK_ASSERT(mq);
157     return (mq->usedCount >= mq->msgCount);
158 }
159 
160 
161 //--------------------------------------------------------------------------------
162 #ifdef __cplusplus
163 } /* extern "C" */
164 #endif
165 
166 /* NITRO_OS_MESSAGE_H_ */
167 #endif
168