int ipc_sem_post(sem_t sem_id) { assert(current->sem_queue != NULL); sem_undo_t *semu; sem_queue_t *sem_queue = current->sem_queue; down(&(sem_queue->sem)); semu = semu_list_search(&(sem_queue->semu_list), sem_id); up(&(sem_queue->sem)); if (semu != NULL) { return usem_up(semu->sem); } return -E_INVAL; }
int ipc_sem_post_max(sem_t sem_id, int max) { assert(pls_read(current)->sem_queue != NULL); sem_undo_t *semu; sem_queue_t *sem_queue = pls_read(current)->sem_queue; down(&(sem_queue->sem)); semu = semu_list_search(&(sem_queue->semu_list), sem_id); up(&(sem_queue->sem)); if(semu != NULL) { int i; int ret = 0; for(i = 0; i < max; ++i) { if(wait_queue_empty(&(semu->sem->wait_queue))) break; usem_up(semu->sem); ++ret; } return ret; } return -E_INVAL; }