]> mj.ucw.cz Git - libucw.git/blobdiff - lib/bigalloc.c
Don't forget to increase run counter.
[libucw.git] / lib / bigalloc.c
index 3749fc9c89cdf331f591a5a3247da44696475fce..a1060e60be7d3cb7185bfff87b4f4c92aa33083f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     UCW Library -- Allocation of Large Aligned Buffers
  *
- *     (c) 2006 Martin Mares <mj@ucw.cz>
+ *     (c) 2006--2007 Martin Mares <mj@ucw.cz>
  *     (c) 2007 Pavel Charvat <char@ucw.cz>
  *
  *     This software may be freely distributed and used according to the terms
 
 #include <sys/mman.h>
 #include <string.h>
+#include <limits.h>
 
 void *
-page_alloc(unsigned int len)
+page_alloc(u64 len)
 {
+  if (len > SIZE_MAX)
+    die("page_alloc: Size %llu is too large for the current architecture", (long long) len);
   ASSERT(!(len & (CPU_PAGE_SIZE-1)));
   byte *p = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
   if (p == (byte*) MAP_FAILED)
-    die("Cannot mmap %d bytes of memory: %m", len);
+    die("Cannot mmap %llu bytes of memory: %m", (long long)len);
   return p;
 }
 
 void
-page_free(void *start, unsigned int len)
+page_free(void *start, u64 len)
 {
   ASSERT(!(len & (CPU_PAGE_SIZE-1)));
   ASSERT(!((uintptr_t) start & (CPU_PAGE_SIZE-1)));
@@ -32,7 +35,7 @@ page_free(void *start, unsigned int len)
 }
 
 void *
-page_realloc(void *start, unsigned int old_len, unsigned int new_len)
+page_realloc(void *start, u64 old_len, u64 new_len)
 {
   void *p = page_alloc(new_len);
   memcpy(p, start, MIN(old_len, new_len));
@@ -40,16 +43,18 @@ page_realloc(void *start, unsigned int old_len, unsigned int new_len)
   return p;
 }
 
-static unsigned int
-big_round(unsigned int len)
+static u64
+big_round(u64 len)
 {
-  return ALIGN_TO(len, CPU_PAGE_SIZE);
+  return ALIGN_TO(len, (u64)CPU_PAGE_SIZE);
 }
 
 void *
-big_alloc(unsigned int len)
+big_alloc(u64 len)
 {
   len = big_round(len);
+  if (len > SIZE_MAX - 2*CPU_PAGE_SIZE)
+    die("big_alloc: Size %llu is too large for the current architecture", (long long) len);
 #ifdef CONFIG_DEBUG
   len += 2*CPU_PAGE_SIZE;
 #endif
@@ -63,7 +68,7 @@ big_alloc(unsigned int len)
 }
 
 void
-big_free(void *start, unsigned int len)
+big_free(void *start, u64 len)
 {
   byte *p = start;
   len = big_round(len);