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; }
inline int fastcall wake_up_process(struct task_struct * p) { return try_to_wake_up(p, 0); }