Exemple #1
0
void
exit_sem_queue(sem_queue_t *sem_queue) {
    assert(sem_queue != NULL && sem_queue_count(sem_queue) == 0);
    list_entry_t *list = &(sem_queue->semu_list), *le = list;
    while ((le = list_next(list)) != list) {
        list_del(le);
        semu_destroy(le2semu(le, semu_link));
    }
}
Exemple #2
0
static int semu_search_with_addr(list_entry_t * list, uintptr_t addr)
{
	list_entry_t *le = list;
	while ((le = list_next(le)) != list) {
		sem_undo_t *semu = le2semu(le, semu_link);
		if (semu->sem->addr == addr)
			return sem2semid(semu->sem);
	}
	return -1;
}
Exemple #3
0
int
dup_sem_queue(sem_queue_t *to, sem_queue_t *from) {
    assert(to != NULL && from != NULL);
    list_entry_t *list = &(from->semu_list), *le = list;
    while ((le = list_next(le)) != list) {
        sem_undo_t *semu;
        if ((semu = semu_create(le2semu(le, semu_link)->sem, 0)) == NULL) {
            return -E_NO_MEM;
        }
        list_add(&(to->semu_list), &(semu->semu_link));
    }
    return 0;
}
Exemple #4
0
static sem_undo_t *
semu_list_search(list_entry_t *list, sem_t sem_id) {
    if (VALID_SEMID(sem_id)) {
        semaphore_t *sem = semid2sem(sem_id);
        list_entry_t *le = list;
        while ((le = list_next(le)) != list) {
            sem_undo_t *semu = le2semu(le, semu_link);
            if (semu->sem == sem) {
                list_del(le);
                list_add_after(list, le);
                return semu;
            }
        }
    }
    return NULL;
}