예제 #1
0
/*
 * 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 );
}
예제 #2
0
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;
}
예제 #3
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;
   }
예제 #4
0
   inline void move_up(node_type node)
   {
      MUTEX_LOCK_GUARD(mtx, normal_lock);

      if(!in_queue(node))
         return;
    
		QUEUE_DEFINE_INTRUSIVE_MOVE_UP();
   }
예제 #5
0
파일: main2.c 프로젝트: hemiao3000/code
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);

}
예제 #6
0
/*
 *  タスク毎の整合性検査
 */
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);
}
예제 #7
0
/*
 *  タスク毎の検査
 */
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);
}
예제 #8
0
/*
 *  ミューテックス毎の検査
 */
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);
}
예제 #9
0
/*
 *  タスク毎の検査
 */
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);
}
예제 #10
0
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);
}