A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
model-checker : update second parameter of mmorecore function (size is a size_t not...
[simgrid.git]
/
src
/
xbt
/
mmalloc
/
mmprivate.h
diff --git
a/src/xbt/mmalloc/mmprivate.h
b/src/xbt/mmalloc/mmprivate.h
index
da1b01e
..
8cfc0ad
100644
(file)
--- a/
src/xbt/mmalloc/mmprivate.h
+++ b/
src/xbt/mmalloc/mmprivate.h
@@
-17,6
+17,8
@@
#include "xbt/xbt_os_thread.h"
#include "xbt/mmalloc.h"
#include "xbt/ex.h"
#include "xbt/xbt_os_thread.h"
#include "xbt/mmalloc.h"
#include "xbt/ex.h"
+#include "xbt/dynar.h"
+#include "xbt/swag.h"
#include <semaphore.h>
#include <stdint.h>
#include <semaphore.h>
#include <stdint.h>
@@
-106,6
+108,18
@@
struct mstats
size_t bytes_free; /* Byte total of chunks in the free list. */
};
size_t bytes_free; /* Byte total of chunks in the free list. */
};
+typedef struct s_heap_area{
+ int block;
+ int fragment;
+}s_heap_area_t, *heap_area_t;
+
+typedef struct s_heap_area_pair{
+ int block1;
+ int fragment1;
+ int block2;
+ int fragment2;
+}s_heap_area_pair_t, *heap_area_pair_t;
+
/* Data structure giving per-block information.
*
* There is one such structure in the mdp->heapinfo array per block used in that heap,
/* Data structure giving per-block information.
*
* There is one such structure in the mdp->heapinfo array per block used in that heap,
@@
-129,26
+143,27
@@
struct mstats
* The type field is consistently updated for every blocks, even within clusters of blocks.
* You can crawl the array and rely on that value.
*
* The type field is consistently updated for every blocks, even within clusters of blocks.
* You can crawl the array and rely on that value.
*
- * TODO:
- * - make room to store the backtrace of where the blocks and fragment were malloced, too.
*/
typedef struct {
*/
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 */
int type; /* 0: busy large block
>0: busy fragmented (fragments of size 2^type bytes)
<0: free block */
+
union {
/* Heap information for a busy block. */
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. */
- unsigned short frag_size[MAX_FRAGMENT_PER_BLOCK];
+ size_t nfree; /* Free fragments in a fragmented block. */
+ short frag_size[MAX_FRAGMENT_PER_BLOCK];
void *bt[MAX_FRAGMENT_PER_BLOCK][XBT_BACKTRACE_SIZE]; /* Where it was malloced (or realloced lastly) */
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];
} 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;
} 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;
} busy_block;
/* Heap information for a free block (that may be the first of a free cluster). */
struct {
} busy_block;
/* Heap information for a free block (that may be the first of a free cluster). */
struct {
@@
-206,8
+221,10
@@
struct mdesc {
/* Table indexed by block number giving per-block information. */
malloc_info *heapinfo;
/* 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
/* The base address of the memory region for this malloc heap. This
is the location where the bookkeeping data for mmap and for malloc
@@
-238,10
+255,6
@@
struct mdesc {
};
};
-int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2);
-
-//void *get_end_addr_heap(void *s_heap);
-
/* Bits to look at in the malloc descriptor flags word */
#define MMALLOC_DEVZERO (1 << 0) /* Have mapped to /dev/zero */
/* Bits to look at in the malloc descriptor flags word */
#define MMALLOC_DEVZERO (1 << 0) /* Have mapped to /dev/zero */
@@
-250,16
+263,16
@@
int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2);
/* A default malloc descriptor for the single sbrk() managed region. */
/* 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. */
/* 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(). */
/* 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, in
t size);
+
XBT_PUBLIC( void *)mmorecore(struct mdesc *mdp, size_
t size);
/* Thread-safety (if the sem is already created)
*
/* Thread-safety (if the sem is already created)
*
@@
-270,4
+283,10
@@
extern void *mmorecore(struct mdesc *mdp, int size);
#define LOCK(mdp) sem_wait(&mdp->sem)
#define UNLOCK(mdp) sem_post(&mdp->sem)
#define LOCK(mdp) sem_wait(&mdp->sem)
#define UNLOCK(mdp) sem_post(&mdp->sem)
+static XBT_INLINE void mmalloc_paranoia(struct mdesc *mdp){
+
+ /* nothing to fear for no */
+
+}
+
#endif /* __MMPRIVATE_H */
#endif /* __MMPRIVATE_H */