#include <limits.h>
#include "mutex.h"
+#include "arch/arch.h"
#define MP_SAFE /* define to make thread safe */
#define SMALLOC_REDZONE /* define to detect memory corruption */
blocks_iter(pool, pool_idx, idx, nr_blocks, mask_clear);
}
-static inline int __ffs(int word)
-{
- int r = 0;
-
- if (!(word & 0xffff)) {
- word >>= 16;
- r += 16;
- }
- if (!(word & 0xff)) {
- word >>= 8;
- r += 8;
- }
- if (!(word & 0xf)) {
- word >>= 4;
- r += 4;
- }
- if (!(word & 3)) {
- word >>= 2;
- r += 2;
- }
- if (!(word & 1)) {
- word >>= 1;
- r += 1;
- }
-
- return r;
-}
-
static int find_next_zero(int word, int start)
{
assert(word != -1U);
word >>= (start + 1);
- return __ffs(~word) + start + 1;
+ return ffz(word) + start + 1;
}
static int add_pool(struct pool *pool, unsigned int alloc_size)
fio_mutex_remove(lock);
}
+#ifdef SMALLOC_REDZONE
static void fill_redzone(struct block_hdr *hdr)
{
-#ifdef SMALLOC_REDZONE
unsigned int *postred = (void *) hdr + hdr->size - sizeof(unsigned int);
hdr->prered = SMALLOC_PRE_RED;
*postred = SMALLOC_POST_RED;
-#endif
}
static void sfree_check_redzone(struct block_hdr *hdr)
{
-#ifdef SMALLOC_REDZONE
unsigned int *postred = (void *) hdr + hdr->size - sizeof(unsigned int);
if (hdr->prered != SMALLOC_PRE_RED) {
hdr, *postred, SMALLOC_POST_RED);
assert(0);
}
-#endif
+}
+#else
+static void fill_redzone(struct block_hdr *hdr)
+{
}
+static void sfree_check_redzone(struct block_hdr *hdr)
+{
+}
+#endif
+
static void sfree_pool(struct pool *pool, void *ptr)
{
struct block_hdr *hdr;
static void *smalloc_pool(struct pool *pool, unsigned int size)
{
- struct block_hdr *hdr;
- unsigned int alloc_size;
+ unsigned int alloc_size = size + sizeof(struct block_hdr);
void *ptr;
- alloc_size = size + sizeof(*hdr);
#ifdef SMALLOC_REDZONE
alloc_size += sizeof(unsigned int);
#endif
ptr = __smalloc_pool(pool, alloc_size);
- if (!ptr)
- return NULL;
+ if (ptr) {
+ struct block_hdr *hdr = ptr;
- hdr = ptr;
- hdr->size = alloc_size;
- ptr += sizeof(*hdr);
+ hdr->size = alloc_size;
+ fill_redzone(hdr);
- fill_redzone(hdr);
+ ptr += sizeof(*hdr);
+ memset(ptr, 0, size);
+ }
- memset(ptr, 0, size);
return ptr;
}