source: rubycfg_asp/trunk/asp_dcre/kernel/pridataq.c@ 313

Last change on this file since 313 was 313, checked in by coas-nagasima, 7 years ago

ソースを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 19.0 KB
Line 
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 * 上記著作権者
12は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18 * スコード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20 * 用できる形で再é…
21å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
22å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
23 * 者
24マニュアルなど)に,上記の著作権表示,この利用条件および下記
25 * の無保証規定を掲載すること.
26 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27 * 用できない形で再é…
28å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
29 * と.
30 * (a) 再é…
31å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
32マニュアルなど)に,上記の著
33 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
34 * (b) 再é…
35å¸ƒã®å½¢æ…
36‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
37 * 報告すること.
38 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
39 * 害からも,上記著作権者
40およびTOPPERSプロジェクトをå…
41è²¬ã™ã‚‹ã“と.
42 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
43 * 由に基づく請求からも,上記著作権者
44およびTOPPERSプロジェクトを
45 * å…
46è²¬ã™ã‚‹ã“と.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
51 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
52 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
53 * の責任を負わない.
54 *
55 * $Id: pridataq.c 313 2017-07-23 04:50:32Z coas-nagasima $
56 */
57
58/*
59 * 優å…
60ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ©Ÿèƒ½
61 */
62
63#include "kernel_impl.h"
64#include "check.h"
65#include "task.h"
66#include "wait.h"
67#include "pridataq.h"
68
69/*
70 * トレースログマクロのデフォルト定義
71 */
72#ifndef LOG_ACRE_PDQ_ENTER
73#define LOG_ACRE_PDQ_ENTER(pk_cpdq)
74#endif /* LOG_ACRE_PDQ_ENTER */
75
76#ifndef LOG_ACRE_PDQ_LEAVE
77#define LOG_ACRE_PDQ_LEAVE(ercd)
78#endif /* LOG_ACRE_PDQ_LEAVE */
79
80#ifndef LOG_DEL_PDQ_ENTER
81#define LOG_DEL_PDQ_ENTER(pdqid)
82#endif /* LOG_DEL_PDQ_ENTER */
83
84#ifndef LOG_DEL_PDQ_LEAVE
85#define LOG_DEL_PDQ_LEAVE(ercd)
86#endif /* LOG_DEL_PDQ_LEAVE */
87
88#ifndef LOG_SND_PDQ_ENTER
89#define LOG_SND_PDQ_ENTER(pdqid, data, datapri)
90#endif /* LOG_SND_PDQ_ENTER */
91
92#ifndef LOG_SND_PDQ_LEAVE
93#define LOG_SND_PDQ_LEAVE(ercd)
94#endif /* LOG_SND_PDQ_LEAVE */
95
96#ifndef LOG_PSND_PDQ_ENTER
97#define LOG_PSND_PDQ_ENTER(pdqid, data, datapri)
98#endif /* LOG_PSND_PDQ_ENTER */
99
100#ifndef LOG_PSND_PDQ_LEAVE
101#define LOG_PSND_PDQ_LEAVE(ercd)
102#endif /* LOG_PSND_PDQ_LEAVE */
103
104#ifndef LOG_IPSND_PDQ_ENTER
105#define LOG_IPSND_PDQ_ENTER(pdqid, data, datapri)
106#endif /* LOG_IPSND_PDQ_ENTER */
107
108#ifndef LOG_IPSND_PDQ_LEAVE
109#define LOG_IPSND_PDQ_LEAVE(ercd)
110#endif /* LOG_IPSND_PDQ_LEAVE */
111
112#ifndef LOG_TSND_PDQ_ENTER
113#define LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout)
114#endif /* LOG_TSND_PDQ_ENTER */
115
116#ifndef LOG_TSND_PDQ_LEAVE
117#define LOG_TSND_PDQ_LEAVE(ercd)
118#endif /* LOG_TSND_PDQ_LEAVE */
119
120#ifndef LOG_RCV_PDQ_ENTER
121#define LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri)
122#endif /* LOG_RCV_PDQ_ENTER */
123
124#ifndef LOG_RCV_PDQ_LEAVE
125#define LOG_RCV_PDQ_LEAVE(ercd, data, datapri)
126#endif /* LOG_RCV_PDQ_LEAVE */
127
128#ifndef LOG_PRCV_PDQ_ENTER
129#define LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri)
130#endif /* LOG_PRCV_PDQ_ENTER */
131
132#ifndef LOG_PRCV_PDQ_LEAVE
133#define LOG_PRCV_PDQ_LEAVE(ercd, data, datapri)
134#endif /* LOG_PRCV_PDQ_LEAVE */
135
136#ifndef LOG_TRCV_PDQ_ENTER
137#define LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout)
138#endif /* LOG_TRCV_PDQ_ENTER */
139
140#ifndef LOG_TRCV_PDQ_LEAVE
141#define LOG_TRCV_PDQ_LEAVE(ercd, data, datapri)
142#endif /* LOG_TRCV_PDQ_LEAVE */
143
144#ifndef LOG_INI_PDQ_ENTER
145#define LOG_INI_PDQ_ENTER(pdqid)
146#endif /* LOG_INI_PDQ_ENTER */
147
148#ifndef LOG_INI_PDQ_LEAVE
149#define LOG_INI_PDQ_LEAVE(ercd)
150#endif /* LOG_INI_PDQ_LEAVE */
151
152#ifndef LOG_REF_PDQ_ENTER
153#define LOG_REF_PDQ_ENTER(pdqid, pk_rpdq)
154#endif /* LOG_REF_PDQ_ENTER */
155
156#ifndef LOG_REF_PDQ_LEAVE
157#define LOG_REF_PDQ_LEAVE(ercd, pk_rpdq)
158#endif /* LOG_REF_PDQ_LEAVE */
159
160/*
161 * 優å…
162ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®æ•°
163 */
164#define tnum_pdq ((uint_t)(tmax_pdqid - TMIN_PDQID + 1))
165#define tnum_spdq ((uint_t)(tmax_spdqid - TMIN_PDQID + 1))
166
167/*
168 * 優å…
169ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼IDから優å…
170ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†ãƒ–ロックを取り出すた
171 * めのマクロ
172 */
173#define INDEX_PDQ(pdqid) ((uint_t)((pdqid) - TMIN_PDQID))
174#define get_pdqcb(pdqid) (&(pdqcb_table[INDEX_PDQ(pdqid)]))
175
176#ifdef TOPPERS_pdqini
177
178/*
179 * 使用していない優å…
180ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†ãƒ–ロックのリスト
181 */
182QUEUE free_pdqcb;
183
184/*
185 * 優å…
186ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ©Ÿèƒ½ã®åˆæœŸåŒ–
187 */
188void
189initialize_pridataq(void)
190{
191 uint_t i, j;
192 PDQCB *p_pdqcb;
193 PDQINIB *p_pdqinib;
194
195 for (i = 0; i < tnum_spdq; i++) {
196 p_pdqcb = &(pdqcb_table[i]);
197 queue_initialize(&(p_pdqcb->swait_queue));
198 p_pdqcb->p_pdqinib = &(pdqinib_table[i]);
199 queue_initialize(&(p_pdqcb->rwait_queue));
200 p_pdqcb->count = 0U;
201 p_pdqcb->p_head = NULL;
202 p_pdqcb->unused = 0U;
203 p_pdqcb->p_freelist = NULL;
204 }
205 queue_initialize(&free_pdqcb);
206 for (j = 0; i < tnum_pdq; i++, j++) {
207 p_pdqcb = &(pdqcb_table[i]);
208 p_pdqinib = &(apdqinib_table[j]);
209 p_pdqinib->pdqatr = TA_NOEXS;
210 p_pdqcb->p_pdqinib = ((const PDQINIB *) p_pdqinib);
211 queue_insert_prev(&free_pdqcb, &(p_pdqcb->swait_queue));
212 }
213}
214
215#endif /* TOPPERS_pdqini */
216
217/*
218 * 優å…
219ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†é ˜åŸŸã¸ã®ãƒ‡ãƒ¼ã‚¿ã®æ ¼ç´
220 */
221#ifdef TOPPERS_pdqenq
222
223void
224enqueue_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri)
225{
226 PDQMB *p_pdqmb;
227 PDQMB **pp_prev_next, *p_next;
228
229 if (p_pdqcb->p_freelist != NULL) {
230 p_pdqmb = p_pdqcb->p_freelist;
231 p_pdqcb->p_freelist = p_pdqmb->p_next;
232 }
233 else {
234 p_pdqmb = p_pdqcb->p_pdqinib->p_pdqmb + p_pdqcb->unused;
235 p_pdqcb->unused++;
236 }
237
238 p_pdqmb->data = data;
239 p_pdqmb->datapri = datapri;
240
241 pp_prev_next = &(p_pdqcb->p_head);
242 while ((p_next = *pp_prev_next) != NULL) {
243 if (p_next->datapri > datapri) {
244 break;
245 }
246 pp_prev_next = &(p_next->p_next);
247 }
248 p_pdqmb->p_next = p_next;
249 *pp_prev_next = p_pdqmb;
250 p_pdqcb->count++;
251}
252
253#endif /* TOPPERS_pdqenq */
254
255/*
256 * 優å…
257ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†é ˜åŸŸã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ã®å–出し
258 */
259#ifdef TOPPERS_pdqdeq
260
261void
262dequeue_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
263{
264 PDQMB *p_pdqmb;
265
266 p_pdqmb = p_pdqcb->p_head;
267 p_pdqcb->p_head = p_pdqmb->p_next;
268 p_pdqcb->count--;
269
270 *p_data = p_pdqmb->data;
271 *p_datapri = p_pdqmb->datapri;
272
273 p_pdqmb->p_next = p_pdqcb->p_freelist;
274 p_pdqcb->p_freelist = p_pdqmb;
275}
276
277#endif /* TOPPERS_pdqdeq */
278
279/*
280 * 優å…
281ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®ãƒ‡ãƒ¼ã‚¿é€ä¿¡
282 */
283#ifdef TOPPERS_pdqsnd
284
285bool_t
286send_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri, bool_t *p_dspreq)
287{
288 TCB *p_tcb;
289
290 if (!queue_empty(&(p_pdqcb->rwait_queue))) {
291 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->rwait_queue));
292 ((WINFO_PDQ *)(p_tcb->p_winfo))->data = data;
293 ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri = datapri;
294 *p_dspreq = wait_complete(p_tcb);
295 return(true);
296 }
297 else if (p_pdqcb->count < p_pdqcb->p_pdqinib->pdqcnt) {
298 enqueue_pridata(p_pdqcb, data, datapri);
299 *p_dspreq = false;
300 return(true);
301 }
302 else {
303 return(false);
304 }
305}
306
307#endif /* TOPPERS_pdqsnd */
308
309/*
310 * 優å…
311ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿å—ä¿¡
312 */
313#ifdef TOPPERS_pdqrcv
314
315bool_t
316receive_pridata(PDQCB *p_pdqcb, intptr_t *p_data,
317 PRI *p_datapri, bool_t *p_dspreq)
318{
319 TCB *p_tcb;
320 intptr_t data;
321 PRI datapri;
322
323 if (p_pdqcb->count > 0U) {
324 dequeue_pridata(p_pdqcb, p_data, p_datapri);
325 if (!queue_empty(&(p_pdqcb->swait_queue))) {
326 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
327 data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
328 datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
329 enqueue_pridata(p_pdqcb, data, datapri);
330 *p_dspreq = wait_complete(p_tcb);
331 }
332 else {
333 *p_dspreq = false;
334 }
335 return(true);
336 }
337 else if (!queue_empty(&(p_pdqcb->swait_queue))) {
338 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
339 *p_data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
340 *p_datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
341 *p_dspreq = wait_complete(p_tcb);
342 return(true);
343 }
344 else {
345 return(false);
346 }
347}
348
349#endif /* TOPPERS_pdqrcv */
350
351/*
352 * 優å…
353ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®ç”Ÿæˆ
354 */
355#ifdef TOPPERS_acre_pdq
356
357ER_UINT
358acre_pdq(const T_CPDQ *pk_cpdq)
359{
360 PDQCB *p_pdqcb;
361 PDQINIB *p_pdqinib;
362 ATR pdqatr;
363 PDQMB *p_pdqmb;
364 ER ercd;
365
366 LOG_ACRE_PDQ_ENTER(pk_cpdq);
367 CHECK_TSKCTX_UNL();
368 CHECK_RSATR(pk_cpdq->pdqatr, TA_TPRI);
369 CHECK_DPRI(pk_cpdq->maxdpri);
370 if (pk_cpdq->pdqmb != NULL) {
371 CHECK_ALIGN_MB(pk_cpdq->pdqmb);
372 }
373 pdqatr = pk_cpdq->pdqatr;
374 p_pdqmb = pk_cpdq->pdqmb;
375
376 t_lock_cpu();
377 if (tnum_pdq == 0 || queue_empty(&free_pdqcb)) {
378 ercd = E_NOID;
379 }
380 else {
381 if (pk_cpdq->pdqcnt != 0 && p_pdqmb == NULL) {
382 p_pdqmb = kernel_malloc(sizeof(PDQMB) * pk_cpdq->pdqcnt);
383 pdqatr |= TA_MBALLOC;
384 }
385 if (pk_cpdq->pdqcnt != 0 && p_pdqmb == NULL) {
386 ercd = E_NOMEM;
387 }
388 else {
389 p_pdqcb = ((PDQCB *) queue_delete_next(&free_pdqcb));
390 p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
391 p_pdqinib->pdqatr = pdqatr;
392 p_pdqinib->pdqcnt = pk_cpdq->pdqcnt;
393 p_pdqinib->maxdpri = pk_cpdq->maxdpri;
394 p_pdqinib->p_pdqmb = p_pdqmb;
395
396 queue_initialize(&(p_pdqcb->swait_queue));
397 queue_initialize(&(p_pdqcb->rwait_queue));
398 p_pdqcb->count = 0U;
399 p_pdqcb->p_head = NULL;
400 p_pdqcb->unused = 0U;
401 p_pdqcb->p_freelist = NULL;
402 ercd = PDQID(p_pdqcb);
403 }
404 }
405 t_unlock_cpu();
406
407 error_exit:
408 LOG_ACRE_PDQ_LEAVE(ercd);
409 return(ercd);
410}
411
412#endif /* TOPPERS_acre_pdq */
413
414/*
415 * 優å…
416ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®å‰Šé™¤
417 */
418#ifdef TOPPERS_del_pdq
419
420ER
421del_pdq(ID pdqid)
422{
423 PDQCB *p_pdqcb;
424 PDQINIB *p_pdqinib;
425 bool_t dspreq;
426 ER ercd;
427
428 LOG_DEL_PDQ_ENTER(pdqid);
429 CHECK_TSKCTX_UNL();
430 CHECK_PDQID(pdqid);
431 p_pdqcb = get_pdqcb(pdqid);
432
433 t_lock_cpu();
434 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
435 ercd = E_NOEXS;
436 }
437 else if (PDQID(p_pdqcb) > tmax_spdqid) {
438 dspreq = init_wait_queue(&(p_pdqcb->swait_queue));
439 if (init_wait_queue(&(p_pdqcb->rwait_queue))) {
440 dspreq = true;
441 }
442 p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
443 if ((p_pdqinib->pdqatr & TA_MBALLOC) != 0U) {
444 kernel_free(p_pdqinib->p_pdqmb);
445 }
446 p_pdqinib->pdqatr = TA_NOEXS;
447 queue_insert_prev(&free_pdqcb, &(p_pdqcb->swait_queue));
448 if (dspreq) {
449 dispatch();
450 }
451 ercd = E_OK;
452 }
453 else {
454 ercd = E_OBJ;
455 }
456 t_unlock_cpu();
457
458 error_exit:
459 LOG_DEL_PDQ_LEAVE(ercd);
460 return(ercd);
461}
462
463#endif /* TOPPERS_del_pdq */
464
465/*
466 * 優å…
467ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡
468 */
469#ifdef TOPPERS_snd_pdq
470
471ER
472snd_pdq(ID pdqid, intptr_t data, PRI datapri)
473{
474 PDQCB *p_pdqcb;
475 WINFO_PDQ winfo_pdq;
476 bool_t dspreq;
477 ER ercd;
478
479 LOG_SND_PDQ_ENTER(pdqid, data, datapri);
480 CHECK_DISPATCH();
481 CHECK_PDQID(pdqid);
482 p_pdqcb = get_pdqcb(pdqid);
483 CHECK_PAR(TMIN_DPRI <= datapri);
484
485 t_lock_cpu();
486 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
487 ercd = E_NOEXS;
488 }
489 else if (!(datapri <= p_pdqcb->p_pdqinib->maxdpri)) {
490 ercd = E_PAR;
491 }
492 else if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
493 if (dspreq) {
494 dispatch();
495 }
496 ercd = E_OK;
497 }
498 else {
499 winfo_pdq.data = data;
500 winfo_pdq.datapri = datapri;
501 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
502 wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq);
503 dispatch();
504 ercd = winfo_pdq.winfo.wercd;
505 }
506 t_unlock_cpu();
507
508 error_exit:
509 LOG_SND_PDQ_LEAVE(ercd);
510 return(ercd);
511}
512
513#endif /* TOPPERS_snd_pdq */
514
515/*
516 * 優å…
517ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡ï¼ˆãƒãƒ¼ãƒªãƒ³ã‚°ï¼‰
518 */
519#ifdef TOPPERS_psnd_pdq
520
521ER
522psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
523{
524 PDQCB *p_pdqcb;
525 bool_t dspreq;
526 ER ercd;
527
528 LOG_PSND_PDQ_ENTER(pdqid, data, datapri);
529 CHECK_TSKCTX_UNL();
530 CHECK_PDQID(pdqid);
531 p_pdqcb = get_pdqcb(pdqid);
532 CHECK_PAR(TMIN_DPRI <= datapri);
533
534 t_lock_cpu();
535 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
536 ercd = E_NOEXS;
537 }
538 else if (!(datapri <= p_pdqcb->p_pdqinib->maxdpri)) {
539 ercd = E_PAR;
540 }
541 else if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
542 if (dspreq) {
543 dispatch();
544 }
545 ercd = E_OK;
546 }
547 else {
548 ercd = E_TMOUT;
549 }
550 t_unlock_cpu();
551
552 error_exit:
553 LOG_PSND_PDQ_LEAVE(ercd);
554 return(ercd);
555}
556
557#endif /* TOPPERS_psnd_pdq */
558
559/*
560 * 優å…
561ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡ï¼ˆãƒãƒ¼ãƒªãƒ³ã‚°ï¼Œéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆç”¨ï¼‰
562 */
563#ifdef TOPPERS_ipsnd_pdq
564
565ER
566ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri)
567{
568 PDQCB *p_pdqcb;
569 bool_t dspreq;
570 ER ercd;
571
572 LOG_IPSND_PDQ_ENTER(pdqid, data, datapri);
573 CHECK_INTCTX_UNL();
574 CHECK_PDQID(pdqid);
575 p_pdqcb = get_pdqcb(pdqid);
576 CHECK_PAR(TMIN_DPRI <= datapri);
577
578 i_lock_cpu();
579 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
580 ercd = E_NOEXS;
581 }
582 else if (!(datapri <= p_pdqcb->p_pdqinib->maxdpri)) {
583 ercd = E_PAR;
584 }
585 else if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
586 if (dspreq) {
587 reqflg = true;
588 }
589 ercd = E_OK;
590 }
591 else {
592 ercd = E_TMOUT;
593 }
594 i_unlock_cpu();
595
596 error_exit:
597 LOG_IPSND_PDQ_LEAVE(ercd);
598 return(ercd);
599}
600
601#endif /* TOPPERS_ipsnd_pdq */
602
603/*
604 * 優å…
605ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡ï¼ˆã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚り)
606 */
607#ifdef TOPPERS_tsnd_pdq
608
609ER
610tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
611{
612 PDQCB *p_pdqcb;
613 WINFO_PDQ winfo_pdq;
614 TMEVTB tmevtb;
615 bool_t dspreq;
616 ER ercd;
617
618 LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
619 CHECK_DISPATCH();
620 CHECK_PDQID(pdqid);
621 CHECK_TMOUT(tmout);
622 p_pdqcb = get_pdqcb(pdqid);
623 CHECK_PAR(TMIN_DPRI <= datapri);
624
625 t_lock_cpu();
626 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
627 ercd = E_NOEXS;
628 }
629 else if (!(datapri <= p_pdqcb->p_pdqinib->maxdpri)) {
630 ercd = E_PAR;
631 }
632 else if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
633 if (dspreq) {
634 dispatch();
635 }
636 ercd = E_OK;
637 }
638 else if (tmout == TMO_POL) {
639 ercd = E_TMOUT;
640 }
641 else {
642 winfo_pdq.data = data;
643 winfo_pdq.datapri = datapri;
644 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
645 wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq,
646 &tmevtb, tmout);
647 dispatch();
648 ercd = winfo_pdq.winfo.wercd;
649 }
650 t_unlock_cpu();
651
652 error_exit:
653 LOG_TSND_PDQ_LEAVE(ercd);
654 return(ercd);
655}
656
657#endif /* TOPPERS_tsnd_pdq */
658
659/*
660 * 優å…
661ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—ä¿¡
662 */
663#ifdef TOPPERS_rcv_pdq
664
665ER
666rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
667{
668 PDQCB *p_pdqcb;
669 WINFO_PDQ winfo_pdq;
670 bool_t dspreq;
671 ER ercd;
672
673 LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
674 CHECK_DISPATCH();
675 CHECK_PDQID(pdqid);
676 p_pdqcb = get_pdqcb(pdqid);
677
678 t_lock_cpu();
679 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
680 ercd = E_NOEXS;
681 }
682 else if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
683 if (dspreq) {
684 dispatch();
685 }
686 ercd = E_OK;
687 }
688 else {
689 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
690 make_wait(&(winfo_pdq.winfo));
691 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
692 winfo_pdq.p_pdqcb = p_pdqcb;
693 LOG_TSKSTAT(p_runtsk);
694 dispatch();
695 ercd = winfo_pdq.winfo.wercd;
696 if (ercd == E_OK) {
697 *p_data = winfo_pdq.data;
698 *p_datapri = winfo_pdq.datapri;
699 }
700 }
701 t_unlock_cpu();
702
703 error_exit:
704 LOG_RCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
705 return(ercd);
706}
707
708#endif /* TOPPERS_rcv_pdq */
709
710/*
711 * 優å…
712ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—信(ポーリング)
713 */
714#ifdef TOPPERS_prcv_pdq
715
716ER
717prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
718{
719 PDQCB *p_pdqcb;
720 bool_t dspreq;
721 ER ercd;
722
723 LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri);
724 CHECK_TSKCTX_UNL();
725 CHECK_PDQID(pdqid);
726 p_pdqcb = get_pdqcb(pdqid);
727
728 t_lock_cpu();
729 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
730 ercd = E_NOEXS;
731 }
732 else if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
733 if (dspreq) {
734 dispatch();
735 }
736 ercd = E_OK;
737 }
738 else {
739 ercd = E_TMOUT;
740 }
741 t_unlock_cpu();
742
743 error_exit:
744 LOG_PRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
745 return(ercd);
746}
747
748#endif /* TOPPERS_prcv_pdq */
749
750/*
751 * 優å…
752ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—信(タイムアウトあり)
753 */
754#ifdef TOPPERS_trcv_pdq
755
756ER
757trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
758{
759 PDQCB *p_pdqcb;
760 WINFO_PDQ winfo_pdq;
761 TMEVTB tmevtb;
762 bool_t dspreq;
763 ER ercd;
764
765 LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
766 CHECK_DISPATCH();
767 CHECK_PDQID(pdqid);
768 CHECK_TMOUT(tmout);
769 p_pdqcb = get_pdqcb(pdqid);
770
771 t_lock_cpu();
772 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
773 ercd = E_NOEXS;
774 }
775 else if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
776 if (dspreq) {
777 dispatch();
778 }
779 ercd = E_OK;
780 }
781 else if (tmout == TMO_POL) {
782 ercd = E_TMOUT;
783 }
784 else {
785 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
786 make_wait_tmout(&(winfo_pdq.winfo), &tmevtb, tmout);
787 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
788 winfo_pdq.p_pdqcb = p_pdqcb;
789 LOG_TSKSTAT(p_runtsk);
790 dispatch();
791 ercd = winfo_pdq.winfo.wercd;
792 if (ercd == E_OK) {
793 *p_data = winfo_pdq.data;
794 *p_datapri = winfo_pdq.datapri;
795 }
796 }
797 t_unlock_cpu();
798
799 error_exit:
800 LOG_TRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
801 return(ercd);
802}
803
804#endif /* TOPPERS_trcv_pdq */
805
806/*
807 * 優å…
808ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®å†åˆæœŸåŒ–
809 */
810#ifdef TOPPERS_ini_pdq
811
812ER
813ini_pdq(ID pdqid)
814{
815 PDQCB *p_pdqcb;
816 bool_t dspreq;
817 ER ercd;
818
819 LOG_INI_PDQ_ENTER(pdqid);
820 CHECK_TSKCTX_UNL();
821 CHECK_PDQID(pdqid);
822 p_pdqcb = get_pdqcb(pdqid);
823
824 t_lock_cpu();
825 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
826 ercd = E_NOEXS;
827 }
828 else {
829 dspreq = init_wait_queue(&(p_pdqcb->swait_queue));
830 if (init_wait_queue(&(p_pdqcb->rwait_queue))) {
831 dspreq = true;
832 }
833 p_pdqcb->count = 0U;
834 p_pdqcb->p_head = NULL;
835 p_pdqcb->unused = 0U;
836 p_pdqcb->p_freelist = NULL;
837 if (dspreq) {
838 dispatch();
839 }
840 ercd = E_OK;
841 }
842 t_unlock_cpu();
843
844 error_exit:
845 LOG_INI_PDQ_LEAVE(ercd);
846 return(ercd);
847}
848
849#endif /* TOPPERS_ini_pdq */
850
851/*
852 * 優å…
853ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®çŠ¶æ…
854‹å‚ç…
855§
856 */
857#ifdef TOPPERS_ref_pdq
858
859ER
860ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
861{
862 PDQCB *p_pdqcb;
863 ER ercd;
864
865 LOG_REF_PDQ_ENTER(pdqid, pk_rpdq);
866 CHECK_TSKCTX_UNL();
867 CHECK_PDQID(pdqid);
868 p_pdqcb = get_pdqcb(pdqid);
869
870 t_lock_cpu();
871 if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
872 ercd = E_NOEXS;
873 }
874 else {
875 pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue));
876 pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue));
877 pk_rpdq->spdqcnt = p_pdqcb->count;
878 ercd = E_OK;
879 }
880 t_unlock_cpu();
881
882 error_exit:
883 LOG_REF_PDQ_LEAVE(ercd, pk_rpdq);
884 return(ercd);
885}
886
887#endif /* TOPPERS_ref_pdq */
Note: See TracBrowser for help on using the repository browser.