Changeset 4fd61ba in mainline


Ignore:
Timestamp:
2006-04-30T19:08:14Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ea199e5
Parents:
0e00b8a
Message:

Fix a bug caused by an unsigned subtraction of bigger value from smaller value in bitmap implementation.
Fix wrong calculation of unaligned leading bits in bitmap implementation.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • generic/src/adt/bitmap.c

    r0e00b8a r4fd61ba  
    4040#include <align.h>
    4141#include <debug.h>
     42#include <macros.h>
    4243
    4344#define ALL_ONES        0xff
     
    6970        index_t aligned_start;
    7071        count_t lub;            /* leading unaligned bits */
    71         count_t tub;            /* trailing unaligned bits */
     72        count_t amb;            /* aligned middle bits */
     73        count_t tab;            /* trailing aligned bits */
    7274       
    7375        ASSERT(start + bits <= bitmap->bits);
    7476       
    7577        aligned_start = ALIGN_UP(start, 8);
    76         lub = aligned_start - start;
    77         tub = (bits - lub) % 8;
     78        lub = min(aligned_start - start, bits);
     79        amb = bits > lub ? bits - lub : 0;
     80        tab = amb % 8;
    7881       
    7982        if (lub) {
     
    8386                bitmap->map[start / 8] |= ~((1 << (8 - lub)) - 1);
    8487        }
    85         for (i = 0; i < (bits - lub) / 8; i++) {
     88        for (i = 0; i < amb / 8; i++) {
    8689                /*
    8790                 * The middle bits can be set byte by byte.
     
    8992                bitmap->map[aligned_start / 8 + i] = ALL_ONES;
    9093        }
    91         if (tub) {
     94        if (tab) {
    9295                /*
    93                  * Make sure to set any trailing unaligned bits.
     96                 * Make sure to set any trailing aligned bits.
    9497                 */
    95                 bitmap->map[aligned_start / 8 + i] |= (1 << tub) - 1;
     98                bitmap->map[aligned_start / 8 + i] |= (1 << tab) - 1;
    9699        }
    97100       
     
    109112        index_t aligned_start;
    110113        count_t lub;            /* leading unaligned bits */
    111         count_t tub;            /* trailing unaligned bits */
     114        count_t amb;            /* aligned middle bits */
     115        count_t tab;            /* trailing aligned bits */
    112116       
    113117        ASSERT(start + bits <= bitmap->bits);
    114118       
    115119        aligned_start = ALIGN_UP(start, 8);
    116         lub = aligned_start - start;
    117         tub = (bits - lub) % 8;
    118        
     120        lub = min(aligned_start - start, bits);
     121        amb = bits > lub ? bits - lub : 0;
     122        tab = amb % 8;
     123
    119124        if (lub) {
    120125                /*
     
    123128                bitmap->map[start / 8] &= (1 << (8 - lub)) - 1;
    124129        }
    125         for (i = 0; i < (bits - lub) / 8; i++) {
     130        for (i = 0; i < amb / 8; i++) {
    126131                /*
    127132                 * The middle bits can be cleared byte by byte.
     
    129134                bitmap->map[aligned_start / 8 + i] = ALL_ZEROES;
    130135        }
    131         if (tub) {
     136        if (tab) {
    132137                /*
    133                  * Make sure to clear any trailing unaligned bits.
     138                 * Make sure to clear any trailing aligned bits.
    134139                 */
    135                 bitmap->map[aligned_start / 8 + i] &= ~((1 << tub) - 1);
     140                bitmap->map[aligned_start / 8 + i] &= ~((1 << tab) - 1);
    136141        }
    137        
     142
    138143}
    139144
Note: See TracChangeset for help on using the changeset viewer.