source: mypx/kernel/pridataq.c @ 7

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

TOPPERS/ASP 1.9.1

ファイルサイズ: 14.2 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-2013 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 "pridataq.h"
52
53/*
54 *  ¥È¥ì¡Œ¥¹¥í¥°¥Þ¥¯¥í€Î¥Ç¥Õ¥©¥ë¥ÈÄêµÁ
55 */
56#ifndef LOG_SND_PDQ_ENTER
57#define LOG_SND_PDQ_ENTER(pdqid, data, datapri)
58#endif /* LOG_SND_PDQ_ENTER */
59
60#ifndef LOG_SND_PDQ_LEAVE
61#define LOG_SND_PDQ_LEAVE(ercd)
62#endif /* LOG_SND_PDQ_LEAVE */
63
64#ifndef LOG_PSND_PDQ_ENTER
65#define LOG_PSND_PDQ_ENTER(pdqid, data, datapri)
66#endif /* LOG_PSND_PDQ_ENTER */
67
68#ifndef LOG_PSND_PDQ_LEAVE
69#define LOG_PSND_PDQ_LEAVE(ercd)
70#endif /* LOG_PSND_PDQ_LEAVE */
71
72#ifndef LOG_IPSND_PDQ_ENTER
73#define LOG_IPSND_PDQ_ENTER(pdqid, data, datapri)
74#endif /* LOG_IPSND_PDQ_ENTER */
75
76#ifndef LOG_IPSND_PDQ_LEAVE
77#define LOG_IPSND_PDQ_LEAVE(ercd)
78#endif /* LOG_IPSND_PDQ_LEAVE */
79
80#ifndef LOG_TSND_PDQ_ENTER
81#define LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout)
82#endif /* LOG_TSND_PDQ_ENTER */
83
84#ifndef LOG_TSND_PDQ_LEAVE
85#define LOG_TSND_PDQ_LEAVE(ercd)
86#endif /* LOG_TSND_PDQ_LEAVE */
87
88#ifndef LOG_RCV_PDQ_ENTER
89#define LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri)
90#endif /* LOG_RCV_PDQ_ENTER */
91
92#ifndef LOG_RCV_PDQ_LEAVE
93#define LOG_RCV_PDQ_LEAVE(ercd, data, datapri)
94#endif /* LOG_RCV_PDQ_LEAVE */
95
96#ifndef LOG_PRCV_PDQ_ENTER
97#define LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri)
98#endif /* LOG_PRCV_PDQ_ENTER */
99
100#ifndef LOG_PRCV_PDQ_LEAVE
101#define LOG_PRCV_PDQ_LEAVE(ercd, data, datapri)
102#endif /* LOG_PRCV_PDQ_LEAVE */
103
104#ifndef LOG_TRCV_PDQ_ENTER
105#define LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout)
106#endif /* LOG_TRCV_PDQ_ENTER */
107
108#ifndef LOG_TRCV_PDQ_LEAVE
109#define LOG_TRCV_PDQ_LEAVE(ercd, data, datapri)
110#endif /* LOG_TRCV_PDQ_LEAVE */
111
112#ifndef LOG_INI_PDQ_ENTER
113#define LOG_INI_PDQ_ENTER(pdqid)
114#endif /* LOG_INI_PDQ_ENTER */
115
116#ifndef LOG_INI_PDQ_LEAVE
117#define LOG_INI_PDQ_LEAVE(ercd)
118#endif /* LOG_INI_PDQ_LEAVE */
119
120#ifndef LOG_REF_PDQ_ENTER
121#define LOG_REF_PDQ_ENTER(pdqid, pk_rpdq)
122#endif /* LOG_REF_PDQ_ENTER */
123
124#ifndef LOG_REF_PDQ_LEAVE
125#define LOG_REF_PDQ_LEAVE(ercd, pk_rpdq)
126#endif /* LOG_REF_PDQ_LEAVE */
127
128/*
129 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€Î¿ô
130 */
131#define tnum_pdq        ((uint_t)(tmax_pdqid - TMIN_PDQID + 1))
132
133/*
134 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡ŒID€«€éÍ¥ÀèÅ٥ǡŒ¥¿¥­¥å¡ŒŽÉÍý¥Ö¥í¥Ã¥¯€òŒè€êœÐ€¹€¿
135 *  €á€Î¥Þ¥¯¥í
136 */
137#define INDEX_PDQ(pdqid)        ((uint_t)((pdqid) - TMIN_PDQID))
138#define get_pdqcb(pdqid)        (&(pdqcb_table[INDEX_PDQ(pdqid)]))
139
140/*
141 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œµ¡Çœ€ÎœéŽü²œ
142 */
143#ifdef TOPPERS_pdqini
144
145void
146initialize_pridataq(void)
147{
148        uint_t  i;
149        PDQCB   *p_pdqcb;
150
151        for (i = 0; i < tnum_pdq; i++) {
152                p_pdqcb = &(pdqcb_table[i]);
153                queue_initialize(&(p_pdqcb->swait_queue));
154                p_pdqcb->p_pdqinib = &(pdqinib_table[i]);
155                queue_initialize(&(p_pdqcb->rwait_queue));
156                p_pdqcb->count = 0U;
157                p_pdqcb->p_head = NULL;
158                p_pdqcb->unused = 0U;
159                p_pdqcb->p_freelist = NULL;
160        }
161}
162
163#endif /* TOPPERS_pdqini */
164
165/*
166 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡ŒŽÉÍýÎ롏ۯ€Î¥Ç¡Œ¥¿€Î³ÊÇŒ
167 */
168#ifdef TOPPERS_pdqenq
169
170void
171enqueue_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri)
172{
173        PDQMB   *p_pdqmb;
174        PDQMB   **pp_prev_next, *p_next;
175
176        if (p_pdqcb->p_freelist != NULL) {
177                p_pdqmb = p_pdqcb->p_freelist;
178                p_pdqcb->p_freelist = p_pdqmb->p_next;
179        }
180        else {
181                p_pdqmb = p_pdqcb->p_pdqinib->p_pdqmb + p_pdqcb->unused;
182                p_pdqcb->unused++;
183        }
184
185        p_pdqmb->data = data;
186        p_pdqmb->datapri = datapri;
187
188        pp_prev_next = &(p_pdqcb->p_head);
189        while ((p_next = *pp_prev_next) != NULL) {
190                if (p_next->datapri > datapri) {
191                        break;
192                }
193                pp_prev_next = &(p_next->p_next);
194        }
195        p_pdqmb->p_next = p_next;
196        *pp_prev_next = p_pdqmb;
197        p_pdqcb->count++;
198}
199
200#endif /* TOPPERS_pdqenq */
201
202/*
203 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡ŒŽÉÍýÎΰ耫€é€Î¥Ç¡Œ¥¿€ÎŒèœÐ€·
204 */
205#ifdef TOPPERS_pdqdeq
206
207void
208dequeue_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
209{
210        PDQMB   *p_pdqmb;
211
212        p_pdqmb = p_pdqcb->p_head;
213        p_pdqcb->p_head = p_pdqmb->p_next;
214        p_pdqcb->count--;
215
216        *p_data = p_pdqmb->data;
217        *p_datapri = p_pdqmb->datapri;
218
219        p_pdqmb->p_next = p_pdqcb->p_freelist;
220        p_pdqcb->p_freelist = p_pdqmb;
221}
222
223#endif /* TOPPERS_pdqdeq */
224
225/*
226 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€Ø€Î¥Ç¡Œ¥¿Á÷¿®
227 */
228#ifdef TOPPERS_pdqsnd
229
230bool_t
231send_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri, bool_t *p_dspreq)
232{
233        TCB             *p_tcb;
234
235        if (!queue_empty(&(p_pdqcb->rwait_queue))) {
236                p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->rwait_queue));
237                ((WINFO_PDQ *)(p_tcb->p_winfo))->data = data;
238                ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri = datapri;
239                *p_dspreq = wait_complete(p_tcb);
240                return(true);
241        }
242        else if (p_pdqcb->count < p_pdqcb->p_pdqinib->pdqcnt) {
243                enqueue_pridata(p_pdqcb, data, datapri);
244                *p_dspreq = false;
245                return(true);
246        }
247        else {
248                return(false);
249        }
250}
251
252#endif /* TOPPERS_pdqsnd */
253
254/*
255 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€«€é€Î¥Ç¡Œ¥¿Œõ¿®
256 */
257#ifdef TOPPERS_pdqrcv
258
259bool_t
260receive_pridata(PDQCB *p_pdqcb, intptr_t *p_data,
261                                                                        PRI *p_datapri, bool_t *p_dspreq)
262{
263        TCB             *p_tcb;
264        intptr_t data;
265        PRI             datapri;
266
267        if (p_pdqcb->count > 0U) {
268                dequeue_pridata(p_pdqcb, p_data, p_datapri);
269                if (!queue_empty(&(p_pdqcb->swait_queue))) {
270                        p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
271                        data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
272                        datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
273                        enqueue_pridata(p_pdqcb, data, datapri);
274                        *p_dspreq = wait_complete(p_tcb);
275                }
276                else {
277                        *p_dspreq = false;
278                }
279                return(true);
280        }
281        else if (!queue_empty(&(p_pdqcb->swait_queue))) {
282                p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
283                *p_data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
284                *p_datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
285                *p_dspreq = wait_complete(p_tcb);
286                return(true);
287        }
288        else {
289                return(false);
290        }
291}
292
293#endif /* TOPPERS_pdqrcv */
294
295/*
296 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€Ø€ÎÁ÷¿®
297 */
298#ifdef TOPPERS_snd_pdq
299
300ER
301snd_pdq(ID pdqid, intptr_t data, PRI datapri)
302{
303        PDQCB   *p_pdqcb;
304        WINFO_PDQ winfo_pdq;
305        bool_t  dspreq;
306        ER              ercd;
307
308        LOG_SND_PDQ_ENTER(pdqid, data, datapri);
309        CHECK_DISPATCH();
310        CHECK_PDQID(pdqid);
311        p_pdqcb = get_pdqcb(pdqid);
312        CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
313
314        t_lock_cpu();
315        if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
316                if (dspreq) {
317                        dispatch();
318                }
319                ercd = E_OK;
320        }
321        else {
322                winfo_pdq.data = data;
323                winfo_pdq.datapri = datapri;
324                p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
325                wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq);
326                dispatch();
327                ercd = winfo_pdq.winfo.wercd;
328        }
329        t_unlock_cpu();
330
331  error_exit:
332        LOG_SND_PDQ_LEAVE(ercd);
333        return(ercd);
334}
335
336#endif /* TOPPERS_snd_pdq */
337
338/*
339 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€Ø€ÎÁ÷¿®¡Ê¥Ý¡Œ¥ê¥ó¥°¡Ë
340 */
341#ifdef TOPPERS_psnd_pdq
342
343ER
344psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
345{
346        PDQCB   *p_pdqcb;
347        bool_t  dspreq;
348        ER              ercd;
349
350        LOG_PSND_PDQ_ENTER(pdqid, data, datapri);
351        CHECK_TSKCTX_UNL();
352        CHECK_PDQID(pdqid);
353        p_pdqcb = get_pdqcb(pdqid);
354        CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
355
356        t_lock_cpu();
357        if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
358                if (dspreq) {
359                        dispatch();
360                }
361                ercd = E_OK;
362        }
363        else {
364                ercd = E_TMOUT;
365        }
366        t_unlock_cpu();
367
368  error_exit:
369        LOG_PSND_PDQ_LEAVE(ercd);
370        return(ercd);
371}
372
373#endif /* TOPPERS_psnd_pdq */
374
375/*
376 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€Ø€ÎÁ÷¿®¡Ê¥Ý¡Œ¥ê¥ó¥°¡€È󥿥¹¥¯¥³¥ó¥Æ¥­¥¹¥ÈÍÑ¡Ë
377 */
378#ifdef TOPPERS_ipsnd_pdq
379
380ER
381ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri)
382{
383        PDQCB   *p_pdqcb;
384        bool_t  dspreq;
385        ER              ercd;
386
387        LOG_IPSND_PDQ_ENTER(pdqid, data, datapri);
388        CHECK_INTCTX_UNL();
389        CHECK_PDQID(pdqid);
390        p_pdqcb = get_pdqcb(pdqid);
391        CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
392
393        i_lock_cpu();
394        if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
395                if (dspreq) {
396                        reqflg = true;
397                }
398                ercd = E_OK;
399        }
400        else {
401                ercd = E_TMOUT;
402        }
403        i_unlock_cpu();
404
405  error_exit:
406        LOG_IPSND_PDQ_LEAVE(ercd);
407        return(ercd);
408}
409
410#endif /* TOPPERS_ipsnd_pdq */
411
412/*
413 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€Ø€ÎÁ÷¿®¡Ê¥¿¥€¥à¥¢¥Š¥È€¢€ê¡Ë
414 */
415#ifdef TOPPERS_tsnd_pdq
416
417ER
418tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
419{
420        PDQCB   *p_pdqcb;
421        WINFO_PDQ winfo_pdq;
422        TMEVTB  tmevtb;
423        bool_t  dspreq;
424        ER              ercd;
425
426        LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
427        CHECK_DISPATCH();
428        CHECK_PDQID(pdqid);
429        CHECK_TMOUT(tmout);
430        p_pdqcb = get_pdqcb(pdqid);
431        CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
432
433        t_lock_cpu();
434        if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
435                if (dspreq) {
436                        dispatch();
437                }
438                ercd = E_OK;
439        }
440        else if (tmout == TMO_POL) {
441                ercd = E_TMOUT;
442        }
443        else {
444                winfo_pdq.data = data;
445                winfo_pdq.datapri = datapri;
446                p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
447                wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq,
448                                                                                                                &tmevtb, tmout);
449                dispatch();
450                ercd = winfo_pdq.winfo.wercd;
451        }
452        t_unlock_cpu();
453
454  error_exit:
455        LOG_TSND_PDQ_LEAVE(ercd);
456        return(ercd);
457}
458
459#endif /* TOPPERS_tsnd_pdq */
460
461/*
462 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€«€é€ÎŒõ¿®
463 */
464#ifdef TOPPERS_rcv_pdq
465
466ER
467rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
468{
469        PDQCB   *p_pdqcb;
470        WINFO_PDQ winfo_pdq;
471        bool_t  dspreq;
472        ER              ercd;
473
474        LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
475        CHECK_DISPATCH();
476        CHECK_PDQID(pdqid);
477        p_pdqcb = get_pdqcb(pdqid);
478
479        t_lock_cpu();
480        if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
481                if (dspreq) {
482                        dispatch();
483                }
484                ercd = E_OK;
485        }
486        else {
487                p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
488                make_wait(&(winfo_pdq.winfo));
489                queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
490                winfo_pdq.p_pdqcb = p_pdqcb;
491                LOG_TSKSTAT(p_runtsk);
492                dispatch();
493                ercd = winfo_pdq.winfo.wercd;
494                if (ercd == E_OK) {
495                        *p_data = winfo_pdq.data;
496                        *p_datapri = winfo_pdq.datapri;
497                }
498        }
499        t_unlock_cpu();
500
501  error_exit:
502        LOG_RCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
503        return(ercd);
504}
505
506#endif /* TOPPERS_rcv_pdq */
507
508/*
509 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€«€é€ÎŒõ¿®¡Ê¥Ý¡Œ¥ê¥ó¥°¡Ë
510 */
511#ifdef TOPPERS_prcv_pdq
512
513ER
514prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
515{
516        PDQCB   *p_pdqcb;
517        bool_t  dspreq;
518        ER              ercd;
519
520        LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri);
521        CHECK_TSKCTX_UNL();
522        CHECK_PDQID(pdqid);
523        p_pdqcb = get_pdqcb(pdqid);
524
525        t_lock_cpu();
526        if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
527                if (dspreq) {
528                        dispatch();
529                }
530                ercd = E_OK;
531        }
532        else {
533                ercd = E_TMOUT;
534        }
535        t_unlock_cpu();
536
537  error_exit:
538        LOG_PRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
539        return(ercd);
540}
541
542#endif /* TOPPERS_prcv_pdq */
543
544/*
545 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€«€é€ÎŒõ¿®¡Ê¥¿¥€¥à¥¢¥Š¥È€¢€ê¡Ë
546 */
547#ifdef TOPPERS_trcv_pdq
548
549ER
550trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
551{
552        PDQCB   *p_pdqcb;
553        WINFO_PDQ winfo_pdq;
554        TMEVTB  tmevtb;
555        bool_t  dspreq;
556        ER              ercd;
557
558        LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
559        CHECK_DISPATCH();
560        CHECK_PDQID(pdqid);
561        CHECK_TMOUT(tmout);
562        p_pdqcb = get_pdqcb(pdqid);
563
564        t_lock_cpu();
565        if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
566                if (dspreq) {
567                        dispatch();
568                }
569                ercd = E_OK;
570        }
571        else if (tmout == TMO_POL) {
572                ercd = E_TMOUT;
573        }
574        else {
575                p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
576                make_wait_tmout(&(winfo_pdq.winfo), &tmevtb, tmout);
577                queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
578                winfo_pdq.p_pdqcb = p_pdqcb;
579                LOG_TSKSTAT(p_runtsk);
580                dispatch();
581                ercd = winfo_pdq.winfo.wercd;
582                if (ercd == E_OK) {
583                        *p_data = winfo_pdq.data;
584                        *p_datapri = winfo_pdq.datapri;
585                }
586        }
587        t_unlock_cpu();
588
589  error_exit:
590        LOG_TRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
591        return(ercd);
592}
593
594#endif /* TOPPERS_trcv_pdq */
595
596/*
597 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€ÎºÆœéŽü²œ
598 */
599#ifdef TOPPERS_ini_pdq
600
601ER
602ini_pdq(ID pdqid)
603{
604        PDQCB   *p_pdqcb;
605        bool_t  dspreq;
606        ER              ercd;
607   
608        LOG_INI_PDQ_ENTER(pdqid);
609        CHECK_TSKCTX_UNL();
610        CHECK_PDQID(pdqid);
611        p_pdqcb = get_pdqcb(pdqid);
612
613        t_lock_cpu();
614        dspreq = init_wait_queue(&(p_pdqcb->swait_queue));
615        if (init_wait_queue(&(p_pdqcb->rwait_queue))) {
616                dspreq = true;
617        }
618        p_pdqcb->count = 0U;
619        p_pdqcb->p_head = NULL;
620        p_pdqcb->unused = 0U;
621        p_pdqcb->p_freelist = NULL;
622        if (dspreq) {
623                dispatch();
624        }
625        ercd = E_OK;
626        t_unlock_cpu();
627
628  error_exit:
629        LOG_INI_PDQ_LEAVE(ercd);
630        return(ercd);
631}
632
633#endif /* TOPPERS_ini_pdq */
634
635/*
636 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€ÎŸõÂÖ»²ŸÈ
637 */
638#ifdef TOPPERS_ref_pdq
639
640ER
641ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
642{
643        PDQCB   *p_pdqcb;
644        ER              ercd;
645   
646        LOG_REF_PDQ_ENTER(pdqid, pk_rpdq);
647        CHECK_TSKCTX_UNL();
648        CHECK_PDQID(pdqid);
649        p_pdqcb = get_pdqcb(pdqid);
650
651        t_lock_cpu();
652        pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue));
653        pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue));
654        pk_rpdq->spdqcnt = p_pdqcb->count;
655        ercd = E_OK;
656        t_unlock_cpu();
657
658  error_exit:
659        LOG_REF_PDQ_LEAVE(ercd, pk_rpdq);
660        return(ercd);
661}
662
663#endif /* TOPPERS_ref_pdq */
詳しい使い方は TracBrowser を参照してください。