コード例 #1
0
ファイル: semaphore.c プロジェクト: hominlinx/hot-pot-lab
int ker_semBDelete(SEM_ID semid)
{
	int ret = -1;
	unsigned long flags;
	struct task_struct *tsk;
    struct semb_wait_item *wait;
	struct list_head *list;
	struct semb_struct *sem = (struct semb_struct *)semid;
	
    if(!semid)
    {
         LOG("Delete NULL BSem!");
         return ERROR_SEMID_INVALID;
    }

    if (sem->magic != SEM_MAGIC)
    {
        return ERROR_SEMID_INVALID;    
    }

    if(InInterrupt())
    {       
         LOG("Delete BSem <0x%p> In ISR!",sem);
         return ERROR_SEM_IN_INTR;
    }

	delete_sem_from_list(&sem->all_list);

	spin_lock_irqsave(&sem->lock, flags);

    sem->magic = 0;
	while (!list_empty(&sem->wait_list))
    {
		list = sem->wait_list.next;
		wait = list_entry(list, struct semb_wait_item, list);
		list_del(list);
    	list->next = NULL;
		
		tsk = wait->task;
        wait->flag |= SEM_DELETED;

        try_to_wake_up(tsk);
    }

	spin_unlock_irqrestore(&sem->lock, flags);

	if (atomic_dec_and_test(&sem->refcount))
	{
		hal_free_align4(sem);
	}

	ret = 0;
    return ret;
}
コード例 #2
0
inline int fastcall wake_up_process(struct task_struct * p)
{
	return try_to_wake_up(p, 0);
}