Memory pool support.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2428 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/memcheck/mac_shared.h b/memcheck/mac_shared.h
index c968a08..1ae789f 100644
--- a/memcheck/mac_shared.h
+++ b/memcheck/mac_shared.h
@@ -51,7 +51,8 @@
       Stack, 
       Unknown,      /* classification yielded nothing useful */
       Freed, Mallocd, 
-      UserG  /* in a user-defined block; Addrcheck & Memcheck only */
+      UserG,        /* in a user-defined block; Addrcheck & Memcheck only */
+      Mempool,      /* in a mempool; Addrcheck & Memcheck only */
    }
    AddrKind;
 
@@ -88,7 +89,9 @@
       /* Overlapping blocks in memcpy(), strcpy(), etc */
       OverlapSupp,
       /* Something to be suppressed in a leak check. */
-      LeakSupp
+      LeakSupp,
+      /* Memory pool suppression. */
+      MempoolSupp,
    } 
    MAC_SuppKind;
 
@@ -100,7 +103,8 @@
           ParamErr, UserErr,  /* behaves like an anonymous ParamErr */
           FreeErr, FreeMismatchErr,
           OverlapErr,
-          LeakErr
+          LeakErr,
+          IllegalMempoolErr,
    }
    MAC_ErrorKind;
 
@@ -153,6 +157,18 @@
    }
    MAC_Chunk;
 
+/* Memory pool.  Nb: first two fields must match core's VgHashNode. */
+typedef
+   struct _MAC_Mempool {
+      struct _MAC_Mempool* next;
+      Addr          pool;           /* pool identifier                       */
+      UInt          rzB;            /* pool red-zone size                    */
+      Bool          is_zeroed;      /* allocations from this pool are zeroed */
+      VgHashTable   chunks;         /* chunks associated with this pool      */
+   }
+   MAC_Mempool;
+
+
 /*------------------------------------------------------------*/
 /*--- Profiling of tools and memory events                 ---*/
 /*------------------------------------------------------------*/
@@ -270,6 +286,9 @@
 /* For tracking malloc'd blocks */
 extern VgHashTable MAC_(malloc_list);
 
+/* For tracking memory pools. */
+extern VgHashTable MAC_(mempool_list);
+
 /* Function pointers for the two tools to track interesting events. */
 extern void (*MAC_(new_mem_heap)) ( Addr a, UInt len, Bool is_inited );
 extern void (*MAC_(ban_mem_heap)) ( Addr a, UInt len );
@@ -298,10 +317,16 @@
 
 extern Bool MAC_(shared_recognised_suppression) ( Char* name, Supp* su );
 
-extern void MAC_(new_block) ( Addr p, UInt size, UInt rzB,
-                              Bool is_zeroed, MAC_AllocKind kind );
+extern MAC_Chunk* MAC_(new_block) ( Addr p, UInt size, UInt rzB,
+                                    Bool is_zeroed, MAC_AllocKind kind,
+                                    VgHashTable table);
 extern void MAC_(handle_free) ( Addr p, UInt rzB, MAC_AllocKind kind );
 
+extern void MAC_(create_mempool)(Addr pool, UInt rzB, Bool is_zeroed);
+extern void MAC_(destroy_mempool)(Addr pool);
+extern void MAC_(mempool_alloc)(Addr pool, Addr addr, UInt size);
+extern void MAC_(mempool_free)(Addr pool, Addr addr);
+
 extern void MAC_(record_address_error)     ( ThreadId tid, Addr a,
                                              Int size, Bool isWrite );
 extern void MAC_(record_core_mem_error)    ( ThreadId tid, Bool isWrite,
@@ -312,6 +337,7 @@
 extern void MAC_(record_free_error)        ( ThreadId tid, Addr a );
 extern void MAC_(record_freemismatch_error)( ThreadId tid, Addr a );
 extern void MAC_(record_overlap_error)     ( Char* function, OverlapExtra* oe );
+extern void MAC_(record_illegal_mempool_error) ( ThreadId tid, Addr pool );
 
 extern void MAC_(pp_shared_SkinError)      ( Error* err);