#include "xbt/mmalloc.h"
#include "xbt/ex.h"
#include "xbt/dynar.h"
+#include "xbt/swag.h"
#include <semaphore.h>
#include <stdint.h>
*
*/
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 */
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. */
+ 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) */
heap_area_t equal_to[MAX_FRAGMENT_PER_BLOCK];
/* 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
/* 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)
*
#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 */