[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