#include <queue.h>
データ構造 | |
struct | pridata_management_block |
struct | pridataq_initialization_block |
struct | pridataq_control_block |
struct | pridataq_waiting_information |
マクロ定義 | |
#define | PDQID(p_pdqcb) ((ID)(((p_pdqcb) - pdqcb_table) + TMIN_PDQID)) |
型定義 | |
typedef struct pridata_management_block | PDQMB |
typedef struct pridataq_initialization_block | PDQINIB |
typedef struct pridataq_control_block | PDQCB |
typedef struct pridataq_waiting_information | WINFO_PDQ |
関数 | |
void | initialize_pridataq (void) |
void | enqueue_pridata (PDQCB *p_pdqcb, intptr_t data, PRI datapri) |
void | dequeue_pridata (PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri) |
bool_t | send_pridata (PDQCB *p_pdqcb, intptr_t data, PRI datapri, bool_t *p_reqdsp) |
bool_t | receive_pridata (PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri, bool_t *p_reqdsp) |
変数 | |
const ID | tmax_pdqid |
const PDQINIB | pdqinib_table [] |
PDQCB | pdqcb_table [] |
#define PDQID | ( | p_pdqcb | ) | ((ID)(((p_pdqcb) - pdqcb_table) + TMIN_PDQID)) |
typedef struct pridataq_control_block PDQCB |
typedef struct pridataq_initialization_block PDQINIB |
typedef struct pridata_management_block PDQMB |
pridataq.h の 55 行で定義されています。
typedef struct pridataq_waiting_information WINFO_PDQ |
pridataq.c の 207 行で定義されています。
参照先 pridataq_control_block::count, pridata_management_block::data, pridata_management_block::datapri, pridataq_control_block::p_freelist, pridataq_control_block::p_head, と pridata_management_block::p_next.
00208 { 00209 PDQMB *p_pdqmb; 00210 00211 p_pdqmb = p_pdqcb->p_head; 00212 p_pdqcb->p_head = p_pdqmb->p_next; 00213 p_pdqcb->count--; 00214 00215 *p_data = p_pdqmb->data; 00216 *p_datapri = p_pdqmb->datapri; 00217 00218 p_pdqmb->p_next = p_pdqcb->p_freelist; 00219 p_pdqcb->p_freelist = p_pdqmb; 00220 }
pridataq.c の 170 行で定義されています。
参照先 pridataq_control_block::count, pridata_management_block::data, pridata_management_block::datapri, NULL, pridataq_control_block::p_freelist, pridataq_control_block::p_head, pridata_management_block::p_next, pridataq_control_block::p_pdqinib, pridataq_initialization_block::p_pdqmb, と pridataq_control_block::unused.
00171 { 00172 PDQMB *p_pdqmb; 00173 PDQMB **pp_prev_next, *p_next; 00174 00175 if (p_pdqcb->p_freelist != NULL) { 00176 p_pdqmb = p_pdqcb->p_freelist; 00177 p_pdqcb->p_freelist = p_pdqmb->p_next; 00178 } 00179 else { 00180 p_pdqmb = p_pdqcb->p_pdqinib->p_pdqmb + p_pdqcb->unused; 00181 p_pdqcb->unused++; 00182 } 00183 00184 p_pdqmb->data = data; 00185 p_pdqmb->datapri = datapri; 00186 00187 pp_prev_next = &(p_pdqcb->p_head); 00188 while ((p_next = *pp_prev_next) != NULL) { 00189 if (p_next->datapri > datapri) { 00190 break; 00191 } 00192 pp_prev_next = &(p_next->p_next); 00193 } 00194 p_pdqmb->p_next = p_next; 00195 *pp_prev_next = p_pdqmb; 00196 p_pdqcb->count++; 00197 }
void initialize_pridataq | ( | void | ) |
pridataq.c の 146 行で定義されています。
参照先 pridataq_control_block::count, NULL, pridataq_control_block::p_freelist, pridataq_control_block::p_head, pridataq_control_block::p_pdqinib, pdqcb_table, pdqinib_table, queue_initialize(), pridataq_control_block::rwait_queue, pridataq_control_block::swait_queue, tnum_pdq, と pridataq_control_block::unused.
00147 { 00148 uint_t i; 00149 PDQCB *p_pdqcb; 00150 00151 for (p_pdqcb = pdqcb_table, i = 0; i < tnum_pdq; p_pdqcb++, i++) { 00152 queue_initialize(&(p_pdqcb->swait_queue)); 00153 p_pdqcb->p_pdqinib = &(pdqinib_table[i]); 00154 queue_initialize(&(p_pdqcb->rwait_queue)); 00155 p_pdqcb->count = 0U; 00156 p_pdqcb->p_head = NULL; 00157 p_pdqcb->unused = 0U; 00158 p_pdqcb->p_freelist = NULL; 00159 } 00160 }
pridataq.c の 259 行で定義されています。
参照先 pridataq_control_block::count, dequeue_pridata, enqueue_pridata, task_control_block::p_winfo, queue_delete_next(), queue_empty(), pridataq_control_block::swait_queue, と wait_complete.
00261 { 00262 TCB *p_tcb; 00263 intptr_t data; 00264 PRI datapri; 00265 00266 if (p_pdqcb->count > 0U) { 00267 dequeue_pridata(p_pdqcb, p_data, p_datapri); 00268 if (!queue_empty(&(p_pdqcb->swait_queue))) { 00269 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue)); 00270 data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data; 00271 datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri; 00272 enqueue_pridata(p_pdqcb, data, datapri); 00273 *p_reqdsp = wait_complete(p_tcb); 00274 } 00275 else { 00276 *p_reqdsp = false; 00277 } 00278 return(true); 00279 } 00280 else if (!queue_empty(&(p_pdqcb->swait_queue))) { 00281 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue)); 00282 *p_data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data; 00283 *p_datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri; 00284 *p_reqdsp = wait_complete(p_tcb); 00285 return(true); 00286 } 00287 else { 00288 return(false); 00289 } 00290 }
pridataq.c の 230 行で定義されています。
参照先 pridataq_control_block::count, enqueue_pridata, pridataq_control_block::p_pdqinib, task_control_block::p_winfo, pridataq_initialization_block::pdqcnt, queue_delete_next(), queue_empty(), pridataq_control_block::rwait_queue, と wait_complete.
00231 { 00232 TCB *p_tcb; 00233 00234 if (!queue_empty(&(p_pdqcb->rwait_queue))) { 00235 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->rwait_queue)); 00236 ((WINFO_PDQ *)(p_tcb->p_winfo))->data = data; 00237 ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri = datapri; 00238 *p_reqdsp = wait_complete(p_tcb); 00239 return(true); 00240 } 00241 else if (p_pdqcb->count < p_pdqcb->p_pdqinib->pdqcnt) { 00242 enqueue_pridata(p_pdqcb, data, datapri); 00243 *p_reqdsp = false; 00244 return(true); 00245 } 00246 else { 00247 return(false); 00248 } 00249 }
const PDQINIB pdqinib_table[] |
const ID tmax_pdqid |
Copyright © 2008 by Kijineko Inc.