source: mypx/extension/dcre/kernel/dataqueue.c

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

TOPPERS/ASP 1.9.1

ファイルサイズ: 18.4 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 "dataqueue.h"
52
53/*
54 *  ¥È¥ì¡Œ¥¹¥í¥°¥Þ¥¯¥í€Î¥Ç¥Õ¥©¥ë¥ÈÄêµÁ
55 */
56#ifndef LOG_ACRE_DTQ_ENTER
57#define LOG_ACRE_DTQ_ENTER(pk_cdtq)
58#endif /* LOG_ACRE_DTQ_ENTER */
59
60#ifndef LOG_ACRE_DTQ_LEAVE
61#define LOG_ACRE_DTQ_LEAVE(ercd)
62#endif /* LOG_ACRE_DTQ_LEAVE */
63
64#ifndef LOG_DEL_DTQ_ENTER
65#define LOG_DEL_DTQ_ENTER(dtqid)
66#endif /* LOG_DEL_DTQ_ENTER */
67
68#ifndef LOG_DEL_DTQ_LEAVE
69#define LOG_DEL_DTQ_LEAVE(ercd)
70#endif /* LOG_DEL_DTQ_LEAVE */
71
72#ifndef LOG_SND_DTQ_ENTER
73#define LOG_SND_DTQ_ENTER(dtqid, data)
74#endif /* LOG_SND_DTQ_ENTER */
75
76#ifndef LOG_SND_DTQ_LEAVE
77#define LOG_SND_DTQ_LEAVE(ercd)
78#endif /* LOG_SND_DTQ_LEAVE */
79
80#ifndef LOG_PSND_DTQ_ENTER
81#define LOG_PSND_DTQ_ENTER(dtqid, data)
82#endif /* LOG_PSND_DTQ_ENTER */
83
84#ifndef LOG_PSND_DTQ_LEAVE
85#define LOG_PSND_DTQ_LEAVE(ercd)
86#endif /* LOG_PSND_DTQ_LEAVE */
87
88#ifndef LOG_IPSND_DTQ_ENTER
89#define LOG_IPSND_DTQ_ENTER(dtqid, data)
90#endif /* LOG_IPSND_DTQ_ENTER */
91
92#ifndef LOG_IPSND_DTQ_LEAVE
93#define LOG_IPSND_DTQ_LEAVE(ercd)
94#endif /* LOG_IPSND_DTQ_LEAVE */
95
96#ifndef LOG_TSND_DTQ_ENTER
97#define LOG_TSND_DTQ_ENTER(dtqid, data, tmout)
98#endif /* LOG_TSND_DTQ_ENTER */
99
100#ifndef LOG_TSND_DTQ_LEAVE
101#define LOG_TSND_DTQ_LEAVE(ercd)
102#endif /* LOG_TSND_DTQ_LEAVE */
103
104#ifndef LOG_FSND_DTQ_ENTER
105#define LOG_FSND_DTQ_ENTER(dtqid, data)
106#endif /* LOG_FSND_DTQ_ENTER */
107
108#ifndef LOG_FSND_DTQ_LEAVE
109#define LOG_FSND_DTQ_LEAVE(ercd)
110#endif /* LOG_FSND_DTQ_LEAVE */
111
112#ifndef LOG_IFSND_DTQ_ENTER
113#define LOG_IFSND_DTQ_ENTER(dtqid, data)
114#endif /* LOG_IFSND_DTQ_ENTER */
115
116#ifndef LOG_IFSND_DTQ_LEAVE
117#define LOG_IFSND_DTQ_LEAVE(ercd)
118#endif /* LOG_IFSND_DTQ_LEAVE */
119
120#ifndef LOG_RCV_DTQ_ENTER
121#define LOG_RCV_DTQ_ENTER(dtqid, p_data)
122#endif /* LOG_RCV_DTQ_ENTER */
123
124#ifndef LOG_RCV_DTQ_LEAVE
125#define LOG_RCV_DTQ_LEAVE(ercd, data)
126#endif /* LOG_RCV_DTQ_LEAVE */
127
128#ifndef LOG_PRCV_DTQ_ENTER
129#define LOG_PRCV_DTQ_ENTER(dtqid, p_data)
130#endif /* LOG_PRCV_DTQ_ENTER */
131
132#ifndef LOG_PRCV_DTQ_LEAVE
133#define LOG_PRCV_DTQ_LEAVE(ercd, data)
134#endif /* LOG_PRCV_DTQ_LEAVE */
135
136#ifndef LOG_TRCV_DTQ_ENTER
137#define LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout)
138#endif /* LOG_TRCV_DTQ_ENTER */
139
140#ifndef LOG_TRCV_DTQ_LEAVE
141#define LOG_TRCV_DTQ_LEAVE(ercd, data)
142#endif /* LOG_TRCV_DTQ_LEAVE */
143
144#ifndef LOG_INI_DTQ_ENTER
145#define LOG_INI_DTQ_ENTER(dtqid)
146#endif /* LOG_INI_DTQ_ENTER */
147
148#ifndef LOG_INI_DTQ_LEAVE
149#define LOG_INI_DTQ_LEAVE(ercd)
150#endif /* LOG_INI_DTQ_LEAVE */
151
152#ifndef LOG_REF_DTQ_ENTER
153#define LOG_REF_DTQ_ENTER(dtqid, pk_rdtq)
154#endif /* LOG_REF_DTQ_ENTER */
155
156#ifndef LOG_REF_DTQ_LEAVE
157#define LOG_REF_DTQ_LEAVE(ercd, pk_rdtq)
158#endif /* LOG_REF_DTQ_LEAVE */
159
160/*
161 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€Î¿ô
162 */
163#define tnum_dtq        ((uint_t)(tmax_dtqid - TMIN_DTQID + 1))
164#define tnum_sdtq       ((uint_t)(tmax_sdtqid - TMIN_DTQID + 1))
165
166/*
167 *  ¥Ç¡Œ¥¿¥­¥å¡ŒID€«€é¥Ç¡Œ¥¿¥­¥å¡ŒŽÉÍý¥Ö¥í¥Ã¥¯€òŒè€êœÐ€¹€¿€á€Î¥Þ¥¯¥í
168 */
169#define INDEX_DTQ(dtqid)        ((uint_t)((dtqid) - TMIN_DTQID))
170#define get_dtqcb(dtqid)        (&(dtqcb_table[INDEX_DTQ(dtqid)]))
171
172#ifdef TOPPERS_dtqini
173
174/*
175 *  »ÈÍÑ€·€Æ€€€Ê€€¥Ç¡Œ¥¿¥­¥å¡ŒŽÉÍý¥Ö¥í¥Ã¥¯€Î¥ê¥¹¥È
176 */
177QUEUE   free_dtqcb;
178
179/*
180 *  ¥Ç¡Œ¥¿¥­¥å¡Œµ¡Çœ€ÎœéŽü²œ
181 */
182void
183initialize_dataqueue(void)
184{
185        uint_t  i, j;
186        DTQCB   *p_dtqcb;
187        DTQINIB *p_dtqinib;
188
189        for (i = 0; i < tnum_sdtq; i++) {
190                p_dtqcb = &(dtqcb_table[i]);
191                queue_initialize(&(p_dtqcb->swait_queue));
192                p_dtqcb->p_dtqinib = &(dtqinib_table[i]);
193                queue_initialize(&(p_dtqcb->rwait_queue));
194                p_dtqcb->count = 0U;
195                p_dtqcb->head = 0U;
196                p_dtqcb->tail = 0U;
197        }
198        queue_initialize(&free_dtqcb);
199        for (j = 0; i < tnum_dtq; i++, j++) {
200                p_dtqcb = &(dtqcb_table[i]);
201                p_dtqinib = &(adtqinib_table[j]);
202                p_dtqinib->dtqatr = TA_NOEXS;
203                p_dtqcb->p_dtqinib = ((const DTQINIB *) p_dtqinib);
204                queue_insert_prev(&free_dtqcb, &(p_dtqcb->swait_queue));
205        }
206}
207
208#endif /* TOPPERS_dtqini */
209
210/*
211 *  ¥Ç¡Œ¥¿¥­¥å¡ŒŽÉÍýÎ롏ۯ€Î¥Ç¡Œ¥¿€Î³ÊÇŒ
212 */
213#ifdef TOPPERS_dtqenq
214
215void
216enqueue_data(DTQCB *p_dtqcb, intptr_t data)
217{
218        (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
219        p_dtqcb->count++;
220        p_dtqcb->tail++;
221        if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
222                p_dtqcb->tail = 0U;
223        }
224}
225
226#endif /* TOPPERS_dtqenq */
227
228/*
229 *  ¥Ç¡Œ¥¿¥­¥å¡ŒŽÉÍýÎ롏ۯ€Î¥Ç¡Œ¥¿€Î¶¯À©³ÊÇŒ
230 */
231#ifdef TOPPERS_dtqfenq
232
233void
234force_enqueue_data(DTQCB *p_dtqcb, intptr_t data)
235{
236        (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
237        p_dtqcb->tail++;
238        if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
239                p_dtqcb->tail = 0U;
240        }
241        if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
242                p_dtqcb->count++;
243        }
244        else {
245                p_dtqcb->head = p_dtqcb->tail;
246        }
247}
248
249#endif /* TOPPERS_dtqfenq */
250
251/*
252 *  ¥Ç¡Œ¥¿¥­¥å¡ŒŽÉÍýÎΰ耫€é€Î¥Ç¡Œ¥¿€ÎŒèœÐ€·
253 */
254#ifdef TOPPERS_dtqdeq
255
256void
257dequeue_data(DTQCB *p_dtqcb, intptr_t *p_data)
258{
259        *p_data = (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->head)->data;
260        p_dtqcb->count--;
261        p_dtqcb->head++;
262        if (p_dtqcb->head >= p_dtqcb->p_dtqinib->dtqcnt) {
263                p_dtqcb->head = 0U;
264        }
265}
266
267#endif /* TOPPERS_dtqdeq */
268
269/*
270 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€Ø€Î¥Ç¡Œ¥¿Á÷¿®
271 */
272#ifdef TOPPERS_dtqsnd
273
274bool_t
275send_data(DTQCB *p_dtqcb, intptr_t data, bool_t *p_dspreq)
276{
277        TCB             *p_tcb;
278
279        if (!queue_empty(&(p_dtqcb->rwait_queue))) {
280                p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
281                ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
282                *p_dspreq = wait_complete(p_tcb);
283                return(true);
284        }
285        else if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
286                enqueue_data(p_dtqcb, data);
287                *p_dspreq = false;
288                return(true);
289        }
290        else {
291                return(false);
292        }
293}
294
295#endif /* TOPPERS_dtqsnd */
296
297/*
298 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€Ø€Î¥Ç¡Œ¥¿¶¯À©Á÷¿®
299 */
300#ifdef TOPPERS_dtqfsnd
301
302bool_t
303force_send_data(DTQCB *p_dtqcb, intptr_t data)
304{
305        TCB             *p_tcb;
306
307        if (!queue_empty(&(p_dtqcb->rwait_queue))) {
308                p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
309                ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
310                return(wait_complete(p_tcb));
311        }
312        else {
313                force_enqueue_data(p_dtqcb, data);
314                return(false);
315        }
316}
317
318#endif /* TOPPERS_dtqfsnd */
319
320/*
321 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€«€é€Î¥Ç¡Œ¥¿Œõ¿®
322 */
323#ifdef TOPPERS_dtqrcv
324
325bool_t
326receive_data(DTQCB *p_dtqcb, intptr_t *p_data, bool_t *p_dspreq)
327{
328        TCB             *p_tcb;
329        intptr_t data;
330
331        if (p_dtqcb->count > 0U) {
332                dequeue_data(p_dtqcb, p_data);
333                if (!queue_empty(&(p_dtqcb->swait_queue))) {
334                        p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
335                        data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
336                        enqueue_data(p_dtqcb, data);
337                        *p_dspreq = wait_complete(p_tcb);
338                }
339                else {
340                        *p_dspreq = false;
341                }
342                return(true);
343        }
344        else if (!queue_empty(&(p_dtqcb->swait_queue))) {
345                p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
346                *p_data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
347                *p_dspreq = wait_complete(p_tcb);
348                return(true);
349        }
350        else {
351                return(false);
352        }
353}
354
355#endif /* TOPPERS_dtqrcv */
356
357/*
358 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€ÎÀžÀ®
359 */
360#ifdef TOPPERS_acre_dtq
361
362ER_UINT
363acre_dtq(const T_CDTQ *pk_cdtq)
364{
365        DTQCB   *p_dtqcb;
366        DTQINIB *p_dtqinib;
367        ATR             dtqatr;
368        DTQMB   *p_dtqmb;
369        ER              ercd;
370
371        LOG_ACRE_DTQ_ENTER(pk_cdtq);
372        CHECK_TSKCTX_UNL();
373        CHECK_RSATR(pk_cdtq->dtqatr, TA_TPRI);
374        if (pk_cdtq->dtqmb != NULL) {
375                CHECK_ALIGN_MB(pk_cdtq->dtqmb);
376        }
377        dtqatr = pk_cdtq->dtqatr;
378        p_dtqmb = pk_cdtq->dtqmb;
379
380        t_lock_cpu();
381        if (tnum_dtq == 0 || queue_empty(&free_dtqcb)) {
382                ercd = E_NOID;
383        }
384        else {
385                if (pk_cdtq->dtqcnt != 0 && p_dtqmb == NULL) {
386                        p_dtqmb = kernel_malloc(sizeof(DTQMB) * pk_cdtq->dtqcnt);
387                        dtqatr |= TA_MBALLOC;
388                }
389                if (pk_cdtq->dtqcnt != 0 && p_dtqmb == NULL) {
390                        ercd = E_NOMEM;
391                }
392                else {
393                        p_dtqcb = ((DTQCB *) queue_delete_next(&free_dtqcb));
394                        p_dtqinib = (DTQINIB *)(p_dtqcb->p_dtqinib);
395                        p_dtqinib->dtqatr = dtqatr;
396                        p_dtqinib->dtqcnt = pk_cdtq->dtqcnt;
397                        p_dtqinib->p_dtqmb = p_dtqmb;
398
399                        queue_initialize(&(p_dtqcb->swait_queue));
400                        queue_initialize(&(p_dtqcb->rwait_queue));
401                        p_dtqcb->count = 0U;
402                        p_dtqcb->head = 0U;
403                        p_dtqcb->tail = 0U;
404                        ercd = DTQID(p_dtqcb);
405                }
406        }
407        t_unlock_cpu();
408
409  error_exit:
410        LOG_ACRE_DTQ_LEAVE(ercd);
411        return(ercd);
412}
413
414#endif /* TOPPERS_acre_dtq */
415
416/*
417 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€Îºïœü
418 */
419#ifdef TOPPERS_del_dtq
420
421ER
422del_dtq(ID dtqid)
423{
424        DTQCB   *p_dtqcb;
425        DTQINIB *p_dtqinib;
426        bool_t  dspreq;
427        ER              ercd;
428
429        LOG_DEL_DTQ_ENTER(dtqid);
430        CHECK_TSKCTX_UNL();
431        CHECK_DTQID(dtqid);
432        p_dtqcb = get_dtqcb(dtqid);
433
434        t_lock_cpu();
435        if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
436                ercd = E_NOEXS;
437        }
438        else if (DTQID(p_dtqcb) > tmax_sdtqid) {
439                dspreq = init_wait_queue(&(p_dtqcb->swait_queue));
440                if (init_wait_queue(&(p_dtqcb->rwait_queue))) {
441                        dspreq = true;
442                }
443                p_dtqinib = (DTQINIB *)(p_dtqcb->p_dtqinib);
444                if ((p_dtqinib->dtqatr & TA_MBALLOC) != 0U) {
445                        kernel_free(p_dtqinib->p_dtqmb);
446                }
447                p_dtqinib->dtqatr = TA_NOEXS;
448                queue_insert_prev(&free_dtqcb, &(p_dtqcb->swait_queue));
449                if (dspreq) {
450                        dispatch();
451                }
452                ercd = E_OK;
453        }
454        else {
455                ercd = E_OBJ;
456        }
457        t_unlock_cpu();
458
459  error_exit:
460        LOG_DEL_DTQ_LEAVE(ercd);
461        return(ercd);
462}
463
464#endif /* TOPPERS_del_dtq */
465
466/*
467 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€Ø€ÎÁ÷¿®
468 */
469#ifdef TOPPERS_snd_dtq
470
471ER
472snd_dtq(ID dtqid, intptr_t data)
473{
474        DTQCB   *p_dtqcb;
475        WINFO_DTQ winfo_dtq;
476        bool_t  dspreq;
477        ER              ercd;
478
479        LOG_SND_DTQ_ENTER(dtqid, data);
480        CHECK_DISPATCH();
481        CHECK_DTQID(dtqid);
482        p_dtqcb = get_dtqcb(dtqid);
483
484        t_lock_cpu();
485        if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
486                ercd = E_NOEXS;
487        }
488        else if (send_data(p_dtqcb, data, &dspreq)) {
489                if (dspreq) {
490                        dispatch();
491                }
492                ercd = E_OK;
493        }
494        else {
495                winfo_dtq.data = data;
496                p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
497                wobj_make_wait((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq);
498                dispatch();
499                ercd = winfo_dtq.winfo.wercd;
500        }
501        t_unlock_cpu();
502
503  error_exit:
504        LOG_SND_DTQ_LEAVE(ercd);
505        return(ercd);
506}
507
508#endif /* TOPPERS_snd_dtq */
509
510/*
511 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€Ø€ÎÁ÷¿®¡Ê¥Ý¡Œ¥ê¥ó¥°¡Ë
512 */
513#ifdef TOPPERS_psnd_dtq
514
515ER
516psnd_dtq(ID dtqid, intptr_t data)
517{
518        DTQCB   *p_dtqcb;
519        bool_t  dspreq;
520        ER              ercd;
521
522        LOG_PSND_DTQ_ENTER(dtqid, data);
523        CHECK_TSKCTX_UNL();
524        CHECK_DTQID(dtqid);
525        p_dtqcb = get_dtqcb(dtqid);
526
527        t_lock_cpu();
528        if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
529                ercd = E_NOEXS;
530        }
531        else if (send_data(p_dtqcb, data, &dspreq)) {
532                if (dspreq) {
533                        dispatch();
534                }
535                ercd = E_OK;
536        }
537        else {
538                ercd = E_TMOUT;
539        }
540        t_unlock_cpu();
541
542  error_exit:
543        LOG_PSND_DTQ_LEAVE(ercd);
544        return(ercd);
545}
546
547#endif /* TOPPERS_psnd_dtq */
548
549/*
550 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€Ø€ÎÁ÷¿®¡Ê¥Ý¡Œ¥ê¥ó¥°¡€È󥿥¹¥¯¥³¥ó¥Æ¥­¥¹¥ÈÍÑ¡Ë
551 */
552#ifdef TOPPERS_ipsnd_dtq
553
554ER
555ipsnd_dtq(ID dtqid, intptr_t data)
556{
557        DTQCB   *p_dtqcb;
558        bool_t  dspreq;
559        ER              ercd;
560
561        LOG_IPSND_DTQ_ENTER(dtqid, data);
562        CHECK_INTCTX_UNL();
563        CHECK_DTQID(dtqid);
564        p_dtqcb = get_dtqcb(dtqid);
565
566        i_lock_cpu();
567        if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
568                ercd = E_NOEXS;
569        }
570        else if (send_data(p_dtqcb, data, &dspreq)) {
571                if (dspreq) {
572                        reqflg = true;
573                }
574                ercd = E_OK;
575        }
576        else {
577                ercd = E_TMOUT;
578        }
579        i_unlock_cpu();
580
581  error_exit:
582        LOG_IPSND_DTQ_LEAVE(ercd);
583        return(ercd);
584}
585
586#endif /* TOPPERS_ipsnd_dtq */
587
588/*
589 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€Ø€ÎÁ÷¿®¡Ê¥¿¥€¥à¥¢¥Š¥È€¢€ê¡Ë
590 */
591#ifdef TOPPERS_tsnd_dtq
592
593ER
594tsnd_dtq(ID dtqid, intptr_t data, TMO tmout)
595{
596        DTQCB   *p_dtqcb;
597        WINFO_DTQ winfo_dtq;
598        TMEVTB  tmevtb;
599        bool_t  dspreq;
600        ER              ercd;
601
602        LOG_TSND_DTQ_ENTER(dtqid, data, tmout);
603        CHECK_DISPATCH();
604        CHECK_DTQID(dtqid);
605        CHECK_TMOUT(tmout);
606        p_dtqcb = get_dtqcb(dtqid);
607
608        t_lock_cpu();
609        if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
610                ercd = E_NOEXS;
611        }
612        else if (send_data(p_dtqcb, data, &dspreq)) {
613                if (dspreq) {
614                        dispatch();
615                }
616                ercd = E_OK;
617        }
618        else if (tmout == TMO_POL) {
619                ercd = E_TMOUT;
620        }
621        else {
622                winfo_dtq.data = data;
623                p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
624                wobj_make_wait_tmout((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq,
625                                                                                                                &tmevtb, tmout);
626                dispatch();
627                ercd = winfo_dtq.winfo.wercd;
628        }
629        t_unlock_cpu();
630
631  error_exit:
632        LOG_TSND_DTQ_LEAVE(ercd);
633        return(ercd);
634}
635
636#endif /* TOPPERS_tsnd_dtq */
637
638/*
639 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€Ø€Î¶¯À©Á÷¿®
640 */
641#ifdef TOPPERS_fsnd_dtq
642
643ER
644fsnd_dtq(ID dtqid, intptr_t data)
645{
646        DTQCB   *p_dtqcb;       
647        ER              ercd;
648
649        LOG_FSND_DTQ_ENTER(dtqid, data);
650        CHECK_TSKCTX_UNL();
651        CHECK_DTQID(dtqid);
652        p_dtqcb = get_dtqcb(dtqid);
653
654        t_lock_cpu();
655        if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
656                ercd = E_NOEXS;
657        }
658        else if (!(p_dtqcb->p_dtqinib->dtqcnt > 0U)) {
659                ercd = E_ILUSE;
660        }
661        else if (force_send_data(p_dtqcb, data)) {
662                dispatch();
663        }
664        ercd = E_OK;
665        t_unlock_cpu();
666
667  error_exit:
668        LOG_FSND_DTQ_LEAVE(ercd);
669        return(ercd);
670}
671
672#endif /* TOPPERS_fsnd_dtq */
673
674/*
675 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€Ø€Î¶¯À©Á÷¿®¡ÊÈ󥿥¹¥¯¥³¥ó¥Æ¥­¥¹¥ÈÍÑ¡Ë
676 */
677#ifdef TOPPERS_ifsnd_dtq
678
679ER
680ifsnd_dtq(ID dtqid, intptr_t data)
681{
682        DTQCB   *p_dtqcb;
683        ER              ercd;
684
685        LOG_IFSND_DTQ_ENTER(dtqid, data);
686        CHECK_INTCTX_UNL();
687        CHECK_DTQID(dtqid);
688        p_dtqcb = get_dtqcb(dtqid);
689
690        i_lock_cpu();
691        if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
692                ercd = E_NOEXS;
693        }
694        else if (!(p_dtqcb->p_dtqinib->dtqcnt > 0U)) {
695                ercd = E_ILUSE;
696        }
697        else if (force_send_data(p_dtqcb, data)) {
698                reqflg = true;
699        }
700        ercd = E_OK;
701        i_unlock_cpu();
702
703  error_exit:
704        LOG_IFSND_DTQ_LEAVE(ercd);
705        return(ercd);
706}
707
708#endif /* TOPPERS_ifsnd_dtq */
709
710/*
711 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€«€é€ÎŒõ¿®
712 */
713#ifdef TOPPERS_rcv_dtq
714
715ER
716rcv_dtq(ID dtqid, intptr_t *p_data)
717{
718        DTQCB   *p_dtqcb;
719        WINFO_DTQ winfo_dtq;
720        bool_t  dspreq;
721        ER              ercd;
722
723        LOG_RCV_DTQ_ENTER(dtqid, p_data);
724        CHECK_DISPATCH();
725        CHECK_DTQID(dtqid);
726        p_dtqcb = get_dtqcb(dtqid);
727
728        t_lock_cpu();
729        if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
730                ercd = E_NOEXS;
731        }
732        else if (receive_data(p_dtqcb, p_data, &dspreq)) {
733                if (dspreq) {
734                        dispatch();
735                }
736                ercd = E_OK;
737        }
738        else {
739                p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
740                make_wait(&(winfo_dtq.winfo));
741                queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
742                winfo_dtq.p_dtqcb = p_dtqcb;
743                LOG_TSKSTAT(p_runtsk);
744                dispatch();
745                ercd = winfo_dtq.winfo.wercd;
746                if (ercd == E_OK) {
747                        *p_data = winfo_dtq.data;
748                }
749        }
750        t_unlock_cpu();
751
752  error_exit:
753        LOG_RCV_DTQ_LEAVE(ercd, *p_data);
754        return(ercd);
755}
756
757#endif /* TOPPERS_rcv_dtq */
758
759/*
760 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€«€é€ÎŒõ¿®¡Ê¥Ý¡Œ¥ê¥ó¥°¡Ë
761 */
762#ifdef TOPPERS_prcv_dtq
763
764ER
765prcv_dtq(ID dtqid, intptr_t *p_data)
766{
767        DTQCB   *p_dtqcb;
768        bool_t  dspreq;
769        ER              ercd;
770
771        LOG_PRCV_DTQ_ENTER(dtqid, p_data);
772        CHECK_TSKCTX_UNL();
773        CHECK_DTQID(dtqid);
774        p_dtqcb = get_dtqcb(dtqid);
775
776        t_lock_cpu();
777        if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
778                ercd = E_NOEXS;
779        }
780        else if (receive_data(p_dtqcb, p_data, &dspreq)) {
781                if (dspreq) {
782                        dispatch();
783                }
784                ercd = E_OK;
785        }
786        else {
787                ercd = E_TMOUT;
788        }
789        t_unlock_cpu();
790
791  error_exit:
792        LOG_PRCV_DTQ_LEAVE(ercd, *p_data);
793        return(ercd);
794}
795
796#endif /* TOPPERS_prcv_dtq */
797
798/*
799 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€«€é€ÎŒõ¿®¡Ê¥¿¥€¥à¥¢¥Š¥È€¢€ê¡Ë
800 */
801#ifdef TOPPERS_trcv_dtq
802
803ER
804trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout)
805{
806        DTQCB   *p_dtqcb;
807        WINFO_DTQ winfo_dtq;
808        TMEVTB  tmevtb;
809        bool_t  dspreq;
810        ER              ercd;
811
812        LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout);
813        CHECK_DISPATCH();
814        CHECK_DTQID(dtqid);
815        CHECK_TMOUT(tmout);
816        p_dtqcb = get_dtqcb(dtqid);
817
818        t_lock_cpu();
819        if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
820                ercd = E_NOEXS;
821        }
822        else if (receive_data(p_dtqcb, p_data, &dspreq)) {
823                if (dspreq) {
824                        dispatch();
825                }
826                ercd = E_OK;
827        }
828        else if (tmout == TMO_POL) {
829                ercd = E_TMOUT;
830        }
831        else {
832                p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
833                make_wait_tmout(&(winfo_dtq.winfo), &tmevtb, tmout);
834                queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
835                winfo_dtq.p_dtqcb = p_dtqcb;
836                LOG_TSKSTAT(p_runtsk);
837                dispatch();
838                ercd = winfo_dtq.winfo.wercd;
839                if (ercd == E_OK) {
840                        *p_data = winfo_dtq.data;
841                }
842        }
843        t_unlock_cpu();
844
845  error_exit:
846        LOG_TRCV_DTQ_LEAVE(ercd, *p_data);
847        return(ercd);
848}
849
850#endif /* TOPPERS_trcv_dtq */
851
852/*
853 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€ÎºÆœéŽü²œ
854 */
855#ifdef TOPPERS_ini_dtq
856
857ER
858ini_dtq(ID dtqid)
859{
860        DTQCB   *p_dtqcb;
861        bool_t  dspreq;
862        ER              ercd;
863   
864        LOG_INI_DTQ_ENTER(dtqid);
865        CHECK_TSKCTX_UNL();
866        CHECK_DTQID(dtqid);
867        p_dtqcb = get_dtqcb(dtqid);
868
869        t_lock_cpu();
870        if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
871                ercd = E_NOEXS;
872        }
873        else {
874                dspreq = init_wait_queue(&(p_dtqcb->swait_queue));
875                if (init_wait_queue(&(p_dtqcb->rwait_queue))) {
876                        dspreq = true;
877                }
878                p_dtqcb->count = 0U;
879                p_dtqcb->head = 0U;
880                p_dtqcb->tail = 0U;
881                if (dspreq) {
882                        dispatch();
883                }
884                ercd = E_OK;
885        }
886        t_unlock_cpu();
887
888  error_exit:
889        LOG_INI_DTQ_LEAVE(ercd);
890        return(ercd);
891}
892
893#endif /* TOPPERS_ini_dtq */
894
895/*
896 *  ¥Ç¡Œ¥¿¥­¥å¡Œ€ÎŸõÂÖ»²ŸÈ
897 */
898#ifdef TOPPERS_ref_dtq
899
900ER
901ref_dtq(ID dtqid, T_RDTQ *pk_rdtq)
902{
903        DTQCB   *p_dtqcb;
904        ER              ercd;
905   
906        LOG_REF_DTQ_ENTER(dtqid, pk_rdtq);
907        CHECK_TSKCTX_UNL();
908        CHECK_DTQID(dtqid);
909        p_dtqcb = get_dtqcb(dtqid);
910
911        t_lock_cpu();
912        if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
913                ercd = E_NOEXS;
914        }
915        else {
916                pk_rdtq->stskid = wait_tskid(&(p_dtqcb->swait_queue));
917                pk_rdtq->rtskid = wait_tskid(&(p_dtqcb->rwait_queue));
918                pk_rdtq->sdtqcnt = p_dtqcb->count;
919                ercd = E_OK;
920        }
921        t_unlock_cpu();
922
923  error_exit:
924        LOG_REF_DTQ_LEAVE(ercd, pk_rdtq);
925        return(ercd);
926}
927
928#endif /* TOPPERS_ref_dtq */
詳しい使い方は TracBrowser を参照してください。