sem_undo_t * semu_create(semaphore_t *sem, int value) { sem_undo_t *semu; if ((semu = kmalloc(sizeof(sem_undo_t))) != NULL) { if (sem == NULL && (sem = kmalloc(sizeof(semaphore_t))) != NULL) { sem_init(sem, value); } if (sem != NULL) { sem_count_inc(sem); semu->sem = sem; return semu; } kfree(semu); } return NULL; }
sem_undo_t* semu_create_with_address(semaphore_t *sem, uintptr_t addr, int value) { sem_undo_t *semu; if((semu = kmalloc(sizeof(sem_undo_t))) != NULL) { if(sem == NULL && (sem = kmalloc(sizeof(semaphore_t))) != NULL) { sem_init_with_address(sem, addr, value); } if(sem != NULL) { sem_count_inc(sem); semu->sem = sem; return semu; } kfree(semu); } return NULL; }