#include "portable.h"
#include "xbt/xbt_os_thread.h"
#include "xbt/mmalloc.h"
+#include <semaphore.h>
#ifdef HAVE_LIMITS_H
# include <limits.h>
#define ADDRESS(B) ((void*) (((ADDR2UINT(B)) - 1) * BLOCKSIZE + (char*) mdp -> heapbase))
-/* Thread-safety (if the mutex is already created)*/
-#define LOCK(mdp) if (mdp->mutex) xbt_os_mutex_acquire(mdp->mutex)
-#define UNLOCK(mdp) if (mdp->mutex) xbt_os_mutex_release(mdp->mutex)
const char *xbt_thread_self_name(void);
/* Data structure giving per-block information. */
size_t nfree; /* Free fragments in a fragmented block. */
size_t first; /* First free fragment of the block. */
} frag;
- /* Size (in blocks) of a large cluster. */
- size_t size;
+ struct {
+ size_t size; /* Size (in blocks) of a large cluster. */
+ size_t busy_size;
+ } block;
} info;
} busy;
/* Heap information for a free block (that may be the first of
if such a file exists. */
struct mdesc {
- xbt_os_mutex_t mutex;
+
+ /* Semaphore locking the access to the heap */
+ sem_t sem;
+
+ /* Number of processes that attached the heap */
+ unsigned int refcount;
+
+ /* Chained lists of mdescs */
+ struct mdesc *next_mdesc;
+
/* The "magic number" for an mmalloc file. */
char magic[MMALLOC_MAGIC_SIZE];
};
+int mmalloc_compare_heap(void *h1, void *h2, void *std_heap_addr);
+
+int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap_addr);
+
+void mmalloc_display_info(void *h);
+
/* Bits to look at in the malloc descriptor flags word */
#define MMALLOC_DEVZERO (1 << 0) /* Have mapped to /dev/zero */
? __mmalloc_default_mdp \
: (struct mdesc *) (md))
+/* Thread-safety (if the sem is already created)*/
+#define LOCK(md) \
+ do {\
+ struct mdesc *lock_local_mdp = MD_TO_MDP(md); \
+ sem_wait(&lock_local_mdp->sem); \
+ } while (0)
+
+#define UNLOCK(md) \
+ do { \
+ struct mdesc *unlock_local_mdp = MD_TO_MDP(md); \
+ sem_post(&unlock_local_mdp->sem); \
+ } while (0)
+
#endif /* __MMPRIVATE_H */