source: extension/dcre/kernel/pridataq.c

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

TOPPERS/ASP 1.9.1

ファイルサイズ: 17.9 KB
 
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 "pridataq.h"
52
53/*
54 *  ¥È¥ì¡Œ¥¹¥í¥°¥Þ¥¯¥í€Î¥Ç¥Õ¥©¥ë¥ÈÄêµÁ
55 */
56#ifndef LOG_ACRE_PDQ_ENTER
57#define LOG_ACRE_PDQ_ENTER(pk_cpdq)
58#endif /* LOG_ACRE_PDQ_ENTER */
59
60#ifndef LOG_ACRE_PDQ_LEAVE
61#define LOG_ACRE_PDQ_LEAVE(ercd)
62#endif /* LOG_ACRE_PDQ_LEAVE */
63
64#ifndef LOG_DEL_PDQ_ENTER
65#define LOG_DEL_PDQ_ENTER(pdqid)
66#endif /* LOG_DEL_PDQ_ENTER */
67
68#ifndef LOG_DEL_PDQ_LEAVE
69#define LOG_DEL_PDQ_LEAVE(ercd)
70#endif /* LOG_DEL_PDQ_LEAVE */
71
72#ifndef LOG_SND_PDQ_ENTER
73#define LOG_SND_PDQ_ENTER(pdqid, data, datapri)
74#endif /* LOG_SND_PDQ_ENTER */
75
76#ifndef LOG_SND_PDQ_LEAVE
77#define LOG_SND_PDQ_LEAVE(ercd)
78#endif /* LOG_SND_PDQ_LEAVE */
79
80#ifndef LOG_PSND_PDQ_ENTER
81#define LOG_PSND_PDQ_ENTER(pdqid, data, datapri)
82#endif /* LOG_PSND_PDQ_ENTER */
83
84#ifndef LOG_PSND_PDQ_LEAVE
85#define LOG_PSND_PDQ_LEAVE(ercd)
86#endif /* LOG_PSND_PDQ_LEAVE */
87
88#ifndef LOG_IPSND_PDQ_ENTER
89#define LOG_IPSND_PDQ_ENTER(pdqid, data, datapri)
90#endif /* LOG_IPSND_PDQ_ENTER */
91
92#ifndef LOG_IPSND_PDQ_LEAVE
93#define LOG_IPSND_PDQ_LEAVE(ercd)
94#endif /* LOG_IPSND_PDQ_LEAVE */
95
96#ifndef LOG_TSND_PDQ_ENTER
97#define LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout)
98#endif /* LOG_TSND_PDQ_ENTER */
99
100#ifndef LOG_TSND_PDQ_LEAVE
101#define LOG_TSND_PDQ_LEAVE(ercd)
102#endif /* LOG_TSND_PDQ_LEAVE */
103
104#ifndef LOG_RCV_PDQ_ENTER
105#define LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri)
106#endif /* LOG_RCV_PDQ_ENTER */
107
108#ifndef LOG_RCV_PDQ_LEAVE
109#define LOG_RCV_PDQ_LEAVE(ercd, data, datapri)
110#endif /* LOG_RCV_PDQ_LEAVE */
111
112#ifndef LOG_PRCV_PDQ_ENTER
113#define LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri)
114#endif /* LOG_PRCV_PDQ_ENTER */
115
116#ifndef LOG_PRCV_PDQ_LEAVE
117#define LOG_PRCV_PDQ_LEAVE(ercd, data, datapri)
118#endif /* LOG_PRCV_PDQ_LEAVE */
119
120#ifndef LOG_TRCV_PDQ_ENTER
121#define LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout)
122#endif /* LOG_TRCV_PDQ_ENTER */
123
124#ifndef LOG_TRCV_PDQ_LEAVE
125#define LOG_TRCV_PDQ_LEAVE(ercd, data, datapri)
126#endif /* LOG_TRCV_PDQ_LEAVE */
127
128#ifndef LOG_INI_PDQ_ENTER
129#define LOG_INI_PDQ_ENTER(pdqid)
130#endif /* LOG_INI_PDQ_ENTER */
131
132#ifndef LOG_INI_PDQ_LEAVE
133#define LOG_INI_PDQ_LEAVE(ercd)
134#endif /* LOG_INI_PDQ_LEAVE */
135
136#ifndef LOG_REF_PDQ_ENTER
137#define LOG_REF_PDQ_ENTER(pdqid, pk_rpdq)
138#endif /* LOG_REF_PDQ_ENTER */
139
140#ifndef LOG_REF_PDQ_LEAVE
141#define LOG_REF_PDQ_LEAVE(ercd, pk_rpdq)
142#endif /* LOG_REF_PDQ_LEAVE */
143
144/*
145 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€Î¿ô
146 */
147#define tnum_pdq        ((uint_t)(tmax_pdqid - TMIN_PDQID + 1))
148#define tnum_spdq       ((uint_t)(tmax_spdqid - TMIN_PDQID + 1))
149
150/*
151 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡ŒID€«€éÍ¥ÀèÅ٥ǡŒ¥¿¥­¥å¡ŒŽÉÍý¥Ö¥í¥Ã¥¯€òŒè€êœÐ€¹€¿
152 *  €á€Î¥Þ¥¯¥í
153 */
154#define INDEX_PDQ(pdqid)        ((uint_t)((pdqid) - TMIN_PDQID))
155#define get_pdqcb(pdqid)        (&(pdqcb_table[INDEX_PDQ(pdqid)]))
156
157#ifdef TOPPERS_pdqini
158
159/*
160 *  »ÈÍÑ€·€Æ€€€Ê€€Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡ŒŽÉÍý¥Ö¥í¥Ã¥¯€Î¥ê¥¹¥È
161 */
162QUEUE   free_pdqcb;
163
164/*
165 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œµ¡Çœ€ÎœéŽü²œ
166 */
167void
168initialize_pridataq(void)
169{
170        uint_t  i, j;
171        PDQCB   *p_pdqcb;
172        PDQINIB *p_pdqinib;
173
174        for (i = 0; i < tnum_spdq; i++) {
175                p_pdqcb = &(pdqcb_table[i]);
176                queue_initialize(&(p_pdqcb->swait_queue));
177                p_pdqcb->p_pdqinib = &(pdqinib_table[i]);
178                queue_initialize(&(p_pdqcb->rwait_queue));
179                p_pdqcb->count = 0U;
180                p_pdqcb->p_head = NULL;
181                p_pdqcb->unused = 0U;
182                p_pdqcb->p_freelist = NULL;
183        }
184        queue_initialize(&free_pdqcb);
185        for (j = 0; i < tnum_pdq; i++, j++) {
186                p_pdqcb = &(pdqcb_table[i]);
187                p_pdqinib = &(apdqinib_table[j]);
188                p_pdqinib->pdqatr = TA_NOEXS;
189                p_pdqcb->p_pdqinib = ((const PDQINIB *) p_pdqinib);
190                queue_insert_prev(&free_pdqcb, &(p_pdqcb->swait_queue));
191        }
192}
193
194#endif /* TOPPERS_pdqini */
195
196/*
197 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡ŒŽÉÍýÎ롏ۯ€Î¥Ç¡Œ¥¿€Î³ÊÇŒ
198 */
199#ifdef TOPPERS_pdqenq
200
201void
202enqueue_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri)
203{
204        PDQMB   *p_pdqmb;
205        PDQMB   **pp_prev_next, *p_next;
206
207        if (p_pdqcb->p_freelist != NULL) {
208                p_pdqmb = p_pdqcb->p_freelist;
209                p_pdqcb->p_freelist = p_pdqmb->p_next;
210        }
211        else {
212                p_pdqmb = p_pdqcb->p_pdqinib->p_pdqmb + p_pdqcb->unused;
213                p_pdqcb->unused++;
214        }
215
216        p_pdqmb->data = data;
217        p_pdqmb->datapri = datapri;
218
219        pp_prev_next = &(p_pdqcb->p_head);
220        while ((p_next = *pp_prev_next) != NULL) {
221                if (p_next->datapri > datapri) {
222                        break;
223                }
224                pp_prev_next = &(p_next->p_next);
225        }
226        p_pdqmb->p_next = p_next;
227        *pp_prev_next = p_pdqmb;
228        p_pdqcb->count++;
229}
230
231#endif /* TOPPERS_pdqenq */
232
233/*
234 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡ŒŽÉÍýÎΰ耫€é€Î¥Ç¡Œ¥¿€ÎŒèœÐ€·
235 */
236#ifdef TOPPERS_pdqdeq
237
238void
239dequeue_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
240{
241        PDQMB   *p_pdqmb;
242
243        p_pdqmb = p_pdqcb->p_head;
244        p_pdqcb->p_head = p_pdqmb->p_next;
245        p_pdqcb->count--;
246
247        *p_data = p_pdqmb->data;
248        *p_datapri = p_pdqmb->datapri;
249
250        p_pdqmb->p_next = p_pdqcb->p_freelist;
251        p_pdqcb->p_freelist = p_pdqmb;
252}
253
254#endif /* TOPPERS_pdqdeq */
255
256/*
257 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€Ø€Î¥Ç¡Œ¥¿Á÷¿®
258 */
259#ifdef TOPPERS_pdqsnd
260
261bool_t
262send_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri, bool_t *p_dspreq)
263{
264        TCB             *p_tcb;
265
266        if (!queue_empty(&(p_pdqcb->rwait_queue))) {
267                p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->rwait_queue));
268                ((WINFO_PDQ *)(p_tcb->p_winfo))->data = data;
269                ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri = datapri;
270                *p_dspreq = wait_complete(p_tcb);
271                return(true);
272        }
273        else if (p_pdqcb->count < p_pdqcb->p_pdqinib->pdqcnt) {
274                enqueue_pridata(p_pdqcb, data, datapri);
275                *p_dspreq = false;
276                return(true);
277        }
278        else {
279                return(false);
280        }
281}
282
283#endif /* TOPPERS_pdqsnd */
284
285/*
286 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€«€é€Î¥Ç¡Œ¥¿Œõ¿®
287 */
288#ifdef TOPPERS_pdqrcv
289
290bool_t
291receive_pridata(PDQCB *p_pdqcb, intptr_t *p_data,
292                                                                        PRI *p_datapri, bool_t *p_dspreq)
293{
294        TCB             *p_tcb;
295        intptr_t data;
296        PRI             datapri;
297
298        if (p_pdqcb->count > 0U) {
299                dequeue_pridata(p_pdqcb, p_data, p_datapri);
300                if (!queue_empty(&(p_pdqcb->swait_queue))) {
301                        p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
302                        data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
303                        datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
304                        enqueue_pridata(p_pdqcb, data, datapri);
305                        *p_dspreq = wait_complete(p_tcb);
306                }
307                else {
308                        *p_dspreq = false;
309                }
310                return(true);
311        }
312        else if (!queue_empty(&(p_pdqcb->swait_queue))) {
313                p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
314                *p_data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
315                *p_datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
316                *p_dspreq = wait_complete(p_tcb);
317                return(true);
318        }
319        else {
320                return(false);
321        }
322}
323
324#endif /* TOPPERS_pdqrcv */
325
326/*
327 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€ÎÀžÀ®
328 */
329#ifdef TOPPERS_acre_pdq
330
331ER_UINT
332acre_pdq(const T_CPDQ *pk_cpdq)
333{
334        PDQCB   *p_pdqcb;
335        PDQINIB *p_pdqinib;
336        ATR             pdqatr;
337        PDQMB   *p_pdqmb;
338        ER              ercd;
339
340        LOG_ACRE_PDQ_ENTER(pk_cpdq);
341        CHECK_TSKCTX_UNL();
342        CHECK_RSATR(pk_cpdq->pdqatr, TA_TPRI);
343        CHECK_DPRI(pk_cpdq->maxdpri);
344        if (pk_cpdq->pdqmb != NULL) {
345                CHECK_ALIGN_MB(pk_cpdq->pdqmb);
346        }
347        pdqatr = pk_cpdq->pdqatr;
348        p_pdqmb = pk_cpdq->pdqmb;
349
350        t_lock_cpu();
351        if (tnum_pdq == 0 || queue_empty(&free_pdqcb)) {
352                ercd = E_NOID;
353        }
354        else {
355                if (pk_cpdq->pdqcnt != 0 && p_pdqmb == NULL) {
356                        p_pdqmb = kernel_malloc(sizeof(PDQMB) * pk_cpdq->pdqcnt);
357                        pdqatr |= TA_MBALLOC;
358                }
359                if (pk_cpdq->pdqcnt != 0 && p_pdqmb == NULL) {
360                        ercd = E_NOMEM;
361                }
362                else {
363                        p_pdqcb = ((PDQCB *) queue_delete_next(&free_pdqcb));
364                        p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
365                        p_pdqinib->pdqatr = pdqatr;
366                        p_pdqinib->pdqcnt = pk_cpdq->pdqcnt;
367                        p_pdqinib->maxdpri = pk_cpdq->maxdpri;
368                        p_pdqinib->p_pdqmb = p_pdqmb;
369
370                        queue_initialize(&(p_pdqcb->swait_queue));
371                        queue_initialize(&(p_pdqcb->rwait_queue));
372                        p_pdqcb->count = 0U;
373                        p_pdqcb->p_head = NULL;
374                        p_pdqcb->unused = 0U;
375                        p_pdqcb->p_freelist = NULL;
376                        ercd = PDQID(p_pdqcb);
377                }
378        }
379        t_unlock_cpu();
380
381  error_exit:
382        LOG_ACRE_PDQ_LEAVE(ercd);
383        return(ercd);
384}
385
386#endif /* TOPPERS_acre_pdq */
387
388/*
389 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€Îºïœü
390 */
391#ifdef TOPPERS_del_pdq
392
393ER
394del_pdq(ID pdqid)
395{
396        PDQCB   *p_pdqcb;
397        PDQINIB *p_pdqinib;
398        bool_t  dspreq;
399        ER              ercd;
400
401        LOG_DEL_PDQ_ENTER(pdqid);
402        CHECK_TSKCTX_UNL();
403        CHECK_PDQID(pdqid);
404        p_pdqcb = get_pdqcb(pdqid);
405
406        t_lock_cpu();
407        if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
408                ercd = E_NOEXS;
409        }
410        else if (PDQID(p_pdqcb) > tmax_spdqid) {
411                dspreq = init_wait_queue(&(p_pdqcb->swait_queue));
412                if (init_wait_queue(&(p_pdqcb->rwait_queue))) {
413                        dspreq = true;
414                }
415                p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
416                if ((p_pdqinib->pdqatr & TA_MBALLOC) != 0U) {
417                        kernel_free(p_pdqinib->p_pdqmb);
418                }
419                p_pdqinib->pdqatr = TA_NOEXS;
420                queue_insert_prev(&free_pdqcb, &(p_pdqcb->swait_queue));
421                if (dspreq) {
422                        dispatch();
423                }
424                ercd = E_OK;
425        }
426        else {
427                ercd = E_OBJ;
428        }
429        t_unlock_cpu();
430
431  error_exit:
432        LOG_DEL_PDQ_LEAVE(ercd);
433        return(ercd);
434}
435
436#endif /* TOPPERS_del_pdq */
437
438/*
439 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€Ø€ÎÁ÷¿®
440 */
441#ifdef TOPPERS_snd_pdq
442
443ER
444snd_pdq(ID pdqid, intptr_t data, PRI datapri)
445{
446        PDQCB   *p_pdqcb;
447        WINFO_PDQ winfo_pdq;
448        bool_t  dspreq;
449        ER              ercd;
450
451        LOG_SND_PDQ_ENTER(pdqid, data, datapri);
452        CHECK_DISPATCH();
453        CHECK_PDQID(pdqid);
454        p_pdqcb = get_pdqcb(pdqid);
455        CHECK_PAR(TMIN_DPRI <= datapri);
456
457        t_lock_cpu();
458        if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
459                ercd = E_NOEXS;
460        }
461        else if (!(datapri <= p_pdqcb->p_pdqinib->maxdpri)) {
462                ercd = E_PAR;
463        }
464        else if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
465                if (dspreq) {
466                        dispatch();
467                }
468                ercd = E_OK;
469        }
470        else {
471                winfo_pdq.data = data;
472                winfo_pdq.datapri = datapri;
473                p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
474                wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq);
475                dispatch();
476                ercd = winfo_pdq.winfo.wercd;
477        }
478        t_unlock_cpu();
479
480  error_exit:
481        LOG_SND_PDQ_LEAVE(ercd);
482        return(ercd);
483}
484
485#endif /* TOPPERS_snd_pdq */
486
487/*
488 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€Ø€ÎÁ÷¿®¡Ê¥Ý¡Œ¥ê¥ó¥°¡Ë
489 */
490#ifdef TOPPERS_psnd_pdq
491
492ER
493psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
494{
495        PDQCB   *p_pdqcb;
496        bool_t  dspreq;
497        ER              ercd;
498
499        LOG_PSND_PDQ_ENTER(pdqid, data, datapri);
500        CHECK_TSKCTX_UNL();
501        CHECK_PDQID(pdqid);
502        p_pdqcb = get_pdqcb(pdqid);
503        CHECK_PAR(TMIN_DPRI <= datapri);
504
505        t_lock_cpu();
506        if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
507                ercd = E_NOEXS;
508        }
509        else if (!(datapri <= p_pdqcb->p_pdqinib->maxdpri)) {
510                ercd = E_PAR;
511        }
512        else if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
513                if (dspreq) {
514                        dispatch();
515                }
516                ercd = E_OK;
517        }
518        else {
519                ercd = E_TMOUT;
520        }
521        t_unlock_cpu();
522
523  error_exit:
524        LOG_PSND_PDQ_LEAVE(ercd);
525        return(ercd);
526}
527
528#endif /* TOPPERS_psnd_pdq */
529
530/*
531 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€Ø€ÎÁ÷¿®¡Ê¥Ý¡Œ¥ê¥ó¥°¡€È󥿥¹¥¯¥³¥ó¥Æ¥­¥¹¥ÈÍÑ¡Ë
532 */
533#ifdef TOPPERS_ipsnd_pdq
534
535ER
536ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri)
537{
538        PDQCB   *p_pdqcb;
539        bool_t  dspreq;
540        ER              ercd;
541
542        LOG_IPSND_PDQ_ENTER(pdqid, data, datapri);
543        CHECK_INTCTX_UNL();
544        CHECK_PDQID(pdqid);
545        p_pdqcb = get_pdqcb(pdqid);
546        CHECK_PAR(TMIN_DPRI <= datapri);
547
548        i_lock_cpu();
549        if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
550                ercd = E_NOEXS;
551        }
552        else if (!(datapri <= p_pdqcb->p_pdqinib->maxdpri)) {
553                ercd = E_PAR;
554        }
555        else if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
556                if (dspreq) {
557                        reqflg = true;
558                }
559                ercd = E_OK;
560        }
561        else {
562                ercd = E_TMOUT;
563        }
564        i_unlock_cpu();
565
566  error_exit:
567        LOG_IPSND_PDQ_LEAVE(ercd);
568        return(ercd);
569}
570
571#endif /* TOPPERS_ipsnd_pdq */
572
573/*
574 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€Ø€ÎÁ÷¿®¡Ê¥¿¥€¥à¥¢¥Š¥È€¢€ê¡Ë
575 */
576#ifdef TOPPERS_tsnd_pdq
577
578ER
579tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
580{
581        PDQCB   *p_pdqcb;
582        WINFO_PDQ winfo_pdq;
583        TMEVTB  tmevtb;
584        bool_t  dspreq;
585        ER              ercd;
586
587        LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
588        CHECK_DISPATCH();
589        CHECK_PDQID(pdqid);
590        CHECK_TMOUT(tmout);
591        p_pdqcb = get_pdqcb(pdqid);
592        CHECK_PAR(TMIN_DPRI <= datapri);
593
594        t_lock_cpu();
595        if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
596                ercd = E_NOEXS;
597        }
598        else if (!(datapri <= p_pdqcb->p_pdqinib->maxdpri)) {
599                ercd = E_PAR;
600        }
601        else if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
602                if (dspreq) {
603                        dispatch();
604                }
605                ercd = E_OK;
606        }
607        else if (tmout == TMO_POL) {
608                ercd = E_TMOUT;
609        }
610        else {
611                winfo_pdq.data = data;
612                winfo_pdq.datapri = datapri;
613                p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
614                wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq,
615                                                                                                                &tmevtb, tmout);
616                dispatch();
617                ercd = winfo_pdq.winfo.wercd;
618        }
619        t_unlock_cpu();
620
621  error_exit:
622        LOG_TSND_PDQ_LEAVE(ercd);
623        return(ercd);
624}
625
626#endif /* TOPPERS_tsnd_pdq */
627
628/*
629 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€«€é€ÎŒõ¿®
630 */
631#ifdef TOPPERS_rcv_pdq
632
633ER
634rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
635{
636        PDQCB   *p_pdqcb;
637        WINFO_PDQ winfo_pdq;
638        bool_t  dspreq;
639        ER              ercd;
640
641        LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
642        CHECK_DISPATCH();
643        CHECK_PDQID(pdqid);
644        p_pdqcb = get_pdqcb(pdqid);
645
646        t_lock_cpu();
647        if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
648                ercd = E_NOEXS;
649        }
650        else if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
651                if (dspreq) {
652                        dispatch();
653                }
654                ercd = E_OK;
655        }
656        else {
657                p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
658                make_wait(&(winfo_pdq.winfo));
659                queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
660                winfo_pdq.p_pdqcb = p_pdqcb;
661                LOG_TSKSTAT(p_runtsk);
662                dispatch();
663                ercd = winfo_pdq.winfo.wercd;
664                if (ercd == E_OK) {
665                        *p_data = winfo_pdq.data;
666                        *p_datapri = winfo_pdq.datapri;
667                }
668        }
669        t_unlock_cpu();
670
671  error_exit:
672        LOG_RCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
673        return(ercd);
674}
675
676#endif /* TOPPERS_rcv_pdq */
677
678/*
679 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€«€é€ÎŒõ¿®¡Ê¥Ý¡Œ¥ê¥ó¥°¡Ë
680 */
681#ifdef TOPPERS_prcv_pdq
682
683ER
684prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
685{
686        PDQCB   *p_pdqcb;
687        bool_t  dspreq;
688        ER              ercd;
689
690        LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri);
691        CHECK_TSKCTX_UNL();
692        CHECK_PDQID(pdqid);
693        p_pdqcb = get_pdqcb(pdqid);
694
695        t_lock_cpu();
696        if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
697                ercd = E_NOEXS;
698        }
699        else if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
700                if (dspreq) {
701                        dispatch();
702                }
703                ercd = E_OK;
704        }
705        else {
706                ercd = E_TMOUT;
707        }
708        t_unlock_cpu();
709
710  error_exit:
711        LOG_PRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
712        return(ercd);
713}
714
715#endif /* TOPPERS_prcv_pdq */
716
717/*
718 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€«€é€ÎŒõ¿®¡Ê¥¿¥€¥à¥¢¥Š¥È€¢€ê¡Ë
719 */
720#ifdef TOPPERS_trcv_pdq
721
722ER
723trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
724{
725        PDQCB   *p_pdqcb;
726        WINFO_PDQ winfo_pdq;
727        TMEVTB  tmevtb;
728        bool_t  dspreq;
729        ER              ercd;
730
731        LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
732        CHECK_DISPATCH();
733        CHECK_PDQID(pdqid);
734        CHECK_TMOUT(tmout);
735        p_pdqcb = get_pdqcb(pdqid);
736
737        t_lock_cpu();
738        if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
739                ercd = E_NOEXS;
740        }
741        else if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
742                if (dspreq) {
743                        dispatch();
744                }
745                ercd = E_OK;
746        }
747        else if (tmout == TMO_POL) {
748                ercd = E_TMOUT;
749        }
750        else {
751                p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
752                make_wait_tmout(&(winfo_pdq.winfo), &tmevtb, tmout);
753                queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
754                winfo_pdq.p_pdqcb = p_pdqcb;
755                LOG_TSKSTAT(p_runtsk);
756                dispatch();
757                ercd = winfo_pdq.winfo.wercd;
758                if (ercd == E_OK) {
759                        *p_data = winfo_pdq.data;
760                        *p_datapri = winfo_pdq.datapri;
761                }
762        }
763        t_unlock_cpu();
764
765  error_exit:
766        LOG_TRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
767        return(ercd);
768}
769
770#endif /* TOPPERS_trcv_pdq */
771
772/*
773 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€ÎºÆœéŽü²œ
774 */
775#ifdef TOPPERS_ini_pdq
776
777ER
778ini_pdq(ID pdqid)
779{
780        PDQCB   *p_pdqcb;
781        bool_t  dspreq;
782        ER              ercd;
783   
784        LOG_INI_PDQ_ENTER(pdqid);
785        CHECK_TSKCTX_UNL();
786        CHECK_PDQID(pdqid);
787        p_pdqcb = get_pdqcb(pdqid);
788
789        t_lock_cpu();
790        if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
791                ercd = E_NOEXS;
792        }
793        else {
794                dspreq = init_wait_queue(&(p_pdqcb->swait_queue));
795                if (init_wait_queue(&(p_pdqcb->rwait_queue))) {
796                        dspreq = true;
797                }
798                p_pdqcb->count = 0U;
799                p_pdqcb->p_head = NULL;
800                p_pdqcb->unused = 0U;
801                p_pdqcb->p_freelist = NULL;
802                if (dspreq) {
803                        dispatch();
804                }
805                ercd = E_OK;
806        }
807        t_unlock_cpu();
808
809  error_exit:
810        LOG_INI_PDQ_LEAVE(ercd);
811        return(ercd);
812}
813
814#endif /* TOPPERS_ini_pdq */
815
816/*
817 *  Í¥ÀèÅ٥ǡŒ¥¿¥­¥å¡Œ€ÎŸõÂÖ»²ŸÈ
818 */
819#ifdef TOPPERS_ref_pdq
820
821ER
822ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
823{
824        PDQCB   *p_pdqcb;
825        ER              ercd;
826   
827        LOG_REF_PDQ_ENTER(pdqid, pk_rpdq);
828        CHECK_TSKCTX_UNL();
829        CHECK_PDQID(pdqid);
830        p_pdqcb = get_pdqcb(pdqid);
831
832        t_lock_cpu();
833        if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
834                ercd = E_NOEXS;
835        }
836        else {
837                pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue));
838                pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue));
839                pk_rpdq->spdqcnt = p_pdqcb->count;
840                ercd = E_OK;
841        }
842        t_unlock_cpu();
843
844  error_exit:
845        LOG_REF_PDQ_LEAVE(ercd, pk_rpdq);
846        return(ercd);
847}
848
849#endif /* TOPPERS_ref_pdq */
詳しい使い方は TracBrowser を参照してください。