Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix compilation error
[simgrid.git] / src / xbt / mmalloc / attach.c
index db06a3c..254182e 100644 (file)
@@ -21,13 +21,14 @@ not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
 #include <sys/types.h>
 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 <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"
 #endif
 #include "mmprivate.h"
+#include "xbt/ex.h"
 
 #ifndef SEEK_SET
 #define SEEK_SET 0
 
 #ifndef SEEK_SET
 #define SEEK_SET 0
@@ -36,7 +37,7 @@ Boston, MA 02111-1307, USA.  */
 
 /* Forward declarations/prototypes for local functions */
 
 
 /* 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.
 
 
 /* Initialize access to a mmalloc managed region.
 
@@ -68,10 +69,11 @@ static struct mdesc *reuse (int fd);
 
    On failure returns NULL. */
 
 
    On failure returns NULL. */
 
-void * mmalloc_attach (int fd, void *baseaddr) {
+void *mmalloc_attach(int fd, void *baseaddr)
+{
   struct mdesc mtemp;
   struct mdesc *mdp;
   struct mdesc mtemp;
   struct mdesc *mdp;
-  voidmbase;
+  void *mbase;
   struct stat sbuf;
 
   /* First check to see if FD is a valid file descriptor, and if so, see
   struct stat sbuf;
 
   /* First check to see if FD is a valid file descriptor, and if so, see
@@ -81,13 +83,12 @@ void * mmalloc_attach (int fd, void *baseaddr) {
      obsolete version, or any other reason, then we fail to attach to
      this file. */
 
      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 (NULL);
 
     else if (sbuf.st_size > 0)
-      return ((void*) reuse (fd));
+      return ((void *) reuse(fd));
   }
 
   /* If the user provided NULL BASEADDR then fail */
   }
 
   /* If the user provided NULL BASEADDR then fail */
@@ -100,20 +101,26 @@ void * mmalloc_attach (int fd, void *baseaddr) {
      then initialize the fields that we know values for. */
 
   mdp = &mtemp;
      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 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. */
 
   /* 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. */
 
@@ -122,25 +129,24 @@ void * mmalloc_attach (int fd, void *baseaddr) {
      fails, then close the file descriptor if it was opened by us, and arrange
      to return a NULL. */
 
      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
 }
 
 /* Given an valid file descriptor on an open file, test to see if that file
@@ -166,43 +172,44 @@ void * mmalloc_attach (int fd, void *baseaddr) {
    Returns a pointer to the malloc descriptor if successful, or NULL if
    unsuccessful for some reason. */
 
    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 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;
     return NULL;
-  if (read (fd, (char *) &mtemp, sizeof (mtemp)) != sizeof (mtemp))
+  if (read(fd, (char *) &mtemp, sizeof(mtemp)) != sizeof(mtemp))
     return NULL;
     return NULL;
-  if (mtemp.headersize != sizeof (mtemp))
+  if (mtemp.headersize != sizeof(mtemp))
     return NULL;
     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;
     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 = (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);
 }
   return (mdp);
 }
-