From: Marion Guthmuller Date: Tue, 28 Feb 2012 09:26:13 +0000 (+0100) Subject: Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot//simgrid/simgrid X-Git-Tag: exp_20120308~21 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/8870e4a485d50ed72f249b345c8338dd6ef1b7f7?hp=939f45165f7ccadb14508dbc6a234a60464b5f57 Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot//simgrid/simgrid --- diff --git a/src/xbt/mmalloc/mmalloc.c b/src/xbt/mmalloc/mmalloc.c index 64041efdd7..b13412bca7 100644 --- a/src/xbt/mmalloc/mmalloc.c +++ b/src/xbt/mmalloc/mmalloc.c @@ -53,7 +53,7 @@ static void initialize(xbt_mheap_t mdp) { mdp->heapsize = HEAP / BLOCKSIZE; mdp->heapinfo = (malloc_info *) - align(mdp, mdp->heapsize * sizeof(malloc_info)); + align(mdp, mdp->heapsize * sizeof(malloc_info)); memset((void *) mdp->heapinfo, 0, mdp->heapsize * sizeof(malloc_info)); mdp->heapinfo[0].type=-1; @@ -76,7 +76,7 @@ static void *register_morecore(struct mdesc *mdp, size_t size) /* Check if we need to grow the info table (in a multiplicative manner) */ if ((size_t) BLOCK((char *) result + size) > mdp->heapsize) { - int it; + int it; newsize = mdp->heapsize; while ((size_t) BLOCK((char *) result + size) > newsize) @@ -92,7 +92,7 @@ static void *register_morecore(struct mdesc *mdp, size_t size) /* mark the space previously occupied by the block info as free by first marking it * as occupied in the regular way, and then freing it */ for (it=0; itheapsize * sizeof(malloc_info)); it++) - newinfo[BLOCK(oldinfo)+it].type = 0; + newinfo[BLOCK(oldinfo)+it].type = 0; newinfo[BLOCK(oldinfo)].busy_block.size = BLOCKIFY(mdp->heapsize * sizeof(malloc_info)); newinfo[BLOCK(oldinfo)].busy_block.busy_size = size; @@ -125,10 +125,10 @@ void *mmalloc(xbt_mheap_t mdp, size_t size) if (size < SMALLEST_POSSIBLE_MALLOC) size = SMALLEST_POSSIBLE_MALLOC; -// printf("(%s) Mallocing %d bytes on %p (default: %p)...",xbt_thread_self_name(),size,mdp,__mmalloc_default_mdp);fflush(stdout); + // printf("(%s) Mallocing %d bytes on %p (default: %p)...",xbt_thread_self_name(),size,mdp,__mmalloc_default_mdp);fflush(stdout); if (!(mdp->flags & MMALLOC_INITIALIZED)) - initialize(mdp); + initialize(mdp); /* Determine the allocation policy based on the request size. */ if (size <= BLOCKSIZE / 2) { @@ -161,7 +161,7 @@ void *mmalloc(xbt_mheap_t mdp, size_t size) } if (--mdp->heapinfo[block].busy_frag.nfree != 0) { mdp->heapinfo[block].busy_frag.first = - RESIDUAL(next->next, BLOCKSIZE) >> log; + RESIDUAL(next->next, BLOCKSIZE) >> log; } } else { @@ -183,8 +183,8 @@ void *mmalloc(xbt_mheap_t mdp, size_t size) next->next->prev = next; } } - mdp->heapinfo[block].busy_frag.frag_size[0] = requested_size; - // FIXME: setup backtrace + mdp->heapinfo[block].busy_frag.frag_size[0] = requested_size; + // FIXME: setup backtrace /* Initialize the nfree and first counters for this block. */ mdp->heapinfo[block].type = log; @@ -199,10 +199,10 @@ void *mmalloc(xbt_mheap_t mdp, size_t size) blocks = BLOCKIFY(size); start = block = MALLOC_SEARCH_START; while (mdp->heapinfo[block].free_block.size < blocks) { - if (mdp->heapinfo[block].type >=0) { // Don't trust xbt_die and friends in malloc-level library, you fool! - fprintf(stderr,"Internal error: found a free block not marked as such (block=%lu type=%lu). Please report this bug.\n",(unsigned long)block,(unsigned long)mdp->heapinfo[block].type); - abort(); - } + if (mdp->heapinfo[block].type >=0) { // Don't trust xbt_die and friends in malloc-level library, you fool! + fprintf(stderr,"Internal error: found a free block not marked as such (block=%lu type=%lu). Please report this bug.\n",(unsigned long)block,(unsigned long)mdp->heapinfo[block].type); + abort(); + } block = mdp->heapinfo[block].free_block.next; if (block == start) { @@ -227,7 +227,7 @@ void *mmalloc(xbt_mheap_t mdp, size_t size) block = BLOCK(result); for (it=0;itheapinfo[block+it].type = 0; + mdp->heapinfo[block+it].type = 0; mdp->heapinfo[block].busy_block.size = blocks; mdp->heapinfo[block].busy_block.busy_size = requested_size; mdp->heapinfo[block].busy_block.bt_size=xbt_backtrace_no_malloc(mdp->heapinfo[block].busy_block.bt,XBT_BACKTRACE_SIZE); @@ -244,25 +244,25 @@ void *mmalloc(xbt_mheap_t mdp, size_t size) /* The block we found has a bit left over, so relink the tail end back into the free list. */ mdp->heapinfo[block + blocks].free_block.size - = mdp->heapinfo[block].free_block.size - blocks; + = mdp->heapinfo[block].free_block.size - blocks; mdp->heapinfo[block + blocks].free_block.next - = mdp->heapinfo[block].free_block.next; + = mdp->heapinfo[block].free_block.next; mdp->heapinfo[block + blocks].free_block.prev - = mdp->heapinfo[block].free_block.prev; + = mdp->heapinfo[block].free_block.prev; mdp->heapinfo[mdp->heapinfo[block].free_block.prev].free_block.next - = mdp->heapinfo[mdp->heapinfo[block].free_block.next].free_block.prev - = mdp->heapindex = block + blocks; + = mdp->heapinfo[mdp->heapinfo[block].free_block.next].free_block.prev + = mdp->heapindex = block + blocks; } else { /* The block exactly matches our requirements, so just remove it from the list. */ mdp->heapinfo[mdp->heapinfo[block].free_block.next].free_block.prev - = mdp->heapinfo[block].free_block.prev; + = mdp->heapinfo[block].free_block.prev; mdp->heapinfo[mdp->heapinfo[block].free_block.prev].free_block.next - = mdp->heapindex = mdp->heapinfo[block].free_block.next; + = mdp->heapindex = mdp->heapinfo[block].free_block.next; } for (it=0;itheapinfo[block+it].type = 0; + mdp->heapinfo[block+it].type = 0; mdp->heapinfo[block].busy_block.size = blocks; mdp->heapinfo[block].busy_block.busy_size = requested_size; //mdp->heapinfo[block].busy_block.bt_size = 0; diff --git a/src/xbt/mmalloc/mmprivate.h b/src/xbt/mmalloc/mmprivate.h index 9de088688a..507a27d0d5 100644 --- a/src/xbt/mmalloc/mmprivate.h +++ b/src/xbt/mmalloc/mmprivate.h @@ -91,8 +91,8 @@ /* Doubly linked lists of free fragments. */ struct list { - struct list *next; - struct list *prev; + struct list *next; + struct list *prev; }; /* Data structure giving per-block information. @@ -122,30 +122,30 @@ struct list { * - make room to store the backtrace of where the blocks and fragment were malloced, too. */ typedef struct { - 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 { - 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]; + 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 { + 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]; //void *bt[XBT_BACKTRACE_SIZE][MAX_FRAGMENT_PER_BLOCK]; /* Where it was malloced (or realloced lastly) */ - } 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_block; - /* Heap information for a free block (that may be the first of a free cluster). */ - struct { - size_t size; /* Size (in blocks) of a free cluster. */ - size_t next; /* Index of next free cluster. */ - size_t prev; /* Index of previous free cluster. */ - } free_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_block; + /* Heap information for a free block (that may be the first of a free cluster). */ + struct { + size_t size; /* Size (in blocks) of a free cluster. */ + size_t next; /* Index of next free cluster. */ + size_t prev; /* Index of previous free cluster. */ + } free_block; + }; } malloc_info; /* Internal structure that defines the format of the malloc-descriptor. @@ -155,71 +155,71 @@ typedef struct { struct mdesc { - /* Semaphore locking the access to the heap */ - sem_t sem; + /* Semaphore locking the access to the heap */ + sem_t sem; - /* Number of processes that attached the heap */ - unsigned int refcount; + /* Number of processes that attached the heap */ + unsigned int refcount; - /* Chained lists of mdescs */ - struct mdesc *next_mdesc; + /* Chained lists of mdescs */ + struct mdesc *next_mdesc; - /* The "magic number" for an mmalloc file. */ - char magic[MMALLOC_MAGIC_SIZE]; + /* The "magic number" for an mmalloc file. */ + char magic[MMALLOC_MAGIC_SIZE]; - /* The size in bytes of this structure, used as a sanity check when reusing + /* The size in bytes of this structure, used as a sanity check when reusing a previously created mapped file. */ - unsigned int headersize; + unsigned int headersize; - /* The version number of the mmalloc package that created this file. */ - unsigned char version; + /* The version number of the mmalloc package that created this file. */ + unsigned char version; - /* Some flag bits to keep track of various internal things. */ - unsigned int flags; + /* Some flag bits to keep track of various internal things. */ + unsigned int flags; - /* Number of info entries. */ - size_t heapsize; + /* Number of info entries. */ + size_t heapsize; - /* Pointer to first block of the heap (base of the first block). */ - void *heapbase; + /* Pointer to first block of the heap (base of the first block). */ + void *heapbase; - /* Current search index for the heap table. */ - /* Search index in the info table. */ - size_t heapindex; + /* Current search index for the heap table. */ + /* Search index in the info table. */ + size_t heapindex; - /* Limit of valid info table indices. */ - size_t heaplimit; + /* Limit of valid info table indices. */ + size_t heaplimit; - /* Block information table. + /* Block information table. Allocated with malign/mfree (not mmalloc/mfree). */ - /* 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 */ + struct list fraghead[BLOCKLOG]; - /* The base address of the memory region for this malloc heap. This + /* The base address of the memory region for this malloc heap. This is the location where the bookkeeping data for mmap and for malloc begins. */ - void *base; + void *base; - /* The current location in the memory region for this malloc heap which + /* The current location in the memory region for this malloc heap which represents the end of memory in use. */ - void *breakval; + void *breakval; - /* The end of the current memory region for this malloc heap. This is + /* The end of the current memory region for this malloc heap. This is the first location past the end of mapped memory. */ - void *top; + void *top; - /* Open file descriptor for the file to which this malloc heap is mapped. + /* Open file descriptor for the file to which this malloc heap is mapped. This will always be a valid file descriptor, since /dev/zero is used by default if no open file is supplied by the client. Also note that it may change each time the region is mapped and unmapped. */ - int fd; + int fd; };