Lines Matching refs:refcount
40 void ea_refcount_free(ext2_refcount_t refcount) in ea_refcount_free() argument
42 if (!refcount) in ea_refcount_free()
45 if (refcount->list) in ea_refcount_free()
46 ext2fs_free_mem(&refcount->list); in ea_refcount_free()
47 ext2fs_free_mem(&refcount); in ea_refcount_free()
52 ext2_refcount_t refcount; in ea_refcount_create() local
56 retval = ext2fs_get_memzero(sizeof(struct ea_refcount), &refcount); in ea_refcount_create()
62 refcount->size = size; in ea_refcount_create()
66 refcount->size, bytes); in ea_refcount_create()
68 retval = ext2fs_get_memzero(bytes, &refcount->list); in ea_refcount_create()
72 refcount->count = 0; in ea_refcount_create()
73 refcount->cursor = 0; in ea_refcount_create()
75 *ret = refcount; in ea_refcount_create()
79 ea_refcount_free(refcount); in ea_refcount_create()
87 static void refcount_collapse(ext2_refcount_t refcount) in refcount_collapse() argument
92 list = refcount->list; in refcount_collapse()
93 for (i = 0, j = 0; i < refcount->count; i++) { in refcount_collapse()
102 refcount->count, j); in refcount_collapse()
104 refcount->count = j; in refcount_collapse()
112 static struct ea_refcount_el *insert_refcount_el(ext2_refcount_t refcount, in insert_refcount_el() argument
120 if (refcount->count >= refcount->size) { in insert_refcount_el()
121 new_size = refcount->size + 100; in insert_refcount_el()
125 retval = ext2fs_resize_mem((size_t) refcount->size * in insert_refcount_el()
129 &refcount->list); in insert_refcount_el()
132 refcount->size = new_size; in insert_refcount_el()
134 num = (int) refcount->count - pos; in insert_refcount_el()
138 memmove(&refcount->list[pos+1], &refcount->list[pos], in insert_refcount_el()
141 refcount->count++; in insert_refcount_el()
142 el = &refcount->list[pos]; in insert_refcount_el()
154 static struct ea_refcount_el *get_refcount_el(ext2_refcount_t refcount, in get_refcount_el() argument
159 if (!refcount || !refcount->list) in get_refcount_el()
163 high = (int) refcount->count-1; in get_refcount_el()
164 if (create && ((refcount->count == 0) || in get_refcount_el()
165 (ea_key > refcount->list[high].ea_key))) { in get_refcount_el()
166 if (refcount->count >= refcount->size) in get_refcount_el()
167 refcount_collapse(refcount); in get_refcount_el()
169 return insert_refcount_el(refcount, ea_key, in get_refcount_el()
170 (unsigned) refcount->count); in get_refcount_el()
172 if (refcount->count == 0) in get_refcount_el()
175 if (refcount->cursor >= refcount->count) in get_refcount_el()
176 refcount->cursor = 0; in get_refcount_el()
177 if (ea_key == refcount->list[refcount->cursor].ea_key) in get_refcount_el()
178 return &refcount->list[refcount->cursor++]; in get_refcount_el()
184 if (ea_key == refcount->list[mid].ea_key) { in get_refcount_el()
185 refcount->cursor = mid+1; in get_refcount_el()
186 return &refcount->list[mid]; in get_refcount_el()
188 if (ea_key < refcount->list[mid].ea_key) in get_refcount_el()
198 if (refcount->count >= refcount->size) { in get_refcount_el()
199 refcount_collapse(refcount); in get_refcount_el()
200 if (refcount->count < refcount->size) in get_refcount_el()
203 return insert_refcount_el(refcount, ea_key, low); in get_refcount_el()
208 errcode_t ea_refcount_fetch(ext2_refcount_t refcount, ea_key_t ea_key, in ea_refcount_fetch() argument
213 el = get_refcount_el(refcount, ea_key, 0); in ea_refcount_fetch()
222 errcode_t ea_refcount_increment(ext2_refcount_t refcount, ea_key_t ea_key, in ea_refcount_increment() argument
227 el = get_refcount_el(refcount, ea_key, 1); in ea_refcount_increment()
237 errcode_t ea_refcount_decrement(ext2_refcount_t refcount, ea_key_t ea_key, in ea_refcount_decrement() argument
242 el = get_refcount_el(refcount, ea_key, 0); in ea_refcount_decrement()
253 errcode_t ea_refcount_store(ext2_refcount_t refcount, ea_key_t ea_key, in ea_refcount_store() argument
261 el = get_refcount_el(refcount, ea_key, ea_value ? 1 : 0); in ea_refcount_store()
268 size_t ext2fs_get_refcount_size(ext2_refcount_t refcount) in ext2fs_get_refcount_size() argument
270 if (!refcount) in ext2fs_get_refcount_size()
273 return refcount->size; in ext2fs_get_refcount_size()
276 void ea_refcount_intr_begin(ext2_refcount_t refcount) in ea_refcount_intr_begin() argument
278 refcount->cursor = 0; in ea_refcount_intr_begin()
281 ea_key_t ea_refcount_intr_next(ext2_refcount_t refcount, in ea_refcount_intr_next() argument
287 if (refcount->cursor >= refcount->count) in ea_refcount_intr_next()
289 list = refcount->list; in ea_refcount_intr_next()
290 if (list[refcount->cursor].ea_value) { in ea_refcount_intr_next()
292 *ret = list[refcount->cursor].ea_value; in ea_refcount_intr_next()
293 return list[refcount->cursor++].ea_key; in ea_refcount_intr_next()
295 refcount->cursor++; in ea_refcount_intr_next()
302 errcode_t ea_refcount_validate(ext2_refcount_t refcount, FILE *out) in ea_refcount_validate() argument
308 if (refcount->count > refcount->size) { in ea_refcount_validate()
312 for (i=1; i < refcount->count; i++) { in ea_refcount_validate()
313 if (refcount->list[i-1].ea_key >= refcount->list[i].ea_key) { in ea_refcount_validate()
317 (unsigned long long) refcount->list[i-1].ea_key, in ea_refcount_validate()
319 (unsigned long long) refcount->list[i].ea_key); in ea_refcount_validate()
375 ext2_refcount_t refcount; in main() local
387 retval = ea_refcount_create(size, &refcount); in main()
397 ea_refcount_free(refcount); in main()
398 refcount = 0; in main()
407 retval = ea_refcount_store(refcount, ea_key, arg); in main()
415 retval = ea_refcount_fetch(refcount, ea_key, &arg); in main()
427 retval = ea_refcount_increment(refcount, ea_key, &arg); in main()
439 retval = ea_refcount_decrement(refcount, ea_key, &arg); in main()
450 retval = ea_refcount_validate(refcount, stderr); in main()
458 ea_refcount_intr_begin(refcount); in main()
460 ea_key = ea_refcount_intr_next(refcount, &arg); in main()
469 refcount_collapse(refcount); in main()