Lines Matching refs:buf
40 util_idalloc_resize(struct util_idalloc *buf, unsigned new_num_elements)
42 if (new_num_elements > buf->num_elements) {
43 buf->data = realloc(buf->data, new_num_elements * sizeof(*buf->data));
44 memset(&buf->data[buf->num_elements], 0,
45 (new_num_elements - buf->num_elements) * sizeof(*buf->data));
46 buf->num_elements = new_num_elements;
51 util_idalloc_init(struct util_idalloc *buf, unsigned initial_num_ids)
53 memset(buf, 0, sizeof(*buf));
55 util_idalloc_resize(buf, DIV_ROUND_UP(initial_num_ids, 32));
59 util_idalloc_fini(struct util_idalloc *buf)
61 if (buf->data)
62 free(buf->data);
66 util_idalloc_alloc(struct util_idalloc *buf)
68 unsigned num_elements = buf->num_elements;
70 for (unsigned i = buf->lowest_free_idx; i < num_elements; i++) {
71 if (buf->data[i] == 0xffffffff)
74 unsigned bit = ffs(~buf->data[i]) - 1;
75 buf->data[i] |= 1u << bit;
76 buf->lowest_free_idx = i;
81 util_idalloc_resize(buf, MAX2(num_elements, 1) * 2);
83 buf->lowest_free_idx = num_elements;
84 buf->data[num_elements] |= 1;
89 find_free_block(struct util_idalloc *buf, unsigned start)
91 for (unsigned i = start; i < buf->num_elements; i++) {
92 if (!buf->data[i])
95 return buf->num_elements;
100 util_idalloc_alloc_range(struct util_idalloc *buf, unsigned num)
103 return util_idalloc_alloc(buf);
106 unsigned num_elements = buf->num_elements;
107 unsigned base = find_free_block(buf, buf->lowest_free_idx);
112 i < num_elements && i - base < num_alloc && !buf->data[i]; i++);
121 base = !buf->data[i] ? i : i + 1;
125 util_idalloc_resize(buf, num_elements * 2 + num_alloc);
130 buf->data[i] = 0xffffffff;
132 buf->data[base + num_alloc - 1] |= BITFIELD_MASK(num % 32);
134 if (buf->lowest_free_idx == base)
135 buf->lowest_free_idx = base + num / 32;
139 assert(util_idalloc_exists(buf, base * 32 + i));
145 util_idalloc_free(struct util_idalloc *buf, unsigned id)
147 assert(id / 32 < buf->num_elements);
149 buf->lowest_free_idx = MIN2(idx, buf->lowest_free_idx);
150 buf->data[idx] &= ~(1 << (id % 32));
154 util_idalloc_reserve(struct util_idalloc *buf, unsigned id)
156 if (id / 32 >= buf->num_elements)
157 util_idalloc_resize(buf, (id / 32 + 1) * 2);
158 buf->data[id / 32] |= 1u << (id % 32);
162 util_idalloc_mt_init(struct util_idalloc_mt *buf,
165 simple_mtx_init(&buf->mutex, mtx_plain);
166 util_idalloc_init(&buf->buf, initial_num_ids);
167 buf->skip_zero = skip_zero;
170 ASSERTED unsigned zero = util_idalloc_alloc(&buf->buf);
177 util_idalloc_mt_init_tc(struct util_idalloc_mt *buf)
179 util_idalloc_mt_init(buf, 1 << 16, true);
183 util_idalloc_mt_fini(struct util_idalloc_mt *buf)
185 util_idalloc_fini(&buf->buf);
186 simple_mtx_destroy(&buf->mutex);
190 util_idalloc_mt_alloc(struct util_idalloc_mt *buf)
192 simple_mtx_lock(&buf->mutex);
193 unsigned id = util_idalloc_alloc(&buf->buf);
194 simple_mtx_unlock(&buf->mutex);
199 util_idalloc_mt_free(struct util_idalloc_mt *buf, unsigned id)
201 if (id == 0 && buf->skip_zero)
204 simple_mtx_lock(&buf->mutex);
205 util_idalloc_free(&buf->buf, id);
206 simple_mtx_unlock(&buf->mutex);