summaryrefslogtreecommitdiff
path: root/mysys/my_bitmap.c
diff options
context:
space:
mode:
authorserg@serg.mylan <>2003-10-30 19:17:57 +0100
committerserg@serg.mylan <>2003-10-30 19:17:57 +0100
commit9c4049ad125e46eb89fb97628b796a7cf07e73f3 (patch)
treee29f3d04a40a0f1438871abcf54eceb9de6a07e4 /mysys/my_bitmap.c
parenteb93b6b81a51bb2bea93b5907d85559c579a4a54 (diff)
downloadmariadb-git-9c4049ad125e46eb89fb97628b796a7cf07e73f3.tar.gz
Bitmap post-review fixes
Diffstat (limited to 'mysys/my_bitmap.c')
-rw-r--r--mysys/my_bitmap.c38
1 files changed, 24 insertions, 14 deletions
diff --git a/mysys/my_bitmap.c b/mysys/my_bitmap.c
index af9b3843060..ba4bbde4e3e 100644
--- a/mysys/my_bitmap.c
+++ b/mysys/my_bitmap.c
@@ -16,7 +16,16 @@
/*
Handling of uchar arrays as large bitmaps.
- We assume that the size of the used bitmap is less than ~(uint) 0
+
+ API limitations (or, rather asserted safety assumptions,
+ to encourage correct programming)
+
+ * the size of the used bitmap is less than ~(uint) 0
+ * it's a multiple of 8 (for efficiency reasons)
+ * when arguments are a bitmap and a bit number, the number
+ must be within bitmap size
+ * bitmap_set_prefix() is an exception - one can use ~0 to set all bits
+ * when both arguments are bitmaps, they must be of the same size
TODO:
Make assembler THREAD safe versions of these using test-and-set instructions
@@ -45,11 +54,11 @@ inline void bitmap_unlock(MY_BITMAP *map)
my_bool bitmap_init(MY_BITMAP *map, uchar *buf, uint bitmap_size, my_bool thread_safe)
{
- // for efficiency reasons - MY_BITMAP is heavily used
DBUG_ASSERT((bitmap_size & 7) == 0);
bitmap_size/=8;
if (!(map->bitmap=buf) &&
- !(map->bitmap=(uchar*)my_malloc(bitmap_size + sizeof(pthread_mutex_t),
+ !(map->bitmap=(uchar*)my_malloc(bitmap_size +
+ (thread_safe ? sizeof(pthread_mutex_t) : 0),
MYF(MY_WME | MY_ZEROFILL))))
return 1;
map->bitmap_size=bitmap_size;
@@ -128,7 +137,8 @@ void bitmap_set_prefix(MY_BITMAP *map, uint prefix_size)
{
uint prefix_bytes, prefix_bits;
- DBUG_ASSERT(map->bitmap);
+ DBUG_ASSERT(map->bitmap &&
+ (prefix_size <= map->bitmap_size*8 || prefix_size == ~0));
bitmap_lock(map);
set_if_smaller(prefix_size, map->bitmap_size*8);
if ((prefix_bytes= prefix_size / 8))
@@ -150,7 +160,7 @@ void bitmap_set_all(MY_BITMAP *map)
bitmap_set_prefix(map, ~0);
}
-my_bool bitmap_is_prefix(MY_BITMAP *map, uint prefix_size)
+my_bool bitmap_is_prefix(const MY_BITMAP *map, uint prefix_size)
{
uint prefix_bits= prefix_size & 7, res= 0;
uchar *m= map->bitmap, *end_prefix= map->bitmap+prefix_size/8,
@@ -167,7 +177,7 @@ my_bool bitmap_is_prefix(MY_BITMAP *map, uint prefix_size)
goto ret;
while (m < end)
- if (m++ != 0)
+ if (*m++ != 0)
goto ret;
res=1;
@@ -176,23 +186,23 @@ ret:
return res;
}
-my_bool bitmap_is_clear_all(MY_BITMAP *map)
+my_bool bitmap_is_clear_all(const MY_BITMAP *map)
{
return bitmap_is_prefix(map, 0);
}
-my_bool bitmap_is_set_all(MY_BITMAP *map)
+my_bool bitmap_is_set_all(const MY_BITMAP *map)
{
return bitmap_is_prefix(map, map->bitmap_size*8);
}
-my_bool bitmap_is_set(MY_BITMAP *map, uint bitmap_bit)
+my_bool bitmap_is_set(const MY_BITMAP *map, uint bitmap_bit)
{
DBUG_ASSERT(map->bitmap && bitmap_bit < map->bitmap_size*8);
return map->bitmap[bitmap_bit / 8] & (1 << (bitmap_bit & 7));
}
-my_bool bitmap_is_subset(MY_BITMAP *map1, MY_BITMAP *map2)
+my_bool bitmap_is_subset(const MY_BITMAP *map1, const MY_BITMAP *map2)
{
uint length, res=0;
uchar *m1=map1->bitmap, *m2=map2->bitmap, *end;
@@ -215,7 +225,7 @@ ret:
return res;
}
-my_bool bitmap_cmp(MY_BITMAP *map1, MY_BITMAP *map2)
+my_bool bitmap_cmp(const MY_BITMAP *map1, const MY_BITMAP *map2)
{
uint res;
@@ -231,7 +241,7 @@ my_bool bitmap_cmp(MY_BITMAP *map1, MY_BITMAP *map2)
return res;
}
-void bitmap_intersect(MY_BITMAP *map, MY_BITMAP *map2)
+void bitmap_intersect(MY_BITMAP *map, const MY_BITMAP *map2)
{
uchar *to=map->bitmap, *from=map2->bitmap, *end;
@@ -249,7 +259,7 @@ void bitmap_intersect(MY_BITMAP *map, MY_BITMAP *map2)
bitmap_unlock(map);
}
-void bitmap_subtract(MY_BITMAP *map, MY_BITMAP *map2)
+void bitmap_subtract(MY_BITMAP *map, const MY_BITMAP *map2)
{
uchar *to=map->bitmap, *from=map2->bitmap, *end;
@@ -267,7 +277,7 @@ void bitmap_subtract(MY_BITMAP *map, MY_BITMAP *map2)
bitmap_unlock(map);
}
-void bitmap_union(MY_BITMAP *map, MY_BITMAP *map2)
+void bitmap_union(MY_BITMAP *map, const MY_BITMAP *map2)
{
uchar *to=map->bitmap, *from=map2->bitmap, *end;