summaryrefslogtreecommitdiff
path: root/mysys/my_bitmap.c
diff options
context:
space:
mode:
authorunknown <sasha@mysql.sashanet.com>2001-12-12 18:55:33 -0700
committerunknown <sasha@mysql.sashanet.com>2001-12-12 18:55:33 -0700
commit9cbc19c8b49764d72c1e43ccd97f299c720b53ef (patch)
tree7eaf5681e41349d3135b099f195338bc5e4b85c9 /mysys/my_bitmap.c
parent77629c20230e92df2617ac4db24a12a5607af0da (diff)
downloadmariadb-git-9cbc19c8b49764d72c1e43ccd97f299c720b53ef.tar.gz
slave-skip-errors
added extra/mysql_install.c - will work on it in 4.0, but it does not hurt to have it sit in 3.23 tree for now since it will eventually be backported to 3.23 anyway Docs/manual.texi: documented slave-skip-errors updated change history extra/resolve_stack_dump.c: fixed wrong help message include/my_bitmap.h: bitmap code updates mysql-test/r/rpl_get_lock.result: test for a possible bug in release_lock() replication mysql-test/t/rpl_get_lock.test: test for possible bug in release_lock replication mysys/my_bitmap.c: bitmap code updates/clean-up sql/mysqld.cc: slave-skip-errors sql/slave.cc: slave-skip-errors sql/slave.h: slave skip errors
Diffstat (limited to 'mysys/my_bitmap.c')
-rw-r--r--mysys/my_bitmap.c52
1 files changed, 45 insertions, 7 deletions
diff --git a/mysys/my_bitmap.c b/mysys/my_bitmap.c
index f30298922df..ba0a5df95c6 100644
--- a/mysys/my_bitmap.c
+++ b/mysys/my_bitmap.c
@@ -26,14 +26,32 @@
#include "mysys_priv.h"
#include <my_bitmap.h>
#include <assert.h>
+#include <string.h>
-my_bool bitmap_init(MY_BITMAP *map, uint bitmap_size)
+inline void bitmap_lock(MY_BITMAP* map)
+{
+#ifdef THREAD
+ if (map->thread_safe)
+ pthread_mutex_lock(&map->mutex);
+#endif
+}
+
+inline void bitmap_unlock(MY_BITMAP* map)
+{
+#ifdef THREAD
+ if (map->thread_safe)
+ pthread_mutex_unlock(&map->mutex);
+#endif
+}
+
+my_bool bitmap_init(MY_BITMAP *map, uint bitmap_size, my_bool thread_safe)
{
if (!(map->bitmap=(uchar*) my_malloc((bitmap_size+7)/8,
MYF(MY_WME | MY_ZEROFILL))))
return 1;
dbug_assert(bitmap_size != ~(uint) 0);
#ifdef THREAD
+ map->thread_safe = thread_safe;
pthread_mutex_init(&map->mutex, MY_MUTEX_INIT_FAST);
#endif
map->bitmap_size=bitmap_size;
@@ -56,9 +74,9 @@ void bitmap_set_bit(MY_BITMAP *map, uint bitmap_bit)
{
if (bitmap_bit < map->bitmap_size)
{
- pthread_mutex_lock(&map->mutex);
+ bitmap_lock(map);
map->bitmap[bitmap_bit / 8] |= (1 << (bitmap_bit & 7));
- pthread_mutex_unlock(&map->mutex);
+ bitmap_unlock(map);
}
}
@@ -70,7 +88,7 @@ uint bitmap_set_next(MY_BITMAP *map)
uint bitmap_size=map->bitmap_size;
uint i;
- pthread_mutex_lock(&map->mutex);
+ bitmap_lock(map);
for (i=0; i < bitmap_size ; i++, bitmap++)
{
if (*bitmap != 0xff)
@@ -88,7 +106,7 @@ uint bitmap_set_next(MY_BITMAP *map)
break; /* Found bit */
}
}
- pthread_mutex_unlock(&map->mutex);
+ bitmap_unlock(map);
return bit_found;
}
@@ -97,9 +115,29 @@ void bitmap_clear_bit(MY_BITMAP *map, uint bitmap_bit)
{
if (bitmap_bit < map->bitmap_size)
{
- pthread_mutex_lock(&map->mutex);
+ bitmap_lock(map);
map->bitmap[bitmap_bit / 8] &= ~ (1 << (bitmap_bit & 7));
- pthread_mutex_unlock(&map->mutex);
+ bitmap_unlock(map);
}
}
+void bitmap_set_all(MY_BITMAP* map)
+{
+ bitmap_lock(map);
+ memset(map->bitmap, 0xff, (map->bitmap_size+7)/8);
+ bitmap_unlock(map);
+}
+
+my_bool bitmap_is_set(MY_BITMAP* map, uint bitmap_bit)
+{
+ return (bitmap_bit < map->bitmap_size) ?
+ (map->bitmap[bitmap_bit / 8] & (1 << (bitmap_bit & 7))) :
+ 0;
+}
+
+void bitmap_clear_all(MY_BITMAP* map)
+{
+ bitmap_lock(map);
+ bzero(map->bitmap,(map->bitmap_size+7)/8);
+ bitmap_unlock(map);
+}