2 * Copyright 2004-2008, François Revol, <revol@free.fr>.
3 * Distributed under the terms of the MIT License.
8 #include <KernelExport.h>
11 /* primary type for the bitmap */
14 #define BM_BYTE(p, vnid) (p->bitmap[(vnid % p->bmsize) / sizeof(BMT)])
15 #define BM_ISSET(p, vnid) (BM_BYTE(p, vnid) & (1 << (p->nextvnid % sizeof(BMT))))
16 #define BM_SET(p, vnid) (BM_BYTE(p, vnid) |= (1 << (p->nextvnid % sizeof(BMT))))
17 #define BM_UNSET(p, vnid) (BM_BYTE(p, vnid) &= ~(1 << (p->nextvnid % sizeof(BMT))))
19 status_t
vnidpool_alloc(struct vnidpool
**pool
, size_t size
)
26 size
= (size
+ sizeof(BMT
) - 1) / sizeof(BMT
);
28 p
= malloc(sizeof(struct vnidpool
) + size
/ sizeof(BMT
));
31 new_lock(&p
->lock
, "vnidpool lock");
33 p
->bitmap
= (BMT
*)(p
+ 1);
35 memset(p
->bitmap
, 0, size
/ sizeof(BMT
));
36 dprintf("vnidpool_alloc: pool @ %p, bitmap @ %p, size %ld\n", p
, p
->bitmap
, p
->bmsize
);
41 status_t
vnidpool_free(struct vnidpool
*pool
) {
43 dprintf("vnidpool_free: pool @ %p\n", pool
);
46 if (LOCK(&pool
->lock
) < B_OK
)
48 /* make sure no vnid is left in use */
49 for (i
= 0; i
< (pool
->bmsize
% sizeof(BMT
)); i
++) {
51 dprintf("WARNING: vnidpool_free called with vnids still in use!!!\n");
52 //panic("vnidpool_free: vnids still in use");
54 free_lock(&pool
->lock
);
59 status_t
vnidpool_get(struct vnidpool
*pool
, ino_t
*vnid
)
61 status_t err
= B_ERROR
;
65 if (LOCK(&pool
->lock
) < B_OK
)
67 for (i
= 0; BM_ISSET(pool
, pool
->nextvnid
) && i
< pool
->bmsize
; pool
->nextvnid
++, i
++) {
72 if (BM_ISSET(pool
, pool
->nextvnid
))
75 BM_SET(pool
, pool
->nextvnid
);
76 *vnid
= pool
->nextvnid
++;
83 status_t
vnidpool_put(struct vnidpool
*pool
, ino_t vnid
)
85 status_t err
= B_ERROR
;
88 if (LOCK(&pool
->lock
) < B_OK
)
90 if (!BM_ISSET(pool
, vnid
))