Lines Matching defs:pool

626  * ID pool code.  We use this to generate unique structure identifiers without
630 * A pool of IDs is a pool of 16 bit numbers. It is implemented as a bitmap.
637 * The pools start with a size of 8 bytes or 64 IDs. Each time the pool runs
640 * means that a pool can have a maximum number of 65534 IDs available.
645 idm_idpool_t *pool)
650 ASSERT(pool->id_magic == IDM_IDPOOL_MAGIC);
652 new_size = pool->id_size * 2;
657 bcopy(pool->id_pool, new_pool, pool->id_size / 8);
658 kmem_free(pool->id_pool, pool->id_size / 8);
659 pool->id_pool = new_pool;
660 pool->id_free_counter += new_size - pool->id_size;
661 pool->id_max_free_counter += new_size - pool->id_size;
662 pool->id_size = new_size;
663 pool->id_idx_msk = (new_size / 8) - 1;
666 pool->id_pool[pool->id_idx_msk] = 0x80;
667 pool->id_free_counter--;
668 pool->id_max_free_counter--;
679 * This function initializes the pool structure provided.
683 idm_idpool_create(idm_idpool_t *pool)
686 ASSERT(pool->id_magic != IDM_IDPOOL_MAGIC);
688 pool->id_size = IDM_IDPOOL_MIN_SIZE;
689 pool->id_idx_msk = (IDM_IDPOOL_MIN_SIZE / 8) - 1;
690 pool->id_free_counter = IDM_IDPOOL_MIN_SIZE - 1;
691 pool->id_max_free_counter = IDM_IDPOOL_MIN_SIZE - 1;
692 pool->id_bit = 0x02;
693 pool->id_bit_idx = 1;
694 pool->id_idx = 0;
695 pool->id_pool = (uint8_t *)kmem_alloc((IDM_IDPOOL_MIN_SIZE / 8),
697 bzero(pool->id_pool, (IDM_IDPOOL_MIN_SIZE / 8));
699 pool->id_pool[0] = 0x01; /* id 0 made unavailable */
700 mutex_init(&pool->id_mutex, NULL, MUTEX_DEFAULT, NULL);
701 pool->id_magic = IDM_IDPOOL_MAGIC;
709 * pool provided.
713 idm_idpool_destroy(idm_idpool_t *pool)
715 ASSERT(pool->id_magic == IDM_IDPOOL_MAGIC);
716 ASSERT(pool->id_free_counter == pool->id_max_free_counter);
717 pool->id_magic = (uint32_t)~IDM_IDPOOL_MAGIC;
718 mutex_destroy(&pool->id_mutex);
719 kmem_free(pool->id_pool, (size_t)(pool->id_size / 8));
725 * This function allocates an ID from the pool provided.
728 idm_idpool_alloc(idm_idpool_t *pool, uint16_t *id)
735 ASSERT(pool->id_magic == IDM_IDPOOL_MAGIC);
737 mutex_enter(&pool->id_mutex);
738 if ((pool->id_free_counter == 0) && idm_idpool_increment(pool)) {
739 mutex_exit(&pool->id_mutex);
743 i = pool->id_size;
745 bit = pool->id_bit;
746 bit_idx = pool->id_bit_idx;
747 byte = pool->id_pool[pool->id_idx];
754 pool->id_pool[pool->id_idx] |= bit;
755 *id = (uint16_t)(pool->id_idx * 8 + (uint32_t)bit_idx);
756 pool->id_free_counter--;
757 pool->id_bit = bit;
758 pool->id_bit_idx = bit_idx;
759 mutex_exit(&pool->id_mutex);
762 pool->id_bit = 1;
763 pool->id_bit_idx = 0;
764 pool->id_idx++;
765 pool->id_idx &= pool->id_idx_msk;
773 mutex_exit(&pool->id_mutex);
783 idm_idpool_free(idm_idpool_t *pool, uint16_t id)
785 ASSERT(pool->id_magic == IDM_IDPOOL_MAGIC);
789 mutex_enter(&pool->id_mutex);
790 if (pool->id_pool[id >> 3] & (1 << (id & 7))) {
791 pool->id_pool[id >> 3] &= ~(1 << (id & 7));
792 pool->id_free_counter++;
793 ASSERT(pool->id_free_counter <= pool->id_max_free_counter);
794 mutex_exit(&pool->id_mutex);
799 mutex_exit(&pool->id_mutex);
806 * ID pool works with 16-bit identifiers right now. That should