#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. */
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];
? __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 */