From 50992fabde30198d9dfcd649e3094e49db332eed Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 27 Apr 2026 00:04:48 -0300 Subject: [PATCH] bitmap: fix bitmap_find_first_set --- kernel-src/lib/bitmap.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/kernel-src/lib/bitmap.c b/kernel-src/lib/bitmap.c index 8b296466..86aa4b3d 100644 --- a/kernel-src/lib/bitmap.c +++ b/kernel-src/lib/bitmap.c @@ -59,17 +59,18 @@ bool bitmap_get(bitmap_t *bitmap, long idx) { } long bitmap_find_first_set(bitmap_t *bitmap) { - size_t loop_size = ROUND_UP(bitmap->size, sizeof(*bitmap->data)) / sizeof(*bitmap->data); - - long offset = -1; + size_t bits_per_long = sizeof(*bitmap->data) * 8; + size_t loop_size = ROUND_UP(bitmap->size, bits_per_long) / bits_per_long; for (size_t i = 0; i < loop_size; ++i) { - if (bitmap->data[i] == 0) + unsigned long word = bitmap->data[i]; + if (word == 0) continue; - offset = i * sizeof(*bitmap->data) + __builtin_ctz(bitmap->data[i]); - break; + long offset = i * bits_per_long + __builtin_ctzl(word); + if (offset < bitmap->size) + return offset; } - return offset; + return -1; }