Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/adt/bitmap.h

    rf72906c r86733f3  
    4444        size_t elements;
    4545        uint8_t *bits;
    46         size_t next_fit;
     46       
     47        size_t block_size;
     48        uint8_t *blocks;
    4749} bitmap_t;
    4850
     
    5052    unsigned int value)
    5153{
    52         if (element >= bitmap->elements)
    53                 return;
    54        
    55         size_t byte = element / BITMAP_ELEMENT;
    56         uint8_t mask = 1 << (element & BITMAP_REMAINER);
    57        
    58         if (value) {
    59                 bitmap->bits[byte] |= mask;
    60         } else {
    61                 bitmap->bits[byte] &= ~mask;
    62                 bitmap->next_fit = byte;
     54        if (element < bitmap->elements) {
     55                /*
     56                 * The 2nd level bitmap is conservative.
     57                 * Make sure we update it properly.
     58                 */
     59               
     60                if (value) {
     61                        bitmap->bits[element / BITMAP_ELEMENT] |=
     62                            (1 << (element & BITMAP_REMAINER));
     63                } else {
     64                        bitmap->bits[element / BITMAP_ELEMENT] &=
     65                            ~(1 << (element & BITMAP_REMAINER));
     66                       
     67                        if (bitmap->block_size > 0) {
     68                                size_t block = element / bitmap->block_size;
     69                               
     70                                bitmap->blocks[block / BITMAP_ELEMENT] &=
     71                                    ~(1 << (block & BITMAP_REMAINER));
     72                        }
     73                }
    6374        }
    6475}
     
    6980                return 0;
    7081       
    71         size_t byte = element / BITMAP_ELEMENT;
    72         uint8_t mask = 1 << (element & BITMAP_REMAINER);
    73        
    74         return !!((bitmap->bits)[byte] & mask);
     82        return !!((bitmap->bits)[element / BITMAP_ELEMENT] &
     83            (1 << (element & BITMAP_REMAINER)));
    7584}
    7685
    77 extern size_t bitmap_size(size_t);
    78 extern void bitmap_initialize(bitmap_t *, size_t, void *);
     86extern size_t bitmap_size(size_t, size_t);
     87extern void bitmap_initialize(bitmap_t *, size_t, size_t, void *);
    7988
    8089extern void bitmap_set_range(bitmap_t *, size_t, size_t);
    8190extern void bitmap_clear_range(bitmap_t *, size_t, size_t);
    8291
    83 extern int bitmap_allocate_range(bitmap_t *, size_t, size_t, size_t, size_t,
    84     size_t *);
     92extern int bitmap_allocate_range(bitmap_t *, size_t, size_t, size_t, size_t *);
     93extern void bitmap_free_range(bitmap_t *, size_t, size_t);
    8594extern void bitmap_copy(bitmap_t *, bitmap_t *, size_t);
    8695
Note: See TracChangeset for help on using the changeset viewer.