Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Remove comment which has not been accurate for a long long time
[simgrid.git] / src / xbt / mmalloc / mmprivate.h
index 63ee257..abf6140 100644 (file)
@@ -1,15 +1,16 @@
-/* Declarations for `mmalloc' and friends.
-   Copyright 1990, 1991, 1992 Free Software Foundation
+/* Declarations for `mmalloc' and friends. */
 
-   Written May 1989 by Mike Haertel.
-   Heavily modified Mar 1992 by Fred Fish. (fnf@cygnus.com) */
-
-/* Copyright (c) 2010. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
+/* Copyright 1990, 1991, 1992 Free Software Foundation
+
+   Written May 1989 by Mike Haertel.
+   Heavily modified Mar 1992 by Fred Fish. (fnf@cygnus.com) */
+
 #ifndef __MMPRIVATE_H
 #define __MMPRIVATE_H 1
 
@@ -18,6 +19,7 @@
 #include "xbt/mmalloc.h"
 #include "xbt/ex.h"
 #include "xbt/dynar.h"
+#include "xbt/swag.h"
 #include <semaphore.h>
 #include <stdint.h>
 
@@ -108,6 +110,7 @@ struct mstats
 };
 
 typedef struct s_heap_area{
+  int valid;
   int block;
   int fragment;
 }s_heap_area_t, *heap_area_t;
@@ -144,6 +147,7 @@ typedef struct s_heap_area_pair{
  *
  */
 typedef struct {
+  s_xbt_swag_hookup_t freehook; /* to register this block as having empty frags when needed */
   int type; /*  0: busy large block
                 >0: busy fragmented (fragments of size 2^type bytes)
                 <0: free block */
@@ -151,18 +155,17 @@ typedef struct {
   union {
     /* Heap information for a busy block.  */
     struct {
-      size_t nfree;           /* Free fragments in a fragmented block.  */
-      size_t first;           /* First free fragment of the block.  */
-      short frag_size[MAX_FRAGMENT_PER_BLOCK];
-      void *bt[MAX_FRAGMENT_PER_BLOCK][XBT_BACKTRACE_SIZE]; /* Where it was malloced (or realloced lastly) */
-      heap_area_t equal_to[MAX_FRAGMENT_PER_BLOCK];
+      size_t nfree;               /* Free fragments in a fragmented block.  */
+      ssize_t frag_size[MAX_FRAGMENT_PER_BLOCK];
+      //void *bt[MAX_FRAGMENT_PER_BLOCK][XBT_BACKTRACE_SIZE]; /* Where it was malloced (or realloced lastly) */
+      int ignore[MAX_FRAGMENT_PER_BLOCK];
     } busy_frag;
     struct {
       size_t size; /* Size (in blocks) of a large cluster.  */
       size_t busy_size; /* Actually used space, in bytes */
-      void *bt[XBT_BACKTRACE_SIZE]; /* Where it was malloced (or realloced lastly) */
-      int bt_size;
-      heap_area_t equal_to;
+      //void *bt[XBT_BACKTRACE_SIZE]; /* Where it was malloced (or realloced lastly) */
+      //int bt_size;
+      int ignore;
     } busy_block;
     /* Heap information for a free block (that may be the first of a free cluster).  */
     struct {
@@ -199,6 +202,8 @@ struct mdesc {
   /* The version number of the mmalloc package that created this file. */
   unsigned char version;
 
+  unsigned int options;
+
   /* Some flag bits to keep track of various internal things. */
   unsigned int flags;
 
@@ -215,13 +220,14 @@ struct mdesc {
   /* Limit of valid info table indices.  */
   size_t heaplimit;
 
-  /* Block information table.
-     Allocated with malign/mfree (not mmalloc/mfree).  */
+  /* Block information table. */
   /* Table indexed by block number giving per-block information.  */
   malloc_info *heapinfo;
 
-  /* List of all blocks containing free fragments of this size. The array indice is the log2 of requested size */
-  struct list fraghead[BLOCKLOG];
+  /* List of all blocks containing free fragments of this size.
+   * The array indice is the log2 of requested size.
+   * Actually only the sizes 8->11 seem to be used, but who cares? */
+  s_xbt_swag_t fraghead[BLOCKLOG];
 
   /* The base address of the memory region for this malloc heap.  This
      is the location where the bookkeeping data for mmap and for malloc
@@ -235,7 +241,9 @@ struct mdesc {
   void *breakval;
 
   /* The end of the current memory region for this malloc heap.  This is
-     the first location past the end of mapped memory. */
+     the first location past the end of mapped memory.
+     Compared to breakval, this value is rounded to the next memory page.
+      */
 
   void *top;
 
@@ -260,16 +268,16 @@ struct mdesc {
 
 /* A default malloc descriptor for the single sbrk() managed region. */
 
-extern struct mdesc *__mmalloc_default_mdp;
+XBT_PUBLIC( struct mdesc ) *__mmalloc_default_mdp;
 
 /* Remap a mmalloc region that was previously mapped. */
 
-extern void *__mmalloc_remap_core(xbt_mheap_t mdp);
+XBT_PUBLIC( void *)__mmalloc_remap_core(xbt_mheap_t mdp);
 
 /*  Get core for the memory region specified by MDP, using SIZE as the
     amount to either add to or subtract from the existing region.  Works
     like sbrk(), but using mmap(). */
-extern void *mmorecore(struct mdesc *mdp, int size);
+XBT_PUBLIC( void *)mmorecore(struct mdesc *mdp, ssize_t size);
 
 /* Thread-safety (if the sem is already created)
  *
@@ -280,6 +288,10 @@ extern void *mmorecore(struct mdesc *mdp, int size);
 #define LOCK(mdp) sem_wait(&mdp->sem)
 #define UNLOCK(mdp) sem_post(&mdp->sem)
 
-void check_fraghead(struct mdesc *mdp);
+static XBT_INLINE void  mmalloc_paranoia(struct mdesc *mdp){
+
+  /* nothing to fear for no */
+
+}
 
 #endif                          /* __MMPRIVATE_H */