pike.git/
src/
block_allocator.c
Branch:
Tag:
Non-build tags
All tags
No tags
2014-12-04
2014-12-04 19:24:11 by Arne Goedeke <el@laramies.com>
c166a3aa7752fdf2a2a2036b00f27a7cd28f7083 (
57
lines) (+
22
/-
35
)
[
Show
|
Annotate
]
Branch:
bill/master_archive_support
block_allocator: fixed ba_walk and some cleanup
354:
size_t length; bv_int_t * v; };
-
#ifdef BA_DEBUG
-
static INLINE void bv_print(struct bitvector * bv) {
-
size_t i;
-
for (i = 0; i < bv->length; i++) {
-
fprintf(stderr, "%d", bv_get(bv, i));
-
}
-
fprintf(stderr, "\n");
-
}
-
#endif
+
static INLINE void bv_set_vector(struct bitvector * bv, void * p) { bv->v = (bv_int_t*)p;
396:
bv_int_t * _v = bv->v + c; bv_int_t V = *_v & (~BV_NIL << bit);
-
#ifdef BA_DEBUG
-
//bv_print(bv);
-
#endif
-
+
bit = c * BV_LENGTH; while (!(V)) { if (bit >= bv->length) {
416:
return bit; }
+
#ifdef BA_DEBUG
+
static INLINE void bv_print(struct bitvector * bv) {
+
size_t i;
+
for (i = 0; i < bv->length; i++) {
+
fprintf(stderr, "%d", bv_get(bv, i));
+
}
+
fprintf(stderr, "\n");
+
}
+
#endif
+
struct ba_block_header * ba_sort_list(const struct ba_page * p, struct ba_block_header * b, const struct ba_layout * l) {
423:
size_t i, j; struct ba_block_header ** t = &b;
-
#ifdef BA_DEBUG
-
fprintf(stderr, "sorting max %llu blocks\n",
-
(unsigned long long)l->blocks);
-
#endif
+
v.length = l->blocks; i = bv_byte_length(&v); /* we should probably reuse an area for this.
439:
*/ while (b) { unsigned INT32 n = ba_block_number(l, p, b);
-
#ifdef BA_DEBUG
-
//fprintf(stderr, "block %llu is free\n", (long long unsigned)n);
-
#endif
+
bv_set(&v, n, 1); if (b->next == BA_ONE) { v.length = n+1;
449:
} else b = b->next; }
-
#ifdef BA_DEBUG
-
//bv_print(&v);
-
#endif
-
+
/* * Handle consecutive free blocks in the end, those * we dont need anyway.
463:
v.length = i+1; }
-
#ifdef BA_DEBUG
-
//bv_print(&v);
-
#endif
-
+
j = 0; /*
527:
struct ba_iterator it; unsigned INT32 i;
+
it.l = ba_get_layout(a, 0);
+
if (!a->size) return; for (i = 0; i < a->size; i++) { struct ba_page * p = a->pages[i]; if (p && p->h.used) {
-
struct ba_block_header * free_list
= p->h.first;
-
struct ba_block_header
* free_block
= free_list
;
+
struct ba_block_header * free_list
,
* free_block;
+
ba_list_defined(a, p->h.first);
-
/* we fake an allocation to prevent the page from being freed during iteration */
-
p->h.used ++;
-
+
if (!(p->h.flags & BA_FLAG_SORTED)) {
-
it.l = ba_get_layout(a, i);
+
p->h.first = ba_sort_list(p, p->h.first, &it.l); p->h.flags |= BA_FLAG_SORTED; }
-
+
/* we fake an allocation to prevent the page from being freed during iteration */
+
p->h.used ++;
-
+
free_list = p->h.first;
+
free_block = free_list;
+
it.cur = BA_BLOCKN(it.l, p, 0); while(1) { if (free_block == NULL) { it.end = ((char*)BA_LASTBLOCK(it.l, p) + it.l.block_size);
-
if ((char*)it.end != (char*)it.cur)
+
if ((char*)it.end != (char*)it.cur)
{
cb(&it, data);
-
+
}
break; } else if (free_block == BA_ONE) { /* all consecutive blocks are free, so we are dont */