X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8868f3e0668d8278936a3c79bae72a485b03d8c8..487f1bbd1b94a8738f06e84815ad0eef6d5e7525:/src/xbt/mmalloc/attach.c diff --git a/src/xbt/mmalloc/attach.c b/src/xbt/mmalloc/attach.c index 99cf8266c3..254182e635 100644 --- a/src/xbt/mmalloc/attach.c +++ b/src/xbt/mmalloc/attach.c @@ -21,24 +21,23 @@ not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include -#include /* After sys/types.h, at least for dpx/2. */ +#include /* After sys/types.h, at least for dpx/2. */ #include #include #ifdef HAVE_UNISTD_H -#include /* Prototypes for lseek */ +#include /* Prototypes for lseek */ #endif #include "mmprivate.h" +#include "xbt/ex.h" #ifndef SEEK_SET #define SEEK_SET 0 #endif -#if defined(HAVE_MMAP) - /* 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. @@ -70,12 +69,11 @@ static struct mdesc *reuse (int fd); 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 @@ -85,13 +83,12 @@ 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) - return (NULL); + 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 */ @@ -104,52 +101,52 @@ 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->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. */ -/* if (mdp -> fd < 0)*/ -/* {*/ -/* if ((mdp -> fd = open ("/dev/zero", O_RDWR)) < 0)*/ -/* {*/ -/* return (NULL);*/ -/* }*/ -/* else*/ -/* {*/ -/* mdp -> flags |= MMALLOC_DEVZERO;*/ -/* }*/ -/* }*/ - /* Now try to map in the first page, copy the malloc descriptor structure there, and arrange to return a pointer to this new copy. If the mapping 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; + if ((mbase = mdp->morecore(mdp, sizeof(mtemp))) != NULL) { + memcpy(mbase, mdp, sizeof(mtemp)); + } else { + THROWF(system_error,0,"morecore failed to get some memory!"); } - else - { - abort(); -// mdp = NULL; + + /* 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; + + LOCK(mdp); + mdp->next_mdesc = (struct mdesc *)mbase; + UNLOCK(mdp); } - return ((void*) mbase); + return ((void *) mbase); } /* Given an valid file descriptor on an open file, test to see if that file @@ -175,49 +172,44 @@ 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; - 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); + } } + + /* 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); } - -#else /* !defined (HAVE_MMAP) */ - -/* For systems without mmap, the library still supplies an entry point - to link to, but trying to initialize access to an mmap'd managed region - always fails. */ - -/* ARGSUSED */ -void* -mmalloc_attach (int fd, void* baseaddr) -{ - return (NULL); -} - -#endif /* defined (HAVE_MMAP) */ -