Пример #1
0
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;
}
Пример #2
0
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;
}