Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
cosmetics and comment improvements
[simgrid.git] / src / xbt / mmalloc / attach.c
index db06a3c..531a436 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>
-#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
@@ -36,7 +37,7 @@ Boston, MA 02111-1307, USA.  */
 
 /* 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.
 
@@ -48,7 +49,7 @@ static struct mdesc *reuse (int fd);
 
    If the open file corresponding to FD is from a previous use of
    mmalloc and passes some basic sanity checks to ensure that it is
-   compatible with the current mmalloc package, then it's data is
+   compatible with the current mmalloc package, then its data is
    mapped in and is immediately accessible at the same addresses in
    the current process as the process that created the file (ignoring
    the BASEADDR parameter).
@@ -62,16 +63,16 @@ static struct mdesc *reuse (int fd);
 
    On success, returns a "malloc descriptor" which is used in subsequent
    calls to other mmalloc package functions.  It is explicitly "void *"
-   ("char *" for systems that don't fully support void) so that users
-   of the package don't have to worry about the actual implementation
-   details.
+   so that users of the package don't have to worry about the actual
+   implementation details.
 
    On failure returns NULL. */
 
-void * mmalloc_attach (int fd, void *baseaddr) {
+void *mmalloc_attach(int fd, void *baseaddr)
+{
   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
@@ -81,13 +82,12 @@ void * mmalloc_attach (int fd, void *baseaddr) {
      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 */
@@ -100,20 +100,25 @@ void * mmalloc_attach (int fd, void *baseaddr) {
      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->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. */
 
@@ -122,25 +127,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. */
 
-  if ((mbase = mdp -> morecore (mdp, sizeof (mtemp))) != NULL)
-  {
-    memcpy (mbase, mdp, sizeof (mtemp));
-    //    mdp = (struct mdesc *) mbase;
-  }
-  else
-  {
-    abort();
-    //    mdp = NULL;
+  if ((mbase = mmorecore(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
@@ -166,43 +170,40 @@ void * mmalloc_attach (int fd, void *baseaddr) {
    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;
+    if(!mdp->refcount){
+      sem_init(&mdp->sem, 1, 1);
+      mdp->refcount++;
     }
   }
-
-  { /* 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);
 }
-