| 72 | } |
| 73 | |
| 74 | uint64_t |
| 75 | unique_insert(uint64_t value) |
| 76 | { |
| 77 | avl_index_t idx; |
| 78 | unique_t *un = kmem_alloc(sizeof (unique_t), KM_SLEEP); |
| 79 | |
| 80 | un->un_value = value; |
| 81 | |
| 82 | mutex_enter(&unique_mtx); |
| 83 | while (un->un_value == 0 || un->un_value & ~UNIQUE_MASK || |
| 84 | avl_find(&unique_avl, un, &idx)) { |
| 85 | mutex_exit(&unique_mtx); |
| 86 | (void) random_get_pseudo_bytes((void*)&un->un_value, |
| 87 | sizeof (un->un_value)); |
| 88 | un->un_value &= UNIQUE_MASK; |
| 89 | mutex_enter(&unique_mtx); |
| 90 | } |
| 91 | |
| 92 | avl_insert(&unique_avl, un, idx); |
| 93 | mutex_exit(&unique_mtx); |
| 94 | |
| 95 | return (un->un_value); |
| 96 | } |
| 97 | |
| 98 | void |
| 99 | unique_remove(uint64_t value) |
no test coverage detected