Allow ':' in filenames
[fio.git] / smalloc.c
index 1e72068541bac82449eb9f13dc3b2cd790247768..3dd1b4960dd9f15186399432800412fa1c45255d 100644 (file)
--- a/smalloc.c
+++ b/smalloc.c
 #include "mutex.h"
 #include "arch/arch.h"
 
-#define MP_SAFE                        /* define to make thread safe */
 #define SMALLOC_REDZONE                /* define to detect memory corruption */
 
 #define SMALLOC_BPB    32      /* block size, bytes-per-bit in bitmap */
 #define SMALLOC_BPI    (sizeof(unsigned int) * 8)
 #define SMALLOC_BPL    (SMALLOC_BPB * SMALLOC_BPI)
 
-#define INITIAL_SIZE   1024*1024       /* new pool size */
+#define INITIAL_SIZE   8192*1024       /* new pool size */
 #define MAX_POOLS      128             /* maximum number of pools to setup */
 
 #define SMALLOC_PRE_RED                0xdeadbeefU
 #define SMALLOC_POST_RED       0x5aa55aa5U
 
 unsigned int smalloc_pool_size = INITIAL_SIZE;
+const int int_mask = sizeof(int) - 1;
 
 struct pool {
        struct fio_mutex *lock;                 /* protects this pool */
@@ -54,38 +54,32 @@ static struct fio_mutex *lock;
 
 static inline void pool_lock(struct pool *pool)
 {
-       if (pool->lock)
-               fio_mutex_down(pool->lock);
+       fio_mutex_down(pool->lock);
 }
 
 static inline void pool_unlock(struct pool *pool)
 {
-       if (pool->lock)
-               fio_mutex_up(pool->lock);
+       fio_mutex_up(pool->lock);
 }
 
 static inline void global_read_lock(void)
 {
-       if (lock)
-               fio_mutex_down_read(lock);
+       fio_mutex_down_read(lock);
 }
 
 static inline void global_read_unlock(void)
 {
-       if (lock)
-               fio_mutex_up_read(lock);
+       fio_mutex_up_read(lock);
 }
 
 static inline void global_write_lock(void)
 {
-       if (lock)
-               fio_mutex_down_write(lock);
+       fio_mutex_down_write(lock);
 }
 
 static inline void global_write_unlock(void)
 {
-       if (lock)
-               fio_mutex_up_write(lock);
+       fio_mutex_up_write(lock);
 }
 
 static inline int ptr_valid(struct pool *pool, void *ptr)
@@ -217,11 +211,9 @@ static int add_pool(struct pool *pool, unsigned int alloc_size)
        pool->map = ptr;
        pool->bitmap = (void *) ptr + (pool->nr_blocks * SMALLOC_BPL);
 
-#ifdef MP_SAFE
        pool->lock = fio_mutex_init(1);
        if (!pool->lock)
                goto out_unlink;
-#endif
 
        /*
         * Unlink pool file now. It wont get deleted until the fd is closed,
@@ -247,9 +239,7 @@ void sinit(void)
 {
        int ret;
 
-#ifdef MP_SAFE
        lock = fio_mutex_rw_init();
-#endif
        ret = add_pool(&mp[0], INITIAL_SIZE);
        assert(!ret);
 }
@@ -279,9 +269,19 @@ void scleanup(void)
 }
 
 #ifdef SMALLOC_REDZONE
+static void *postred_ptr(struct block_hdr *hdr)
+{
+       unsigned long ptr;
+
+       ptr = (unsigned long) hdr + hdr->size - sizeof(unsigned int);
+       ptr = (ptr + int_mask) & ~int_mask;
+
+       return (void *) ptr;
+}
+
 static void fill_redzone(struct block_hdr *hdr)
 {
-       unsigned int *postred = (void *) hdr + hdr->size - sizeof(unsigned int);
+       unsigned int *postred = postred_ptr(hdr);
 
        hdr->prered = SMALLOC_PRE_RED;
        *postred = SMALLOC_POST_RED;
@@ -289,7 +289,7 @@ static void fill_redzone(struct block_hdr *hdr)
 
 static void sfree_check_redzone(struct block_hdr *hdr)
 {
-       unsigned int *postred = (void *) hdr + hdr->size - sizeof(unsigned int);
+       unsigned int *postred = postred_ptr(hdr);
 
        if (hdr->prered != SMALLOC_PRE_RED) {
                fprintf(stderr, "smalloc pre redzone destroyed!\n");
@@ -425,8 +425,13 @@ static void *smalloc_pool(struct pool *pool, unsigned int size)
        unsigned int alloc_size = size + sizeof(struct block_hdr);
        void *ptr;
 
+       /*
+        * Round to int alignment, so that the postred pointer will
+        * be naturally aligned as well.
+        */
 #ifdef SMALLOC_REDZONE
        alloc_size += sizeof(unsigned int);
+       alloc_size = (alloc_size + int_mask) & ~int_mask;
 #endif
 
        ptr = __smalloc_pool(pool, alloc_size);