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)); } }
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; }
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; }
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; }