[Ocfs2-tools-commits] jlbec commits r297 - in trunk/libocfs2: .
include
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Thu Sep 30 10:45:39 CDT 2004
Author: jlbec
Date: 2004-09-30 10:45:37 -0500 (Thu, 30 Sep 2004)
New Revision: 297
Modified:
trunk/libocfs2/bitops.c
trunk/libocfs2/include/bitops.h
Log:
o Make find_set/find_clear work.
Modified: trunk/libocfs2/bitops.c
===================================================================
--- trunk/libocfs2/bitops.c 2004-09-30 00:40:51 UTC (rev 296)
+++ trunk/libocfs2/bitops.c 2004-09-30 15:45:37 UTC (rev 297)
@@ -81,3 +81,157 @@
#endif /* !_OCFS2_HAVE_ASM_BITOPS_ */
+#if !defined(_OCFS2_HAVE_ASM_FINDBIT_)
+#include <strings.h>
+
+int ocfs2_find_first_bit_set(void *addr, int size)
+{
+ unsigned char *cp = (unsigned char *) addr;
+ unsigned int res = 0;
+ int d0;
+ unsigned char tilde = ~0;
+ unsigned int mask = 0U | tilde;
+
+ if (!size)
+ return 0;
+
+ while ((size > res) && (*cp == 0)) {
+ cp++;
+ res += 8;
+ }
+ if (res >= size)
+ return size;
+ if ((res + 8) > size)
+ mask >>= 8 - (size - res);
+ d0 = ffs(*cp & mask);
+ if (d0 == 0)
+ return size;
+
+ return res + d0 - 1;
+}
+
+int ocfs2_find_first_bit_clear(void *addr, int size)
+{
+ unsigned char *cp = (unsigned char *) addr;
+ unsigned int res = 0;
+ int d0;
+ unsigned char tilde = ~0;
+ unsigned int mask = 0U | tilde;
+
+ if (!size)
+ return 0;
+
+ while ((size > res) && (*cp == tilde)) {
+ cp++;
+ res += 8;
+ }
+ if (res >= size)
+ return size;
+ if ((res + 8) > size)
+ mask >>= 8 - (size - res);
+ d0 = ffs(~(*cp & mask));
+ if (d0 == 0)
+ return size;
+
+ return res + d0 - 1;
+}
+
+int ocfs2_find_next_bit_set(void *addr, int size, int offset)
+{
+ unsigned char * p;
+ int set = 0, d0;
+ unsigned int bit = offset & 7, res = 0;
+ unsigned char tilde = ~0;
+ unsigned int mask = 0U | tilde;
+
+ res = offset >> 3;
+ p = ((unsigned char *) addr) + res;
+ res <<= 3;
+
+ if (bit) {
+ set = ffs(*p & ~((1 << bit) - 1));
+ if (set)
+ return (offset & ~7) + set - 1;
+ p++;
+ res += 8;
+ }
+ while ((size > res) && (*p == 0)) {
+ p++;
+ res += 8;
+ }
+ if (res >= size)
+ return size;
+ if ((res + 8) > size)
+ mask >>= 8 - (size - res);
+ d0 = ffs(*p & mask);
+ if (d0 == 0)
+ return size;
+
+ return (res + d0 - 1);
+}
+
+int ocfs2_find_next_bit_clear(void *addr, int size, int offset)
+{
+ unsigned char * p;
+ int set = 0, d0;
+ unsigned int bit = offset & 7, res = 0;
+ unsigned char tilde = ~0;
+ unsigned int mask = 0U | tilde;
+
+ res = offset >> 3;
+ p = ((unsigned char *) addr) + res;
+ res <<= 3;
+
+ if (bit) {
+ set = ffs(~*p & ~((1 << bit) - 1) & mask);
+ if (set)
+ return (offset & ~7) + set - 1;
+ p++;
+ res += 8;
+ }
+ while ((size > res) && (*p == tilde)) {
+ p++;
+ res += 8;
+ }
+ if (res >= size)
+ return size;
+ if ((res + 8) > size)
+ mask >>= 8 - (size - res);
+ d0 = ffs(~(*p & mask));
+ if (d0 == 0)
+ return size;
+
+ return (res + d0 - 1);
+}
+#endif
+
+
+#ifdef DEBUG_EXE
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main(int argc, char *argv[])
+{
+ char bitmap[8 * sizeof(unsigned long)];
+ int ret;
+ int size = sizeof(bitmap) * 8;
+
+ /* Test an arbitrary size (not byte bounded) */
+ memset(bitmap, 0, sizeof(bitmap));
+ ocfs2_set_bit(size - 1, bitmap);
+ ret = ocfs2_find_first_bit_set(bitmap, size - 3);
+ fprintf(stdout, "Pass1: first set %d (%s)\n", ret,
+ (ret == (size - 3)) ? "correct" : "incorrect");
+
+ memset(bitmap, 0xFF, sizeof(bitmap));
+ ocfs2_clear_bit(size - 1, bitmap);
+ ret = ocfs2_find_first_bit_clear(bitmap, size - 3);
+ fprintf(stdout, "Pass1: first clear %d (%s)\n", ret,
+ (ret == (size - 3)) ? "correct" : "incorrect");
+
+ /* XXX add more tests */
+ return 0;
+}
+#endif
+
Modified: trunk/libocfs2/include/bitops.h
===================================================================
--- trunk/libocfs2/include/bitops.h 2004-09-30 00:40:51 UTC (rev 296)
+++ trunk/libocfs2/include/bitops.h 2004-09-30 15:45:37 UTC (rev 297)
@@ -261,59 +261,16 @@
#endif /* __sparc__ */
-#if !defined(_OCFS2_HAVE_ASM_FINDBIT_)
-#include <strings.h>
-
-static inline int ocfs2_find_first_bit_set(void * addr, unsigned size)
-{
- char *cp = (unsigned char *) addr;
- int res = 0, d0;
-
- if (!size)
- return 0;
-
- while ((size > res) && (*cp == 0)) {
- cp++;
- res += 8;
- }
- d0 = ffs(*cp);
- if (d0 == 0)
- return size;
-
- return res + d0 - 1;
-}
-
-static inline int ocfs2_find_next_bit_set (void * addr, int size, int offset)
-{
- unsigned char * p;
- int set = 0, bit = offset & 7, res = 0, d0;
-
- res = offset >> 3;
- p = ((unsigned char *) addr) + res;
-
- if (bit) {
- set = ffs(*p & ~((1 << bit) - 1));
- if (set)
- return (offset & ~7) + set - 1;
- p++;
- res += 8;
- }
- while ((size > res) && (*p == 0)) {
- p++;
- res += 8;
- }
- d0 = ffs(*p);
- if (d0 == 0)
- return size;
-
- return (res + d0 - 1);
-}
-#endif
-
#ifndef _OCFS2_HAVE_ASM_BITOPS_
extern int ocfs2_set_bit(int nr,void * addr);
extern int ocfs2_clear_bit(int nr, void * addr);
extern int ocfs2_test_bit(int nr, const void * addr);
#endif
+#if !defined(_OCFS2_HAVE_ASM_FINDBIT_)
+extern int ocfs2_find_first_bit_set(void *addr, int size);
+extern int ocfs2_find_first_bit_clear(void *addr, int size);
+extern int ocfs2_find_next_bit_set(void *addr, int size, int offset);
+extern int ocfs2_find_next_bit_clear(void *addr, int size, int offset);
+#endif
More information about the Ocfs2-tools-commits
mailing list