source: mypx/extension/messagebuf/kernel/messagebuf.c

このファイルの最終更新内容7 で kominami が 2015/09/12 9:22:12 に更新しました

TOPPERS/ASP 1.9.1

ファイルサイズ: 15.8 KB
Rev 
[7]1/*
2 *  TOPPERS/ASP Kernel
3 *      Toyohashi Open Platform for Embedded Real-Time Systems/
4 *      Advanced Standard Profile Kernel
5 *
6 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 *                              Toyohashi Univ. of Technology, JAPAN
8 *  Copyright (C) 2005-2014 by Embedded and Real-Time Systems Laboratory
9 *              Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 *  Ÿåµ­Ãøºîž¢ŒÔ€Ï¡€°Ê²Œ€Î(1)¡Á(4)€ÎŸò·ï€òËþ€¿€¹Ÿì¹ç€ËžÂ€ê¡€ËÜ¥œ¥Õ¥È¥Š¥§
12 *  ¥¢¡ÊËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò²þÊÑ€·€¿€â€Î€òŽÞ€à¡¥°Ê²ŒÆ±€ž¡Ë€ò»ÈÍÑ¡ŠÊ£Àœ¡Š²þ
13 *  ÊÑ¡ŠºÆÇÛÉۡʰʲŒ¡€ÍøÍрȞƀ֡ˀ¹€ë€³€È€ò̵œþ€ÇµöÂú€¹€ë¡¥
14 *  (1) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¥œ¡Œ¥¹¥³¡Œ¥É€Î·Á€ÇÍøÍÑ€¹€ëŸì¹ç€Ë€Ï¡€Ÿåµ­€ÎÃøºî
15 *      ž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äꀬ¡€€œ€Î€Þ€Þ€Î·Á€Ç¥œ¡Œ
16 *      ¥¹¥³¡Œ¥ÉÃæ€ËŽÞ€Þ€ì€Æ€€€ë€³€È¡¥
17 *  (2) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€¥é¥€¥Ö¥é¥ê·ÁŒ°€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
18 *      Íрǀ­€ë·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍÑ
19 *      ŒÔ¥Þ¥Ë¥å¥¢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃøºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­
20 *      €Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
21 *  (3) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€µ¡Žï€ËÁȀ߹þ€à€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
22 *      Íрǀ­€Ê€€·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€Œ¡€Î€€€º€ì€«€ÎŸò·ï€òËþ€¿€¹€³
23 *      €È¡¥
24 *    (a) ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍьԥޥ˥奢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃø
25 *        ºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
26 *    (b) ºÆÇÛÉۀηÁÂÖ€ò¡€ÊÌ€ËÄê€á€ëÊýË¡€Ë€è€Ã€Æ¡€TOPPERS¥×¥í¥ž¥§¥¯¥È€Ë
27 *        Êó¹ð€¹€ë€³€È¡¥
28 *  (4) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€ë€€€«€Ê€ë»
29 *      ³²€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€òÌÈÀÕ€¹€ë€³€È¡¥
30 *      €Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Î¥æ¡Œ¥¶€Þ€¿€Ï¥š¥ó¥É¥æ¡Œ¥¶€«€é€Î€€€«€Ê€ëÍý
31 *      ͳ€ËŽð€Å€¯ÀÁµá€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€ò
32 *      ÌÈÀÕ€¹€ë€³€È¡¥
33 *
34 *  ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Ï¡€ÌµÊÝŸÚ€ÇÄó¶¡€µ€ì€Æ€€€ë€â€Î€Ç€¢€ë¡¥Ÿåµ­Ãøºîž¢ŒÔ€ª
35 *  €è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€Ï¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ËŽØ€·€Æ¡€ÆÃÄê€Î»ÈÍÑÌÜŪ
36 *  €ËÂЀ¹€ëŬ¹çÀ­€âŽÞ€á€Æ¡€€€€«€Ê€ëÊÝŸÚ€â¹Ô€ï€Ê€€¡¥€Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§
37 *  ¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€¿€€€«€Ê€ë»³²€ËŽØ€·€Æ€â¡€€œ
38 *  €ÎÀÕÇ€€òÉé€ï€Ê€€¡¥
39 *
40 *  $Id$
41 */
42
43/*
44 *              ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡µ¡Çœ
45 */
46
47#include "kernel_impl.h"
48#include "check.h"
49#include "task.h"
50#include "wait.h"
51#include "messagebuf.h"
52#include <string.h>
53
54/*
55 *  ¥È¥ì¡Œ¥¹¥í¥°¥Þ¥¯¥í€Î¥Ç¥Õ¥©¥ë¥ÈÄêµÁ
56 */
57#ifndef LOG_SND_MBF_ENTER
58#define LOG_SND_MBF_ENTER(mbfid, msg, msgsz)
59#endif /* LOG_SND_MBF_ENTER */
60
61#ifndef LOG_SND_MBF_LEAVE
62#define LOG_SND_MBF_LEAVE(ercd)
63#endif /* LOG_SND_MBF_LEAVE */
64
65#ifndef LOG_PSND_MBF_ENTER
66#define LOG_PSND_MBF_ENTER(mbfid, msg, msgsz)
67#endif /* LOG_PSND_MBF_ENTER */
68
69#ifndef LOG_PSND_MBF_LEAVE
70#define LOG_PSND_MBF_LEAVE(ercd)
71#endif /* LOG_PSND_MBF_LEAVE */
72
73#ifndef LOG_TSND_MBF_ENTER
74#define LOG_TSND_MBF_ENTER(mbfid, msg, msgsz, tmout)
75#endif /* LOG_TSND_MBF_ENTER */
76
77#ifndef LOG_TSND_MBF_LEAVE
78#define LOG_TSND_MBF_LEAVE(ercd)
79#endif /* LOG_TSND_MBF_LEAVE */
80
81#ifndef LOG_RCV_MBF_ENTER
82#define LOG_RCV_MBF_ENTER(mbfid, msg)
83#endif /* LOG_RCV_MBF_ENTER */
84
85#ifndef LOG_RCV_MBF_LEAVE
86#define LOG_RCV_MBF_LEAVE(msgsz, msg)
87#endif /* LOG_RCV_MBF_LEAVE */
88
89#ifndef LOG_PRCV_MBF_ENTER
90#define LOG_PRCV_MBF_ENTER(mbfid, msg)
91#endif /* LOG_PRCV_MBF_ENTER */
92
93#ifndef LOG_PRCV_MBF_LEAVE
94#define LOG_PRCV_MBF_LEAVE(msgsz, msg)
95#endif /* LOG_PRCV_MBF_LEAVE */
96
97#ifndef LOG_TRCV_MBF_ENTER
98#define LOG_TRCV_MBF_ENTER(mbfid, msg, tmout)
99#endif /* LOG_TRCV_MBF_ENTER */
100
101#ifndef LOG_TRCV_MBF_LEAVE
102#define LOG_TRCV_MBF_LEAVE(msgsz, msg)
103#endif /* LOG_TRCV_MBF_LEAVE */
104
105#ifndef LOG_INI_MBF_ENTER
106#define LOG_INI_MBF_ENTER(mbfid)
107#endif /* LOG_INI_MBF_ENTER */
108
109#ifndef LOG_INI_MBF_LEAVE
110#define LOG_INI_MBF_LEAVE(ercd)
111#endif /* LOG_INI_MBF_LEAVE */
112
113#ifndef LOG_REF_MBF_ENTER
114#define LOG_REF_MBF_ENTER(mbfid, pk_rmbf)
115#endif /* LOG_REF_MBF_ENTER */
116
117#ifndef LOG_REF_MBF_LEAVE
118#define LOG_REF_MBF_LEAVE(ercd, pk_rmbf)
119#endif /* LOG_REF_MBF_LEAVE */
120
121/*
122 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡€Î¿ô
123 */
124#define tnum_mbf        ((uint_t)(tmax_mbfid - TMIN_MBFID + 1))
125
126/*
127 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡ID€«€é¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡ŽÉÍý¥Ö¥í¥Ã¥¯€òŒè€êœÐ€¹€¿
128 *  €á€Î¥Þ¥¯¥í
129 */
130#define INDEX_MBF(mbfid)        ((uint_t)((mbfid) - TMIN_MBFID))
131#define get_mbfcb(mbfid)        (&(mbfcb_table[INDEX_MBF(mbfid)]))
132
133/*
134 *  ¥Õ¥Ã¥¯¥ë¡Œ¥Á¥óžÆœÐ€·ÍÑ€ÎÊÑ¿ô
135 */
136#ifdef TOPPERS_mbfhook
137
138bool_t  (*mbfhook_dequeue_wobj)(TCB *p_tcb) = NULL;
139bool_t  (*mbfhook_change_priority)(WOBJCB *p_wobjcb) = NULL;
140
141#endif /* TOPPERS_mbfhook */
142
143/*
144 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡µ¡Çœ€ÎœéŽü²œ
145 */
146#ifdef TOPPERS_mbfini
147
148void
149initialize_messagebuf(void)
150{
151        uint_t  i;
152        MBFCB   *p_mbfcb;
153
154        mbfhook_dequeue_wobj = messagebuf_dequeue_wobj;
155        mbfhook_change_priority = messagebuf_change_priority;
156
157        for (i = 0; i < tnum_mbf; i++) {
158                p_mbfcb = &(mbfcb_table[i]);
159                queue_initialize(&(p_mbfcb->swait_queue));
160                p_mbfcb->p_mbfinib = &(mbfinib_table[i]);
161                queue_initialize(&(p_mbfcb->rwait_queue));
162                p_mbfcb->fmbfsz = p_mbfcb->p_mbfinib->mbfsz;
163                p_mbfcb->head = 0U;
164                p_mbfcb->tail = 0U;
165                p_mbfcb->smbfcnt = 0U;
166        }
167}
168
169#endif /* TOPPERS_mbfini */
170
171/*
172 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡ŽÉÍýÎ롏ۯ€Î¥á¥Ã¥»¡Œ¥ž€Î³ÊÇŒ
173 */
174#ifdef TOPPERS_mbfenq
175
176bool_t
177enqueue_message(MBFCB *p_mbfcb, const void *msg, uint_t msgsz)
178{
179        const MBFINIB   *p_mbfinib = p_mbfcb->p_mbfinib;
180        char    *mbuffer = (char *)(p_mbfinib->mbfmb);
181        uint_t  allocsz;
182        SIZE    remsz;
183
184        allocsz = sizeof(uint_t) + TOPPERS_ROUND_SZ(msgsz, sizeof(uint_t));
185        if (allocsz <= p_mbfcb->fmbfsz) {
186                *((uint_t *) &(mbuffer[p_mbfcb->tail])) = msgsz;
187                p_mbfcb->tail += sizeof(uint_t);
188                if (p_mbfcb->tail >= p_mbfinib->mbfsz) {
189                        p_mbfcb->tail = 0U;
190                }
191
192                remsz = p_mbfinib->mbfsz - p_mbfcb->tail;
193                if (remsz < msgsz) {
194                        memcpy(&(mbuffer[p_mbfcb->tail]), msg, remsz);
195                        msg = ((char *) msg) + remsz;
196                        msgsz -= remsz;
197                        p_mbfcb->tail = 0U;
198                }
199                memcpy(&(mbuffer[p_mbfcb->tail]), msg, msgsz);
200                p_mbfcb->tail += TOPPERS_ROUND_SZ(msgsz, sizeof(uint_t));
201                if (p_mbfcb->tail >= p_mbfinib->mbfsz) {
202                        p_mbfcb->tail = 0U;
203                }
204
205                p_mbfcb->fmbfsz -= allocsz;
206                p_mbfcb->smbfcnt++;
207                return(true);
208        }
209        return(false);
210}
211
212#endif /* TOPPERS_mbfenq */
213
214/*
215 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡ŽÉÍýÎΰ耫€é€Î¥á¥Ã¥»¡Œ¥ž€ÎŒèœÐ€·
216 */
217#ifdef TOPPERS_mbfdeq
218
219uint_t
220dequeue_message(MBFCB *p_mbfcb, void *msg)
221{
222        const MBFINIB   *p_mbfinib = p_mbfcb->p_mbfinib;
223        char    *mbuffer = (char *)(p_mbfinib->mbfmb);
224        uint_t  msgsz, copysz;
225        SIZE    remsz;
226
227        assert(p_mbfcb->smbfcnt > 0);
228        msgsz = *((uint_t *) &(mbuffer[p_mbfcb->head]));
229        p_mbfcb->head += sizeof(uint_t);
230        if (p_mbfcb->head >= p_mbfcb->p_mbfinib->mbfsz) {
231                p_mbfcb->head = 0U;
232        }
233
234        remsz = p_mbfcb->p_mbfinib->mbfsz - p_mbfcb->head;
235        copysz = msgsz;
236        if (remsz < copysz) {
237                memcpy(msg, &(mbuffer[p_mbfcb->head]), remsz);
238                msg = ((char *) msg) + remsz;
239                copysz -= remsz;
240                p_mbfcb->head = 0U;
241        }
242        memcpy(msg, &(mbuffer[p_mbfcb->head]), copysz);
243        p_mbfcb->head += TOPPERS_ROUND_SZ(copysz, sizeof(uint_t));
244        if (p_mbfcb->head >= p_mbfcb->p_mbfinib->mbfsz) {
245                p_mbfcb->head = 0U;
246        }
247
248        p_mbfcb->fmbfsz += sizeof(uint_t) + TOPPERS_ROUND_SZ(msgsz, sizeof(uint_t));
249        p_mbfcb->smbfcnt--;
250        return(msgsz);
251}
252
253#endif /* TOPPERS_mbfdeq */
254
255/*
256 *  Á÷¿®ÂÔ€Á¹ÔÎó€ËŒ«¥¿¥¹¥¯€è€êÍ¥À耷€Æ¥á¥Ã¥»¡Œ¥ž€òÁ÷¿®€Ç€­€ë¥¿¥¹¥¯€¬Âž
257 *  ºß€·€Ê€€Ÿì¹ç€Ëtrue€òÊÖ€¹ŽØ¿ô
258 */
259Inline bool_t
260have_precedence(MBFCB *p_mbfcb)
261{
262        if (queue_empty(&(p_mbfcb->swait_queue))) {
263                /* Á÷¿®ÂÔ€Á¹ÔÎ󀬶õ€Î»þ */
264                return(true);
265        }
266        else if ((p_mbfcb->p_mbfinib->mbfatr & TA_TPRI) != 0) {
267                if (((TCB *)(p_mbfcb->swait_queue.p_next))->priority
268                                                                                                > p_runtsk->priority) {
269                        /* Á÷¿®ÂÔ€Á¹ÔÎ󀬥¿¥¹¥¯€ÎÍ¥ÀèÅÙœç€Ç¡€
270                                        ÀèÆ¬€Î¥¿¥¹¥¯€ÎÍ¥ÀèÅÙ€¬Œ«¥¿¥¹¥¯€ÎÍ¥ÀèÅÙ€è€ê€âÄ »þ */
271                        return(true);
272                }
273        }
274        return(false);
275}
276
277/*
278 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡€Ø€Î¥á¥Ã¥»¡Œ¥žÁ÷¿®
279 */
280#ifdef TOPPERS_mbfsnd
281
282bool_t
283send_message(MBFCB *p_mbfcb, const void *msg, uint_t msgsz, bool_t *p_dspreq)
284{
285        TCB             *p_tcb;
286
287        if (!queue_empty(&(p_mbfcb->rwait_queue))) {
288                p_tcb = (TCB *) queue_delete_next(&(p_mbfcb->rwait_queue));
289                memcpy(((WINFO_MBF *)(p_tcb->p_winfo))->msg, msg, msgsz);
290                ((WINFO_MBF *)(p_tcb->p_winfo))->msgsz = msgsz;
291                *p_dspreq = wait_complete(p_tcb);
292                return(true);
293        }
294        else if (have_precedence(p_mbfcb)
295                                                        && enqueue_message(p_mbfcb, msg, msgsz)) {
296                *p_dspreq = false;
297                return(true);
298        }
299        else {
300                return(false);
301        }
302}
303
304#endif /* TOPPERS_mbfsnd */
305
306/*
307 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡Á÷¿®ÂÔ€Á¥¿¥¹¥¯€Î¥Á¥§¥Ã¥¯
308 *
309 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡Á÷¿®ÂÔ€Á¥­¥å¡Œ€ÎÀèÆ¬€Î¥¿¥¹¥¯€ÎÁ÷¿®¥á¥Ã¥»¡Œ¥ž€¬¡€
310 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡ŽÉÍýÎΰè€Ë³ÊÇŒ€¹€ë€³€È€Ç€­€ì€Ð³ÊÇŒ€·¡€ÂÔ€Á²òœü€¹
311 *  €ë¡¥€³€ÎœèÍý€ò¡€ÀèÆ¬€Î¥¿¥¹¥¯€ÎÁ÷¿®¥á¥Ã¥»¡Œ¥ž€¬³ÊÇŒ€Ç€­€Ê€¯€Ê€ë€Þ€Ç
312 *  ·«€êÊÖ€¹¡¥
313 */
314#ifdef TOPPERS_mbfsig
315
316bool_t
317messagebuf_signal(MBFCB *p_mbfcb)
318{
319        TCB             *p_tcb;
320        bool_t  dspreq = false;
321
322        while (!queue_empty(&(p_mbfcb->swait_queue))) {
323                p_tcb = (TCB *)(p_mbfcb->swait_queue.p_next);
324                if (enqueue_message(p_mbfcb, ((WINFO_MBF *)(p_tcb->p_winfo))->msg,
325                                                                        ((WINFO_MBF *)(p_tcb->p_winfo))->msgsz)) {
326                        queue_delete(&(p_tcb->task_queue));
327                        if (wait_complete(p_tcb)) {
328                                dspreq = true;
329                        }
330                }
331                else {
332                        break;
333                }
334        }
335        return(dspreq);
336}
337
338#endif /* TOPPERS_mbfsig */
339
340/*
341 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡€«€é€Î¥á¥Ã¥»¡Œ¥žŒõ¿®
342 */
343#ifdef TOPPERS_mbfrcv
344
345uint_t
346receive_message(MBFCB *p_mbfcb, void *msg, bool_t *p_dspreq)
347{
348        TCB             *p_tcb;
349        uint_t  msgsz;
350
351        if (p_mbfcb->smbfcnt > 0) {
352                msgsz = dequeue_message(p_mbfcb, msg);
353                *p_dspreq = messagebuf_signal(p_mbfcb);
354                return(msgsz);
355        }
356        else if (!queue_empty(&(p_mbfcb->swait_queue))) {
357                p_tcb = (TCB *) queue_delete_next(&(p_mbfcb->swait_queue));
358                msgsz = ((WINFO_MBF *)(p_tcb->p_winfo))->msgsz;
359                memcpy(msg, ((WINFO_MBF *)(p_tcb->p_winfo))->msg, msgsz);
360                *p_dspreq = wait_complete(p_tcb);
361                return(msgsz);
362        }
363        else {
364                return(0U);
365        }
366}
367
368#endif /* TOPPERS_mbfrcv */
369
370/*
371 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡Á÷¿®ÂÔ€Á¥¿¥¹¥¯€ÎÂÔ€Á²òœü»þœèÍý
372 */
373#ifdef TOPPERS_mbfwobj
374
375bool_t
376messagebuf_dequeue_wobj(TCB *p_tcb)
377{
378        return(messagebuf_signal(((WINFO_MBF *)(p_tcb->p_winfo))->p_mbfcb));
379}
380
381#endif /* TOPPERS_mbfwobj */
382
383/*
384 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡Á÷¿®ÂÔ€Á¥¿¥¹¥¯€ÎÍ¥ÀèÅÙÊѹ¹»þœèÍý
385 */
386#ifdef TOPPERS_mbfpri
387
388bool_t
389messagebuf_change_priority(WOBJCB *p_wobjcb)
390{
391        return(messagebuf_signal((MBFCB *) p_wobjcb));
392}
393
394#endif /* TOPPERS_mbfpri */
395
396/*
397 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡€Ø€ÎÁ÷¿®
398 */
399#ifdef TOPPERS_snd_mbf
400
401ER
402snd_mbf(ID mbfid, const void *msg, uint_t msgsz)
403{
404        MBFCB   *p_mbfcb;
405        WINFO_MBF winfo_mbf;
406        bool_t  dspreq;
407        ER              ercd;
408
409        LOG_SND_MBF_ENTER(mbfid, msg, msgsz);
410        CHECK_DISPATCH();
411        CHECK_MBFID(mbfid);
412        p_mbfcb = get_mbfcb(mbfid);
413        CHECK_PAR(0 < msgsz && msgsz <= p_mbfcb->p_mbfinib->maxmsz);
414
415        t_lock_cpu();
416        if (send_message(p_mbfcb, msg, msgsz, &dspreq)) {
417                if (dspreq) {
418                        dispatch();
419                }
420                ercd = E_OK;
421        }
422        else {
423                winfo_mbf.msg = (void *) msg;
424                winfo_mbf.msgsz = msgsz;
425                p_runtsk->tstat = (TS_WAITING | TS_WAIT_SMBF);
426                wobj_make_wait((WOBJCB *) p_mbfcb, (WINFO_WOBJ *) &winfo_mbf);
427                dispatch();
428                ercd = winfo_mbf.winfo.wercd;
429        }
430        t_unlock_cpu();
431
432  error_exit:
433        LOG_SND_MBF_LEAVE(ercd);
434        return(ercd);
435}
436
437#endif /* TOPPERS_snd_mbf */
438
439/*
440 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡€Ø€ÎÁ÷¿®¡Ê¥Ý¡Œ¥ê¥ó¥°¡Ë
441 */
442#ifdef TOPPERS_psnd_mbf
443
444ER
445psnd_mbf(ID mbfid, const void *msg, uint_t msgsz)
446{
447        MBFCB   *p_mbfcb;
448        bool_t  dspreq;
449        ER              ercd;
450
451        LOG_PSND_MBF_ENTER(mbfid, msg, msgsz);
452        CHECK_TSKCTX_UNL();
453        CHECK_MBFID(mbfid);
454        p_mbfcb = get_mbfcb(mbfid);
455        CHECK_PAR(0 < msgsz && msgsz <= p_mbfcb->p_mbfinib->maxmsz);
456
457        t_lock_cpu();
458        if (send_message(p_mbfcb, msg, msgsz, &dspreq)) {
459                if (dspreq) {
460                        dispatch();
461                }
462                ercd = E_OK;
463        }
464        else {
465                ercd = E_TMOUT;
466        }
467        t_unlock_cpu();
468
469  error_exit:
470        LOG_PSND_MBF_LEAVE(ercd);
471        return(ercd);
472}
473
474#endif /* TOPPERS_psnd_mbf */
475
476/*
477 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡€Ø€ÎÁ÷¿®¡Ê¥¿¥€¥à¥¢¥Š¥È€¢€ê¡Ë
478 */
479#ifdef TOPPERS_tsnd_mbf
480
481ER
482tsnd_mbf(ID mbfid, const void *msg, uint_t msgsz, TMO tmout)
483{
484        MBFCB   *p_mbfcb;
485        WINFO_MBF winfo_mbf;
486        TMEVTB  tmevtb;
487        bool_t  dspreq;
488        ER              ercd;
489
490        LOG_TSND_MBF_ENTER(mbfid, msg, msgsz, tmout);
491        CHECK_DISPATCH();
492        CHECK_MBFID(mbfid);
493        CHECK_TMOUT(tmout);
494        p_mbfcb = get_mbfcb(mbfid);
495        CHECK_PAR(0 < msgsz && msgsz <= p_mbfcb->p_mbfinib->maxmsz);
496
497        t_lock_cpu();
498        if (send_message(p_mbfcb, msg, msgsz, &dspreq)) {
499                if (dspreq) {
500                        dispatch();
501                }
502                ercd = E_OK;
503        }
504        else if (tmout == TMO_POL) {
505                ercd = E_TMOUT;
506        }
507        else {
508                winfo_mbf.msg = (void *) msg;
509                winfo_mbf.msgsz = msgsz;
510                p_runtsk->tstat = (TS_WAITING | TS_WAIT_SMBF);
511                wobj_make_wait_tmout((WOBJCB *) p_mbfcb, (WINFO_WOBJ *) &winfo_mbf,
512                                                                                                                &tmevtb, tmout);
513                dispatch();
514                ercd = winfo_mbf.winfo.wercd;
515        }
516        t_unlock_cpu();
517
518  error_exit:
519        LOG_TSND_MBF_LEAVE(ercd);
520        return(ercd);
521}
522
523#endif /* TOPPERS_tsnd_mbf */
524
525/*
526 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡€«€é€ÎŒõ¿®
527 */
528#ifdef TOPPERS_rcv_mbf
529
530ER_UINT
531rcv_mbf(ID mbfid, void *msg)
532{
533        MBFCB   *p_mbfcb;
534        WINFO_MBF winfo_mbf;
535        uint_t  msgsz;
536        bool_t  dspreq;
537        ER_UINT ercd;
538
539        LOG_RCV_MBF_ENTER(mbfid, msg);
540        CHECK_DISPATCH();
541        CHECK_MBFID(mbfid);
542        p_mbfcb = get_mbfcb(mbfid);
543
544        t_lock_cpu();
545        if ((msgsz = receive_message(p_mbfcb, msg, &dspreq)) > 0U) {
546                if (dspreq) {
547                        dispatch();
548                }
549                ercd = (ER_UINT) msgsz;
550        }
551        else {
552                p_runtsk->tstat = (TS_WAITING | TS_WAIT_RMBF);
553                make_wait(&(winfo_mbf.winfo));
554                queue_insert_prev(&(p_mbfcb->rwait_queue), &(p_runtsk->task_queue));
555                winfo_mbf.p_mbfcb = p_mbfcb;
556                winfo_mbf.msg = msg;
557                LOG_TSKSTAT(p_runtsk);
558                dispatch();
559                ercd = winfo_mbf.winfo.wercd;
560                if (ercd == E_OK) {
561                        ercd = (ER_UINT)(winfo_mbf.msgsz);
562                }
563        }
564        t_unlock_cpu();
565
566  error_exit:
567        LOG_RCV_MBF_LEAVE(ercd, msg);
568        return(ercd);
569}
570
571#endif /* TOPPERS_rcv_mbf */
572
573/*
574 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡€«€é€ÎŒõ¿®¡Ê¥Ý¡Œ¥ê¥ó¥°¡Ë
575 */
576#ifdef TOPPERS_prcv_mbf
577
578ER
579prcv_mbf(ID mbfid, void *msg)
580{
581        MBFCB   *p_mbfcb;
582        uint_t  msgsz;
583        bool_t  dspreq;
584        ER_UINT ercd;
585
586        LOG_PRCV_MBF_ENTER(mbfid, msg);
587        CHECK_TSKCTX_UNL();
588        CHECK_MBFID(mbfid);
589        p_mbfcb = get_mbfcb(mbfid);
590
591        t_lock_cpu();
592        if ((msgsz = receive_message(p_mbfcb, msg, &dspreq)) > 0U) {
593                if (dspreq) {
594                        dispatch();
595                }
596                ercd = (ER_UINT) msgsz;
597        }
598        else {
599                ercd = E_TMOUT;
600        }
601        t_unlock_cpu();
602
603  error_exit:
604        LOG_PRCV_MBF_LEAVE(ercd, msg);
605        return(ercd);
606}
607
608#endif /* TOPPERS_prcv_mbf */
609
610/*
611 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡€«€é€ÎŒõ¿®¡Ê¥¿¥€¥à¥¢¥Š¥È€¢€ê¡Ë
612 */
613#ifdef TOPPERS_trcv_mbf
614
615ER
616trcv_mbf(ID mbfid, void *msg, TMO tmout)
617{
618        MBFCB   *p_mbfcb;
619        WINFO_MBF winfo_mbf;
620        TMEVTB  tmevtb;
621        uint_t  msgsz;
622        bool_t  dspreq;
623        ER_UINT ercd;
624
625        LOG_TRCV_MBF_ENTER(mbfid, msg, tmout);
626        CHECK_DISPATCH();
627        CHECK_MBFID(mbfid);
628        CHECK_TMOUT(tmout);
629        p_mbfcb = get_mbfcb(mbfid);
630
631        t_lock_cpu();
632        if ((msgsz = receive_message(p_mbfcb, msg, &dspreq)) > 0U) {
633                if (dspreq) {
634                        dispatch();
635                }
636                ercd = (ER_UINT) msgsz;
637        }
638        else if (tmout == TMO_POL) {
639                ercd = E_TMOUT;
640        }
641        else {
642                p_runtsk->tstat = (TS_WAITING | TS_WAIT_RMBF);
643                make_wait_tmout(&(winfo_mbf.winfo), &tmevtb, tmout);
644                queue_insert_prev(&(p_mbfcb->rwait_queue), &(p_runtsk->task_queue));
645                winfo_mbf.p_mbfcb = p_mbfcb;
646                winfo_mbf.msg = msg;
647                LOG_TSKSTAT(p_runtsk);
648                dispatch();
649                ercd = winfo_mbf.winfo.wercd;
650                if (ercd == E_OK) {
651                        ercd = (ER_UINT)(winfo_mbf.msgsz);
652                }
653        }
654        t_unlock_cpu();
655
656  error_exit:
657        LOG_TRCV_MBF_LEAVE(ercd, msg);
658        return(ercd);
659}
660
661#endif /* TOPPERS_trcv_mbf */
662
663/*
664 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡€ÎºÆœéŽü²œ
665 */
666#ifdef TOPPERS_ini_mbf
667
668ER
669ini_mbf(ID mbfid)
670{
671        MBFCB   *p_mbfcb;
672        bool_t  dspreq;
673        ER              ercd;
674   
675        LOG_INI_MBF_ENTER(mbfid);
676        CHECK_TSKCTX_UNL();
677        CHECK_MBFID(mbfid);
678        p_mbfcb = get_mbfcb(mbfid);
679
680        t_lock_cpu();
681        dspreq = init_wait_queue(&(p_mbfcb->swait_queue));
682        if (init_wait_queue(&(p_mbfcb->rwait_queue))) {
683                dspreq = true;
684        }
685        p_mbfcb->fmbfsz = p_mbfcb->p_mbfinib->mbfsz;
686        p_mbfcb->head = 0U;
687        p_mbfcb->tail = 0U;
688        p_mbfcb->smbfcnt = 0U;
689        if (dspreq) {
690                dispatch();
691        }
692        ercd = E_OK;
693        t_unlock_cpu();
694
695  error_exit:
696        LOG_INI_MBF_LEAVE(ercd);
697        return(ercd);
698}
699
700#endif /* TOPPERS_ini_mbf */
701
702/*
703 *  ¥á¥Ã¥»¡Œ¥ž¥Ð¥Ã¥Õ¥¡€ÎŸõÂÖ»²ŸÈ
704 */
705#ifdef TOPPERS_ref_mbf
706
707ER
708ref_mbf(ID mbfid, T_RMBF *pk_rmbf)
709{
710        MBFCB   *p_mbfcb;
711        ER              ercd;
712   
713        LOG_REF_MBF_ENTER(mbfid, pk_rmbf);
714        CHECK_TSKCTX_UNL();
715        CHECK_MBFID(mbfid);
716        p_mbfcb = get_mbfcb(mbfid);
717
718        t_lock_cpu();
719        pk_rmbf->stskid = wait_tskid(&(p_mbfcb->swait_queue));
720        pk_rmbf->rtskid = wait_tskid(&(p_mbfcb->rwait_queue));
721        pk_rmbf->smbfcnt = p_mbfcb->smbfcnt;
722        pk_rmbf->fmbfsz = p_mbfcb->fmbfsz;
723        ercd = E_OK;
724        t_unlock_cpu();
725
726  error_exit:
727        LOG_REF_MBF_LEAVE(ercd, pk_rmbf);
728        return(ercd);
729}
730
731#endif /* TOPPERS_ref_mbf */
詳しい使い方は TracBrowser を参照してください。