/* * Function: int main(int argc, char args[]) * Description: process main function * Input: argc: parameter number * args: parameter value array * Output: none * Return: function exit status * Others: none */ int main( ) { Queue * q; Ele * ele; q = create_queue( show_ele, delete_ele ); ele = create_ele( 28, "liwei", 10, "hust++life" ); in_queue( q, ele ); ele = create_ele( 24, "lijia", 10, "hust++acon" ); in_queue( q, ele ); ele = create_ele( 26, "lijing", 10, "hust++acon" ); in_queue( q, ele ); queue_show( q ); printf( "=============\n" ); ele = out_queue( q ); show_ele( ele ); ele = out_queue( q ); show_ele( ele ); ele = out_queue( q ); show_ele( ele ); ele = out_queue( q ); show_ele( ele ); }
int main(int argc, const char *argv[]) { queue_t *sqp; int i; data_t buf; sqp = creat_queue(8); for(i = 0;i < 10;i ++){ in_queue(sqp,&i); } print_queue(sqp); for(i = 0 ;i < 4;i ++){ buf = -1; out_queue(sqp,&buf); printf("out : %d\n",buf); } print_queue(sqp); for(i = 11;i < 20;i ++){ in_queue(sqp,&i); } print_queue(sqp); for(i = 0 ;i < 8;i ++){ buf = -1; out_queue(sqp,&buf); printf("out : %d\n",buf); } print_queue(sqp); return 0; }
inline bool do_remove(node_type node, const queue_id_t new_state) { if(!in_queue(node)) return false; QUEUE_DEFINE_INTRUSIVE_REMOVE(node); return true; }
inline void move_up(node_type node) { MUTEX_LOCK_GUARD(mtx, normal_lock); if(!in_queue(node)) return; QUEUE_DEFINE_INTRUSIVE_MOVE_UP(); }
void main() { int arr[LEN] = {0}; in_queue(arr, 9); in_queue(arr, 5); in_queue(arr, 2); in_queue(arr, 7); queue_for_each(arr); out_queue(arr); out_queue(arr); queue_for_each(arr); in_queue(arr, 3); queue_for_each(arr); }
/* * タスク毎の整合性検査 */ static ER bit_task(ID tskid) { TCB *p_tcb; const TINIB *p_tinib; uint_t tstat, tstat_wait, pri; TMEVTB *p_tmevtb; SEMCB *p_semcb; FLGCB *p_flgcb; DTQCB *p_dtqcb; PDQCB *p_pdqcb; MTXCB *p_mtxcb; MPFCB *p_mpfcb; if (!(TMIN_TSKID <= (tskid) && (tskid) <= tmax_tskid)) { return(E_ID); } p_tcb = get_tcb(tskid); p_tinib = p_tcb->p_tinib; tstat = p_tcb->tstat; tstat_wait = (tstat & TS_WAIT_MASK); pri = p_tcb->priority; /* * 初期化ブロックへのポインタの検査 */ if (p_tinib != &(tinib_table[INDEX_TSK(tskid)])) { return(E_SYS_LINENO); } /* * tstatの検査 */ switch (tstat & (TS_RUNNABLE | TS_WAITING | TS_SUSPENDED)) { case TS_DORMANT: if (tstat != TS_DORMANT) { return(E_SYS_LINENO); } break; case TS_RUNNABLE: if (tstat != TS_RUNNABLE) { return(E_SYS_LINENO); } break; case TS_WAITING: case (TS_WAITING | TS_SUSPENDED): if (!(TS_WAIT_DLY <= tstat_wait && tstat_wait <= TS_WAIT_MTX) || tstat_wait == TS_WAIT_MBX) { return(E_SYS_LINENO); } if ((tstat & ~(TS_WAIT_MASK | TS_RUNNABLE | TS_WAITING | TS_SUSPENDED)) != 0U) { return(E_SYS_LINENO); } break; case TS_SUSPENDED: if (tstat != TS_SUSPENDED) { return(E_SYS_LINENO); } break; default: return(E_SYS_LINENO); } /* * actqueの検査 */ if (TSTAT_DORMANT(tstat) && p_tcb->actque) { return(E_SYS_LINENO); } /* * タスク優先度の検査 */ if (pri >= TNUM_TPRI) { return(E_SYS_LINENO); } /* * texptnの検査 */ if (p_tcb->p_tinib->texrtn == NULL && p_tcb->texptn != 0U) { return(E_SYS_LINENO); } /* * 休止状態におけるチェック */ if (TSTAT_DORMANT(tstat)) { if (!(pri == p_tinib->ipriority) && (p_tcb->wupque == false) && (p_tcb->enatex == false) && (p_tcb->texptn == 0U)) { return(E_SYS_LINENO); } } /* * 実行できる状態におけるチェック */ if (TSTAT_RUNNABLE(tstat)) { if (!in_queue(&ready_queue[pri], &(p_tcb->task_queue))) { return(E_SYS_LINENO); } } /* * 待ち状態におけるチェック */ if (TSTAT_WAITING(tstat)) { if (!on_stack(p_tcb->p_winfo, p_tinib)) { return(E_SYS_LINENO); } p_tmevtb = p_tcb->p_winfo->p_tmevtb; if (p_tmevtb != NULL) { if (!on_stack(p_tmevtb, p_tinib)) { return(E_SYS_LINENO); } /* * (*p_tmevtb)の検査(未完成) */ } switch (tstat & TS_WAIT_MASK) { case TS_WAIT_SLP: if (p_tcb->wupque == true) { return(E_SYS_LINENO); } break; case TS_WAIT_DLY: if (p_tmevtb == NULL) { return(E_SYS_LINENO); } break; case TS_WAIT_SEM: p_semcb = ((WINFO_SEM *)(p_tcb->p_winfo))->p_semcb; if (!VALID_SEMCB(p_semcb)) { return(E_SYS_LINENO); } if (!in_queue(&(p_semcb->wait_queue), &(p_tcb->task_queue))) { return(E_SYS_LINENO); } break; case TS_WAIT_FLG: p_flgcb = ((WINFO_FLG *)(p_tcb->p_winfo))->p_flgcb; if (!VALID_FLGCB(p_flgcb)) { return(E_SYS_LINENO); } if (!in_queue(&(p_flgcb->wait_queue), &(p_tcb->task_queue))) { return(E_SYS_LINENO); } break; case TS_WAIT_SDTQ: p_dtqcb = ((WINFO_DTQ *)(p_tcb->p_winfo))->p_dtqcb; if (!VALID_DTQCB(p_dtqcb)) { return(E_SYS_LINENO); } if (!in_queue(&(p_dtqcb->swait_queue), &(p_tcb->task_queue))) { return(E_SYS_LINENO); } break; case TS_WAIT_RDTQ: p_dtqcb = ((WINFO_DTQ *)(p_tcb->p_winfo))->p_dtqcb; if (!VALID_DTQCB(p_dtqcb)) { return(E_SYS_LINENO); } if (!in_queue(&(p_dtqcb->rwait_queue), &(p_tcb->task_queue))) { return(E_SYS_LINENO); } break; case TS_WAIT_SPDQ: p_pdqcb = ((WINFO_PDQ *)(p_tcb->p_winfo))->p_pdqcb; if (!VALID_PDQCB(p_pdqcb)) { return(E_SYS_LINENO); } if (!in_queue(&(p_pdqcb->swait_queue), &(p_tcb->task_queue))) { return(E_SYS_LINENO); } break; case TS_WAIT_RPDQ: p_pdqcb = ((WINFO_PDQ *)(p_tcb->p_winfo))->p_pdqcb; if (!VALID_PDQCB(p_pdqcb)) { return(E_SYS_LINENO); } if (!in_queue(&(p_pdqcb->rwait_queue), &(p_tcb->task_queue))) { return(E_SYS_LINENO); } break; case TS_WAIT_MTX: p_mtxcb = ((WINFO_MTX *)(p_tcb->p_winfo))->p_mtxcb; if (!VALID_MTXCB(p_mtxcb)) { return(E_SYS_LINENO); } if (!in_queue(&(p_mtxcb->wait_queue), &(p_tcb->task_queue))) { return(E_SYS_LINENO); } break; case TS_WAIT_MPF: p_mpfcb = ((WINFO_MPF *)(p_tcb->p_winfo))->p_mpfcb; if (!VALID_MPFCB(p_mpfcb)) { return(E_SYS_LINENO); } if (!in_queue(&(p_mpfcb->wait_queue), &(p_tcb->task_queue))) { return(E_SYS_LINENO); } break; } } /* * tskctxbの検査 */ if (!TSTAT_DORMANT(tstat) && p_tcb != p_runtsk) { /* * ターゲット依存の検査 */ #if 0 if (bit_tskctxb(&(p_tcb->tskctxb))) { return(E_SYS_LINENO); } #endif } return(E_OK); }
/* * タスク毎の検査 */ static ER bit_mutex_task(ID tskid) { TCB *p_tcb; uint_t pri; MTXCB *p_mtxcb; const MTXINIB *p_mtxinib; if (!VALID_TSKID(tskid)) { return(E_ID); } p_tcb = get_tcb(tskid); pri = p_tcb->bpriority; /* * タスクがロックしているミューテックスのキューの検査 */ p_mtxcb = p_tcb->p_lastmtx; while (p_mtxcb != NULL) { if (!VALID_MTXCB(p_mtxcb)) { return(E_SYS_LINENO); } p_mtxinib = p_mtxcb->p_mtxinib; /* * ミューテックスをロックしているタスクのチェック */ if (p_mtxcb->p_loctsk != p_tcb) { return(E_SYS_LINENO); } /* * 現在優先度の計算 */ if (MTXPROTO(p_mtxinib)) { if (p_mtxinib->ceilpri < pri) { pri = p_mtxinib->ceilpri; } } /* * キューの次の要素に進む */ p_mtxcb = p_mtxcb->p_prevmtx; } /* * 現在優先度の検査 */ if (p_tcb->priority != pri) { return(E_SYS_LINENO); } /* * タスクが待っているミューテックスに関する検査 */ if (TSTAT_WAIT_MTX(p_tcb->tstat)) { p_mtxcb = ((WINFO_MTX *)(p_tcb->p_winfo))->p_mtxcb; if (!VALID_MTXCB(p_mtxcb)) { return(E_SYS_LINENO); } if (!in_queue(&(p_mtxcb->wait_queue), &(p_tcb->task_queue))) { return(E_SYS_LINENO); } } return(E_OK); }
/* * ミューテックス毎の検査 */ static ER bit_mutex_mutex(ID mtxid) { MTXCB *p_mtxcb; TCB *p_tcb; QUEUE *p_queue, *p_next; uint_t pri; if (!(TMIN_MTXID <= (mtxid) && (mtxid) <= tmax_mtxid)) { return(E_ID); } p_mtxcb = get_mtxcb(mtxid); /* * 初期化ブロックへのポインタの検査 */ if (p_mtxcb->p_mtxinib != &(mtxinib_table[INDEX_MTX(mtxid)])) { return(E_SYS_LINENO); } /* * ミューテックス待ちキューの検査 */ p_queue = p_mtxcb->wait_queue.p_next; if (p_queue->p_prev != &(p_mtxcb->wait_queue)) { return(E_SYS_LINENO); } pri = TMIN_TPRI; while (p_queue != &(p_mtxcb->wait_queue)) { p_tcb = (TCB *) p_queue; if (!VALID_TCB(p_tcb)) { return(E_SYS_LINENO); } /* * キューがタスク優先度順になっているかの検査 */ if (MTXPROTO(p_mtxcb) != TA_NULL) { if (p_tcb->priority < pri) { return(E_SYS_LINENO); } } pri = p_tcb->priority; /* * タスク状態の検査 * * ミューテックス待ち状態のタスクの検査は,タスク毎の検査で行っ * ているため,ここでは行わない. */ if (!TSTAT_WAIT_MTX(p_tcb->tstat)) { return(E_SYS_LINENO); } /* * 優先度上限の検査 */ if (MTXPROTO(p_mtxcb) == TA_CEILING) { if (p_tcb->bpriority < p_mtxcb->p_mtxinib->ceilpri) { return(E_SYS_LINENO); } } /* * キューの次の要素に進む */ p_next = p_queue->p_next; if (p_next->p_prev != p_queue) { return(E_SYS_LINENO); } p_queue = p_next; } /* * ミューテックスをロックしているタスクの検査 */ p_tcb = p_mtxcb->p_loctsk; if (p_tcb == NULL) { /* * ミューテックスがロックされていない時 */ if (!queue_empty(&(p_mtxcb->wait_queue))) { return(E_SYS_LINENO); } } else { /* * ミューテックスがロックされている時 * * ミューテックスをロックしているタスクの検査は,タスク毎の検 * 査で行っているため,ここでは行わない. */ if (!VALID_TCB(p_tcb)) { return(E_SYS_LINENO); } if (!in_queue(&(p_tcb->mutex_queue), &(p_mtxcb->mutex_queue))) { return(E_SYS_LINENO); } /* * 優先度上限の検査 */ if (MTXPROTO(p_mtxcb) == TA_CEILING) { if (p_tcb->bpriority < p_mtxcb->p_mtxinib->ceilpri) { return(E_SYS_LINENO); } } } return(E_OK); }
/* * タスク毎の検査 */ static ER bit_mutex_task(ID tskid) { TCB *p_tcb; MTXCB *p_mtxcb; QUEUE *p_queue, *p_next; uint_t pri; if (!(TMIN_TSKID <= (tskid) && (tskid) <= tmax_tskid)) { return(E_ID); } p_tcb = get_tcb(tskid); pri = p_tcb->bpriority; /* * タスクがロックしているミューテックスのキューの検査 */ p_queue = p_tcb->mutex_queue.p_next; if (p_queue->p_prev != &(p_tcb->mutex_queue)) { return(E_SYS_LINENO); } while (p_queue != &(p_tcb->mutex_queue)) { p_mtxcb = MTXCB_QUEUE(p_queue); if (!VALID_MTXCB(p_mtxcb)) { return(E_SYS_LINENO); } /* * ミューテックスをロックしているタスクのチェック */ if (p_mtxcb->p_loctsk != p_tcb) { return(E_SYS_LINENO); } /* * 現在優先度の計算 */ if (MTXPROTO(p_mtxcb)) { if (p_mtxcb->p_mtxinib->ceilpri < pri) { pri = p_mtxcb->p_mtxinib->ceilpri; } } /* * キューの次の要素に進む */ p_next = p_queue->p_next; if (p_next->p_prev != p_queue) { return(E_SYS_LINENO); } p_queue = p_next; } /* * 現在優先度の検査 */ if (p_tcb->priority != pri) { return(E_SYS_LINENO); } /* * タスクが待っているミューテックスに関する検査 */ if (TSTAT_WAIT_MTX(p_tcb->tstat)) { p_mtxcb = ((WINFO_MTX *)(p_tcb->p_winfo))->p_mtxcb; if (!VALID_MTXCB(p_mtxcb)) { return(E_SYS_LINENO); } if (!in_queue(&(p_mtxcb->wait_queue), &(p_tcb->task_queue))) { return(E_SYS_LINENO); } } return(E_OK); }
void intersection_before_entry(Direction origin, Direction destination) { /* replace this default implementation with your own implementation */ //(void)origin; /* avoid compiler complaint about unused parameter */ (void)destination; /* avoid compiler complaint about unused parameter */ // KASSERT(intersectionSem != NULL); // P(intersectionSem); KASSERT(intersection_lock != NULL); KASSERT(next_lights != NULL); KASSERT(cv_south_go != NULL); KASSERT(cv_north_go != NULL); KASSERT(cv_east_go != NULL); KASSERT(cv_west_go != NULL); lock_acquire(intersection_lock); // bool check = in_queue(origin); // if (!check){ // check = true; // } // if (q_empty(next_lights)){ // first_dir = origin; // current_light = &first_dir; // } // add the cu // if(!in_queue(origin)){ // q_addtail(next_lights,pointer); // } // current_light = q_peek(next_lights); // q_remhead(next_lights); // if (origin == north){ // // if the light is green // if(!in_queue(origin)){ // q_addtail(next_lights,&north_dir); // } // current_light = q_peek(next_lights); // // q_remhead(next_lights); // if (origin == *current_light) { // if (num_vehicles_waiting_north != 0){ // num_vehicles_waiting_north++; // cv_wait(cv_north_go,intersection_lock); // } // } // else{ // num_vehicles_waiting_north++; // cv_wait(cv_north_go,intersection_lock); // } // } // else if (origin == south){ // // if the light is green // if(!in_queue(origin)){ // q_addtail(next_lights,&south_dir); // } // current_light = q_peek(next_lights); // // q_remhead(next_lights); // if (origin == *current_light) { // if (num_vehicles_waiting_south != 0){ // num_vehicles_waiting_south++; // cv_wait(cv_south_go,intersection_lock); // } // } // else{ // num_vehicles_waiting_south++; // cv_wait(cv_south_go,intersection_lock); // } // } // else if (origin == east){ // // if the light is green // if(!in_queue(origin)){ // q_addtail(next_lights,&east_dir); // } // current_light = q_peek(next_lights); // // q_remhead(next_lights); // if (origin == *current_light) { // if (num_vehicles_waiting_east != 0){ // num_vehicles_waiting_east++; // cv_wait(cv_east_go,intersection_lock); // } // } // else{ // num_vehicles_waiting_east++; // cv_wait(cv_east_go,intersection_lock); // } // } // else if (origin == west){ // // if the light is green // if(!in_queue(origin)){ // q_addtail(next_lights,&west_dir); // } // current_light = q_peek(next_lights); // // q_remhead(next_lights); // if (origin == *current_light) { // if (num_vehicles_waiting_west != 0){ // num_vehicles_waiting_west++; // cv_wait(cv_west_go,intersection_lock); // } // }else{ // num_vehicles_waiting_west++; // cv_wait(cv_west_go,intersection_lock); // } // } if (origin == north) { // if the light is green if(!in_queue(origin)){ q_addtail(next_lights,&north_dir); } current_light = q_peek(next_lights); // q_remhead(next_lights); num_vehicles_waiting_north++; if (origin != *current_light) { cv_wait(cv_north_go,intersection_lock); } } else if (origin == south){ // if the light is green if(!in_queue(origin)){ q_addtail(next_lights,&south_dir); } current_light = q_peek(next_lights); // q_remhead(next_lights); num_vehicles_waiting_south++; if (origin != *current_light) { cv_wait(cv_south_go,intersection_lock); } } else if (origin == east){ // if the light is green if(!in_queue(origin)){ q_addtail(next_lights,&east_dir); } current_light = q_peek(next_lights); num_vehicles_waiting_east++; // q_remhead(next_lights); if (origin != *current_light) { cv_wait(cv_east_go,intersection_lock); } } else if (origin == west){ // if the light is green if(!in_queue(origin)){ q_addtail(next_lights,&west_dir); } num_vehicles_waiting_west++; current_light = q_peek(next_lights); // q_remhead(next_lights); if (origin == *current_light) { cv_wait(cv_west_go,intersection_lock); } } lock_release(intersection_lock); }