pridataq.h

#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))

pridataq.h129 行で定義されています。

参照元 ref_tsk().


型定義

typedef struct pridataq_control_block PDQCB

pridataq.h55 行で定義されています。


関数

void dequeue_pridata ( PDQCB p_pdqcb,
intptr_t *  p_data,
PRI p_datapri 
)

pridataq.c207 行で定義されています。

参照先 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 }

void enqueue_pridata ( PDQCB p_pdqcb,
intptr_t  data,
PRI  datapri 
)

pridataq.c170 行で定義されています。

参照先 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.c146 行で定義されています。

参照先 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 }

bool_t receive_pridata ( PDQCB p_pdqcb,
intptr_t *  p_data,
PRI p_datapri,
bool_t p_reqdsp 
)

pridataq.c259 行で定義されています。

参照先 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 }

bool_t send_pridata ( PDQCB p_pdqcb,
intptr_t  data,
PRI  datapri,
bool_t p_reqdsp 
)

pridataq.c230 行で定義されています。

参照先 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 ID tmax_pdqid


Copyright © 2008 by Kijineko Inc.

ホームページ制作