Boston, MA 02111-1307, USA. */
#include <sys/types.h>
-#include <fcntl.h> /* After sys/types.h, at least for dpx/2. */
+#include <fcntl.h> /* After sys/types.h, at least for dpx/2. */
#include <sys/stat.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
-#include <unistd.h> /* Prototypes for lseek */
+#include <unistd.h> /* Prototypes for lseek */
#endif
#include "mmprivate.h"
+#include "xbt/ex.h"
#ifndef SEEK_SET
#define SEEK_SET 0
/* Forward declarations/prototypes for local functions */
-static struct mdesc *reuse (int fd);
+static struct mdesc *reuse(int fd);
/* Initialize access to a mmalloc managed region.
On failure returns NULL. */
-void * mmalloc_attach (int fd, void *baseaddr) {
+void *mmalloc_attach(int fd, void *baseaddr)
+{
struct mdesc mtemp;
struct mdesc *mdp;
- void* mbase;
+ void *mbase;
struct stat sbuf;
/* First check to see if FD is a valid file descriptor, and if so, see
obsolete version, or any other reason, then we fail to attach to
this file. */
- if (fd >= 0)
- {
- if (fstat (fd, &sbuf) < 0)
+ if (fd >= 0) {
+ if (fstat(fd, &sbuf) < 0)
return (NULL);
else if (sbuf.st_size > 0)
- return ((void*) reuse (fd));
+ return ((void *) reuse(fd));
}
/* If the user provided NULL BASEADDR then fail */
then initialize the fields that we know values for. */
mdp = &mtemp;
- memset ((char *) mdp, 0, sizeof (mtemp));
- strncpy (mdp -> magic, MMALLOC_MAGIC, MMALLOC_MAGIC_SIZE);
- mdp -> headersize = sizeof (mtemp);
- mdp -> version = MMALLOC_VERSION;
- mdp -> morecore = __mmalloc_mmap_morecore;
- mdp -> fd = fd;
- mdp -> base = mdp -> breakval = mdp -> top = baseaddr;
-
+ memset((char *) mdp, 0, sizeof(mtemp));
+ strncpy(mdp->magic, MMALLOC_MAGIC, MMALLOC_MAGIC_SIZE);
+ mdp->headersize = sizeof(mtemp);
+ mdp->version = MMALLOC_VERSION;
+ mdp->morecore = __mmalloc_mmap_morecore;
+ mdp->fd = fd;
+ mdp->base = mdp->breakval = mdp->top = baseaddr;
+ mdp->next_mdesc = NULL;
+ mdp->refcount = 1;
+
/* If we have not been passed a valid open file descriptor for the file
to map to, then we go for an anonymous map */
- if(mdp -> fd < 0)
- mdp -> flags |= MMALLOC_ANONYMOUS;
-
+ if (mdp->fd < 0){
+ mdp->flags |= MMALLOC_ANONYMOUS;
+ sem_init(&mdp->sem, 0, 1);
+ }else{
+ sem_init(&mdp->sem, 1, 1);
+ }
+
/* If we have not been passed a valid open file descriptor for the file
to map to, then open /dev/zero and use that to map to. */
fails, then close the file descriptor if it was opened by us, and arrange
to return a NULL. */
- if ((mbase = mdp -> morecore (mdp, sizeof (mtemp))) != NULL)
- {
- memcpy (mbase, mdp, sizeof (mtemp));
- // mdp = (struct mdesc *) mbase;
- }
- else
- {
- abort();
- // mdp = NULL;
+ if ((mbase = mdp->morecore(mdp, sizeof(mtemp))) != NULL) {
+ memcpy(mbase, mdp, sizeof(mtemp));
+ } else {
+ THROWF(system_error,0,"morecore failed to get some memory!");
}
- { /* create the mutex within that heap */
- void*old_heap=mmalloc_get_current_heap();
- mmalloc_set_current_heap(mbase);
- mdp->mutex =xbt_os_mutex_init();
- mmalloc_set_current_heap(old_heap);
- }
+ /* Add the new heap to the linked list of heaps attached by mmalloc */
+ if(__mmalloc_default_mdp){
+ mdp = __mmalloc_default_mdp;
+ while(mdp->next_mdesc)
+ mdp = mdp->next_mdesc;
- return ((void*) mbase);
+ LOCK(mdp);
+ mdp->next_mdesc = (struct mdesc *)mbase;
+ UNLOCK(mdp);
+ }
+
+ return ((void *) mbase);
}
/* Given an valid file descriptor on an open file, test to see if that file
Returns a pointer to the malloc descriptor if successful, or NULL if
unsuccessful for some reason. */
-static struct mdesc *
-reuse (int fd)
+static struct mdesc *reuse(int fd)
{
struct mdesc mtemp;
- struct mdesc *mdp = NULL;
+ struct mdesc *mdp = NULL, *mdptemp = NULL;
- if (lseek (fd, 0L, SEEK_SET) != 0)
+ if (lseek(fd, 0L, SEEK_SET) != 0)
return NULL;
- if (read (fd, (char *) &mtemp, sizeof (mtemp)) != sizeof (mtemp))
+ if (read(fd, (char *) &mtemp, sizeof(mtemp)) != sizeof(mtemp))
return NULL;
- if (mtemp.headersize != sizeof (mtemp))
+ if (mtemp.headersize != sizeof(mtemp))
return NULL;
- if (strcmp (mtemp.magic, MMALLOC_MAGIC) != 0)
+ if (strcmp(mtemp.magic, MMALLOC_MAGIC) != 0)
return NULL;
if (mtemp.version > MMALLOC_VERSION)
return NULL;
mtemp.fd = fd;
- if (__mmalloc_remap_core (&mtemp) == mtemp.base)
- {
+ if (__mmalloc_remap_core(&mtemp) == mtemp.base) {
mdp = (struct mdesc *) mtemp.base;
- mdp -> fd = fd;
- mdp -> morecore = __mmalloc_mmap_morecore;
- mdp->mutex =xbt_os_mutex_init();
- if (mdp -> mfree_hook != NULL)
- {
- mmcheckf ((void*) mdp, (void (*) (void)) NULL, 1);
+ mdp->fd = fd;
+ mdp->morecore = __mmalloc_mmap_morecore;
+ if(!mdp->refcount){
+ sem_init(&mdp->sem, 1, 1);
+ mdp->refcount++;
+ }
+ if (mdp->mfree_hook != NULL) {
+ mmcheckf((void *) mdp, (void (*)(void)) NULL, 1);
}
}
-
- { /* create the mutex within that heap */
- void*old_heap=mmalloc_get_current_heap();
- mmalloc_set_current_heap(mdp);
- mdp->mutex =xbt_os_mutex_init();
- mmalloc_set_current_heap(old_heap);
- }
-
+
+ /* Add the new heap to the linked list of heaps attached by mmalloc */
+ mdptemp = __mmalloc_default_mdp;
+ while(mdptemp->next_mdesc)
+ mdptemp = mdptemp->next_mdesc;
+
+ LOCK(mdptemp);
+ mdptemp->next_mdesc = mdp;
+ UNLOCK(mdptemp);
+
return (mdp);
}
-